H10 (Все лабы по инфе за 2ой сем на С++)
Описание файла
Файл "H10" внутри архива находится в следующих папках: Все лабы по инфе за 2ой сем на С++, Инфа - бесценно, homework. Документ из архива "Все лабы по инфе за 2ой сем на С++", который расположен в категории "". Всё это находится в предмете "информатика" из 2 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "информатика" в общих файлах.
Онлайн просмотр документа "H10"
Текст из документа "H10"
Московский Государственный Технический Университет
имени Н.Э.Баумана
Домашняя работа
по теме
«Программирование
на языке высокого уровня»
Вариант H10
Выполнил:
Студент РК6-33
Попов В.Ю.
Проверила:
Волосатова Т.М.
Москва 2006г.
Техническое задание
Введение
Разработать программу вычисления разности между двумя заданными датами. Каждая дата должна быть задана в формате MMDD[CC]YY, где MM фиксирует номер месяца года в диапазоне от 1 до 12, DD соответствует числу месяца в диапазоне от 1 до 31, CC обозначает две первые необязательные цифры, а YY - две последние цифры, идентифицирующие год. Обе даты, разность которых нужно вычислить, должны передаваться программе через аргументы командной строки ее вызова. Результат вычисления разности дат должен отображаться в потоке стандартного вывода (stdout) числом полных лет и дней между ними по календарю.
Основания для разработки
«Учебный план» - документ, на основании которого ведется разработка.
Кафедра РК6 - организация, утвердившая этот документ.
Назначение разработки
Программа предназначена для нахождения разности двух календарных дат.
Требования к программе или программному изделию
-
Требования к функциональным характеристикам
Исходные данные передаются программе через аргументы командной строки.
-
Требования к надежности
Программа должна быть устойчива к вводу некорректных данных. Корректный выход из программы должен осуществляться после выполнения соответствующего вычисления.
-
Условия эксплуатации
Без ограничений.
-
Требования к составу и параметрам технических средств
IBM совместимый персональный компьютер.
-
Требования к информационной и программной совместимости
Программа предназначена для работы в ОС Linux и ОС Windows с использованием командной строки.
-
Требования к маркировке и упаковке
Без ограничений.
-
Требования к транспортированию и хранению
Транспортировка и хранение осуществляется на любых известных носителях надлежащего качества.
-
Специальные требования
Программа должна быть совместима с ОС Windows на уровне исходного кода.
Требования к программной документации
Основной программной документацией является «Текст программы»
Технико-экономические показатели
Программа способна эффективно функционировать на любых персональных компьютерах, ноутбуках и серверах с процессором не ниже i386, кроме того не требует от пользователей дополнительных усилий по её освоению, что даёт возможность её широкого применения на предприятиях и частными лицами.
Стадии и этапы разработки
-
Предпроектное иследование. Изучая широко известные программные продукты, было выявлено отсутствие аналогичных программ, способных реализовать поставленную задачу.
-
Экскизное и техническое проектирование. Написание программы велось на языке высокого уровня С, с учетом всех требований структурного программирования.
-
Изготовление опытного образца производилось в среде разработки OS SuSE Linux 10 с использованием GCC компилятора.
-
Испытание опытного образца выявило отсутствие ошибок и утечек системных ресурсов.
Порядок контроля и приёмки
Программа должна пройти испытания на устойчивость работы и правильность получаемых результатов при вводе пользователем любых данных.
Правила ввода данных:
Данные вводятся через аргументы командной строки. Должны быть введены любые календарные даты в формате MMDD[CC]YY, где MM фиксирует номер месяца года, DD соответствует числу месяца, CC обозначает две первые необязательные цифры, а YY - две последние цифры, идентифицирующие год.
Результатом работы программы является вычисление разности двух дат и вывод её через поток стандартного вывода.
Описание алгоритма.
Полученные через аргументы командной строки данные сначала обрабатываются функцией init, которая инициализирует поля структуры типа tm соответствующими значениями. При некорректном вводе данных с помощью функции errormes выводится сообщение об ошибке. Используя функцию mktime стандартной библиотеки <time.h> переводим даты, записанные в каждой из структур в число секунд, прошедших с 1 января 1970 года, и находим их разность. После проводим обратный процесс: приводим разность к типу структуры tm.
Результат выполнения программы отображается через поток стандартного вывода stdout с помощью функции fprintf. Программа корректно завершается.
Список литературы.
-
Волосатова Т.М., Лекции “Программирование на языке высокого уровня С”. МГТУ 2006г.
-
Б. Керниган, Д. Ритчи “Язык программирования С”
Текст программы
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>
#include <memory.h>
void init(char *, struct tm *);
void errormes(int);
int diffabs(int, int);
int main(int argc, char *argv[])
{
struct tm date1, date2, *diffdate;
time_t time1, time2, dtime;
int len;
if (argc != 3) errormes(1);
len = strlen(argv[1]);
if (len != 6 && len != 8) errormes(1);
len = strlen(argv[2]);
if (len != 6 && len != 8) errormes(1);
init(argv[1], &date1);
init(argv[2], &date2);
if (diffabs(date1.tm_year, date2.tm_year) > 68) errormes(2);
time1 = mktime(&date1); // Переводим время из структуры
time2 = mktime(&date2); // в число секунд прошедших с 1 января 1970 года
if (time1 > time2)
dtime = difftime(time1, time2); // Вычисляем разность
else
dtime = difftime(time2, time1);
diffdate = localtime(&dtime); // Приводим время обратно из секунд в структуру
fprintf(stdout, "\nРазность дат: %d г. %d дн.\n\n",
diffabs(diffdate->tm_year, 70), diffdate->tm_yday);
return 0;
}
// Инициализируем поля структуры адрессуемую date, извлекая данные из строки pstr
void init(char *pstr, struct tm *date)
{
char buf[5];
int i=0;
while(isdigit(pstr[i]))
i++;
if(i!=strlen(pstr)) errormes(1); //Проверяем строку на наличие символов, отличных от цифр
memset(date, 0, sizeof(struct tm)); // Обнуляем все поля структу
strncpy(buf, pstr, 2);
buf[2] = '\0';
date->tm_mon = atoi(buf) - 1; // Месяц должен храниться с нуля
if (date->tm_mon < 0 || date->tm_mon > 11) errormes(3);
strncpy(buf, pstr + 2, 2);
buf[2] = '\0';
date->tm_mday = atoi(buf);
if (date->tm_mday < 1 || date->tm_mday > 31) errormes(3);
if (strlen(pstr) == 6) // Если первые две цифры года опущены
{
strcpy(buf, "20");
strcat(buf, pstr + 4);
}
else
strcpy(buf, pstr + 4); // Год храниться начиная с 1900
date->tm_year = atoi(buf) - 1900; // т.е. 108 соответствует 2008 году
if (date->tm_year < 2 || date->tm_year > 138) errormes(3);
return;
}
// Вычитаем из большего меньшее
int diffabs(int a, int b)
{
if (a > b) return a - b;
return b - a;
}
// Выводит сообщение об ошибке
void errormes(int kod)
{
if (kod == 1)
fprintf(stderr, "\nНекорректные аргументы.\n");
if (kod == 2)
fprintf(stderr, "\nПереполнение типа. Разность дат не должна превышать 68 лет.\n");
if (kod == 3)
fprintf(stderr, "\nНеверный формат даты.\n");
fprintf(stderr, "Необходимо задать два параметра вида\n\n\tMMDD[CC]YY\n\t"
"MM - номер месяца от 01 до 12\n\t"
"DD - день месяца от 01 до 31\n\t"
"[CC]YY - год от 1902 до 2038, где первые две цифры необязательны\n\n"
"Например: 070806\n\n");
exit(-1);
return;
}
5