Некоторый
интернет-магазин ежедневно принимает заказы от покупателей. Имеется
список всех заказов, сделанных в магазине в 2011 году. Напишите
эффективную по времени работы и используемой памяти программу, которая
по этим данным определяет, в какие дни недели магазин получал наибольшее
число заказов.
На вход программе в первой сроке подается количество
заказов N. В каждой из последующих N строк находится информация о датах
заказов в следующем формате: <день> <месяц> где <день>
– число от 1 до 31, <месяц> – одно из 12 возможных слов —
«января», «февраля», «марта», «апреля», «мая», «июня», «июля»,
«августа», «сентября», «октября», «ноября», «декабря». Все даты —
корректные, даты различных заказов могут совпадать.
Пример входных данных:5
4 апреля
5 апреля
11 апреля
5 апреля
31 марта
Программа
должна вывести список дней недели, в которые поступало наибольшее число
заказов. Для примера выше результат работы программы должен быть таким:
понедельниквторник
Для справки – 1 января 2011 года было субботой.
Количество
дней в месяцах года: январь – 31, февраль – 28, март – 31, апрель – 30,
май – 31, июнь – 30, июль – 31, август – 31, сентябрь – 30, октябрь -
31, ноябрь – 30, декабрь – 31.
Решение задачи №11.
posl:array [1..12] of integer = (31,28,31,30,31,30,31,31,30,31,30,31); {постоянный целочисленный массив posl, который содержит количество дней в каждом месяце}
![](/Pascal/download-button.jpg)
Алгоритм решения задачи
Для решения задачи, нам необходимо определить в списке какой по счету день в году. Для этого мы ввели постоянный массив posl, в котором указаны количество дней в каждом месяце (с 1 по 12). В цикле while m<>mes[i] do мы находим какой по счету день в году (d:=d+posl[i];), для этого проверяем пока введенный с клавиатуры месяц не совпадет со значением постоянного массива месяцев mes, если не совпадаем увеличиваем значение переменной дня d на величину количества дней в месяце.
Определив какой по счету день в году, мы находим какой это день недели (из условия задачи 1 января - суббота), в этом нам помогает постоянный массив dn в котором последовательно идут суббота (1 индекс), воскресенье (индекс 2) и тд. до пятницы (индекс 7). Получив остаток от деления величины по счету дней в году на 7, мы получаем значение дня недели (1 -суббота, 2- воскресенье и тд. 0-пятница). Проверяем величину остатка от деления, не равен ли он 0, если равен то массив sum (который подсчитывает сколько заказов было в конкретный день недели) с индексом 7 (который соответствует пятнице) увеличивает свое значение на единицу. В противном случае массив sum с индексом остатка от деления увеличивает свое значение на единицу. Так мы подсчитаем сколько заказов было в каждый день недели.
Нам остается только найти максимальное количество заказов в какой-то из дней недели и вывести дни недели с максимальным количеством заказов.
Возврат к списку
Решение задачи №11.
const {задаём константы}
mes:array [1..12] of string = ('января','февраля','марта','апреля','мая','июня','июля','августа','сентября',
'октября','ноября','декабря'); {задаем постоянный строковый массив mes, который содержит названия всех месяцев года}posl:array [1..12] of integer = (31,28,31,30,31,30,31,31,30,31,30,31); {постоянный целочисленный массив posl, который содержит количество дней в каждом месяце}
dn:array [1..7] of string = ('суббота','воскресенье','понедельник','вторник','среда','четверг','пятница'); {постоянный строковый массив dn, который содержит названия дней недели, начиная с субботы}
var {задаём переменные}sum:array [1..7] of integer; {целочисленный массив с индексами от 1 до 7, поможет посчитать сколько заказов было в каждый день недели}
m:string; {строковая переменная m будет считывать месяц введенный с клавиатуры}
i,n,d,j,max:integer; {целочисленные переменные: i и j - индексы, n - количество заказов, d - считает дату заказа (день), max - максимальное количества заказов в конкретный день}
begin
for i:=1 to 7 do {цикл для обнуления массива sum}
sum[i]:=0; { обнулили массив }
readln (n); { считали количество заказов в списке }
for j:=1 to n do { задаем цикл для считывания n строк списка }
begin
readln(d,m); { считываем в переменную d - день, а в переменную m - месяц }
i:=1; { начальное значение индекса i равно 1 }
while m<>mes[i] do { задаем цикл пока переменная месяца m не равна элементу постоянного массива mes[i] }
begin
d:=d+posl[i]; { в цикле переменная d каждый проход цикла прибавляет величину массива posl[i] в котором находятся данные по максимальным количествам дней в месяце, таким образом мы подсчитываем какой по счету месяц в году }
i:=i+1; { каждый проход цикла индекс увеличивает свое значение на единицу }
end;
if d mod 7 = 0 then sum[7]:=sum[7]+1 { если остаток от деления переменной d на 7 равен нулю, следовательно день недели пятница, массив sum[7] увеличивает свое значение на единицу }
else
sum[d mod 7]:= sum[d mod 7]+1; { в противном случае, массив sum с индексом в mod 7 (sum[d mod 7]) увеличивает свое значение на единицу, таким образом мы подсчитали сколько заказов было в каждый день недели }
end; { мы считали данные с клавиатуры, и подсчитали сколько в каждый день недели было заказов }
max:=0; { нам осталось подсчитать максимальное количество заказов в определенный день недели, для этого начальное значение переменной max присвоим 0 }
for i:=1 to 7 do { задаем цикл для определение максимального числа заказов }
if sum[i]>max then max:=sum[i]; { если элемент массива sum больше переменной max, тогда значение переменной max принимает значение элемента массива? таким образом мы определили максимальное количество заказов }
for i:=1 to 7 do { задаем цикл, чтобы вывести все дни недели количество заказов которых равно максимальному числу заказов }
if max=sum[i] then writeln(dn[i]); { если элемент массива равен переменной max, тогда выводим на экран день недели (массив dn[i]), задача решена }
end.
m:string; {строковая переменная m будет считывать месяц введенный с клавиатуры}
i,n,d,j,max:integer; {целочисленные переменные: i и j - индексы, n - количество заказов, d - считает дату заказа (день), max - максимальное количества заказов в конкретный день}
begin
for i:=1 to 7 do {цикл для обнуления массива sum}
sum[i]:=0; { обнулили массив }
readln (n); { считали количество заказов в списке }
for j:=1 to n do { задаем цикл для считывания n строк списка }
begin
readln(d,m); { считываем в переменную d - день, а в переменную m - месяц }
i:=1; { начальное значение индекса i равно 1 }
while m<>mes[i] do { задаем цикл пока переменная месяца m не равна элементу постоянного массива mes[i] }
begin
d:=d+posl[i]; { в цикле переменная d каждый проход цикла прибавляет величину массива posl[i] в котором находятся данные по максимальным количествам дней в месяце, таким образом мы подсчитываем какой по счету месяц в году }
i:=i+1; { каждый проход цикла индекс увеличивает свое значение на единицу }
end;
if d mod 7 = 0 then sum[7]:=sum[7]+1 { если остаток от деления переменной d на 7 равен нулю, следовательно день недели пятница, массив sum[7] увеличивает свое значение на единицу }
else
sum[d mod 7]:= sum[d mod 7]+1; { в противном случае, массив sum с индексом в mod 7 (sum[d mod 7]) увеличивает свое значение на единицу, таким образом мы подсчитали сколько заказов было в каждый день недели }
end; { мы считали данные с клавиатуры, и подсчитали сколько в каждый день недели было заказов }
max:=0; { нам осталось подсчитать максимальное количество заказов в определенный день недели, для этого начальное значение переменной max присвоим 0 }
for i:=1 to 7 do { задаем цикл для определение максимального числа заказов }
if sum[i]>max then max:=sum[i]; { если элемент массива sum больше переменной max, тогда значение переменной max принимает значение элемента массива? таким образом мы определили максимальное количество заказов }
for i:=1 to 7 do { задаем цикл, чтобы вывести все дни недели количество заказов которых равно максимальному числу заказов }
if max=sum[i] then writeln(dn[i]); { если элемент массива равен переменной max, тогда выводим на экран день недели (массив dn[i]), задача решена }
end.
![](/Pascal/download-button.jpg)
Алгоритм решения задачи
Для решения задачи, нам необходимо определить в списке какой по счету день в году. Для этого мы ввели постоянный массив posl, в котором указаны количество дней в каждом месяце (с 1 по 12). В цикле while m<>mes[i] do мы находим какой по счету день в году (d:=d+posl[i];), для этого проверяем пока введенный с клавиатуры месяц не совпадет со значением постоянного массива месяцев mes, если не совпадаем увеличиваем значение переменной дня d на величину количества дней в месяце.
Определив какой по счету день в году, мы находим какой это день недели (из условия задачи 1 января - суббота), в этом нам помогает постоянный массив dn в котором последовательно идут суббота (1 индекс), воскресенье (индекс 2) и тд. до пятницы (индекс 7). Получив остаток от деления величины по счету дней в году на 7, мы получаем значение дня недели (1 -суббота, 2- воскресенье и тд. 0-пятница). Проверяем величину остатка от деления, не равен ли он 0, если равен то массив sum (который подсчитывает сколько заказов было в конкретный день недели) с индексом 7 (который соответствует пятнице) увеличивает свое значение на единицу. В противном случае массив sum с индексом остатка от деления увеличивает свое значение на единицу. Так мы подсчитаем сколько заказов было в каждый день недели.
Нам остается только найти максимальное количество заказов в какой-то из дней недели и вывести дни недели с максимальным количеством заказов.
![](/i_back.gif)