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

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Dr_Grizzly
Сообщения: 407
Зарегистрирован: 13 сен 2004, 12:05
Откуда: Курган
Контактная информация:

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

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

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.
Чем проще - тем оригинальней, а значит гениально, т.к. все гениальное - просто! ;) Да! Кстати! Ctrl+V реально вставляет!!! ХDD
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

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;
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

не допонял, надо что по слогам её разбить?? переносы в строке делаются же по заданной правой границе...
Изображение
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

somewhere писал(а):
If (Stroka='а') or (Stroka='и') or (Stroka='е')


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

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

Function IsVowelLetter&#40][/quote]Мне пришло в голову, что это условие можно записать более компактно:
[code]If (Stroka[i] in ['а', 'и', 'е']) then
 ...........
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Все равно функцию создай. А если тебе надо другие буквы проверять или добавить, что, по всему коду бегать будешь? Когда ее сделаешь, то увидишь сколько кода потом останеться ненужным, всякие Flag'и там и т.д. Я серьезно ;-) Рефакторинг ...
It's a long way to the top if you wanna rock'n'roll
Dr_Grizzly
Сообщения: 407
Зарегистрирован: 13 сен 2004, 12:05
Откуда: Курган
Контактная информация:

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


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

Отличная идея!!! Супер!
Чем проще - тем оригинальней, а значит гениально, т.к. все гениальное - просто! ;) Да! Кстати! Ctrl+V реально вставляет!!! ХDD
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

ну уж тогда объявляется множество в начале

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

var
  Ltrs = ('а', 'и', 'е');
и далее 
  if Stroka[i] in Ltrs
:)
А ещё не забыть что низя переносить или оставлять одну букву в слове...
Изображение
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

Я, конечно, извиняюсь, но...
алгоритм переноса по слогам
первые несколько ссылок :)
С уважением, Lost Angel...
Dr_Grizzly
Сообщения: 407
Зарегистрирован: 13 сен 2004, 12:05
Откуда: Курган
Контактная информация:

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

ВОООООТТТТТТ!!!!! То что и нужно было!!!! Всем благодарен за внимание! Огромной СПАСИБО!
Чем проще - тем оригинальней, а значит гениально, т.к. все гениальное - просто! ;) Да! Кстати! Ctrl+V реально вставляет!!! ХDD
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

[quote="Игорь Акопян"]ну уж тогда объявляется множество в начале

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

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