![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
Очередная |
![]()
Сообщение
#1
|
Гость ![]() |
??? Привет! Чайник просит помощи у умных людей!!!
Помогите решить задачу на строковые переменные. Задача: Сколько одинаковых слов в предложении, введенном с клавиатуры? Вывести на экран слова и их количество. Заранее большое спасибо |
trminator |
![]()
Сообщение
#2
|
Четыре квадратика ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 579 Пол: Мужской Репутация: ![]() ![]() ![]() |
Давай начнем с начала.
Первым делом нужно уметь разделять строку на слова. Эти слова можно запихивать, допустим, в массив. Это получается? Если нет, поищи на форуме - такое тут обсуждалось... раз 20-30 +) -------------------- Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала |
Очередная |
![]()
Сообщение
#3
|
Гость ![]() |
Слова я разделяю с помощью copy. Только у меня программа получается с целой кучей циклов. Вопрос: нельзя ли ее сделать по-проще?
|
P@sh@ |
![]()
Сообщение
#4
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 180 Пол: Мужской Репутация: ![]() ![]() ![]() |
А как узнаешь координаты слова? с помощью Pos? тогда для разделения нужен один цикл - while pos('<пробел>',s)<>0 do - или лучше аналогичный repeat ... until. Только этот метод неудобен, если слова могут разделяться не только пробелами, но и запятыми и т.д. Если учитывать все знаки препинания, понадобится еще цикл. Лучше сделать один цикл for по длине строки и каждый символ сравнивать с множеством знаков препинаний, и добавлять к слову, если это буква... затем полученное слово сравнить с массивом и либо увеличить счетчик во втором числовом массиве, либо дополнить массив слов. т.е. получается еще вложенный for, плюс цикл на вывод результатов - 3(три) цикла на программу. А у тебя сколько ?
|
trminator |
![]()
Сообщение
#5
|
Четыре квадратика ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 579 Пол: Мужской Репутация: ![]() ![]() ![]() |
Попробуй изменить такую программу, чтобы в массив А не вставлялись повторяющиеся слова
Код program strngs; const razdel: set of char = [' ',',','.']; {разделители слов - пробел, точка, запятая. Больше не придумал +)} var a: array[1..10] of string[20]; i, j, n : integer; s, part: string; begin ReadLn(s); i:=1; j:=1; n:=length(s); while i<=n do begin while s[i] in razdel do inc(i); {пропускаем разделители слов} while (i<=n) and not (s[i] in razdel) do begin part:=part+s[i]; inc(i); {накапливаем строку} end; a[j]:=part; {<== тут изменить +)} inc(j) {ищем следующее слово} end; {Ну тут их вывести. В переменной j должно получиться количество слов} end. Слово накапливается в строке part, перед тем, как добавлять его в массив, нужно проверить, нет ли его уже там. Все-таки такое уже было на форуме... что-то искать лень. Можно сделать, как говорит P@sh@, будет короче, но можно запутаться (наверное... я как-то писАл так, долго глючил. С тех пор так вот делаю +) ). А эта программа, по-моему, проще для понимания. -------------------- Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала |
P@sh@ |
![]()
Сообщение
#6
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 180 Пол: Мужской Репутация: ![]() ![]() ![]() |
я вобщем-то понял, что автору надо, чтоб подсчиталось количество одинаковых слов, т.е. если слово в массиве уже есть, нужно просто увеличить счетчик этого слова - а для этого нужен еще массив чисел.
|
Очередная |
![]()
Сообщение
#7
|
Гость ![]() |
А можно это сделать без массивов, используя только функции для строковых переменных, циклы и т.д.?
|
trminator |
![]()
Сообщение
#8
|
Четыре квадратика ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 579 Пол: Мужской Репутация: ![]() ![]() ![]() |
По-моему, нет... надо же где-то запоминать,какое слово сколько раз встречалось.
А вообще, возможно, пригодится примерно такая структура: Код type TWordInfo = record s: string; {Само слово} count: byte; {Сколько раз оно встречалось} end; var a: array[1..10] of TWordInfo; То есть если слово не встречалось, добавляем в массив A запись, поле s - это слово, поле count = 1. А если встречалось (перед добавлением пройтись по массиву и проверить, нет ли записи, поле s в которой совпадает с новым словом), то просто увеличить значение count там. -------------------- Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала |
Очередная |
![]()
Сообщение
#9
|
Гость ![]() |
А мне подсказали вот этот вариант, только он выводит начальные буквы двух слов. Посмотрите, пожалуйста. какая в программе ошибка.
Код Program strings; Var j,n:integer; s,sl,s1:string; I,k:byte; Begin Writeln (‘Введите строку:’); Readln (s); k:=1; j:=1; For I:=1 to length(s) do If s[I]=’ ‘ then Begin Sl:=copy(s,j+1,k); j:=I; k:=0; s1:=copy (s,j,length(s)); If pos(sl,s1)=0 then Begin Writeln (sl); k:=k+1; s1:=copy(s,I+1,n); End; k:=k+1; End; End. Сообщение отредактировано: volvo - |
P@sh@ |
![]()
Сообщение
#10
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 180 Пол: Мужской Репутация: ![]() ![]() ![]() |
хм, столько ошибок... зачем нужны j и k? n вообще неизвестно чему равна
задумка в общем-то понятна, реализуется гораздо легче: Код program superstrings; var s,s1: string; i: integer; begin writeln('Enter the String:'); readln(s); while s<>'' do begin i:=pos(' ',s); // в кавычках пробел if i=0 then i:=length(s)+1; s1:=copy(s,1,i-1); s:=copy(s,i+1,length(s)); if pos(s1,s)>0 then writeln(s1); end; end. если б я знал, что pos может искать не только символ, но и строку! я бы сразу это написал. блин. почему-то у меня в памяти сохранилось такое описание функции - pos(c: char; s: string): integer; - откуда, интересно? может со времен Express Pascal'я на советских машинах ПК8010"Корвет" ? |
Очередная |
![]()
Сообщение
#11
|
Гость ![]() |
Мне сказали, что к - это счетчик повторяющихся слов. n - это обозначение length(s)
![]() :)trminator! Тоже большое спасибо за участие! |
trminator |
![]()
Сообщение
#12
|
Четыре квадратика ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 579 Пол: Мужской Репутация: ![]() ![]() ![]() |
м-да? кто-то тут программировать явно разучился... причем это не P@sh@ и не ты +) P@sh@, респект +) прога супер.
Хотя разделители не только пробелы. Еще запятые, точки, ... (хотя тут как в задании сказано). А это ИМХО pos'ом уже запарнее будет. -------------------- Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала |
P@sh@ |
![]()
Сообщение
#13
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 180 Пол: Мужской Репутация: ![]() ![]() ![]() |
ну, я это еще в первый раз говорил, что проблема будет с другими знаками препинания, но раз это не важно, фиг с ним
|
trminator |
![]()
Сообщение
#14
|
Четыре квадратика ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 579 Пол: Мужской Репутация: ![]() ![]() ![]() |
Нет, все-таки бага:
Ввожу hello hellow Ответ: hello Цитата if pos(s1,s)>0 then writeln(s1); Корректно будет добавить к s1 спереди и сзади по пробелу, и в строчку тоже по пробелу в начале и в конце. Тогда должно работать -------------------- Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала |
P@sh@ |
![]()
Сообщение
#15
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 180 Пол: Мужской Репутация: ![]() ![]() ![]() |
ага, а также по запятой, по точке и т.д.
![]() и правда, у функции pos к сожалению нету опции "слово целиком":) |
![]() ![]() |
![]() |
Текстовая версия | 11.02.2025 2:22 |