Мегаобучалка Главная | О нас | Обратная связь


Обработка календарных дат. Лабораторная работа №1



2015-12-07 323 Обсуждений (0)
Обработка календарных дат. Лабораторная работа №1 0.00 из 5.00 0 оценок




МИНОБРНАУКИ РОССИИ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

«САМАРСКИЙ ГОСУДАРСТВЕННЫЙ АЭРОКОСМИЧЕСКИЙ УНИВЕРСИТЕТ

Имени академика С.П. КОРОЛЕВА

(НАЦИОНАЛЬНЫЙИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ)» (СГАУ)

Факультет информатики

Кафедра «Программные системы»

 

 

Отчет

По лабораторным работам по курсу

«Практикум на ЭВМ»

 

Вариант 2

 

 

Выполнил студент

Группы 6213

Елистратов А.А.

 

 

Преподаватель

Сопченко Е.В.

Самара 2014

Содержание

1. Обработка календарных дат. Лабораторная работа №1……………………..3

2. Задачи аналитической геометрии. Лабораторная работа №2……………….7

3. Обработка матриц и массивов. Лабораторная работа №3…………………...8

4. Обработка символьной, строковой и текстовой информации.

Лабораторная работа №4……………………………………………………..10

5. Рекурсия.

5.1 Лабораторная работа №5.1…………………………………………...12
5.2 Лабораторная работа №5.2…………………………………………...13

6. Обработка связных списков. Лабораторная работа №6……………………15

7. Лабораторная работа №7……………………………………………………..19

 

 

Обработка календарных дат. Лабораторная работа №1

Формулировка Задания
Посчитать количество суббот и воскресений между датами i.j.k и l.m.k (включительно), если первая дата – p-ый день недели.


Код программы

//Data.h

#include<stdio.h>

#include<stdlib.h>

#include <cstring>

#include <stdlib.h>

int dni[13]={0,31,0,31,30,31,30,31,31,30,31,30,31};

/*описание структуры для хранения информации об одной дате – число, месяц год*/

struct Data

{

int day; /*число*/

int month; /*месяц*/

int year; /*год*/

};

/*функция, проверяющая дату на корректность. Возвращает 1, если дата корректна, 0 – если некорректна*/

int correct(struct Data *data)

{

if (data->year < 1919) return(0); else;

/*проверка на високосность*/

if ((data->year%400==0) || ((data->year%4==0) && (data->year%100!=0)))

dni[2]=29; else dni[2]=28;

if ((data->month < 1) || (data->month >12)) return(0); else;

if ( (data->day < 1) || (data->day > dni[data->month]) ) return(0);

else return(1);

}

 

/*функция, переводящая номер месяца в его символьное представление в родительном падеже*/

char *month_to_string(int number)

{

switch(number)

{

case 1: return("января");

case 2: return("февраля");

case 3: return("марта");

case 4: return("апреля");

case 5: return("мая");

case 6: return("июня");

case 7: return("июля");

case 8: return("августа");

case 9: return("сентября");

case 10: return("октября");

case 11: return("ноября");

case 12: return("декабря");

default: return NULL;

}

}

/*функция, которая добавляет один день к заданной дате. Возвращает 1, если исходная дата корректна, 0 – если некорректна*/

int incr(struct Data *data )

{

if (correct(data)==0) return(0); else;

/*если это не последний день месяца, число увеличивается на единицу, остальные данные не изменяются*/

if (data->day < dni[data->month]) { data->day++; return(1); }

/*если это последний день месяца, но месяц – не последний в году*/

else if (data->month < 12) { data->day=1; data->month++; return(1); }

/*если это последний день года*/

else { data->day=1; data->month=1; data->year++; return(1); }

}

 

/*функция, которая отнимает один день от заданной даты. Возвращает 1, если исходная дата корректна, 0 – если некорректна*/

int decr(struct Data *data)

{

if (correct(data)==0) return(0); else;

/*если число – не первое*/

if (data->day > 1) { data->day--; return(1); }

/*если число первое, но месяц – не первый*/

else if (data->month > 1) { data->month--; data->day=dni[data->month];

return(1); }

/*если это первый день года*/

else { data->day=31; data->month=12; data->year--; return(1); }

}

 

/*функция возвращает день недели, на который приходится заданная дата. Работает с датами не ранее 1 января 1990 года. Возвращает день недели (от 1 до 7) и 0, если дата некорректна */

int week(struct Data *data)

{

int dni_1[13], k1, first_day_year, sum, first_day_month, week_day, i;

if (correct(data)==0) return(0); else;

/*в этот массив заносятся остатки от деления на семь количества дней в каждом месяце. Требуются для смещения дня недели при переходе к тому же числу следующего месяца*/

dni_1[1]=3;

if ( (data->year%4)==0 ) dni_1[2]=1; else dni_1[2]=0;

dni_1[3]=3; dni_1[4]=2; dni_1[5]=3; dni_1[6]=2;

dni_1[7]=3; dni_1[8]=3; dni_1[9]=2; dni_1[10]=3;

dni_1[11]=2; dni_1[12]=3;

k1= data->year/4;

if ((data->year%4)==0) k1--;

/*по этой формуле рассчитывается день недели, на который приходится 1 января заданного года. В качестве исходной информации принимается то, что 1 января 1990 года - понедельник*/

first_day_year=(1+ data->year-1990+k1-497)%7;

if (first_day_year == 0) first_day_year=7;

/*вычисление дня недели, на который приходится первое число заданного месяца*/

sum=0;

for (i=1; i< data->month; i++)

sum+=dni_1[i];

first_day_month=(first_day_year+sum)%7;

if (first_day_month ==0) first_day_month =7;

/*вычисление дня недели, на который приходится заданная дата*/

week_day=( first_day_month + data->day-1)%7;

if (week_day==0) week_day=7;

return(week_day);

}

/*функция определяет предшествует ли первая дата второй. Возвращает 1 в случае утвердительного ответа, 0 – в случае отрицательного, -1 - если некорректна первая дата, -2 – если некорректна вторая дата*/

int less_than (struct Data *d1, struct Data *d2)

{

if (correct(d1)==0) return(-1); else;

if (correct(d2)==0) return(-2); else;

if (d1->year < d2->year) return(1);

else if (d1->year == d2->year)

if (d1->month < d2->month) return(1);

else if (d1->month == d2->month)

if (d1->day < d2->day) return(1);

else return(0);

else return(0);

else return(0);

}

/*функция определяет, совпадают ли две заданные даты Возвращает 1 в случае утвердительного ответа, 0 – в случае отрицательного, -1 - если некорректна первая дата, -2 – если некорректна вторая дата*/

int equal (struct Data *d1, struct Data *d2)

{

if (correct(d1)==0) return(-1); else;

if (correct(d2)==0) return(-2); else;

if (d1->year == d2->year)

if (d1->month == d2->month)

if (d1->day == d2->day) return(1);

else return(0);

else return(0);

else return(0);

}

/*функция вычисляет на сколько дней отстоит первая дата от второй. Первая дата обязательно должна предшествовать второй. Возвращает посчитанное количество дней в случае корректности исходных данных, 0 – если первая дата не меньше второй, -1 – если первая дата некорректна, -2 – если вторая дата некорректна*/

int difference (struct Data *d2, struct Data *d1)

{

int dni_2[13][2], i, sum;

if (correct(d1)==0) return(-1); else;

if (correct(d2)==0) return(-2); else;

if ( less_than(d1, d2)==0 ) return (0);

dni_2 [1][0]=31;

if ( (d1->year%4)==0 ) dni_2 [2][0]=29; else dni_2 [2][0]=28;

dni_2 [3][0]=31; dni_2 [4][0]=30; dni_2 [5][0]=31; dni_2 [6][0]=30;

dni_2 [7][0]=31; dni_2 [8][0]=31; dni_2 [9][0]=30; dni_2 [10][0]=31;

dni_2 [11][0]=30; dni_2 [12][0]=31;

dni_2 [1][1]=31;

if ( (d2->year%4)==0 ) dni_2 [2][1]=29; else dni_2 [2][1]=28;

dni_2 [3][1]=31; dni_2 [4][1]=30; dni_2 [5][1]=31; dni_2 [6][1]=30;

dni_2 [7][1]=31; dni_2 [8][1]=31; dni_2 [9][1]=30; dni_2 [10][1]=31;

dni_2 [11][1]=30; dni_2 [12][1]=31;

/*если обе даты принадлежат одному году и одному месяцу*/

if (d2->year == d1->year)

if (d2->month == d1->month)

return(d2->day-d1->day);

else /*если обе даты принадлежат одному году, но разным месяцам*/

{

sum=dni_2 [d1->month][0]-d1->day+d2->day;

for (i=d1->month+1; i<=d2->month-1; i++)

sum+=dni_2 [i][0];

return(sum);

}

/*если обе даты принадлежат разным годам*/

else

{

sum=dni_2 [d1->month][0]-d1->day;

/*подсчет количества дней от первой даты до конца года*/

for (i=d1->month+1; i<=12; i++)

sum+=dni_2 [i][0];

/*подсчет суммарного количества дней в годах, лежащих между первои

и второй датами*/

for (i=d1->year+1; i<=d2->year-1; i++)

{

if ( i%4 == 0 ) sum+=366; else sum+=365;

}

/*подсчет количества дней от начала года второй даты до этой даты*/

for (i=1; i<d2->month; i++)

sum+=dni_2 [i][1];

sum+=d2->day;

return(sum);

}

}

 

//основная программа

#include "stdafx.h"

#include "Data.h"

#include <stdlib.h>

int Check()

{

int n=1;

while(n)

{

int s;

fflush(stdin);

if(scanf("%d",&s)!=1) {puts("Error.Repeat");}

else return s;

}

}

int _tmain(int argc, _TCHAR* argv[])

{

m1:

Data d1,d2;

puts("First date");

puts("Enter day");

d1.day=Check();

puts("Enter month");

d1.month=Check();

puts("Enter year");

d1.year=Check();

d2.year=d1.year;

if(correct(&d1)==0) {puts("Wrong date"); goto m1;}

m2:

puts("Second date");

puts("Enter day");

d2.day=Check();

puts("Enter month");

d2.month=Check();

if(correct(&d2)==0) {puts("Wrong date"); goto m2;}

if(less_than (&d1, &d2)==0) {puts("Incorrect order");goto m1;}

m3:

puts("Enter the day of the week");

int p=Check();

if((p<1)&&(p>7)) {puts("Wrong day of the week");goto m3;}//проверка на корректность дня недели

int x=0;

while(equal(&d1,&d2)==0)//считаем субботы и воскресения, сравнивая даты и смещая первую на один день при каждом проходе

{

if((p==6)||(p==7)) x++;

if(p<7) {p++;}

else p=1;

incr(&d1);

}

if((p==6)||(p==7)) x++;//проверяем последнюю дату

printf("%s%d\n","Number of Saturdays and Sundays: ",x);//выводим

system("pause");

return 0;

}

 

 



2015-12-07 323 Обсуждений (0)
Обработка календарных дат. Лабораторная работа №1 0.00 из 5.00 0 оценок









Обсуждение в статье: Обработка календарных дат. Лабораторная работа №1

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (323)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.008 сек.)