PDA

Просмотр полной версии : строковые данные в паскале



ксюньк@
24.01.2008, 21:09
привет!!! помогите, пожалуйста, написать программу:

"определить количество символов в самом длинном слове произвольной строки текста. используя оператор форматированного вывода вывести на экран ПЕРВУЮ БУКВУ САМОГО ДЛИННОГО СЛОВА"

у меня всегда последняя буква строки выводится:

program kontr268;
var a: string;
i,l,pr,ppr,dl,max: integer;
bukva: char;
begin
writeln ('vvedite stroky');
readln (a);
l:= length (a);
max:=0;

for i:= 1 to l do
begin
pr:= pos (' ',a); {naxodim poziciu pervogo probela.}
for i:= pr+1 to l do {nachinaya s etogo chisla,}
begin
ppr:= pos (' ',a); {naxodim poziciy cledyushego probela.}
dl:=ppr-pr; {vichyslyaem dlinu slova mezhdu probelami}
if dl>max then {esli ona bolshe dlinny samogo dlinnogo slova,}
max:=dl; {eto slovo stanovitsa samym dlinnim.}
pr:=ppr; {posledniy probel stanovitsa pervym}
end;
bukva:=a[i-max];

writeln ('pervaya bukva samogo dlinnogo slova ',bukva);
end.

MOTOCoder
24.01.2008, 22:24
Помоему в данном случае функция pos будет всегда
возвращать позицию первого пробела.
Предлагаю такое решение.
Оно посложнее, но работает:

program p1;
const
N=10;

var
words:array[1..N]of string;
s:string;
wd:string;
i:integer;
index:integer;
count:integer;
scount:integer;

function ParceText(txt:string):integer;
var l,c:integer;
begin
c:=0;
l:=length(txt);
for i:=1 to l+1 do
begin
if ((txt[i]<>' ')and(i<>l+1)) then
wd:=wd+txt[i]
else
begin
inc(c);
words[c]:=wd;
wd:='';
end;
end;
ParceText:=c;
end;

function FindLargest(c:integer):integer;
var
idx,max:integer;
begin
idx:=0;
max:=0;
for i:=1 to c do
if length(words[i])>max then
begin
max:=length(words[i]);
idx:=i;
end;
FindLargest:=idx;
end;

begin
writeln('Введите текст:');
readln(s);
count:=ParceText(s);
index:=FindLargest(count);
scount:=length(words[index]);
writeln('В самом длинном слове ',scount,' стмволов');
writeln('Первый символ этого слова "',words[index][1],'"');
readln;
end.

BBB
25.01.2008, 01:40
Воспользоваться алгоритмом "Разбиение строки на слова" (http://forum.developing.ru/showthread.php?t=7995).
Сделать цикл. В цикле получаем очередное слово, славниваем по длинне с самым длинным найденным на данный момент словом (которое перед входом в цикл равно пустой строке). Если новое слово длиннее, то запоминаем его как самое длинное на данный момент. После выхода из цикла вывести на экран первую букву найденного самого длинного слова.

Примерно так (с использованием функции по указанной сылке):

var stLine : string;
stMaxWord : string;
stCurrWord : string;
begin
..................... {здесь ввод строки stLine }
stMaxWord :='';
while (TRUE) do begin
stCurrWord := strtok (stLine, ' '); { разделителем указан только пробел. Хотя }
{ можно бы и добавить другин разделители, }
{ например, запятая и т.п. }
if (stCurrWord = '') then
break; { слова в строке закончились }

if (Length (stCurrWord) > Length (stMaxWord)) then
stCurrWord := stMaxWord;
end;

if (Length (stMaxWord) > 0) then
writeln ('pervaya bukva samogo dlinnogo slova ', stMaxWord [1])
else
writeln ('vvedennaja stroka ne soderzhit slov')

end.