2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Помощь с задачей "Нули" [Pascal]
Сообщение15.02.2013, 21:03 
Прошу помочь с задачей
Требуется найти самую длинную непрерывную цепочку нулей в последовательности нулей и единиц.
Входные данные
В единственной строке входного файла INPUT.TXT записана последовательность нулей и единиц (без пробелов). Суммарное количество цифр не превышает 100.
Выходные данные
В единственную строку выходного файла OUTPUT.TXT нужно вывести искомую длину цепочки нулей.

код: [ скачать ] [ спрятать ]
Используется синтаксис Pascal
var a, max, c:integer;
n:string
begin
assign (input, 'input.txt'); reset(input);
assgin (output, 'output.txt'); rewrite(output);
read(n);
c:=0;
max:=0;
 while not eof do begin
 read(a);
 if (a=0) then c:=c+1
 else if (c>max) then max:=c
 else c:=0
 end:
writeln(max);
end.
 

Всё отлично компилируется, но не подсчитывает нули. В ответ выводит 0. Не могу найти ошибку

 
 
 
 Re: Помощь с задачей "Нули"
Сообщение15.02.2013, 21:40 
Аватара пользователя
Все правильно. Считайте сначала вашу строку вне цикла, а потом уже занимайтесь подсчетами. И в одном assign у вас опечатка.

 
 
 
 Re: Помощь с задачей "Нули"
Сообщение16.02.2013, 05:38 
Не выходит. Преобразовал еще вот так. Чтобы посимвольно проверять а. Но все равно в ответ выводит 0. Я вот не пойму, может с циклом что не так...
P.S.с assign я здесь опечатался. В программе этого не было
код: [ скачать ] [ спрятать ]
Используется синтаксис Pascal
var max, c:integer;
n:string;
a:char;
begin
assign (input, 'input.txt'); reset(input);
assign (output, 'output.txt'); rewrite(output);
read(n);
c:=0;
max:=0;
 while not eof do begin
 read(a);
 if (a='0') then c:=c+1
 else if (c>max) then max:=c
 else c:=0
 end:
writeln(max);
end.

 
 
 
 Re: Помощь с задачей "Нули"
Сообщение16.02.2013, 06:05 
А что такое "read(n);"? Зачем это, и что оно делает? А еще, разве reset и rewrite автоматически перенаправляют потоки в файлы? Мне казалось, это нужно указывать дополнительно.
Следующий забавный вопрос: где переменные, отвечающие файлам? Я не особо понимаю, как программа вообще компилируется. Тем более, при таком-то отсутствии всяких ";".

 
 
 
 Re: Помощь с задачей "Нули"
Сообщение16.02.2013, 07:17 
Moriarter
Когда исправите ошибки в программе, попробуйте встать на место компьютера и точь-в-точь повторить, что он будет делать на каком-нибудь простом тесте типа 001000. Это необходимо, чтобы найти ошибки в алгоритме. Это я к тому, что ваша строчка
Код:
else if (c>max) then max:=c

вообще может не выполняться, и ответом будет 0. Например, когда единиц в строке совсем нет (0000). В общем, чтобы не делать ошибок, станьте на время самим компьютером.

 
 
 
 Re: Помощь с задачей "Нули"
Сообщение16.02.2013, 09:43 
Nemiroff в сообщении #684519 писал(а):
Следующий забавный вопрос: где переменные, отвечающие файлам?

input и output -- это системные файловые переменные, они определены по умолчанию.

Nemiroff в сообщении #684519 писал(а):
read(n);

Эта команда считывает всю строку, но оставляет несчитанными (в отличие от команды readln(n)) признаки конца строки. Потом в цикле только эти два оставшихся символа #13, #10 и считываются.

Moriarter в сообщении #684518 писал(а):
else if (c>max) then max:=c
else c:=0

Первый else должен быть никаким не else: у Вас из-за этого и счётчик обнуляется не всегда, когда положено, и (как заметил Zealint) максимум в конце может не обновиться.

 
 
 
 Re: Помощь с задачей "Нули"
Сообщение16.02.2013, 14:39 
ewert в сообщении #684547 писал(а):
input и output -- это системные файловые переменные, они определены по умолчанию.

А-а-а.
ewert в сообщении #684547 писал(а):
Эта команда считывает всю строку, но оставляет несчитанными (в отличие от команды readln(n)) признаки конца строки. Потом в цикле только эти два оставшихся символа #13, #10 и считываются.

Ну вот я и не понял - зачем оно нужно - все нули ведь туда уйдут.
ewert в сообщении #684547 писал(а):
Первый else должен быть никаким не else

Лучше else. Просто нужно принудительно "с" обнулять.

 
 
 
 Re: Помощь с задачей "Нули"
Сообщение16.02.2013, 19:20 
Nemiroff в сообщении #684617 писал(а):
Лучше else. Просто нужно принудительно "с" обнулять.

Гораздо лучше этот первый else просто включить в then.

Nemiroff в сообщении #684617 писал(а):
Ну вот я и не понял - зачем оно нужно - все нули ведь туда уйдут.

Явно оно осталось просто по рассеянности, из-за разных там переделок. Я лишь пояснил, почему эта версия программы в принципе не может выдавать ничего, кроме нуля.

Да, кстати, я в этом месте процитировал именно Вас тоже исключительно по рассеянности. А с точками с запятой, если уж кстати -- в том тексте всё вполне в порядке. Т.е. две из них пропущены просто по синтаксической необходимости, а пропуск третьей пусть и неэстетичен,но и не является синтаксической ошибкой.

 
 
 
 Re: Помощь с задачей "Нули"
Сообщение16.02.2013, 22:30 
ewert в сообщении #684728 писал(а):
а пропуск третьей пусть и неэстетичен,но и не является синтаксической ошибкой.

:oops: Не верил, пока сам не проверил. :oops:

 
 
 [ Сообщений: 9 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group