По номеру дня недели определить его название - C (СИ)
Формулировка задачи:
#include <stdio.h>
#include <conio.h>
main()
{
static int days[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int dw=4,A[3]={1,1,1999},B[3];
clrscr();
printf("Vvedite datu (DD MM YYYY)");
scanf("%d %d %d",&B[0],&B[1],&B[2]);
while ((A[0]<=B[0])&&(A[1]<=B[1])&&(A[2]<=B[2]))
{
A[0]++;
if (A[0]>days[A[1]])
{
if ((A[1]==2)&&(A[0]==29)&&(A[2]%4==0)) goto l10;
A[0]=1;A[1]++;
if(A[1]==13){A[1]=1;A[2]++;}
}
l10:
dw++;
if (dw==8) (dw=1);
}
switch (dw){
case 1:printf("pyatnica");break;
case 2:printf("subbota");break;
case 3:printf("voskresene");break;
case 4:printf("ponedelnik");break;
case 5:printf("vtornik");break;
case 6:printf("sreda");break;
case 7:printf("chetverg ");break;}
getch();
}Решение задачи: «По номеру дня недели определить его название»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#define BUFLEN 32
int main(void){
time_t sec;
struct tm ret, * loc;
int day, month, year;
static const char *days[] = { "Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота" };
memset(&ret, 0, sizeof(struct tm));
printf("Enter the dste in format DD-MM-YYYY > ");
if ( scanf("%d-%d-%d", &day, &month, &year) != 3 ){
perror("scanf");
exit(EXIT_FAILURE);
}
ret.tm_year = year - 1900;
ret.tm_mon = month - 1;
ret.tm_mday = day;
ret.tm_hour = 0;
ret.tm_min = 0;
ret.tm_sec = 1;
if ( ( sec = mktime(&ret) ) == -1 ){
perror("mktime");
exit(EXIT_FAILURE);
}
loc = localtime(&sec);
printf("%s\n", days[loc->tm_wday]);
exit(EXIT_SUCCESS);
}
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы
- Определяется константа BUFLEN, которая равна 32 символам
- Объявляются переменные sec, ret, loc, day, month, year, days
- Инициализируется структура tm, используя функцию memset
- Пользователю предлагается ввести дату в формате DD-MM-YYYY
- С помощью функции scanf считываются значения переменных day, month, year
- Значения переменных month и day приводятся к 0-индексированному формату (например, январь становится 0, а не 1)
- Значение переменной year приводится к формату ГГГГ-ГГ-ГГ (например, 2000 становится 1900, а не 2000)
- Значения переменных ret.tm_year, ret.tm_mon и ret.tm_mday присваиваются соответствующие значения
- Значения переменных ret.tm_hour, ret.tm_min и ret.tm_sec присваиваются нулевые значения
- Используя функцию mktime, создается объект типа tm
- Если mktime вернул -1, то программа выводит сообщение об ошибке и завершает работу с кодом EXIT_FAILURE
- Полученный объект типа tm приводится к объекту типа localtime_r
- Используя оператор индексации, определяется день недели и выводится на экран с помощью функции printf
- Программа завершает работу с кодом EXIT_SUCCESS