Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ PASCAL: текстовые задачи и файлы

Автор: xxBOBAHxx 8.12.2008 1:01

№1.
Расставить слова в каждом предложении в алфавитном порядке и одновременно рассортировать предложения по возрастанию количества слов в каждом.

ПРИМЕР:
дано: Жили, жили не тужили дед да бабка.(7 слова) Долго они жили и счастливо.(5 слов)
требуемый результат: Долго жили и они счастливо. Бабка да дед жили жили не тужили.(все слова в обоих предложениях в алфавитном порядке)

Общие указания при составлении программы:
1. Текст стандартного типа String ввести с клавиатуры.
2. Между словами могут быть различные разделители (пробел, запятая, точка и т.д.), которые необходимо задать во множестве.
3. Вывести исходный текст и текст после преобразования его по условию задачи.

№2.
Создать файл f1 из целых чисел. Создать новый файл f2, содержащий неубывающую последовательность файла f1 и включающий в себя минимальный элемент файла f1.

Общие указания при составлении программы:
В данной лабораторной работе необходимо сделать типизированный файл, где каждой компонентой будет число, массив или матрица. Количество компонент заранее не определено, поэтому, при обработке файла необходимо использовать либо булевское значение функции EOF (конец файла), либо значение функции FILESIZE (размер файла).
Сами значения каждой компоненты можно задавать генератором случайных чисел.
Вывод исходного файла и файла с результатами сделать процедурой (и, если файлы одного типа, то одной процедурой).


Автор: Lapp 8.12.2008 14:56

Посмотри прикрепленную тему про разбиения на слова в разделе Задачи.

Автор: xxBOBAHxx 8.12.2008 22:46

Теперь у меня проблема. Я смог расставить слова по алфавиту во всем тексте, а мне надо расставить слова по алфавиту отдельно в каждом предложении.
Помогите мне осуществить данную цель, пожалуйста)))
P.S. А рассортировать рассортировать предложения по возрастанию количества слов в каждом я попытаюсь сам)))


var t1, t2:string;
mn:set of char;
a:array[1..50] of string[25];
c:string[25];
kb, ksl, i, k, kp, e:byte;
p:boolean;
begin
readln(t1); t1:=t1+'';
mn:=['.', ' ', ','];
kb:=0; ksl:=0;
for i:=1 to length(t1) do
if not (t1[i] in mn) then inc (kb)
else if kb>0 then
begin
inc(ksl);
a[ksl]:=copy(t1, i-kb, kb);
kb:=0;
end;
k:=ksl;
inc(k);
repeat
p:=true; dec(k);
for i:=1 to k do
if length (a[i])>length (a[i+1]) then
begin
c:=a[i];
a[i]:=a[i+1];
a[i+1]:=c;
p:=false;
end;
until p or (t1[i] in mn);
t2:='';
for i:=1 to ksl do
t2:=t2+a[i]+' ';
writeln('text v alfavitnom poradke', t2);
end.


Автор: Lapp 8.12.2008 23:08

Ты сначала разбивай на предложения (точка, многоточие, восклицательный и вопросительный знаки - оставлять их в конце предложения и убирать пробелы по краям предложений), а потом - на слова (пробелы, запятые, точка с запятой, тире..) отдельно по каждому предложению.

Автор: xxBOBAHxx 9.12.2008 1:01

Чувствуя себя тупым.))НО не могли бы вы мне по-подробней объяснить что именно надо сделать. ПО-больше бы комментариев чтоб я понял.....если вас конечно не затруднит. Подправил чуть код, т.к. он изобиловал кучей ошибок, хотя изменился он от этого не сильно.....)))

[/i]

Код

var t1, t2:string;
mn, mn1:set of char;
a:array[1..50] of string[25];
c:string[25];
kb, kp, ksl, i, k:byte;
p:boolean;
begin
  readln(t1); t1:=t1+'';
  mn1:=['.', '!', '?'];
  mn:=[' ', ',', '-', ':', ';'];
  kp:=0;
  kb:=0; ksl:=0;
  for i:=1 to length(t1)  do
  if  (t1[i] in mn1) then inc (kp);  writeln('kol-vo pred =', kp);{считаю кол-во предложений}

  for i:=1 to length(t1)  do
  if not (t1[i] in mn) then inc (kb)
  else if kb>0 then{пустые слова не берем}
    begin
      inc(ksl);{счетчик слов}
      a[ksl]:=copy(t1, i-kb, kb);
      kb:=0;
    end;
  k:=ksl;
  repeat{сортируем в алфавитном порядке}
    p:=true; dec(k);
    for i:=1 to k do
      if (a[i])>(a[i+1]) then {сравниваем сами слова}
        begin
          c:=a[i];
          a[i]:=a[i+1];
          a[i+1]:=c;
          p:=false;
        end;
      until p;
  t2:='';
  for i:=1 to ksl do
  t2:=t2+a[i]+' ';
  writeln('text v alfavitnom poradke   ', t2);
end.

Автор: amega 9.12.2008 2:31

может лудже всего будет следовать такому алгоритму

1 ищем позицию (pos) входа разделительного знака(пробела запятой)ж
2 копируем от начала до pos-1 в какуюту переменную (так мы виделим вхождение слова)ж
3 переносим переменную в массив
4 удаляем от начала до pos
5 удаляем пробел (вдруг у нас после слова стояла запятя) (в делфи есть процедура тримлефл если в паскале нету то могу написать)

етот цикл делаем до тех пор пока pos cтанет равно 0 (тоесть строка закончилась).

Теперь сортируем массив

и выводим его

PS если нужно отдель2 предложения то вставляем такой анализ если символ равен точке то начинаем новый массив и тогда сортируем 2 массива

Автор: volvo 9.12.2008 2:42

Цитата
xxBOBAHxx
, ты сначала с заданием все вопросы реши, а потом будешь реализовывать, договорились? Тебе понятно задание от начала и до конца? Мне вот - не совсем... Смотри:
Цитата
2. Между словами могут быть различные разделители (пробел, запятая, точка и т.д.), которые необходимо задать во множестве.
Почему не указано что именно должно происходить с НЕпробельными разделителями в предложении после сортировки слов по алфавиту? Если как минимум 2 варианта:
1) удалить все лишние разделители и оставить по одному пробелу;
2) оставить все разделители на местах, поменять местами только сами слова (довольно часто именно этот вариант встречается на форумах, я специально для таких случаев добавил выделение слов в массив записей - пост №6 в прикрепленной теме)...