Помощь - Поиск - Пользователи - Календарь
Полная версия: Строки
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Eichhorn
Ну, теперь у меня проблемы с задачей на строки.
Задача:
Дана непустая последовательность слов. Слова разделяются пробелами, запятыми. Текст заканчивается символом "*". Написать программу для подсчета количества слов и вывести все слова, отличные от первого слова.

Программу я написать не смогла, тк даже не знаю что там можно использовать. Считать слова-это, можно просто поставить счётчик и когда после последовательности символов встречается пробел, запятая или *-увеличивать его на еденицу. У меня также получилось выделить первое слово. Но я не знаю как можно сравнивать другие слова с ним. Можно поставить оператор if и если слова одинаковые, то удалять с помощью delete. Но как выполнить само сравнение слов? Кто-нибудь может подсказать? Я по форуму попыталась найти, но похожего не встретила...
volvo
Вот тут есть нечто подобное:
И снова строки
еще одно:
Двумерные массивы
(а говоришь - не встретила. Запрос +слов* +отлич* +первого в строке поиска, если что)

Посмотри, как решались те задачи, и сделай для своего условия...
Eichhorn
Спасибо! Попробую разобраться.
Eichhorn
Люди! Хэлп! Не могу понять как сравнить слова с первым. Вот текст программы, которая есть:

var
s,s1,s2:string;
i,p,j,r,d:integer;
begin
readln(s);
for i:=1 to length(s) do
begin
r:=pos(' ',s);
d:=pos(',',s);
if r>d then
begin
s1:=copy(s,1,d-1);
p:=d;
end
else
begin
p:=r;
s1:=copy(s,1,r-1);
end;
end;
for i:=p to length(s) do
begin
r:=pos(' ',s);
d:=pos(',',s);
if r>d then p:=d else p:=r;

for j:=p to length(s) do
begin
if (s[j]<>' ') and (s[j]<>',') then
s2:=copy(s,j,pos(' ',s));
end;
if s2=s1 then delete(s,p,length(s2));
end;


writeln(s);
readln;
end.



Ну просто очень нужно. А как сделать-не понимаю....
volvo
Алена, зачем же так сложно?

Задача, описанная в первом посте. решается вот так (я добавил комментарии, так что разобраться будет просто) :

{ Для начала задаем список символов, которые считаются разделителями }
const
Ds = [' ', ',', '*'];

var
i, start, count : integer;
s : string;
first_word, curr_word : string;

begin
s := 'first, second, one, two, three, first, next, first*';

{ Начали... Естественно, счетчик слов = 0, еще ничего не нашли }
count := 0;

i := 1;
while i <= length (s) do { Пока не доберемся до конца строки... }
begin

{ Пропускаем все разделители, идущие перед словом }
while (i <= length (s)) and (s[ i ] in Ds) do inc (i);

{ Если предыдущий цикл не вылетел за границы строки - то продолжаем }
if i <= length (s) then
begin
{ Запоминаем позицию, где встретилась первая буква слова }
start := i;

{ И идем, пока НЕ встретим разделитель }
while (i <= length(s)) and not (s[ i ] in Ds) do inc (i);

{
Теперь у нас есть start - индекс начала слова, i - индекс конца слова
Пользуясь этой информацией вытягиваем само слово в переменную curr_word
и увеличиваем счетчик слов.
}
curr_word := copy (s, start, i - start);
inc (count);

{
Если найденное слово - первое, то запоминаем его,
иначе - сравниваем текущее с первым, при неравенстве- выводим
}
if count = 1 then
first_word := curr_word
else
if curr_word <> first_word then write (curr_word, ' ');
end;
end;

{ Все, концерт окончен, печатаем общее количество слов }
writeln;
writeln (count, ' word(s)');
end.
Eichhorn
Спасибо большое! Так даже понятнее) Я сдавала эту задачу, решенную страшекурсниками таким способом:

var
str,s1,outStr :string;
i, s, start:integer;
equal:boolean;
begin

readln(str);
writeln(str);
s := 0;
start:=0;
equal:=true;
for i:=1 to length(str) do
begin
if (str[i] <> ',') and (str[i] <> ' ') and (str[i] <> '*') and (s = 0) then
s1 := s1 + str[i];
if (str[i] <> ',') and (str[i] <> ' ') and (str[i] <> '*') and ((str[i-1] = ',') or (str[i-1] = ' ')) then
start := i;
if (start<>0)and(str[i] <> ',') and (str[i] <> ' ') and (str[i] <> s1[i - start + 1]) then
equal:=false;
if ((str[i] = ',') or (str[i] = ' ') or (str[i]='*')) and ((str[i - 1] <> ',') and
(str[i - 1] <> ' ')) then
begin
inc(s);
if not equal then
outStr:=outStr + copy(str,start,i - start) + ' ';
equal:=true;
end;
if str[i] = '*' then break;
end;
writeln(s);
writeln(outStr);
readln;
end.


повезло, что по ней не спрашивали, иначе этот вышеописанный код вряд ли смогла бы объяснить)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.