Помощь - Поиск - Пользователи - Календарь
Полная версия: Строковой массив
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Вячеслав Л.
Возможно ли разбиение строки на слова посредством массива типа string? То есть, что-то типа:
...
for i:=1 to {ne znayu}
do {zapolnit' massiv}

for i:=1 to ...
do writeln(s[i]);

{zatem soverwit' kakie to deistviya s otdelnymi slovami: tipa naxozhdeniya samogo dlinnogo slova i t. p.}

Как это будет выглядеть (хотя бы примерно) ?
volvo
Выбирай: Разбиение на слова. Все способы.
Вячеслав Л.
До того как открывать тему, я посмотрел эту ссылку (видел где-то ее в другой теме). То, что там написано, мне непонятно. Полно неизвестных функций, процедур и оператор. Я это не знаю и не понимаю. Соответственно, на моем уровне предлагаемыми вариантами воспользоваться не могу. Пытаюсь разобраться, появился вопрос этой темы - прошу ответить.
volvo
Ближе к концу смотрел, метод klem4, например? Куда уж проще? А писать без функций/процедур - извини, но зачем тогда учить Паскаль? Лучше вообще не писать тогда уже. С другой стороны - с чего ты решил, что если ты не понял ТАМ, то поймешь ЗДЕСЬ?

Цитата
Полно неизвестных функций, процедур и оператор.
Например? Что именно непонятно, скажем, в методе из поста №7 по ссылке?
Вячеслав Л.
Нда, извиняюсь, там действительно есть такая идея с массивом string. Именно от klem4. Не внимательно просматривал.

Насколько понимаю, ты счиатешь мне стоит попробовать разобраться с этим способом. Тогда вопросы:

1.
Цитата
limits = [#0..#32,'.',',',':',';','!','?','"'];
Первый раз вижу подобную строчку что это значит?

2.
Цитата
function GetWords(s : string; var w : TWords) : byte;
Что это значит?

3. Что за тип такой byte, мы такой тип не проходили (насколько я знаю)? Нельзя ли его заменит типом уже проходимым нами?

4. Что такое
Цитата
s[i] in limits
?

5.
Цитата
GetWords := n;
Это зачем?
Lapp
Цитата(Вячеслав Людской @ 26.10.2009 18:28) *
1. Первый раз вижу подобную строчку что это значит?
limits = [#0..#32,'.',',',':',';','!','?','"'];
Константe limits типа set присвоено знаение, указанное в квадратных скобках. Про set (множество) читай в учебнике.

Цитата(Вячеслав Людской @ 26.10.2009 18:28) *
2. Что это значит?
function GetWords(s : string; var w : TWords) : byte;
Заголовок функции. Тоже не проходили?..

Цитата(Вячеслав Людской @ 26.10.2009 18:28) *
3. Что за тип такой byte, мы такой тип не проходили (насколько я знаю)? Нельзя ли его заменит типом уже проходимым нами?
Целочисленный тип с диапазоном 0..255, занимает в памяти 1 байт.
"уже проходимым" lol.gif ? Можно)). Замени на integer или word (хотя это не совсем рационально).

Цитата(Вячеслав Людской @ 26.10.2009 18:28) *
4. Что такое ?
s[i] in limits
Оператор для работы с типом set (множество), проверка на содержание элемента (s[i] в данном случае) в множестве (limits в данном случае).

Цитата(Вячеслав Людской @ 26.10.2009 18:28) *
5. Это зачем?
GetWords := n;
Присвоение возвращаемого значения функции (см. 2)
Вячеслав Л.
Цитата
Про set (множество) читай в учебнике
Книги по паскалю сейчас нет, учебник в самом паскале не работает (баг какой-то unsure.gif ). Хотя бы в двух словах, что это такое и пример в две строчки. В принципе, думаю, что смогу разобраться сам.

Цитата
Константe limits типа set присвоено знаение, указанное в квадратных скобках
Это типа защита от дурака, чтоб не вводил лишнее, или что-то другое?

Цитата
Заголовок функции. Тоже не проходили?..
Функции еще никоим образом не проходили, даже не касались их. Только теоретически знаю, что это такое.

Цитата
"уже проходимым" ? Можно)).
Когда писал даже не заметил, как это звучит... smile.gif

Цитата
Замени на integer или word (хотя это не совсем рационально).
И все таки я заменю на integer.

Честно, говоря, легче не стало, я так и не знаю как это делать. Жду помощи, надеюсь на вас smile.gif
Lapp
Цитата(Вячеслав Людской @ 27.10.2009 17:59) *
Книги по паскалю сейчас нет, учебник в самом паскале не работает (баг какой-то unsure.gif ). Хотя бы в двух словах, что это такое и пример в две строчки.
Тип множество похож на понятие множества, известное из математики (теория множеств), но не совсем то. Множества - это как бы признак наличия величин. Работает только для перечислисых и порядковых типов с не более, чем 256 значениями. Например, можно объявить set of char (множество ascii-символов, их как раз 256). Множества допускают операции включения/исключения элементов и объединения/вычитания. В множестве не может быть двух или более одинаковых элементов: он либо есть, либо нет его. Например:
m: set of byte;
...
m:=[1,2,3];
Include(m,8); {множество стало [1,2,3,8]}
Include(m,8); {множество не изменилось}
m:=m+[2,3]; {множество не изменилось}
m:=m+m; {множество не изменилось}
m:=m-[1,3]; {множество стало [2,8]}
m:=[1,2,3]+[1,2,5]; {множество стало [1,2,3,5]}
m:=[]; {пустое множество}


m:=['a','b'];
Допустим, ты хочешь узнать, какие символы встречаются в строке. Делаешь так:
var
s: string;
m: set of char;
...
for i:=1 to Length(s) do Include(m,s[i]);
c:='f';
Write('символ ',c);
if not (c in m) then Write('не ');
WriteLn(' присутствует в строке');

Цитата(Вячеслав Людской @ 27.10.2009 17:59) *
Это типа защита от дурака, чтоб не вводил лишнее, или что-то другое?
Нет. Это прямая функциональность кода.

Цитата(Вячеслав Людской @ 27.10.2009 17:59) *
Честно, говоря, легче не стало, я так и не знаю как это делать. Жду помощи, надеюсь на вас smile.gif
Мы, конечно, можем помочь, но только НЕ ПОТОМУ, что тебе в лом искать учебник (в Инете можно найти легко) или исправлять какой-то баг. Если есть вопрос, если что-то непонятно, если что-то не получается - пожалуйста, поможем. Но заменять тебе учебник - учти, я делал это в первый и последний раз. Будь, пожалуйста, поуважительнее, не расходуй чужое время.
Вячеслав Л.
Оба привиденных фрагмента программ не работают, хотя я их дополнил до целых программ как знал. В обоих случаях вылетает ошибка:
» Nepredvidennoe isklyu4enie EAccessViolation. Access violation at address 0069CADC in module 'PascalABC.exe'. Read of address 00000004. Programma zaverwena.

Сами программы вот:
var
m:set of byte;
begin

m:=[1,2,3];
Include(m,8); {ìíîæåñòâî ñòàëî [1,2,3,8]}
Include(m,8); {ìíîæåñòâî íå èçìåíèëîñü}
m:=m+[2,3]; {ìíîæåñòâî íå èçìåíèëîñü}
m:=m+m; {ìíîæåñòâî íå èçìåíèëîñü}
m:=m-[1,3]; {ìíîæåñòâî ñòàëî [2,8]}
m:=[1,2,3]+[1,2,5]; {ìíîæåñòâî ñòàëî [1,2,3,5]}
m:=[]; {ïóñòîå ìíîæåñòâî}

end.


var
s: string;
m: set of char;
i:integer;
begin
readln(s);
for i:=1 to Length(s) do Include(m,s[i]);
c:='f';
Write('ñèìâîë ',c);
if not (c in m) then Write('íå ');
WriteLn(' ïðèñóòñòâóåò â ñòðîêå');
end.
Возникает вопрос: правильно ли я их дополнил?

Цитата
Мы, конечно, можем помочь, но только НЕ ПОТОМУ, что тебе в лом искать учебник (в Инете можно найти легко) или исправлять какой-то баг. Если есть вопрос, если что-то непонятно, если что-то не получается - пожалуйста, поможем. Но заменять тебе учебник - учти, я делал это в первый и последний раз. Будь, пожалуйста, поуважительнее, не расходуй чужое время
Несколько учебников, я скачал сегодня, как исправить баг я не знаю. По теории больше обращаться не буду. Действительно не стоит, прочитать это я могу сам. Сглупил, простите.

Что касается разбиения строки - буду искать более простой способ. С данными здесь способами я так и не разобрался.
volvo
Цитата
Возникает вопрос: правильно ли я их дополнил?
Первую - правильно, она должна отработать (хотя ничего тебе не выведет, но в отладчике посмотреть значения переменных можно). Вторую - не совсем, ты забыл описать переменную C: char. После добавления ее программа тоже должна отработать.

Теперь - о грустном. Я бы не рекомендовал тебе начинать работу с PascalABC, по собственному опыту знаю, иногда, чтобы заставить его выполнять простейшие для Turbo Pascal/FPC действия, надо очень сильно извращаться. Сейчас посмотрю, что там они опять нахимичили со множествами (я об авторах этой поделки - PascalABC)...

Добавлено через 11 мин.
Update
В PascalABC.NET отрабатывают обе программы...

Старую версию (которая без .NET) уж извини, ставить не буду, она в прошлый раз мне самовольно перековеркала все ассоциации файлов и так нагадила на диске, что я ее замучался потом выкорчевывать.
Вячеслав Л.
Цитата
но в отладчике посмотреть значения переменных можно
Как это сделать?

Цитата
ты забыл описать переменную C: char.
Аааа, да, забыл.

Цитата
я об авторах этой поделки - PascalABC
Какого ты о них невысокого мнения... smile.gif

Цитата
Я бы не рекомендовал тебе начинать работу с PascalABC,
Да, я уже об этом думал. Скорее всего, правда, надо скачать ТурбоПаскаль, а то у меня уже давно возникали проблемы в ABC с метками и бесило, то, что переменной нельзя присваивать тип longint, а только integer. Например в проге вычисления факториала это имеет значение. Имхо, косячный это маленько компиллятор.

Цитата
она в прошлый раз мне самовольно перековеркала все ассоциации файлов и так нагадила на диске, что я ее замучался потом выкорчевывать.
Нда не завидую тебе nea.gif
Вячеслав Л.
Все, взял программу, приведенную klem4, переделал ее на свой вкус. Кажется, разобрался с ней. Про множества, функции и процедуры прочитал в учебнике.

Цитата
Цитата
но в отладчике посмотреть значения переменных можно
Как это сделать?
уже, догадался.

Спасибо всем за советы.
Lapp
Цитата(Вячеслав Людской @ 29.10.2009 14:24) *
уже, догадался.
Вот и хорошо. Боюсь, я бы не сказал с ходу, как это делать в АВС.. smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.