• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

[pascal] Ошибка в работе программы

  • Автор темы Wefast
  • Дата начала
W

Wefast

Программа должна находить самое короткое слово, и удалять лишние пробелы. Так вот если ввести много пробелов в начале, потом слово , потом пробелы, а потом слово опять , то он не выводит самое короткое слово.
Код:


Код:
uses crt;
var s,s1,s2,s3:string;
mx,mn:byte;
begin
clrscr;
textcolor(White);
write('Строка: ');
readln(s);
s:=s+' ';{добавление пробела в конец}
while pos(' ',s)>0 do{удаляем лишние пробелы, пока есть 2 пробела рядом}
delete(s,pos(' ',s),1);{1 удаляем}
mx:=0;mn:=255; {начальное значение}


textcolor(red);
writeln;
writeln('Строка без лишних пробелов: ',s);
while pos(' ',s)>0 do{пока есть пробел в строке}
begin
s1:=copy(s,1,pos(' ',s)-1);{копируем первое слово до пробела}
if length(s1)<mn then{если меньше всех}
begin
mn:=length(s1); {самая маленькая длина}
s2:=s1;	 {запоминаем слово}
end;
delete(s,1,pos(' ',s));{удаляем это слово следующее будет первым}
end;
textcolor(green);
writeln('Самое короткое слово ',s2);
readln
end.
 
H

hosm

Так вот если ввести много пробелов в начале, потом слово , потом пробелы, а потом слово опять , то он не выводит самое короткое слово.
так как пробел - первый символ строки.
Выбирайте:
1) можно добавить условие проверки s1<>"" внутри цикла.
2) проверить позицию пробела, если строка начинается с пробела, то не обрабатывать как слово, а просто его удалить:
Код:
while pos(' ',s)>0 do{пока есть пробел в строке}
begin
if pos(' ',s) > 1 then // пробел не первый
begin
s1:=copy(s,1,pos(' ',s)-1);{копируем первое слово до пробела}
if length(s1)<mn then{если меньше всех}
begin
mn:=length(s1); {самая маленькая длина}
s2:=s1;	 {запоминаем слово}
end;
end;
// тут первый пробел должен удалиться
delete(s,1,pos(' ',s));{удаляем это слово следующее будет первым} 
end;
 
V

vital

топискстартер, слушай умную тетю, она в уме паскалевский код компилировать умеет)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!