строковые данные в паскале

Ответить
ксюньк@
Сообщения: 2
Зарегистрирован: 24 янв 2008, 19:53

24 янв 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
Сообщения: 542
Зарегистрирован: 14 янв 2008, 20:27
Откуда: Россия, Псков

24 янв 2008, 22:24

Помоему в данном случае функция pos будет всегда
возвращать позицию первого пробела.
Предлагаю такое решение.
Оно посложнее, но работает:
[syntax='delphi']
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<>' ')and(i<>l+1)) then
wd:=wd+txt
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)>max then
begin
max:=length(words);
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.
[/syntax]
Ни что так не ограничивает фантазию программиста, как компилятор...
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

25 янв 2008, 01:40

Воспользоваться алгоритмом "Разбиение строки на слова".
Сделать цикл. В цикле получаем очередное слово, славниваем по длинне с самым длинным найденным на данный момент словом (которое перед входом в цикл равно пустой строке). Если новое слово длиннее, то запоминаем его как самое длинное на данный момент. После выхода из цикла вывести на экран первую букву найденного самого длинного слова.

Примерно так (с использованием функции по указанной сылке):
[syntax='Pascal']
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.[/syntax]
Ответить