Все лабы по инфе за 2ой сем на С++ (H10)

Посмотреть архив целиком

Московский Государственный Технический Университет

имени Н.Э.Баумана











Домашняя работа

по теме

«Программирование

на языке высокого уровня»



Вариант H10








Выполнил:

Студент РК6-33

Попов В.Ю.



Проверила:

Волосатова Т.М.








Москва 2006г.



Техническое задание


Введение


Разработать программу вычисления разности между двумя заданными датами. Каждая дата должна быть задана в формате MMDD[CC]YY, где MM фиксирует номер месяца года в диапазоне от 1 до 12, DD соответствует числу месяца в диапазоне от 1 до 31, CC обозначает две первые необязательные цифры, а YY - две последние цифры, идентифицирующие год. Обе даты, разность которых нужно вычислить, должны передаваться программе через аргументы командной строки ее вызова. Результат вычисления разности дат должен отображаться в потоке стандартного вывода (stdout) числом полных лет и дней между ними по календарю.


Основания для разработки


«Учебный план» - документ, на основании которого ведется разработка.

Кафедра РК6 - организация, утвердившая этот документ.


Назначение разработки


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


Требования к программе или программному изделию


  1. Требования к функциональным характеристикам

Исходные данные передаются программе через аргументы командной строки.

  1. Требования к надежности

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

  1. Условия эксплуатации

Без ограничений.

  1. Требования к составу и параметрам технических средств

IBM совместимый персональный компьютер.

  1. Требования к информационной и программной совместимости

Программа предназначена для работы в ОС Linux и ОС Windows с использованием командной строки.

  1. Требования к маркировке и упаковке

Без ограничений.

  1. Требования к транспортированию и хранению

Транспортировка и хранение осуществляется на любых известных носителях надлежащего качества.

  1. Специальные требования

Программа должна быть совместима с ОС Windows на уровне исходного кода.


Требования к программной документации

Основной программной документацией является «Текст программы»





Технико-экономические показатели

Программа способна эффективно функционировать на любых персональных компьютерах, ноутбуках и серверах с процессором не ниже i386, кроме того не требует от пользователей дополнительных усилий по её освоению, что даёт возможность её широкого применения на предприятиях и частными лицами.


Стадии и этапы разработки


  1. Предпроектное иследование. Изучая широко известные программные продукты, было выявлено отсутствие аналогичных программ, способных реализовать поставленную задачу.

  2. Экскизное и техническое проектирование. Написание программы велось на языке высокого уровня С, с учетом всех требований структурного программирования.

  3. Изготовление опытного образца производилось в среде разработки OS SuSE Linux 10 с использованием GCC компилятора.

  4. Испытание опытного образца выявило отсутствие ошибок и утечек системных ресурсов.


Порядок контроля и приёмки



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

Правила ввода данных:

Данные вводятся через аргументы командной строки. Должны быть введены любые календарные даты в формате MMDD[CC]YY, где MM фиксирует номер месяца года, DD соответствует числу месяца, CC обозначает две первые необязательные цифры, а YY - две последние цифры, идентифицирующие год.


Результатом работы программы является вычисление разности двух дат и вывод её через поток стандартного вывода.


Описание алгоритма.


Полученные через аргументы командной строки данные сначала обрабатываются функцией init, которая инициализирует поля структуры типа tm соответствующими значениями. При некорректном вводе данных с помощью функции errormes выводится сообщение об ошибке. Используя функцию mktime стандартной библиотеки <time.h> переводим даты, записанные в каждой из структур в число секунд, прошедших с 1 января 1970 года, и находим их разность. После проводим обратный процесс: приводим разность к типу структуры tm.

Результат выполнения программы отображается через поток стандартного вывода stdout с помощью функции fprintf. Программа корректно завершается.



Список литературы.


  1. Волосатова Т.М., Лекции “Программирование на языке высокого уровня С”. МГТУ 2006г.

  2. Б. Керниган, Д. Ритчи “Язык программирования С”

Текст программы

#include <stdio.h>

#include

#include

#include

#include


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








Чтобы не видеть здесь видео-рекламу достаточно стать зарегистрированным пользователем.
Чтобы не видеть никакую рекламу на сайте, нужно стать VIP-пользователем.
Это можно сделать совершенно бесплатно. Читайте подробности тут.