Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача на строки
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
dog
Во веденной строке слово нечетной длины, в котором больше всего гласных букв

Задача наполовину решена, на вторую половину никаких идей.


PROGRAM PRP4;
var a, temp:string;
i:integer;
BEGIN
WRITELN('Введите текст');
READLN(a);
a:=' '+a;
for i:= length(a) downto 1 do
begin
if a[i]<>' ' then temp:=temp+a[i]
else begin
if length(temp) mod 2<>0 then WRITELN(temp); {распечатка temp для примера т. к. temp слово нечетной длины}
temp:='';
end;
end;
END.



Слово нечетной длины программа находит, а вот что дальше делать с поиском слова с наибольшим числом гласных букв, никаких идей
amega
Цитата
Слово нечетной длины программа находит, а вот что дальше делать с поиском слова с наибольшим числом гласных букв, никаких идей

береш делаеш множество из гласных букв, потом каждое слово по букве проверяеш, евляется ли буква в этом множестве или нет, если да то увеличиваеш счетчик...
Unconnected
Вот, смотри:

const
limits = [#0..#32,'.',',',':',';','!','?','"'];
letters = ['a','e','i','o','u','y','A','E','I','O','U','Y']; //будет работать только с латинской
// строкой. Если надо с кириллической тоже, добавь в это множество русские гласные буквы.

var
s,buf,res : string;
i,ii,back,n,sc1,sc2:byte;

begin
i := 1;n:= 0;
sc1:=0;sc2:=0;
writeln('Vvedite stroku');
readln(s);
while(i<=length(s)) do begin
while(i<=length(s)) and (s[i] in limits) do inc(i);
if i<=length(s) then begin
back := i;
while(i<=length(s)) and not(s[i] in limits) do inc(i);
inc(n);
if length(copy(s, back, i-back)) mod 2<>0 then begin
buf:=copy(s, back, i-back);
sc1:=0;
for ii:=1 to length(buf) do if (buf[ii] in letters) then inc(sc1);
if sc1>sc2 then begin
sc2:=sc1;
res:=buf;
end;
end;
end;
end;
writeln(res);
readln;
end.



Хорошее разбиение на слова есть в FaQ форума.

Сегодня узнал, что около 10 процентов учащихся бюджетных мест в ВУЗах России не сдали первую сессию и были отчислены... А вместе с коммерческими - около 25%. Мрак.
Lapp
Unconnected, зачем же столько циклов? Вполне можно обойтись одним..
Количество строковых переменных тоже великовато..
И еще: лучше работать с множеством букв, а не разделителей.
При такой входной строке:
sss
- у тебя ответ неверный (верный: sss - в нем 0 гласных, и это максимум).
И в случае
ss
- ты ничего не должен напечатать, а ты печатаешь пустую строку.
Ну и последнее: делать множество гласных и называть его "буквы" - очень misleading..

Я б сделал типо так..
const
Letter=['A'..'Z']+['0'..'9'];
Vowel=['A','E','I','O','U','Y'];

var
s: string;
i,j,n,l,v,m: integer;

begin
Write('Type in a line: ');
ReadLn(s);
j:=1; {начало слова}
v:=0; {кол-во гласных}
m:=-1; {максимум гласных}
for i:=1 to Length(s)+1 do if (i>Length(s)) or not (UpCase(s[i]) in Letter) then begin
if Odd(i-j) and (v>m) then begin
n:=j;
l:=i-j;
m:=v
end;
j:=i+1;
v:=0
end
else if UpCase(s[i]) in Vowel then Inc(v);
if m>-1 then WriteLn(Copy(s,n,l));
ReadLn
end.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.