Форум «Всё о Паскале» _ Задачи _ Проверить программу
Автор: Татьяна12678 23.05.2011 5: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.
Очень надеюсь на вашу помощь))заранее спасибо!!!!
Автор: Lapp 23.05.2011 12:01
Цитата(Татьяна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 23.05.2011 15:46
Если и есть что хорошего в 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.
P.S. Андрей, в задаче надо было
Цитата
Напечатать все различные слова,встречающиеся в последовательности более двух раз.
, твой код делает "более одного раза".
Автор: Lapp 24.05.2011 2:55
Цитата(IUnknown @ 23.05.2011 12:46)
Если и есть что хорошего в Pascal ABC - то это возможность использовать всю мощь .NET-а...
Круто! Правда, скорее всего, автор темы, скорее всего, не имела в виду .net, но все равно круто.
Цитата
P.S. Андрей, в задаче надо было , твой код делает "более одного раза".
Спасибо - да, проглядел.. Исправлю свой код чуть позже. +1
Автор: Lapp 24.05.2011 3:50
Цитата(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 24.05.2011 4:06
Спасибо огромное,вы меня просто спасли!!!!!))))
Автор: Татьяна12678 26.05.2011 4:34
А мне в курсовой надо написать вербальное описание этой программы,если вам не сложно можете помочь с описанием!!!!!
Автор: Lapp 26.05.2011 5:57
Цитата(Татьяна12678 @ 26.05.2011 1:34)
А мне в курсовой надо написать вербальное описание этой программы,если вам не сложно можете помочь с описанием!!!!!
Таня!!!!! Мы все можем!!!!! Мы только не хотим спойлить твое образование!!!!! Можешь написать свой начальный вариант!!!!! А мы подправим!!!!!
а иначе ты ничему не научишься..
Автор: Татьяна12678 27.05.2011 1:15
Окей я попробую и выложу тогда!!!!!!спасибо!!!!!!
Автор: Lapp 27.05.2011 3:48
Цитата(Татьяна12678 @ 26.05.2011 22:15)
Окей я попробую и выложу тогда!!!!!!спасибо!!!!!!
Хорошо давай!!!!!!пока не за что!!!!!
Ты только не затягивай, потому что может потребоваться не одна итерация. Успехов тебе )
Автор: Татьяна12678 31.05.2011 19:36
я пока не написала вербальное описание,но мне сказали что в программе нужен автоматический вывод на экран,когда жмешь на выполнение программы,чтобы не вводить вручную,у меня все никак не получается,вроде вывод на экран writeln,но автоматически не выводится(((
Автор: Татьяна12678 31.05.2011 20:17
а вот пока начало вербального описания: Данная программа выводит с экрана все различные слова,встречающиеся в последовательности более двух раз. Для этого в программе мы вводим переменные типа строковые,которые применяются при использовании текстовых данных в программе,состоит из набора последовательно расположенных символов char) и байтовые.....а дальше пока думаю как писать((((((((
Автор: Krjuger 1.06.2011 16:34
Чтобы не вводить каждый раз самой можно, либо сделать в самом коде программы строку константой, либо сделать так,чтобы читалось из файла.Насчет вербального описания,дальше можно прям построчно идти и писать,что делалось в каждой строке.(До тех пор ,пока не дойдет до конча строки мы читаем слово,заведомо зная ,что между словами стоит разделитель ",",записываем слово в результирующую строку и тд)
Автор: Татьяна12678 1.06.2011 22:03
а как здесь сделать строку константой?подскажите пожалуйста!!!!у меня что-то не выходит!!!!
Автор: Krjuger 2.06.2011 17:55
const Name: String[9]= 'IBM PC/AT';
Вот тебе строковая константа из 9 символов,если хочеш можеш после слова string убрать скобочки с цифрой и тогда у тебя под строку выделится 255 символов.
Автор: IUnknown 2.06.2011 20:10
Цитата
если хочеш можеш после слова 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 2.06.2011 21:34
Тьфу ты из головы вылетело,что ABC ,sorry
Автор: Lapp 3.06.2011 9:19
Цитата(Татьяна12678 @ 31.05.2011 17:17)
а вот пока начало вербального описания: Данная программа выводит с экрана все различные слова,встречающиеся в последовательности более двух раз. Для этого в программе мы вводим переменные типа строковые,которые применяются при использовании текстовых данных в программе,состоит из набора последовательно расположенных символов char...
, которые содержат инофрмацию обиспользуемом символе, который представляет собой начертательное изображение лингвистической единицы, состоящее из палочек, кружочков и крючочков, объединенных в единое целое (целый тип представляет недробные числа со знаком в диапазоне от -32768 до 32767, а дробные - это те, которые с точкой или с дробной чертой, блин, ну чо пристали, я вам инцэглупедия штоле???)
Не нужно так подробно. Я буду описывать свой вариант (пост #5) Данная программа выводит с экрана все различные слова,встречающиеся в последовательности более двух раз. Для входных данных используется переменная a типа string (выражайся точнее, в Паскале НЕТ типа "строковой"). Для найденных слов используется переменная b, также типа string. Для нахождения очередного слова определяем положение разделителя "," (запятая). В переменную b копируем кусок строки a до разделителя, после чего удаляем этот кусок из a. Далее проверяем наличие слова b в оставшейся части строки a. Если слово найдено, удаляем его из a и производим повторную проверку. Если результат положительный - выводим слово на печать и удаляем все вхождения слова b в строку a. Далее повторяем все действия, начиная с нахождения очередного слова, до тех пор, пока переменная a не опустеет.
Автор: Гость 4.06.2011 16:32
Спасибо большое за помощь,думаю теперь точно все сдам))))))))))
Автор: Lapp 5.06.2011 5:11
Цитата(Гость @ 4.06.2011 13:32)
думаю теперь точно все сдам))))))))))
Вот это меня нисколько не волнует. Если скажешь, что теперь знаешь больше - мне действительно будет приятно..
Автор: Гость 16.06.2011 2:54
Да действительно,пока я разбиралась с этими программами,я действительно стала больше знать!!!!Благодаря вам!!!!спасибо большое еще раз!!!!На 4 сдала кстати!!!!))))))))
Автор: зайцев роман 18.10.2012 17:52
Дана последовательность содержащая от 1 до 30 слов в каждом из которых от 1 до 5 строчных латинских букв между соседними словами запятая за последним словом точка.вывести все слова которые встречаются по одному разу! помогите пожалуйста написать программу!!!