Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 275

/ вопрос открыт /

Здравствуйте, уважаемые!
Дана строка. определить наибольнее количество идухих подряд пробелов.

Приложение:
  1. program Project1;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6. SysUtils;
  7. var s:string; max,i,n:integer; l:byte;
  8. begin
  9. writeln('insert string');
  10. readln(s);
  11. n:=0;
  12. for i:=1 to 250 do
  13. begin
  14. begin
  15. while s[i]=' ' do
  16. inc(n); break;
  17. end;
  18. n:=max; if max>n then n:=max;
  19. end;
  20. write(max);
  21. readln;
  22. end.
  23.  
  24.  


I{ () T Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: I{ () T (статус: Посетитель)
Вопрос отправлен: 12 октября 2009, 14:49
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Тов. Женька

Здравствуйте, I{ () T!

Что не так? Все не так!

Приложение:
  1. program Project1;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6. SysUtils;
  7.  
  8. var s:string; max,i,n, p :integer;
  9. begin
  10. writeln('insert string');
  11. readln(s);
  12. max := 0;
  13. n := 0;
  14. p := pos(' ', s);
  15. for i := p to length(s) do
  16. begin
  17. if s[i] = ' ' then
  18. begin
  19. inc(n);
  20. if n > max then
  21. max := n;
  22. end
  23. else
  24. n := 0;
  25. end;
  26. writeln(max);
  27. readln;
  28. end.


Ответ отправил: Тов. Женька (статус: 3-ий класс)
Время отправки: 12 октября 2009, 15:27


Мини-форум вопроса

Всего сообщений: 9; последнее сообщение — 14 октября 2009, 22:17; участников в обсуждении: 5.

12 октября 2009, 15:08: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Лабораторный практикум модератором Ерёмин А.А.

I{ () T

I{ () T (статус: Посетитель), 12 октября 2009, 15:17 [#1]:

program Project1;

{$APPTYPE CONSOLE}

uses
SysUtils;
var s:string; max,i,n:integer; b:boolean; l:char;
begin
writeln('insert string');
readln(s);
n:=0;
b:= true;
for i:=1 to length(s) do
begin
l:=s[i];
while (l=' ') and b do
inc(n);
b:=(l=' ');
n:=max;
break;
end;
write(max);
readln;
end.
подправил...все равно не выдает результ
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
Тов. Женька

Тов. Женька (статус: 3-ий класс), 12 октября 2009, 15:33 [#2]:

А теперь разбор вашего решения.
1. max так и не инициализирован, т.е. значение берется "от балды". А потом это значение "от балды" присваивается n и таким образом замещается кол-во подсчитанных пробелов.
2. Внутри одного цикла с i (for.. do) вы пытаетесь крутить второй (while ... do), результат, честно говоря, для меня не предсказуем, а что "думает" программа, можно только догадываться.
3. Слишком усложняете, задача-то простая.
Вадим К

Вадим К (статус: Академик), 12 октября 2009, 15:43 [#3]:

Тов. Женька:
Вообще то внутри одного цикла вставлять другой никто не запрещает. Другое дело, что там есть break;, поэтому этот цикл более одного раза никогда не будет выполняться.
Галочка "подтверждения прочтения" - вселенское зло.
Тов. Женька

Тов. Женька (статус: 3-ий класс), 12 октября 2009, 15:58 [#4]:

Разумеется! Не обратил внимания на break, без него бы зациклилось. Другое дело, что в этом конкретном случае второй цикл смысла не имеет.
I{ () T

I{ () T (статус: Посетитель), 12 октября 2009, 17:03 [#5]:

этим циклом while умудриться:вот пробежал он один раз по строке этим циклом, запомнил наибольшее число пробелов(наиб. первое попавшееся). потом, т.к. етот цикл в цикле, то думал он будет вот так пробегаться, пока не найдет мах((
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
Тов. Женька

Тов. Женька (статус: 3-ий класс), 13 октября 2009, 08:58 [#6]:

I{ () T:
"этим циклом while умудриться:вот пробежал он один раз по строке этим циклом, запомнил наибольшее число пробелов(наиб. первое попавшееся). потом, т.к. етот цикл в цикле, то думал он будет вот так пробегаться, пока не найдет мах(("

Этот цикл while по строке не бегает. Дело в том, что в этом цикле идет обращение к i-тому символу (только к одному символу) строки s (а не ко всей строке) и в процессе работы этого цикла он никуда не движется, так как i остается неизменным. И программа не зависает только благодаря break.
min@y™

min@y™ (статус: Доктор наук), 13 октября 2009, 09:01 [#7]:

function GetMaxSpacesCount(const S: string): Cardinal;
var
  Index: Integer;
  Max: Cardinal;
begin
  Result:= 0;
  Max:= 0;
 
  for Index:= 1 to Length(S) do
    if S[Index] = #32
      then Inc(Max)
      else begin
             if Result < Max
               then Result:= Max;
             Max:= 0;
           end;
end;
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Егор

Егор (статус: 10-ый класс), 14 октября 2009, 18:53 [#8]:

min@y™:
вай, красЫва напысАл! :)
уважаю :)

прибавил бы к репутации, но система не даёт
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
min@y™

min@y™ (статус: Доктор наук), 14 октября 2009, 22:17 [#9]:

Цитата (Егор):

вай, красЫва напысАл! :) уважаю :)


Опыт не пропьёшь, дарагой!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 12:02
Выполнено за 0.04 сек.