Форум программистов, компьютерный форум, киберфорум
Наши страницы
PascalABC.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
Антониос
0 / 0 / 0
Регистрация: 07.05.2015
Сообщений: 8
1

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

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

Помогите пожалуйста переделать программу!!!
Задание:
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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2015, 13:55
Ответы с готовыми решениями:

Определить, является ли заданный день недели выходным днём
Создать перечислимый тип, включающий названия дней недели, и на основе этого...

Записи: Определить по данной дате день недели и его порядковый номер в году
Первого января какого-то года был понедельник. Определить по данной дате день...

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

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

Определить день недели по дате
01.01.1980 года вторник и этот год високосныи.программа должна определять день...

9
Joy
Эксперт Pascal/Delphi
2175 / 1202 / 1438
Регистрация: 29.08.2014
Сообщений: 4,389
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
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26477 / 17781 / 7034
Регистрация: 22.10.2011
Сообщений: 31,295
Записей в блоге: 6
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
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26477 / 17781 / 7034
Регистрация: 22.10.2011
Сообщений: 31,295
Записей в блоге: 6
13.05.2015, 15:30 6
Case не нужен, он не сократит код в твоем случае.
0
Антониос
0 / 0 / 0
Регистрация: 07.05.2015
Сообщений: 8
13.05.2015, 15:39  [ТС] 7
а преподаватель просит, чтобы обязательно был case, его можно туда встроить?
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26477 / 17781 / 7034
Регистрация: 22.10.2011
Сообщений: 31,295
Записей в блоге: 6
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
Joy
Эксперт Pascal/Delphi
2175 / 1202 / 1438
Регистрация: 29.08.2014
Сообщений: 4,389
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2015, 16:09

Определить день недели по введенному дню
1 мая 2006 года – это день недели понедельник. Вводится любая дата месяца май....

Определить день недели своего рождения
По введенной текущей дате (число, месяц и год), текущем дне недели, дате...

по заданному количеству дней определить день недели
по заданному количеству дней определить день недели, если 1.01 - среда (Pascal ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru