Консультация № 184599
28.11.2011, 19:01
54.08 руб.
0 22 2
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:

Нужно написать программу.
Вот текст задания:

Нужно ввести дату в формате ДД.ММ. Определить и вывести по этой дате на экран день недели для текущего года
Помогите пожалуйста....Заранее спасибо!

Обсуждение

давно
Мастер-Эксперт
325460
1469
28.11.2011, 19:04
общий
консольное приложение?
Об авторе:
to live is to die
Неизвестный
28.11.2011, 19:11
общий
Адресаты:
Ну нужен текст программы...на си....
давно
Мастер-Эксперт
325460
1469
28.11.2011, 19:14
общий
а год какой?
если никто не возьмется, то завтра постараюсь выложить код. функцию определения дня недели.
Об авторе:
to live is to die
Неизвестный
28.11.2011, 19:18
общий
Адресаты:
Год нужен текущий.
Неизвестный
28.11.2011, 19:26
общий
Адресаты:
И пожалуйста, если можно, то чтоб программа была написана понятно
давно
Академик
20764
1861
28.11.2011, 21:46
общий
Цитата: 349343
Год нужен текущий.
Текущий - это его запросить у системы или считать 2011? Во втором случае программа будет совсем простая.
Неизвестный
28.11.2011, 21:56
общий
Адресаты:
Считать год 2011, используя оператор Switch
давно
Мастер-Эксперт
325460
1469
29.11.2011, 12:08
общий
это ответ
Здравствуйте, Посетитель - 349343!

Предлагаю следующее решение
Код:


#include "stdafx.h"


//////////////////////////////////////////////////////
// Входные данные
// year - год
// month - месяц
// d- день
//
//Выходные данные
// result - Результат — число от 0 до 6, где 0 — суббота, 1 — воскресенье, 2 — понедельник, 3 — вторник, 4 — среда, 5 — четверг, 6 — пятница
int day(int year,int month, int d)
{
int a=0;
int y=0;
int result=0;
a=(14-month)/12 ; // вспомогательная переменная
y=year-a; // определяются год и месяц с учётом поправки
result=(7000+((d+y+y) / 4-y / 100+y / 400+(31*month) /12)) % 7 ; // получаем день недели
return result;// выдаем день недели
}



int _tmain(int argc, _TCHAR* argv[])
{
int mm;
int dd;
int e=0;
// преобразование страки в int
mm=int(argv[3]-'0')*10+int(argv[4]-'0')*10;
dd=int(argv[0]-'0')*10+int(argv[1]-'0')*10;


e=day(2011,mm,dd);
//e=day(2011,11,29);// занчение для проверки
printf("%d",e); // выод номера недели по возвращаемой функции
return e;
}




Если Вам надо осуществить ввод с клавиатуры, пишите, реализую

В данном примере реализован ввод из командной строчки, выводит номер недели, если будут вопросы, пишите.
Об авторе:
to live is to die
давно
Академик
320937
2216
29.11.2011, 12:56
общий
это ответ
Здравствуйте, Посетитель - 349343! Code::blocks/G++
Код:
/* 1.1.2011 - суббота */
#include <stdio.h>
#include <stdlib.h>
int main()
{
enum {FIRST_DAY=6};
enum sum_days
{JAN=31, FEB=JAN+28, MAR=FEB+31, APR=MAR+30, MAY=APR+31, JUN=MAY+30,
JUL=JUN+31, AUG=JUL+31, SEP=AUG+30, OCT=SEP+31, NOV=OCT+30};
int month, day;
int year_day, week_day;

char s_date[6];

system("chcp 1251 >nul");

printf("Дата в формате dd.mm ");
scanf("%s", s_date);

day=(s_date[0]-'0')*10+(s_date[1]-'0');
month=(s_date[3]-'0')*10+(s_date[4]-'0');

switch (month)
{
case 1:
year_day=day;
break;
case 2:
year_day=day+JAN;
break;
case 3:
year_day=day+FEB;
break;
case 4:
year_day=day+MAR;
break;
case 5:
year_day=day+APR;
break;
case 6:
year_day=day+MAY;
break;
case 7:
year_day=day+JUN;
break;
case 8:
year_day=day+JUL;
break;
case 9:
year_day=day+AUG;
break;
case 10:
year_day=day+SEP;
break;
case 11:
year_day=day+OCT;
break;
case 12:
year_day=day+NOV;
break;
default:
year_day=0;
break;
}
week_day = (year_day+FIRST_DAY-1)%7;
if (week_day==0)
week_day=7;
printf("Номер дня недели - %d\n", week_day);

system("pause");
return 0;
}

Если будут вопросы - обращайтесь в мини-форум.
Неизвестный
07.12.2011, 01:53
общий
Адресаты:
Здравствуйте!
А можно добавить комментарии к программе(желательно подробнее)?
Заранее спасибо!
давно
Академик
320937
2216
07.12.2011, 07:38
общий
Добрый день! Что именно Вас интересует? Какие строки понятны?
Неизвестный
07.12.2011, 22:10
общий
Адресаты:
Здравствуйте!
Желательно ко всем.
давно
Академик
320937
2216
08.12.2011, 08:54
общий
Добрый день! Вынужден повторить вопрос
Цитата: lamed
Какие строки понятны?

Например, понятна ли строка 1, содержащая /* 1.1.2011 - суббота */?
Неизвестный
08.12.2011, 10:35
общий
Адресаты:
Здравствуйте!
enum {FIRST_DAY=6};
enum sum_days
{JAN=31, FEB=JAN+28, MAR=FEB+31, APR=MAR+30, MAY=APR+31, JUN=MAY+30,
JUL=JUN+31, AUG=JUL+31, SEP=AUG+30, OCT=SEP+31, NOV=OCT+30};
int month, day;
int year_day, week_day;
char s_date[6];
system("chcp 1251 >nul");
printf("Дата в формате dd.mm ");
scanf("%s", s_date);
day=(s_date[0]-'0')*10+(s_date[1]-'0');
month=(s_date[3]-'0')*10+(s_date[4]-'0');
switch (month)
{
case 1:
year_day=day;
break;
case 2:
year_day=day+JAN;
break;
case 3:
year_day=day+FEB;
break;
case 4:
year_day=day+MAR;
break;
case 5:
year_day=day+APR;
break;
case 6:
year_day=day+MAY;
break;
case 7:
year_day=day+JUN;
break;
case 8:
year_day=day+JUL;
break;
case 9:
year_day=day+AUG;
break;
case 10:
year_day=day+SEP;
break;
case 11:
year_day=day+OCT;
break;
case 12:
year_day=day+NOV;
break;
default:
year_day=0;
break;
}
week_day = (year_day+FIRST_DAY-1)%7;
if (week_day==0)
week_day=7;



Вот можно эти?
давно
Академик
320937
2216
08.12.2011, 17:41
общий
Хорошо, в выходные сделаю.
давно
Академик
320937
2216
15.12.2011, 10:18
общий
Добрый день! Вновь вынужден задать вопрос. Какие строки в программе понятны? Не знаю, как комментировать 36 практически одинаковых строк. Что-нибудь на Си Вы умеете делать?
Неизвестный
15.12.2011, 15:44
общий
Адресаты:
Добрый день!
Вот эти строки можно с комментариями.....в принципе разобрался с ними....но охота, что точные объяснения.


enum {FIRST_DAY=6};
enum sum_days
{JAN=31, FEB=JAN+28, MAR=FEB+31, APR=MAR+30, MAY=APR+31, JUN=MAY+30,
JUL=JUN+31, AUG=JUL+31, SEP=AUG+30, OCT=SEP+31, NOV=OCT+30};
int month, day;
int year_day, week_day;
char s_date[6];
system("chcp 1251 >nul");
printf("Дата в формате dd.mm ");
scanf("%s", s_date);
day=(s_date[0]-'0')*10+(s_date[1]-'0');
month=(s_date[3]-'0')*10+(s_date[4]-'0');
давно
Академик
320937
2216
15.12.2011, 17:18
общий
15.12.2011, 18:09
Добрый день! Все примечания - это ссылки на
Б. Керниган, Д. Ритчи. Язык программирования Си. Издание 3-е, исправленное.
Перевод с английского под редакцией Вс. С. Штаркмана. Невский Диалект, Санкт-Петербург 2001
, точнее на интернет-текст

В Си имеется еще один вид константы - константа перечисления. Перечисление - это список целых констант, как, например, в

enum boolean {NO, YES};

Первое имя в enum имеет значение 0, следующее - 1 и т.д. (если для значений констант не было явных спецификаций). Если не все значения специфицированы, то они продолжают прогрессию, начиная от последнего специфицированного значения, как в следующих двух примерах:

enum escapes { BELL = '\a', BACKSPACE = '\b', TAB = '\t',
NEWLINE = '\n', VTAB = '\v', RETURN = '\r'};
enum months { JAN = 1, FEB, MAR, APR, MAY, JUN,
JUL, AUG, SEP, OCT, NOV, DEC};
/* FEB есть 2, MAR есть 3 и т.д. */

Имена в различных перечислениях должны отличаться друг от друга. Значения внутри одного перечисления могут совпадать.

Средство enum обеспечивает удобный способ присвоить константам имена, причем в отличие от #define значения констант при этом способе могут генерироваться автоматически. Хотя разрешается объявлять переменные типа enum, однако компилятор не обязан контролировать, входят ли присваиваемые этим переменным значения в их тип. Но сама возможность такой проверки часто делает enum лучше, чем #define. Кроме того, отладчик получает возможность печатать значения переменных типа enum в символьном виде.
Стало быть, использование enum в программе - для удобства.

Код:
enum sum_days
{JAN=31, FEB=JAN+28, MAR=FEB+31, APR=MAR+30, MAY=APR+31, JUN=MAY+30,
JUL=JUN+31, AUG=JUL+31, SEP=AUG+30, OCT=SEP+31, NOV=OCT+30};

Поскольку задается номер дня в месяце, нужно определить номер дня в году, для чего прибавляем дни во всех предыдущих месяцах.

2011 год начался с субботы. Можно было бы написать без enum
Код:
week_day = (year_day+6-1)%7;

вместо
Код:
week_day = (year_day+FIRST_DAY-1)%7;


Код:
int month, day;
int year_day, week_day;
char s_date[6];

Здесь определяются переменные, в частности, выделяется память для хранения. Первоначально в этих переменных - "мусор"

Код:
system("chcp 1251 >nul");

Библиотечная функция system "запускает" DOS-команду chcp 1251 > nul, которая в консольном окне программы устанавливает кодовую страницу для вывода кириллицы.

Код:
printf("Дата в формате dd.mm ");

Печатаем сообщение

Код:
scanf("%s", s_date);

Читаем с клавиатуры в переменную s_date;

Код:
day=(s_date[0]-'0')*10+(s_date[1]-'0');
month=(s_date[3]-'0')*10+(s_date[4]-'0');
Разбираем строку. Получаем номер дня и номер месяца.
Неизвестный
15.12.2011, 23:06
общий
Адресаты:
week_day = (year_day+FIRST_DAY-1)%7;

А вот в этой строке %7 это что? то что 7 дней в неделе?
давно
Академик
320937
2216
16.12.2011, 07:50
общий
Цитата: 349343
week_day = (year_day+FIRST_DAY-1)%7;
А вот в этой строке %7 это что? то что 7 дней в неделе?

В задании требуется указать номер дня недели. Если день в году, например, 8, то 8+6-1=13,
13%7=6, то есть 8 января тоже суббота.
Неизвестный
16.12.2011, 20:54
общий
Адресаты:
Здравствуйте еще раз!

day=(s_date[0]-'0')*10+(s_date[1]-'0');
month=(s_date[3]-'0')*10+(s_date[4]-'0');

можно вот эти строки подробнее.

s_date[0] - вот это получается берется какой день недели?(воскресенье?) или это функция перевода числа типа (01.01) ?

s_date[3]
давно
Академик
320937
2216
16.12.2011, 22:37
общий
Адресаты:
Давайте так. Весь язык Си я пересказывать не буду. Если хотите консультаций по языку - можно и это, но отдельно.
Форма ответа