IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Непонятка с string (и что такое char?), вроде все правильно, но есть недочеты...
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской
Реальное имя: Дмитрий

Репутация: -  0  +


Добрый день.

1. Обясните что такое string и что такое char?
Нет, только не надо говорить, что string - это строчная переменная, а char - это текст, это мне сказал препод в универе (к сожалению больше я ничего из него выдавил). Меня инетересует, чем на практике отличаются string от char ? Ну может, допустим char можно как-то сортировать, а string нет и т.д.....
2. Что такое packed array? Ну вот написано b=packed array[1..30] of char ? Что такое array (массив я знаю), что он char (символьный) я догадался, но вот "packed array" - такого я не знаю.
3. Далее я приведу кусочек из моего текста программы:

Program lab;
uses crt;
var s,d: string;
z,k,c,i,j: integer;
Begin
clrscr;
Write(' Vvedite stroky = ');
Readln(s);
c:=length(s);
for i:=1 to c do
if s[i]=' ' then
k:=i;
for i:=k+1 to c-1 do
Begin
j:=j+1;
d[j]:=s[i];
end;
Write('Poslednee slovo = ');
for i:=1 to j do
Write(d[i]);
writeln;
writeln('d = ',d);
writeln('Dlina d = ',length(d));
readkey;
end.


В общем условие: дана строка s, в неё входят слова, между словами не меньше одного проблема, после последнего слова точка(!). Нужно найти это последнее слово и записать в переменную d.

Впринципе у меня все работет, но вот буквы из в приходятся "выуживать" (for i:=1 to j do), т.е. если написать просто writeln(d) получается фигня. Далее если написать length(d) - длина d, то паскаль выводит значение 0(!), хотя я туда заносил буквы. Я кончено пробовал типа d[0]:=5 - и оно тогда при writeln(d) выводил только пять букв, но дело в том, что я же не знаю сколько букв в этом слове. Конечно, значение переменной j и есть кол-во букв, на вот d[0]:=j паскалю не нравится. Вот как сделать так, что я мог нормально знать длину строки d.

И еще (может идею подкинете smile.gif ). После того как я нашел последнее слово, я должен просмотреть всю строку и вывести только те слова, которые отличаются от последнего слова - вот как это сделать я даже не имею понятия.

P.S. Прикрепил скан с методички, ну что бы вы посмотрели, что полезного в ней много не найдешь. И свой текст программы.

Сообщение отредактировано: DIMMUA -


Эскизы прикрепленных изображений
Прикрепленное изображение

Прикрепленные файлы
Прикрепленный файл  DIMM.PAS ( 383 байт ) Кол-во скачиваний: 163
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
не надо говорить, что string - это строчная переменная, а char - это текст
blink.gif А?... Хм...

Char - какой же это текст? Это символ, в смысле - ОДИН символ... Значит, так: про использование packed array можешь забыть - это стандартный паскаль, в нем не было String-ов, поэтому пользовались упакованными массивами символов...

Теперь, почему тебе
Цитата
приходятся "выуживать"
содержимое D... Все просто - ты же работаешь со строкой "вручную" - но при этом совсем не заботишься об установке длины строки, хранящейся в нулевом символе... "А ларчик просто открывается" (С) - достаточно было просто пройти от конца строки к началу, пока не встретишь либо САМОЕ начало строки, либо пробел:
i := length(s) - 1;
d := ''; { <--- не забывай задавать начальные значения }
while (i > 1) and (s[i] <> ' ') do begin
d := s[i] + d; { <--- "прибавляешь" очередной символ к НАЧАЛУ слова }
dec(i); { <--- и переходишь к предыдущему символу }
end;

{ теперь можно печатать writeln(d), Паскаль сделает все как положено }


По поводу
Цитата
После того как я нашел последнее слово, я должен просмотреть всю строку и вывести только те слова, которые отличаются от последнего слова
- в разделе "Задачи" есть прикрепленная тема - "Разбиение строки на слова", посмотри там способ klem4, он самый простой, но эффективный...

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской
Реальное имя: Дмитрий

Репутация: -  0  +


Цитата(volvo @ 23.04.2007 23:26) *

в разделе "Задачи" есть прикрепленная тема - "Разбиение строки на слова", посмотри там способ klem4, он масый простой, но эффективный...


Спасибо, посмотрел... Но буду переделывать способ klem4 т.к. мы впринципе TWords, text, words - ничего подобного не учили sad.gif. Вообще мы по программе учили: три вида цикла, массивы (чуть-чуть), сортировка методом пузьрька. И впринципе из основного все smile.gif. Типы переменных: real, integer, string.

Но большое спасибо, за то что рассказал про "d", "packed array" а тоя уже воообще чувствовал себя идиотом smile.gif. Про "char" тоже спасибо.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 2.12.2020 9:04
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name