С Новым годом! Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/77: Рейтинг темы: голосов - 77, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 07.05.2015
Сообщений: 8
1

Определить день недели, на который приходится день с указанной датой

13.05.2015, 13:55. Показов 14153. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите пожалуйста переделать программу!!!
Задание:
Pascal
1
2
3
4
{type число =  1..31;
    месяц = (янв,фев,мар,апр,май,июн,июл,авг,сен,окт,ноя,дек);
    деньнедели = (вс,пн,вт,ср,чт,пт,сб);
var d: число; m: месяц; wd1, wd: деньнедели; k: 0..12;
Считая, что год невисокосный и его 1 января приходится на день недели wd1,
определить wd - день недели, на который приходится день с датой d, m.}

Сама программа:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
program zadanie2;
type
    day = 1..31; //тип данных 'день'
    days = 1..365;//тип данных -номер дня недели
    month = 1..12;//тип данных- номер месяца
    const all_month : array[1..12] of string =('Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь');//константа - массив названий месяцев
    const   all_daysofweek : array[1..7] of string = ('понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота', 'воскресенье');//константа - массив названий дней недели
var
  i,j : integer; //счетчики для циклов расчета дня месяца
  kd: days; //счетчик дней от начала года.
  d : day;//дата внутри месяца (день) определяемого дня недели
  m : month;//месяц определяемого дня недели
  wd1s:string; //строка для ввода для недели, на который приходится 1ое января
  days_in_month:array[1..12] of integer := (31,28,31,30,31,30,31,31,30,31,30,31); //массив значений - сколько дней в каждом месяце невисокосного года
begin
  writeln('введите день недели на который пришлось первое января: '); //вывод на экран 'введите...'
  readln(wd1s);//считывание данных из консоли в переменную wd1s 
  wd1s := UpperCase(wd1s);                        //перевод строки в верхний регистр.
  if wd1s in  ['MON', 'ПН', 'ПОНЕДЕЛЬНИК']      then kd := 0 //если значение wds = 'mon', 'пн' или 'понедельник', то kd = 1
  else if wd1s in  ['TUE', 'ВТ', 'ВТОРНИК']      then kd := 1 //ИНАЧЕ если значение wds = ''tue', 'вт' или 'вторник', то kd = 2                                       
  else if wd1s in  ['WED', 'СР', 'СРЕДА']       then kd := 2 //ИНАЧЕ если...
  else if wd1s in  ['THU', 'ЧТ', 'ЧЕТВЕРГ']     then kd := 3 //ИНАЧЕ если..
  else if wd1s in  ['FRI', 'ПТ', 'ПЯТНИЦА']     then kd := 4 //ИНАЧЕ если..
  else if wd1s in  ['SAT', 'СБ', 'СУББОТА']     then kd := 5 //ИНАЧЕ если..
  else if wd1s in  ['SUN', 'ВС', 'ВОСКРЕСЕНЬЕ'] then kd := 6; //ИНАЧЕ если..
  
  writeln('Введите день и месяц для определения дня недели:'); //вывод на экран сообщения 'введите'
  readln(d, m);//считывание из консоли значений d и m - дня и месяца определяемого дня недели
  
  for i:=1 to m do//цикл - переменная i принимает значения от 1 до номера введенного месяца
    begin //так как в цикле больше 1 оператора, то применяется конструкция begin .. end 
      if i<m then //если i не номер введенного месяца, то..
        for j:=1 to days_in_month[i] do //цикл от 1 до номера числа дней в iом месяце (числа дней в месяце содержатся в массиве days_in_month
           kd:=kd+1 // прибавление к счетчику дней от начала года единицы
      else //иначе - т.е. условие выполнения - если i равен номеру введенного месяца
        for j:=1 to d do //тут цикл идет не до конца месяца, а до 
          kd:= kd+1; //прибавление к счетчику дней от начала года единицы
    end;// конец выражения под циклом   for i:=1 to m do (конструкции begin - end)
  
    case (kd mod 7) of //оператор выбора - в зависимости от остатка деления количества прошедших дней от начала года (kd) на 7. пример- 1 mod 7 = 8 mod 7 = 1 = понедельник
      0: writeln(d,' числа месяца ',all_month[m],' - ',all_daysofweek[7]); //если значение 0 выводится надпись из массива all_daysofweek с индексом 7 - 'воскресенье '
      else  writeln(d,' числа месяца ',all_month[m],' - ',all_daysofweek[kd mod 7]); //иначе выводится надпись из массива all_daysofweek с индексом kd mod 7 (индекс от 1 до 6)
    end;
end.
Программа работает, только нужно переделать
Pascal
1
2
3
4
5
6
7
 if wd1s in  ['MON', 'ПН', 'ПОНЕДЕЛЬНИК']      then kd := 0 //если значение wds = 'mon', 'пн' или 'понедельник', то kd = 1
  else if wd1s in  ['TUE', 'ВТ', 'ВТОРНИК']      then kd := 1 //ИНАЧЕ если значение wds = ''tue', 'вт' или 'вторник', то kd = 2                                       
  else if wd1s in  ['WED', 'СР', 'СРЕДА']       then kd := 2 //ИНАЧЕ если...
  else if wd1s in  ['THU', 'ЧТ', 'ЧЕТВЕРГ']     then kd := 3 //ИНАЧЕ если..
  else if wd1s in  ['FRI', 'ПТ', 'ПЯТНИЦА']     then kd := 4 //ИНАЧЕ если..
  else if wd1s in  ['SAT', 'СБ', 'СУББОТА']     then kd := 5 //ИНАЧЕ если..
  else if wd1s in  ['SUN', 'ВС', 'ВОСКРЕСЕНЬЕ'] then kd := 6; //ИНАЧЕ если..
с помощью case, чтобы не писать каждую в отдельности
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.05.2015, 13:55
Ответы с готовыми решениями:

Известна дата и день недели некоторого события. Определить, на какой день недели приходится начало года
Известна дата и день недели некоторого события. Определить, на какой день недели приходится начало...

Определить название месяца, на который приходится указанный день
Задан S - номер дня не высокосного года (1&lt; S &lt; 365). Определить название месяца и номер дня такого...

Определить день недели, на который приходится день с датой d (день), m (месяц)
Считая, что год не високосный и его 1 января приходится на день недели wd1, определиь wd -день...

Определить день недели, на который приходится день с введенной датой
имеются следующие описания:число=1..31 день недели(пн,вт,ср,чт,пт,сб).Считая,что год не високосный...

9
Эксперт Pascal/Delphi
2386 / 1298 / 1492
Регистрация: 29.08.2014
Сообщений: 4,661
13.05.2015, 14:58 2
вот мой вариант, а теперь конкретно что нужно переделать?
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const ms:array[1..12] of integer=(31,28,31,30,31,30,31,31,30,31,30,31);
      dt:array[1..7] of string[2]=('Пн','Вт','Ср','Чт','Пт','Сб','Вс');
var
  d,m,i,wd1:integer;
begin
  repeat
    write('на какой день недели выпало 1 января (1-пн,2-вт...7-вс):');
    readln(wd1);
  until wd1 in [1..7];  
  repeat
    write('День=');    readln(d);
    write('Месяц=');    readln(m);
  until (m>0) and (m<13) and (d<=ms[m]);  
  for i:=1 to m-1 do d:=d+ms[i];
  writeln(dt[(d+wd1) mod 7-1]);
 end.
1
0 / 0 / 0
Регистрация: 07.05.2015
Сообщений: 8
13.05.2015, 15:07  [ТС] 3
Pascal
1
2
3
4
5
6
7
if wd1s in  ['MON', 'ПН', 'ПОНЕДЕЛЬНИК']      then kd := 0 //если значение wds = 'mon', 'пн' или 'понедельник', то kd = 1
  else if wd1s in  ['TUE', 'ВТ', 'ВТОРНИК']      then kd := 1 //ИНАЧЕ если значение wds = ''tue', 'вт' или 'вторник', то kd = 2                                       
  else if wd1s in  ['WED', 'СР', 'СРЕДА']       then kd := 2 //ИНАЧЕ если...
  else if wd1s in  ['THU', 'ЧТ', 'ЧЕТВЕРГ']     then kd := 3 //ИНАЧЕ если..
  else if wd1s in  ['FRI', 'ПТ', 'ПЯТНИЦА']     then kd := 4 //ИНАЧЕ если..
  else if wd1s in  ['SAT', 'СБ', 'СУББОТА']     then kd := 5 //ИНАЧЕ если..
  else if wd1s in  ['SUN', 'ВС', 'ВОСКРЕСЕНЬЕ'] then kd := 6; //ИНАЧЕ если..
преподаватель просит эту часть преобразовать с помощью case и там уже перечислялись дни недели. Ей не нравится, что для каждой дни недели нужно писать if,else, then ("слишком много писанины")
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
33003 / 21306 / 8183
Регистрация: 22.10.2011
Сообщений: 36,609
Записей в блоге: 8
13.05.2015, 15:19 4
Ввести вот такую константу:
Pascal
1
2
3
4
const
  lst : string =
  'MON_ПН_ПОНЕДЕЛЬНИК_TUE_ВТ_    ВТОРНИК_WED_СР_      СРЕДА_' +
  'THU_ЧТ_    ЧЕТВЕРГ_FRI_ПТ_    ПЯТНИЦА_SAT_СБ_    СУББОТА_SUN_ВС_ВОСКРЕСЕНЬЕ_';
, и все это:
Pascal
1
2
3
4
5
6
7
if wd1s in ['MON', 'ПН', 'ПОНЕДЕЛЬНИК'] then kd := 0 //если значение wds = 'mon', 'пн' или 'понедельник', то kd = 1
 else if wd1s in ['TUE', 'ВТ', 'ВТОРНИК'] then kd := 1 //ИНАЧЕ если значение wds = ''tue', 'вт' или 'вторник', то kd = 2 
 else if wd1s in ['WED', 'СР', 'СРЕДА'] then kd := 2 //ИНАЧЕ если...
 else if wd1s in ['THU', 'ЧТ', 'ЧЕТВЕРГ'] then kd := 3 //ИНАЧЕ если..
 else if wd1s in ['FRI', 'ПТ', 'ПЯТНИЦА'] then kd := 4 //ИНАЧЕ если..
 else if wd1s in ['SAT', 'СБ', 'СУББОТА'] then kd := 5 //ИНАЧЕ если..
 else if wd1s in ['SUN', 'ВС', 'ВОСКРЕСЕНЬЕ'] then kd := 6; //ИНАЧЕ если..
заменить на
Pascal
1
kd := pos(wd1s + '_', lst) div 19;
1
0 / 0 / 0
Регистрация: 07.05.2015
Сообщений: 8
13.05.2015, 15:29  [ТС] 5
а с помощью case можно его преобразовать?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
33003 / 21306 / 8183
Регистрация: 22.10.2011
Сообщений: 36,609
Записей в блоге: 8
13.05.2015, 15:30 6
Case не нужен, он не сократит код в твоем случае.
0
0 / 0 / 0
Регистрация: 07.05.2015
Сообщений: 8
13.05.2015, 15:39  [ТС] 7
а преподаватель просит, чтобы обязательно был case, его можно туда встроить?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
33003 / 21306 / 8183
Регистрация: 22.10.2011
Сообщений: 36,609
Записей в блоге: 8
13.05.2015, 15:42 8
Блин, непонятно что-ли? Валит он тебя. Встроишь Case - будет вякать что писанины много. Ты уж реши, что тебе нужно, чтобы было меньше писанины, или угодить преподавателю, который сам не в состоянии определить, что будет при использовании Case-а, и потом опять переписывать?

К тому же, как выяснилось, в PascalABC.NET Case работать со строками не умеет. В отличие от FPC, например... Так что Case там вообще мимо кассы.
1
0 / 0 / 0
Регистрация: 07.05.2015
Сообщений: 8
13.05.2015, 15:50  [ТС] 9
Вы все правильно говорите, просто у нас преподаватель вредный, поэтому без case не принимает, по мне, конечно, чем короче программа, тем лучше
0
Эксперт Pascal/Delphi
2386 / 1298 / 1492
Регистрация: 29.08.2014
Сообщений: 4,661
13.05.2015, 16:09 10
вместо массива case:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
const ms:array[1..12] of integer=(31,28,31,30,31,30,31,31,30,31,30,31);
var
  d,m,i,wd1:integer;
begin
  repeat
    write('на какой день недели выпало 1 января (1-пн,2-вт...7-вс):');
    readln(wd1);
  until wd1 in [1..7];  
  repeat
    write('День=');    readln(d);
    write('Месяц=');    readln(m);
  until (m>0) and (m<13) and (d<=ms[m]);  
  for i:=1 to m-1 do d:=d+ms[i];
  case (d+wd1-1) mod 7 of
    0:writeln('воскресенье');
    1:writeln('понедельник');
    2:writeln('вторник');
    3:writeln('среда');
    4:writeln('четверг');
    5:writeln('пятница');
    6:writeln('суббота');
  end;
 end.
1
13.05.2015, 16:09
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.05.2015, 16:09
Помогаю со студенческими работами здесь

Определить день недели, на который приходится день с датой “d”, “m”.
Считая, что год не високосный и его 1 января приходится на день недели “wd1”, определить день...

Определить день недели, на который приходится день с датой d, m
Объявлены типы и переменные : TYPE ЧИСЛО = 1 .. 31; МЕСЯЦ= ( ЯНВ, ФЕВ, МАР, АПР,...

Известна дата и день недели некоторого события. Определить на какой день недели приходится начало года
Известна дата и день недели некоторого события. Определить на какой день недели приходится начало...

Определить день недели, на который приходится дата d
type число =1..31; месяц=1..12; год=1..2000; дата = record ч: число; м: месяц; г: год end;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Блоги программистов
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
Полезные поделки на Arduino, которые можно сделать самому
raxper 06.01.2025
Arduino как платформа для творчества Arduino представляет собой удивительную платформу для технического творчества, которая открывает безграничные возможности для создания уникальных проектов. Эта. . .
Подборка решений задач на Python
IT_Exp 06.01.2025
Целью данной подборки является предоставление возможности ознакомиться с различными задачами и их решениями на Python, что может быть полезно как для начинающих, так и для опытных программистов. . . .
С чего начать программировать микроконтроллер­­ы
raxper 06.01.2025
Введение в мир микроконтроллеров Микроконтроллеры стали неотъемлемой частью современного мира, окружая нас повсюду: от простых бытовых приборов до сложных промышленных систем. Эти маленькие. . .
Из чего собрать игровой компьютер
inter-admin 06.01.2025
Сборка игрового компьютера требует особого внимания к выбору комплектующих и их совместимости. Правильно собранный игровой ПК не только обеспечивает комфортный геймплей в современных играх, но и. . .
Обновление сайта www.historian.b­y
Reglage 05.01.2025
Обещал подвести итоги 2024 года для сайта. Однако начну с того, что изменилось за неделю. Добавил краткий урок по последовательности действий при анализе вредоносных файлов и значительно улучшил урок. . .
Как использовать GraphQL в C# с HotChocolate
Programming 05.01.2025
GraphQL — это современный подход к разработке API, который позволяет клиентам запрашивать только те данные, которые им необходимы. Это делает взаимодействие с API более гибким и эффективным по. . .
Модель полного двоичного сумматора с помощью логических операций (python)
AlexSky-coder 04.01.2025
def binSum(x:list, y:list): s=^y] p=x and y for i in range(1,len(x)): s. append((x^y)^p) p=(x and y)or(p and (x or y)) return s x=list() y=list()
Это мы не проходили, это нам не задавали...(аси­­­­­­­­­­­­­­хро­н­н­ы­й счётчик с управляющим сигналом задержки).
Hrethgir 04.01.2025
Асинхронный счётчик на сумматорах (шестиразрядный по числу диодов на плате, но наверное разрядов будет больше - восемь или шестнадцать, а диоды на старшие), так как триггеры прошли тестирование и. . .
Руководство по созданию бота для Телеграм на Python
IT_Exp 04.01.2025
Боты для Телеграм представляют собой автоматизированные программы, которые выполняют различные задачи, взаимодействуя с пользователями через интерфейс мессенджера. В данной статье мы рассмотрим,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru