Страница 1 из 2

Помогите упростить задачку...(Паскаль)

Добавлено: 13 ноя 2006, 18:47
Dr_Grizzly
Всем привет! Вот написал прогу которая расставляет переносы в строке, в этом примере указаны не все гласные буквы, а суть работает, остается только дописать нехватающие буквы и все, но препод сказал надо более рациональным способом ее решить, а каким - ума не приложу :)

Код: Выделить всё

Uses crt;
var
Stroka:String;
y,i,m,Pos:Integer;
Flag2,flag:Boolean;
begin
clrscr;
Writeln('Vvedite stroku');
readln(stroka);
Flag2:=false;
Flag:=false;

 For y:=1 to length(stroka) do
  begin
{Uslovie 1}
   If (Stroka[y]='а') or (Stroka[y]='и') or (Stroka[y]='е') then
     If (Stroka[y+1]='а') or (Stroka[y+1]='и') or (Stroka[y+1]='е') then
      If y-1<>0 then
       If (Stroka[y-1]<>'а') and (Stroka[y-1]<>'и') and (Stroka[y-1]<>'е') then
        begin
         If (Stroka[y+2]='й') and (y+2<>length(stroka)) then
          begin
           Insert('-',Stroka,y+1);
           flag2:=true;
           y:=y+1;
          end;
         If (Stroka[y+2]<>'й') and (y+2<>length(stroka)) then
          begin
           Insert('-',Stroka,y+1);
           flag2:=true;
           y:=y+1;
          end;

        end;
  end;

 If (y=length(stroka)) and (flag2=false) then
   y:=1;

 For i:=y to length(stroka) do
  begin
{uslovie 2}
   If (Stroka[i]<>'а') and (Stroka[i]<>'и') and (Stroka[i]<>'е') then
     If (Stroka[i+1]<>'а') and (Stroka[i+1]<>'и') and (Stroka[i+1]<>'е') then
       If (Stroka[i-1]='а') or (Stroka[i-1]='и') or (Stroka[i-1]='е') then
         begin
          For m:=i+1 to length(stroka) do
           If (Stroka[m]='а') or (Stroka[m]='и') or (Stroka[m]='е') then
             flag:=true;
           If Flag=true then
           begin
            Insert('-',Stroka,i+1);
            flag2:=true;
            i:=i+1;
           end
         end;
  end;


 If (i>=length(stroka)) and (flag2=false) then i:=1;

 For y:=i to length(stroka) do
  begin
{Uslovie 3}
   If (Stroka[y]='а') or (Stroka[y]='и') or (Stroka[y]='е') then
    If y>=2 then
      begin
         For i:=y+1 to length(stroka) do
           If (Stroka[i]='а') or (Stroka[i]='и') or (Stroka[i]='е') then
             flag:=true;
           If Flag=true then
           begin
            Insert('-',Stroka,y+1);
           end;
      end;

 end;

Writeln(stroka);
readkey;
end.

Добавлено: 14 ноя 2006, 08:54
somewhere
If (Stroka='а') or (Stroka='и') or (Stroka='е')


Наверняка имелось ввиду то, что таких проверок очень много, сделай функцию, которая будет давать True или False, и там где проверки ее зови:

Код: Выделить всё

Function IsVowelLetter(P1: Char):Boolean;
begin
If (P1='а') or (P1='и') or (P1='е') then result := true else Result := false;
end;

Добавлено: 14 ноя 2006, 09:42
Игорь Акопян
не допонял, надо что по слогам её разбить?? переносы в строке делаются же по заданной правой границе...

Добавлено: 14 ноя 2006, 10:23
BBB
somewhere писал(а):
If (Stroka='а') or (Stroka='и') or (Stroka='е')


Наверняка имелось ввиду то, что таких проверок очень много, сделай функцию, которая будет давать True или False, и там где проверки ее зови:

Код: Выделить всё

Function IsVowelLetter&#40][/quote]Мне пришло в голову, что это условие можно записать более компактно:
[code]If (Stroka[i] in ['а', 'и', 'е']) then
 ...........

Добавлено: 14 ноя 2006, 15:51
somewhere
Все равно функцию создай. А если тебе надо другие буквы проверять или добавить, что, по всему коду бегать будешь? Когда ее сделаешь, то увидишь сколько кода потом останеться ненужным, всякие Flag'и там и т.д. Я серьезно ;-) Рефакторинг ...

Добавлено: 14 ноя 2006, 16:18
Dr_Grizzly
не допонял, надо что по слогам её разбить?? переносы в строке делаются же по заданной правой границе...
Надо именно возможные переносы в слове указать
Function IsVowelLetter(P1: Char):Boolean;
begin
If (P1='а') or (P1='и') or (P1='е') then result := true else Result := false;
end;


Мне пришло в голову, что это условие можно записать более компактно:
Код:
If (Stroka in ['а', 'и', 'е']) then
...........

Отличная идея!!! Супер!

Добавлено: 14 ноя 2006, 16:36
Игорь Акопян
ну уж тогда объявляется множество в начале

Код: Выделить всё

var
  Ltrs = ('а', 'и', 'е');
и далее 
  if Stroka[i] in Ltrs
:)
А ещё не забыть что низя переносить или оставлять одну букву в слове...

Добавлено: 14 ноя 2006, 16:46
LAngel
Я, конечно, извиняюсь, но...
алгоритм переноса по слогам
первые несколько ссылок :)

Добавлено: 14 ноя 2006, 16:58
Dr_Grizzly
ну уж тогда объявляется множество в начале
Код:
var
Ltrs = ('а', 'и', 'е');
и далее
if Stroka in Ltrs

ВОООООТТТТТТ!!!!! То что и нужно было!!!! Всем благодарен за внимание! Огромной СПАСИБО!

Добавлено: 14 ноя 2006, 17:31
BBB
[quote="Игорь Акопян"]ну уж тогда объявляется множество в начале

Код: Выделить всё

var
  Ltrs = &#40][/quote]
Все-таки, квадратные скобки :) :
И, по-моему, надо тип переменной указать. Т.е.
[code]var
  Ltrs : set of char = ['а', 'и', 'е'];