Размер шрифта: A AA Изображения Выключить Включить Цвет сайта Ц Ц Ц Х
Бесплатный конструктор сайтов - uCoz
Суббота, 18.05.2024, 16:12
Приветствую Вас Гость | RSS

Сайт учителя информатики  и ИКТ Шинкаренко Евгения Александровича

Реклама
Оцените сайт
Оцените мой сайт
Всего ответов: 837
Программирование
Какой язык программирования выбрать для подготовки к ЕГЭ
Всего ответов: 804

Решение задачи №11.

Задача №11.
Некоторый интернет-магазин ежедневно принимает заказы от покупателей. Имеется список всех заказов, сделанных в магазине в 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.
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.

Алгоритм решения задачи
Для решения задачи, нам необходимо определить в списке какой по счету день в году. Для этого мы ввели постоянный массив 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 с индексом остатка от деления увеличивает свое значение на единицу. Так мы подсчитаем сколько заказов было в каждый день недели.

Нам остается только найти максимальное количество заказов в какой-то из дней недели и вывести дни недели с максимальным количеством заказов.

Возврат к списку
Реклама
Календарь
«  Май 2024  »
ПнВтСрЧтПтСбВс
  12345
6789101112
13141516171819
20212223242526
2728293031
Поиск
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Счетчик яндекс
Яндекс.Метрика