Помощь - Поиск - Пользователи - Календарь
Полная версия: Проверить программу
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Татьяна12678
проверьте пожалуйста правильно ли сделана программа:вот условие Дана последовательность,содержащая от 1 до 30 слов,в каждом из которых от 1 до 5 строчных латинских букв,между соседними словами-запятая,за последними словами-точка.Напечатать все различные слова,встречающиеся в последовательности более двух раз.
var
a,b:string;
c:byte;
begin
readln(a);
repeat begin
c:=pos(',',a);
b:=copy(a,1,c-1);
delete(a,1,c);
if pos(b,a)<>0 then write(b,' ');end;
until c=0;
end.

Очень надеюсь на вашу помощь))заранее спасибо!!!!
Lapp
Цитата(Татьяна12678 @ 23.05.2011 2:07) *
проверьте пожалуйста правильно ли сделана программа:вот условие Дана последовательность,содержащая от 1 до 30 слов,в каждом из которых от 1 до 5 строчных латинских букв,между соседними словами-запятая,за последними словами-точка.Напечатать все различные слова,встречающиеся в последовательности более двух раз.
var
a,b:string;
c:byte;
begin
readln(a);
repeat begin
c:=pos(',',a);
b:=copy(a,1,c-1);
delete(a,1,c);
if pos(b,a)<>0 then write(b,' ');end;
until c=0;
end.

Очень надеюсь на вашу помощь))заранее спасибо!!!!

Не совсем. Надо выводить повторяющиеся слова только один раз, а у тебя они выводятся n-1 раз. Исправить можно как-то так:
var
a,b:string;
c:byte;
begin
readln(a);
repeat
c:=pos(',',a);
b:=copy(a,1,c-1);
delete(a,1,c);
if pos(b,a)<>0 then begin
write(b,' ');
while pos(b,a)>0 do delete(a,pos(b,a),Length(b)+1)
end
until c=0;
end.

И еще: "repeat .. until" работают как операторные скобки, то есть "begin .. end" к ним не нужны.
IUnknown
Если и есть что хорошего в Pascal ABC - то это возможность использовать всю мощь .NET-а... Вот с использованием классов .NET задача решается так:

uses System.Collections.Generic;
var a : string;
begin
with new System.Collections.Generic.SortedList<string, integer> do
begin
readln(a);
foreach st:string in a.TrimEnd('.').Split(',') do
if ContainsKey(st) then
begin
Item[st] := Item[st] + 1;
if Item[st] = 3 then writeln(st);
end
else Add(st, 1);
end;
end.
smile.gif

P.S. Андрей, в задаче надо было
Цитата
Напечатать все различные слова,встречающиеся в последовательности более двух раз.
, твой код делает "более одного раза".
Lapp
Цитата(IUnknown @ 23.05.2011 12:46) *
Если и есть что хорошего в Pascal ABC - то это возможность использовать всю мощь .NET-а...
Круто! Правда, скорее всего, автор темы, скорее всего, не имела в виду .net, но все равно круто.

Цитата
P.S. Андрей, в задаче надо было
, твой код делает "более одного раза".
Спасибо - да, проглядел.. Исправлю свой код чуть позже.
+1
Lapp
Цитата(Lapp @ 23.05.2011 23:55) *
Исправлю свой код чуть позже.

Вот:
var
a,b:string;
c:byte;
begin
readln(a);
repeat
c:=pos(',',a);
b:=copy(a,1,c-1);
delete(a,1,c);
if pos(b,a)<>0 then begin
delete(a,pos(b,a),Length(b)+1);
if pos(b,a)<>0 then begin
write(b,' ');
while pos(b,a)>0 do delete(a,pos(b,a),Length(b)+1)
end
end
until c=0;
end.

Татьяна12678
Спасибо огромное,вы меня просто спасли!!!!!))))
Татьяна12678
А мне в курсовой надо написать вербальное описание этой программы,если вам не сложно можете помочь с описанием!!!!!
Lapp
Цитата(Татьяна12678 @ 26.05.2011 1:34) *
А мне в курсовой надо написать вербальное описание этой программы,если вам не сложно можете помочь с описанием!!!!!
Таня!!!!! Мы все можем!!!!! Мы только не хотим спойлить твое образование!!!!! Можешь написать свой начальный вариант!!!!! А мы подправим!!!!!


а иначе ты ничему не научишься.. no1.gif
Татьяна12678
Окей я попробую и выложу тогда!!!!!!спасибо!!!!!!
Lapp
Цитата(Татьяна12678 @ 26.05.2011 22:15) *
Окей я попробую и выложу тогда!!!!!!спасибо!!!!!!

Хорошо давай!!!!!!пока не за что!!!!!

smile.gif

Ты только не затягивай, потому что может потребоваться не одна итерация. Успехов тебе )
Татьяна12678
я пока не написала вербальное описание,но мне сказали что в программе нужен автоматический вывод на экран,когда жмешь на выполнение программы,чтобы не вводить вручную,у меня все никак не получается,вроде вывод на экран writeln,но автоматически не выводится(((
Татьяна12678
а вот пока начало вербального описания:
Данная программа выводит с экрана все различные слова,встречающиеся в последовательности более двух раз.
Для этого в программе мы вводим переменные типа строковые,которые применяются при использовании текстовых данных в программе,состоит из набора последовательно расположенных символов char) и байтовые.....а дальше пока думаю как писать((((((((
Krjuger
Чтобы не вводить каждый раз самой можно, либо сделать в самом коде программы строку константой, либо сделать так,чтобы читалось из файла.Насчет вербального описания,дальше можно прям построчно идти и писать,что делалось в каждой строке.(До тех пор ,пока не дойдет до конча строки мы читаем слово,заведомо зная ,что между словами стоит разделитель ",",записываем слово в результирующую строку и тд)
Татьяна12678
а как здесь сделать строку константой?подскажите пожалуйста!!!!у меня что-то не выходит!!!!
Krjuger
const Name: String[9]= 'IBM PC/AT';

Вот тебе строковая константа из 9 символов,если хочеш можеш после слова string убрать скобочки с цифрой и тогда у тебя под строку выделится 255 символов.
IUnknown
Цитата
если хочеш можеш после слова string убрать скобочки с цифрой и тогда у тебя под строку выделится 255 символов.
Ага, щаззз. В PascalABC другие правила, это тебе не Турбо-Паскаль...

Кроме того, если описать строку так:
const a : string = 'тут сама строка';
, то ABC начнет возмущаться ниже по коду, при попытке удалить часть константной строки. Так что описывай, как описывала, просто инициализируй строку в начале программы:
var
a,b:string;
c:byte;
begin
a := 'one,two,two,three,four,two,five,one,one,two.';
repeat
...


Кстати, PascalABC имеет одну не очень хорошую черту, по крайней мере PascalABC.NET 1.7 сборка 452 (ну, вообще-то не одну, но эта - вообще какой-то кошмар) :
var a, b : string;
begin
a := ''; b := '';
writeln(pos(a, b));
end.
Напечатает не 0, а 1, поэтому программа, приведенная Lapp-ом в 5-ом посте может зависнуть, если будет запускаться на .NET-овской версии Pascal ABC. Как вариант исправления:
    if (c > 0) and (pos(b,a)<>0) then begin
Krjuger
Тьфу ты из головы вылетело,что ABC ,sorry wub.gif
Lapp
Цитата(Татьяна12678 @ 31.05.2011 17:17) *
а вот пока начало вербального описания:
Данная программа выводит с экрана все различные слова,встречающиеся в последовательности более двух раз.
Для этого в программе мы вводим переменные типа строковые,которые применяются при использовании текстовых данных в программе,состоит из набора последовательно расположенных символов char...
, которые содержат инофрмацию обиспользуемом символе, который представляет собой начертательное изображение лингвистической единицы, состоящее из палочек, кружочков и крючочков, объединенных в единое целое (целый тип представляет недробные числа со знаком в диапазоне от -32768 до 32767, а дробные - это те, которые с точкой или с дробной чертой, блин, ну чо пристали, я вам инцэглупедия штоле???)

smile.gif smile.gif smile.gif
Не нужно так подробно.
Я буду описывать свой вариант (пост #5)
Данная программа выводит с экрана все различные слова,встречающиеся в последовательности более двух раз.
Для входных данных используется переменная a типа string (выражайся точнее, в Паскале НЕТ типа "строковой"). Для найденных слов используется переменная b, также типа string. Для нахождения очередного слова определяем положение разделителя "," (запятая). В переменную b копируем кусок строки a до разделителя, после чего удаляем этот кусок из a. Далее проверяем наличие слова b в оставшейся части строки a. Если слово найдено, удаляем его из a и производим повторную проверку. Если результат положительный - выводим слово на печать и удаляем все вхождения слова b в строку a. Далее повторяем все действия, начиная с нахождения очередного слова, до тех пор, пока переменная a не опустеет.
Гость
Спасибо большое за помощь,думаю теперь точно все сдам))))))))))
Lapp
Цитата(Гость @ 4.06.2011 13:32) *
думаю теперь точно все сдам))))))))))
Вот это меня нисколько не волнует. Если скажешь, что теперь знаешь больше - мне действительно будет приятно..
Гость
Да действительно,пока я разбиралась с этими программами,я действительно стала больше знать!!!!Благодаря вам!!!!спасибо большое еще раз!!!!На 4 сдала кстати!!!!))))))))
зайцев роман
Дана последовательность содержащая от 1 до 30 слов в каждом из которых от 1 до 5 строчных латинских букв между соседними словами запятая за последним словом точка.вывести все слова которые встречаются по одному разу! помогите пожалуйста написать программу!!!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.