Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ помогите разобраться

Автор: Лейла 5.06.2009 20:47

задача: Написать программу, которая для каждого слова заданного предложения определяет долю согласных.Определить слово, в котором доля согласных максимальна.
решение:

  
var s:string;
sl:array of string;
k,l,i,j,sogl:integer;
otn:array of real;
max:real;
begin
readln(s);
k:=0;
repeat
l:=pos(' ',s);
if l<>0 then
begin
k:=k+1;
setlength(sl,k);
sl[k-1]:=copy(s,1,l-1);
delete(s,1,l);
end
else
begin
k:=k+1;
setlength(sl,k);

sl[k-1]:=copy(s,1,length(s));
end;
until l=0;

for i:=0 to k-1 do writeln(sl[i]);

setlength(otn,k);

for i:=0 to k-1 do
begin
sogl:=0;
l:=length(sl[i]);
for j:=1 to l do
case sl[i,j] of
'q','w','r','t','p','s','d','f','g','h','j','k','l','z','x','c','v','b','n',
'm':sogl:=sogl+1;
end;
write(sl[i],' - ');
otn[i]:=sogl/l;
if sogl<>0 then writeln(sogl/l:2:3)
else writeln('sogl net!');
end;

max:=otn[0];
l:=0;
for i:=1 to k-1 do
if otn[i]>max then begin max:=otn[i]; l:=i; end;

writeln;
writeln(sl[l]);

readln;
end.


Автор: volvo 5.06.2009 20:55

Ну хорошо, решение есть (что-то оно мне смутно напоминает, но не об этом речь smile.gif ). Что именно в нем непонятно? Сначала разбиваем строку на слова, потом по каждому слову проходим, и ищем число согласных, и отношение к общему кол-ву букв, в результате имеем долю согласных в слове. Из найденных отношений находим максимальное. Что именно непонятно? Где проблема?

P.S. Программа явно не под Турбо Паскаль, это что, Дельфи? Так там есть более интересные способы разбиения строки на слова.

Автор: sheka 5.06.2009 21:03

Цитата(volvo @ 5.06.2009 16:55) *

Так там есть более интересные способы разбиения строки на слова.

какие?

Автор: volvo 5.06.2009 21:10

TStringList и его методы. В одно движение все разбивается... В FPC, кстати, тоже...

Автор: Buka 5.06.2009 21:23

Вот готовая, сама делала))
Всё работает.

program qwe;
uses crt;
type masstr=array [1..10] of string;
type maslength=array [1..10] of byte;
type masdol=array[1..10] of real;
procedure ms(s1:string; var s2:masstr; var l2:maslength; var count:byte);
var i1,i2:byte;
i,l:byte;
begin
l:=length(s1);
i1:=1; i2:=0;
count:=0;
for i:=1 to l do begin
if (s1[i]= ' ') and (s1[i+1] <> ' ')
then i1:=i+1;
if (s1[i] <> ' ') and ((s1[i+1]= ' ') or (i=l)) then begin
i2:=i; inc(count)
end;
if i2 <> 0 then begin
s2[count]:=copy(s1, i1, i2-i1+1);
l2[count]:=length(s2[count]);
i2:=0;
end;
end;
end;
procedure doli(s2:masstr; l2:maslength; count:byte; var d:masdol);
var g,i:byte; soglas:byte; c:char;
begin
for i:=1 to count do begin
soglas:=0;
for g:=1 to l2[i] do begin
c:=s2[i][g] ;
if ((c='w') or (c='q') or (c='r') or (c='t') or (c='p')
or (c='s') or(c='d') or (c='f') or (c='g') or(c='h') or (c='j')
or (c='k') or (c='l') or (c='z') or (c='x') or (c='c') or (c='v')
or (c='b')or (c='n') or (c='m')) then inc(soglas);
d[i]:=soglas/l2[i];
end;
end;
end;
procedure max(d:masdol; count:byte;var maxd:real);
var i:byte;
begin
maxd:=d[1];
for i:=2 to 10 do begin
if d[1]<d[i] then maxd:=d[i]
end;
end;
var s:string;
s2:masstr; l2:maslength; d:masdol;
i,nslov:byte; maxd:real;
begin clrscr;
write(' vvedite predlogenie-> ');
readln(s);
ms(s, s2,l2, nslov);
doli(s2,l2,nslov,d);
max(d,nslov,maxd);
for i:=1 to nslov do begin
writeln(s2[i], ' ', l2[i] ,' ', d[i]:6:3 );
end;
writeln('max doly soglas ravna ', maxd:6:3);
readkey
end.



М
Buka, пожалуйста, используй тэги кода и не дублируй мессаджи


Автор: Лейла 7.07.2009 18:12

ой спасиб всем за помощь!!!! smile.gif