Помощь - Поиск - Пользователи - Календарь
Полная версия: PASCAL: текстовые задачи и файлы
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
xxBOBAHxx
№1.
Расставить слова в каждом предложении в алфавитном порядке и одновременно рассортировать предложения по возрастанию количества слов в каждом.

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

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

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

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

Lapp
Посмотри прикрепленную тему про разбиения на слова в разделе Задачи.
xxBOBAHxx
Теперь у меня проблема. Я смог расставить слова по алфавиту во всем тексте, а мне надо расставить слова по алфавиту отдельно в каждом предложении.
Помогите мне осуществить данную цель, пожалуйста)))
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
Ты сначала разбивай на предложения (точка, многоточие, восклицательный и вопросительный знаки - оставлять их в конце предложения и убирать пробелы по краям предложений), а потом - на слова (пробелы, запятые, точка с запятой, тире..) отдельно по каждому предложению.
xxBOBAHxx
Чувствуя себя тупым.))НО не могли бы вы мне по-подробней объяснить что именно надо сделать. ПО-больше бы комментариев чтоб я понял.....если вас конечно не затруднит. Подправил чуть код, т.к. он изобиловал кучей ошибок, хотя изменился он от этого не сильно.....)))

[/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
может лудже всего будет следовать такому алгоритму

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

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

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

и выводим его

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