Помощь - Поиск - Пользователи - Календарь
Полная версия: Работа со строками
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
d1monn
Уважаемые знатоки! Внимание, нужно написать программу, которая вводит строку символов и выводит на экран сначала предложення, которые начинаются с однобуквенных слов, а потом все остальные. Заранее спасибо! Очень на вас надеюсь.
Bokul
Цитата
выводит на экран сначала предложення

Что считать предложением?

Свои наработки есть? В чем возникли затруднения?
d1monn

program Project2;

{$APPTYPE CONSOLE}

const MLA=['A'..'Z','a'..'z'];
      MRZ=['.','!'];
var l,i,k,zzr,ps:integer; s:string;
begin
    readln(s);
    l:=length(s);
    i:=1;
    k:=0;
    while i<=l do begin
      zzr:=0;
      while (i<=l) and not (s[i] in MLA) do begin
        if s[i] in MRZ then inc(zzr);
        inc(i);
      end;
      if i<=l then begin
        k:=k+1;
        ps:=i;
        while (i<=l) and (s[i] in MLA) do  i:=i+1;
        if ((k=1) or (zzr>0)) and (i-ps=1) then  writeln(copy(s,ps,1));
        if 

      end;
    end;
    write(k);
    readln;
    readln;
    end.

Bokul
А комментарии к этому можно?
d1monn
S- строка
MLA- множество лат. алфавита
MRZ- множество знаков препинания
k- кол-во слов в тексте
ps- первое слово

В итоге у меня выводится только первое однобуквенное слово предложения и кол-во слов в тексте. Надо изменить исходник так, чтобы сначала шли предложения, которые начинаются с однобуквенных слов, а потом остальные предложения текста. Пример такого предложения: В лесу родилась елочка. За критерий окончания предложения взято . ! , Помогите мне пожалуйста!
Bokul
Вот smile.gif , вроде то, что надо...
 
const
   WordSeparators=[' ',',',';'];
   SentenceSeparators=['?','.','!'];

Function FindFirstWord(s:string):string;
var i:byte;
    buf:string;
begin
  buf:='';
  for i:=1 to length(s) do
      begin
           if (s[i] in WordSeparators) and (buf<>'') then
              break;
           if not(s[i] in WordSeparators) then
             buf:=buf+s[i];
      end;
  FindFirstWord:=buf;
end;

Function FindFirstSentence(s:string):string;
var buf:string;
    i:byte;
begin
  i:=0;
  buf:='';
  repeat
        inc(i);
        buf:=buf+s[i];
  until (s[i] in SentenceSeparators) or (i=length(s));
  FindFirstSentence:=buf;
end;

procedure MoveToEnd(from,num:byte; var s:string);
var buf:string;
begin
  buf:=copy(s,from,num);
  delete(s,from,num);
  s:=s+buf;
end;

function Result(s:string):string;
var sentence:string;
    from,size,last:byte;
begin
    from:=1;
    last:=length(s);
    repeat
          sentence:=FindFirstSentence(copy(s,from,last));
          size:=length(sentence);
          if length(FindFirstWord(sentence))=1 then
             inc(from,size)
          else
              begin
                   MoveToEnd(from,size,s);
                   dec(last,size);
              end;
    until from>=last;
    Result:=s;
end;

var s:string;
begin
  s:=', , Hello. I am so cool . I am so big. Yes! Pascal. I am so clever ';
  writeln(s);
  writeln(Result(s));
  readln;
end.


Старался давать переменным и функциям понятные имена, так что все должно быть понятно.
6ac9k
Цитата(Bokul @ 10.12.2006 2:55) *

Вот smile.gif , вроде то, что надо...
 
const
   WordSeparators=[' ',',',';'];
   SentenceSeparators=['?','.','!'];

Function FindFirstWord(s:string):string;
var i:byte;
    buf:string;
begin
  buf:='';
  for i:=1 to length(s) do
      begin
           if (s[i] in WordSeparators) and (buf<>'') then
              break;
           if not(s[i] in WordSeparators) then
             buf:=buf+s[i];
      end;
  FindFirstWord:=buf;
end;

Function FindFirstSentence(s:string):string;
var buf:string;
    i:byte;
begin
  i:=0;
  buf:='';
  repeat
        inc(i);
        buf:=buf+s[i];
  until (s[i] in SentenceSeparators) or (i=length(s));
  FindFirstSentence:=buf;
end;

procedure MoveToEnd(from,num:byte; var s:string);
var buf:string;
begin
  buf:=copy(s,from,num);
  delete(s,from,num);
  s:=s+buf;
end;

function Result(s:string):string;
var sentence:string;
    from,size,last:byte;
begin
    from:=1;
    last:=length(s);
    repeat
          sentence:=FindFirstSentence(copy(s,from,last));
          size:=length(sentence);
          if length(FindFirstWord(sentence))=1 then
             inc(from,size)
          else
              begin
                   MoveToEnd(from,size,s);
                   dec(last,size);
              end;
    until from>=last;
    Result:=s;
end;

var s:string;
begin
  s:=', , Hello. I am so cool . I am so big. Yes! Pascal. I am so clever ';
  writeln(s);
  writeln(Result(s));
  readln;
end.


Старался давать переменным и функциям понятные имена, так что все должно быть понятно.

Спасиб большое! good.gif


А как насчет

Описать процедуру Height (Ax, Ay, Bx, By, Cx, Cy, hA, hB, hC), находящую высоту hB, hA, hC треуголника ABC, проведенные соответственно из вершин A, B, C. С помощью этой процедуры найти высоты преугольником ABC, ABD, ACD, если даны координаты точек A, B, C, D.
Если не сложно !mol1.gif

Цитата(d1monn @ 10.12.2006 0:38) *

S- строка
MLA- множество лат. алфавита
MRZ- множество знаков препинания
k- кол-во слов в тексте
ps- первое слово

В итоге у меня выводится только первое однобуквенное слово предложения и кол-во слов в тексте. Надо изменить исходник так, чтобы сначала шли предложения, которые начинаются с однобуквенных слов, а потом остальные предложения текста. Пример такого предложения: В лесу родилась елочка. За критерий окончания предложения взято . ! , Помогите мне пожалуйста!

Я пока думаю, если получится скину yes2.gif
Bokul
Цитата
Спасиб большое!

Кажется я шутки не понял... blink.gif

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