Форум «Всё о Паскале» _ Задачи _ Непонятка с string (и что такое char?)
Автор: DIMMUA 24.04.2007 3:05
Добрый день.
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.
И еще (может идею подкинете ). После того как я нашел последнее слово, я должен просмотреть всю строку и вывести только те слова, которые отличаются от последнего слова - вот как это сделать я даже не имею понятия.
P.S. Прикрепил скан с методички, ну что бы вы посмотрели, что полезного в ней много не найдешь. И свой текст программы.
не надо говорить, что string - это строчная переменная, а char - это текст
А?... Хм...
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, он самый простой, но эффективный...
Автор: DIMMUA 24.04.2007 12:34
Цитата(volvo @ 23.04.2007 23:26)
в разделе "Задачи" есть прикрепленная тема - "Разбиение строки на слова", посмотри там способ klem4, он масый простой, но эффективный...
Спасибо, посмотрел... Но буду переделывать способ klem4 т.к. мы впринципе TWords, text, words - ничего подобного не учили . Вообще мы по программе учили: три вида цикла, массивы (чуть-чуть), сортировка методом пузьрька. И впринципе из основного все . Типы переменных: real, integer, string.
Но большое спасибо, за то что рассказал про "d", "packed array" а тоя уже воообще чувствовал себя идиотом . Про "char" тоже спасибо.