Решение задач
Разбор задачи C1 (демо ЕГЭ 2004)
Следующая программа, содержащая, по крайней мере, одну ошибку, после устранения ошибок должна определять день недели для произвольного дня месяца. В ней считается, что первое число данного месяца — понедельник. Укажите в листе ответа все ошибки. Взяв эту программу за основу, напишите программу, которая будет решать ту же задачу при условии, что w1 — день недели для первого числа месяца. Значение w1 (целое число от 1 до 7) должно запрашиваться программой. Интересующее нас число месяца d (от 1 до 31) также должно запрашиваться. Предполагается, что ввод данных будет корректным.
Программа на языке Паскаль | Программа на языке Бейсик |
---|---|
var d,w:integer; begin readln(d); w:=d div 7; case w of 1:writeln(’понедельник’); 2:writeln(’вторник’); 3:writeln(’среда’); 4:writeln(’четверг’); 5:writeln(’пятница’); 6:writeln(’суббота’); 7:writeln(’воскресенье’); end end. |
DIM w, d AS INTEGER INPUT d w = d \ 7 IF w = 1 THEN PRINT "понедельник" IF w = 2 THEN PRINT "вторник" IF w = 3 THEN PRINT "среда" IF w = 4 THEN PRINT "четверг" IF w = 5 THEN PRINT "пятница" IF w = 6 THEN PRINT "суббота" IF w = 7 THEN PRINT "воскресенье" END |
Программа на Алгоритмическом | Программа на языке Си |
алг нач цел w,d ввод d w:=div(d,7) выбор при w=1: вывод 'понедельник' при w=2: вывод 'вторник' при w=3: вывод 'среда' при w=4: вывод 'четверг' при w=5: вывод 'пятница' при w=6: вывод 'суббота' при w=7: вывод 'воскресенье' все |
#include <stdio.h> void main() { int w,d; scanf("%d",&d); w=d/7 switch(w){ 1:printf("понедельник");break; 2:printf("вторник");break; 3:printf("среда");break; 4:printf("четверг");break; 5:printf("пятница");break; 6:printf("суббота");break; 7:printf("воскресенье");break; } } |
Решение:
Приведенная в задании программа содержит 2-е ошибки:
- при расчете w необходимо использовать операцию определения остатка от деления (mod - для Паскаля, Бейсика и Алгоритмического, % - для Си), а не операцию целочисленного деления (div - для Паскаля и Алгоритмического, \ - для Бейсика, для Си целочисленное деление обозначается также как обычное деление);
- для воскренья w равно 0, а не 7.
- дополнительно ввести день недели для первого числа месяца w1
- рассчитать w по формуле: w=(d+w1-1)mod7
Паскаль | Бейсик |
---|---|
var d,w:integer; begin readln(w1,d); w:=(d+w1-1)mod7; case w of 1:writeln(’понедельник’); 2:writeln(’вторник’); 3:writeln(’среда’); 4:writeln(’четверг’); 5:writeln(’пятница’); 6:writeln(’суббота’); 0:writeln(’воскресенье’); end end. |
DIM w, d AS INTEGER INPUT w1,d w = (d+w1-1)MOD7 IF w = 1 THEN PRINT "понедельник" IF w = 2 THEN PRINT "вторник" IF w = 3 THEN PRINT "среда" IF w = 4 THEN PRINT "четверг" IF w = 5 THEN PRINT "пятница" IF w = 6 THEN PRINT "суббота" IF w = 0 THEN PRINT "воскресенье" END |
Алгоритмический | Си |
алг нач цел w,d ввод w1,d w:=mod((d+w1-1),7) выбор при w=1: вывод 'понедельник' при w=2: вывод 'вторник' при w=3: вывод 'среда' при w=4: вывод 'четверг' при w=5: вывод 'пятница' при w=6: вывод 'суббота' при w=0: вывод 'воскресенье' все |
#include <stdio.h> void main() { int w,d; scanf("%d %d",&w1,&d); w=(d+w1-1)%7 switch(w){ 1:printf("понедельник");break; 2:printf("вторник");break; 3:printf("среда");break; 4:printf("четверг");break; 5:printf("пятница");break; 6:printf("суббота");break; 0:printf("воскресенье");break; } } |