Форум » Обработка числовых последовательностей » C4 30 » Ответить

C4 30

Анна: Предлагаю такое решение задачи С4-30, более эффективное, без массивов. Оно правильное? program demo_C4; var i,j,N,id,dn,month,date,monthR,dateR:integer; simv,simv1:char; begin i:=0; j:=0; N:=0; dn:=0; monthR:=0; dateR:=0; read(simv,simv1); dateR:=10*(ord(simv)-ord('0'))+(ord(simv1)-ord('0')); read(simv); read(simv,simv1); monthR:=10*(ord(simv)-ord('0'))+(ord(simv1)-ord('0')); Readln(N); for i:=1 to N do begin Read(id); read(simv); month:=0; date:=0; read(simv,simv1); date:=10*(ord(simv)-ord('0'))+(ord(simv1)-ord('0')); read(simv); read(simv,simv1); month:=10*(ord(simv)-ord('0'))+(ord(simv1)-ord('0')); case month of 1,3,5,7,8,10,12:dn:=31; 2:dn:=28; 4,6,9,11:dn:=30; end; if month=monthR then begin if (dateR-date)>3 then writeln(id); end else if month+1=monthR then begin if (dateR+dn-date)>3 then writeln(id); end else if month<monthR then writeln(id); end; end.

Ответов - 8

Поляков: 1. Докажите, что оно правильное. 2. Докажите, что оно эффективнее. 3. Докажите, что можно без массивов.

Анна: Поляков пишет: 1. Докажите, что оно правильное. 2. Докажите, что оно эффективнее. 3. Докажите, что можно без массивов. Правильное, потому что протестировала на разных вариантах и результат был верный. Эффективнее, потому что вся информация проверяется прямо на входе и номера нужных ячеек выводятся сразу же. Т.е. информацию можно не хранить.

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


Анна: Поляков пишет: Тесты, как известно, не могут доказать правильность программы и алгоритма Тогда я не знаю, как еще доказать. Можно описать принцип работы программы.

Поляков: Анна пишет: Тогда я не знаю, как еще доказать. Рассуждениями. Возможны такие-то и такие-то варианты. Других вариантов быть не может. Алгоритм следующий... В этом варианте он сработает так, в этом - так... Таким образом, во всех возможных вариантах алгоритм выдает правильный ответ. Где может быть ошибка: 1) вы не учли какой-то вариант исходных данных, который возможен по условию 2) ваш алгоритм работает не так, как нужно, в каком-то варианте.

Анна: Поляков пишет: Рассуждениями. Хорошо. Сначала программа считывает текущую дату в две переменные - месяц и день. Затем считывает количество N. В Цикле от 1 до N она считывает дату сдачи багажа. Далее возможны 3 варианта: 1. Месяц даты сдачи багажа равен текущему. 2. Месяц даты сдачи багажа - предыдущий. 3. Месяц даты сдачи багажа отличается от текущего более чем на один. 4й вариант, в котором месяц больше текущего, не рассматривается. Что делает программа: в первом случае она просто сравнивает дни дат. Если их разность больше трех, то выводит номер багажа. Во втором случае проверяет, больше ли трех сумма текущей даты и числа дней от даты сдачи багажа до конца предыдущего месяца. То есть, программа работает по условной формуле: I+(N-K), где I - текущий день, N - число дней в предыдущем месяце (записано через оператор case), К - день даты сдачи багажа. В третьем случае можно автоматически вывести номер багажа.

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

Анна: Поляков пишет: в хронологическом порядке сдачи багажа. Все, теперь поняла ошибку. Я думала, эта фраза к другому относится.



полная версия страницы