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

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

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

 
 Ответить  Открыть новую тему 
> Строковые переменные
сообщение
Сообщение #1


Гость






??? Привет! Чайник просит помощи у умных людей!!!
Помогите решить задачу на строковые переменные. Задача: Сколько одинаковых слов в предложении, введенном с клавиатуры? Вывести на экран слова и их количество. Заранее большое спасибо
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Четыре квадратика
****

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

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


Давай начнем с начала.
Первым делом нужно уметь разделять строку на слова. Эти слова можно запихивать, допустим, в массив. Это получается? Если нет, поищи на форуме - такое тут обсуждалось... раз 20-30 +)


--------------------
Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Слова я разделяю с помощью copy. Только у меня программа получается с целой кучей циклов. Вопрос: нельзя ли ее сделать по-проще?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Бывалый
***

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

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


А как узнаешь координаты слова? с помощью Pos? тогда для разделения нужен один цикл - while pos('<пробел>',s)<>0 do - или лучше аналогичный repeat ... until. Только этот метод неудобен, если слова могут разделяться не только пробелами, но и запятыми и т.д. Если учитывать все знаки препинания, понадобится еще цикл. Лучше сделать один цикл for по длине строки и каждый символ сравнивать с множеством знаков препинаний, и добавлять к слову, если это буква... затем полученное слово сравнить с массивом и либо увеличить счетчик во втором числовом массиве, либо дополнить массив слов. т.е. получается еще вложенный for, плюс цикл на вывод результатов - 3(три) цикла на программу. А у тебя сколько ?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Четыре квадратика
****

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

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


Попробуй изменить такую программу, чтобы в массив А не вставлялись повторяющиеся слова
Код

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@, будет короче, но можно запутаться (наверное... я как-то писАл так, долго глючил. С тех пор так вот делаю +) ). А эта программа, по-моему, проще для понимания.


--------------------
Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Бывалый
***

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

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


я вобщем-то понял, что автору надо, чтоб подсчиталось количество одинаковых слов, т.е. если слово в массиве уже есть, нужно просто увеличить счетчик этого слова - а для этого нужен еще массив чисел.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






А можно это сделать без массивов, используя только функции для строковых переменных, циклы и т.д.?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Четыре квадратика
****

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

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


По-моему, нет... надо же где-то запоминать,какое слово сколько раз встречалось.
А вообще, возможно, пригодится примерно такая структура:
Код

type TWordInfo = record
 s: string; {Само слово}
 count: byte; {Сколько раз оно встречалось}
end;
var a: array[1..10] of TWordInfo;

То есть если слово не встречалось, добавляем в массив A запись, поле s - это слово, поле count = 1. А если встречалось (перед добавлением пройтись по массиву и проверить, нет ли записи, поле s в которой совпадает с новым словом), то просто увеличить значение count там.


--------------------
Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Бывалый
***

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

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


хм, столько ошибок... зачем нужны 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"Корвет" ?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Мне сказали, что к - это счетчик повторяющихся слов. n - это обозначение length(s)
smile.gifP@sh@! Спасибо за программу! Оказывается все намного проще чем мне объясняли!
:)trminator! Тоже большое спасибо за участие!
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Четыре квадратика
****

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

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


м-да? кто-то тут программировать явно разучился... причем это не P@sh@ и не ты +) P@sh@, респект +) прога супер.

Хотя разделители не только пробелы. Еще запятые, точки, ... (хотя тут как в задании сказано). А это ИМХО pos'ом уже запарнее будет.


--------------------
Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Бывалый
***

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

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


ну, я это еще в первый раз говорил, что проблема будет с другими знаками препинания, но раз это не важно, фиг с ним
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Четыре квадратика
****

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

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


Нет, все-таки бага:
Ввожу hello hellow
Ответ: hello

Цитата
if pos(s1,s)>0 then writeln(s1);

Корректно будет добавить к s1 спереди и сзади по пробелу, и в строчку тоже по пробелу в начале и в конце. Тогда должно работать


--------------------
Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Бывалый
***

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

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


ага, а также по запятой, по точке и т.д.smile.gif

и правда, у функции pos к сожалению нету опции "слово целиком":)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 




- Текстовая версия 20.09.2017 7:12
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"