Реализовать систему учета заявок о повреждении телефонных аппаратов

 

Пояснительная записка

к курсовому проекту

по дисциплине

«СПОСОБЫ ПРОГРАММИРОВАНИЯ»

 

 

Выполнила студентка гр. ПО811 А.А.Демьянович

Руководитель А. Н. Балаш

 

 

Минск


Содержание

 

Введение. 3

1 Формулировка задачи.. 4

2 Описание программы.. 5

3 Тестирование программы.. 8

Заключение. 9

Литература.. 10

Приложение А.. 11

 


Введение

 

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

Целью курсового проекта является разработка реализация систему учета заявок о повреждениях телефонного аппарата.

Си (англ. C) – стандартизированный процедурный язык программирования, разработанный в начале 1970-х годов сотрудниками Bell Labs Кеном Томпсоном и Деннисом Ритчи как развитие языка Би. Си ценят за его эффективность. Он является самым популярным языком для создания системного программного обеспечения. Его также часто используют для создания прикладных программ.

Для написания программы SYSTEM.EXE использованы библиотеки:

1) stdio.h (от англ. standard input/output header – стандартный заголовочный файл ввода/вывода) – заголовочный файл стандартной библиотеки языка Си, содержащий определения макросов, константы и объявления функций и типов, используемых для различных операций стандартного ввода и вывода;

2) conio.h (от англ. console input-output – консольный ввод-вывод) – заголовочный файл, используемый в старых компиляторах, работающих в операционных системах MS-DOS, для создания текстового интерфейса пользователя;

3) string.h – заголовочный файл стандартной библиотеки языка Си, содержащий функции для работы с нуль-терминированными строками и различными функциями работы с памятью;

4) файл alloc.h, в котором содержатся описания функций динамического выделения/освобождения памяти;

5) dos.h – библиотека, предоставляющая возможность использовать сервисы DOS;

6) math.h – набор математических функций.


1 Формулировка задачи

 

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

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

Условно каждое обращение назовём заявкой. Каждая заявка в совокупности с некоторой информацией о клиенте представляет запись.

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

— Фамилия И.О.

— Адрес

— Краткое описание заявки

— Контактный телефон

Система также добавляет сведения о дате обращения клиента в компанию. Предусмотрена возможность корректировки и поиска сведений по фамилии.

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

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

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

 


2 Описание программы

 

Программа SYSTEM.EXE тесно работает с файлом (базой) заявок – BAZA.TXT.

Рассмотрим подробнее содержание файла BAZA.TXT, структура которого приведена на рисунке 1.

 

число записей в файле   ID будущей (новой) записи  
ID  
дата подачи заявки клиента
число

  месяц   год активная запись
             
Фамилия И.О.
Адрес
Краткое описание заявки
Телефон
active
ID  
дата подачи заявки клиента
число

  месяц   год обработанная запись
             
Фамилия И.О.
Адрес
Краткое описание заявки
Телефон
ФИО ответственного лица
дата обработки заявки клиента
число

  месяц   год
           
                     

 

Рисунок 1 – Структура файла BAZA.TXT

 

Заголовок файла (первая строка) состоит из двух чисел:

— число записей в файле: позволяет определить программе, какого размера должен быть создаваемый массив структур;

— ID будущей (новой) записи – уникальный порядковый номер, который будет присвоен новой записи в случае выбора режима добавления заявки.

После заголовка в файле следуют записи. Запись могут быть активными или обработанными. Активная запись отличается от обработанной тем, что в строке, где предполагается наличие имени исполнителя, находится ключевое слово active. Оно то и указывает на то, что запись не является обработанной. Если имя исполнителя отлично от active, то запись обработана, и программа в следующей строке считывает дату обработки заявки.

Кратко опишем назначение всех полей записи:

— ID – уникальный (идентификационный) номер записи, по которой запись можно выделить из всех других записей. Поле, по сути, является ключевым.

— дата подачи заявки клиента – дата, когда заявка появилась в файле базы данных.

— Фамилия И.О. – кратко фамилия абонента компании.

— Адрес – краткий адрес телефонного абонента

— Краткое описание заявки – должно быть четким и стандартным

— Телефон – контактный телефонный номер (строковый тип)

— ФИО ответственного лица – ФИО исполнителя, который обработал заявление или разрешил проблему

— дата обработки заявки – дата, когда заявка перестала быть активной.

Стоит заметить также, что обработанные заявки до 1 числа предыдущего месяца считаются устаревшими (старыми).

Исходный код программы приведен в листинге приложения А. Комментарии раскрывают детали и назничение элементов программного кода.

Кратко опишем суть работы функций программы, прототипы которых описаны сразу после глобальных переменных:

void get_today(int*,int*,int*); — функция, присваивающая переменным в скобках соответственно сегодняшнее число,месяц,год;

int read_baza(void); — задача функции состоит в том, чтобы открыть файл базы данных и считать из него всю информацию в массив rec. После закрытия файла базы данных и завершения функции массив продолжает существовать;

int write_baza(void); — задача функции состоит в перезаписи файла базы данных в соответствии с глобальными переменными и данными из массива структур rec, каждый элемент которого является отдельной заявкой. После завершения работы функции массив rec также продолжает существовать!

void add_rec(); — функция, проводящая добавление новой заявки в базу. Детали реализации описаны в комментариях;

int find(); — фукция, возвращающая индекс структуры с фамилией, которую пользователь укажет в качестве искомой (поиск по фамилии);

void edit_rec(); — функция редактирования некоторой заявки;

void done_rec(); — функция, преобразующая некоторую запись из активной в обработанную;

void watch(int); — функция просмотра записей (активных либо обработанных) за некоторый календарный период;

void del_rec(); — функция, проводящая чистку базы данных путём удаления старых записей.

void main() — главная функция запускается при старте программы, представляет собой главное меню. Из этой функции организуется вызов прочих функций в программе.

Заметим, что программа SYSTEM.EXE будет корректно работать, если файл заявок создан в кодировке ANSI и не правился вручную с помощью Блокнота.

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


3 Тестирование программы

 

Проведем контрольный тест программы.

Запуск программы начинается с вывода в окно перечня основных режимов, которые реализует данная система. Главное меню программы представлено на рисунке 2.

 

 

Рисунок 2 – Главное меню программы SYSTEM.EXE

 

Для добавления новой заявки в базу необходимо выбрать режим 1, после чего ввести фамилию (например, Сидорова), указать адрес и телефон абонента. После этого оператор системы должен ввести краткое описание заявления абонента. На этом заявление клиента будет внесено в базу (см. рисунок 3).

Программа предлагает осуществить просмотр деталей заявки по фамилии абонента. Выбрав режим 2, можно ввести фамилию Сидорова и просмотреть введенные об абоненте сведения.

Каждая заявка после добавления является активной. Просмотр активных заявок осуществляется в режиме 3 (см. рисунок 4). Например, чтобы просмотреть все активные заявки, надо ввести “all”.

Допустим, что заявка абонента Сидорова обработана . В режиме 5 можно указать фамилию абонента и фамилию лица, которое решило проблему абонента. Система автоматически определит дату обаботки заявки.

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

 

 

Рисунок 3 – Добавление новой заявки

 

 

Рисунок 4 – Перечень активных заявок

 

Чтобы база данных не засорялась, режим 7 позволяет проводить очистку базы от старых записей. В нашем случае удалятся все обработанные записи, которые были обработаны до 1 марта 2012 года. Программа выведет на экран перечень удаляемых записей. Требуется также подтверждение удаления записей, что изображено на рисунке 6.

Выход из программы осуществляется путем выбора режима 0.

 

 

Рисунок 5 – Перечень обработанных заявок

 

 

Рисунок 6 – Удаление устаревших заявок из базы данных

 

Совокупность проведенных тестов доказывает работоспособность и правильность функционирования программы.


Заключение

 

Регистрация и учет заявок клиентов — важнейшая составляющая жизни любого сервисного бизнеса, в том числе телефонной компании.

В данном курсовом проекте разработана программа, обеспечивающая возможность добавления и учета обработки заявлений от абонентов телефонной компании.

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

В программе ведения базы обращений абонентов реализован быстрый поиск, что позволяет в короткое время найти требуемую информацию.

Также при регистрации обращения абонента система автоматически устанавливает дату.

В результате выполнения курсового проекта были закреплены знания по использованию управляющих конструкций языка Си и использования форматированного ввода/вывода, частично закреплены знания в организации хранения информации в базах данных.

 


Литература

 

1. Стандарт предприятия. Курсовое и дипломное проектирование : СТП ВГКС 1.01-2005. – Введ. 2005-01-01. – Минск : ВГКС, 2004. – 107 с.

2. Национальный Интернет-портал Республики Беларусь [Электронный ресурс] / Википедия — свободная энциклопедия – Режим доступа: http://ru.wikipedia.org/wiki/. – Дата доступа: 20.04.2012.

3. Национальный Интернет-портал Республики Беларусь [Электронный ресурс] / Регистрация и учет заявок пользователей – Режим доступа: http://www.smartnut.ru/registraciya-zayavok-polzovatelej/. – Дата доступа: 20.04.2012.

4. Основы алгоритмизации и программирования. Язык СИ. Минск БГУИР 2008. М.П. Батура, В.Л. Бусько, А.Г.Корбит, Т.М.Кривоносова.

 


Приложение А

(обязательное)

 

Листинг – Исходный код программы SYSTEM.EXE

 

#include <stdio.h> //стандартная библиотека ввода-вывода

#include <conio.h> //библиотека организации текстового интерфейса

#include <string.h> //библиотека для работы со строками

#include <alloc.h> //для работы с динамической памятью

#include <math.h> //для работы с математическими функциями

#include <dos.h> //для получения системного времени

 

// ----- описываем глобальные переменные -----

FILE *baza; //указатель на файловый поток

int kol,new_id; //слева направо: кол-во записей в файле, ID добавляемой записи

struct rec_type { //структура записи

int id; //ID

char fam[20]; //Фамилия И.О.

char adr[20]; //адрес

char tel[16]; //контактный телефон

char zajav[28]; //краткое описание заявки

int day,mon,year; //дата обращения абонента: число,месяц,год

char isp[16]; //Фамилия исполнителя, обработавшего заявку (если заявка не обработана, то "active"

int d_done,m_done,y_done; //дата обработка заявки: число,месяц,год

} *rec; //указатель на динамический массив всех записей

 

// ----- прототипы функций -----

void get_today(int*,int*,int*); //функция получения системного времени

int read_baza(void); //функция создания и заполнения массива записей из файла

int write_baza(void); //функция записи в файл записей из массива

void add_rec(); //функция добавления в базу новой записи

int find(); //функция поиска номера записи в массиве по фамилии

void edit_rec(); //функция редактирования записи

void done_rec(); //функция обработки полученной заявки

void watch(int); //функция просмотра определенных заявок за некоторый период

void del_rec(); //функция удаления устаревших заявок

 

// ----- ГЛАВНАЯ ФУНКЦИЯ -----

void main() {

char key; //ключ - режим работы

int x; //номер найденной записи

do { //бесконечный цикл

clrscr(); //очистка экрана

puts("СИСТЕМА УЧЕТА ОБРАЩЕНИЯ АБОНЕНТОВ В ТЕЛЕФОННУЮ КОМПАНИЮ\n"); //печать информации

puts("0 - завершение работы системы");

puts("1 - добавление заявки от клиента");

puts("2 - поиск заявки по фамилии");

puts("3 - просмотр активных заявок за период");

puts("4 - редактирование сведений в заявке");

puts("5 - установить отметку о завершении обработки заявки");

puts("6 - просмотр обработанных заявок за период");

puts("7 - удалить устаревшие записи");

fflush(stdin); //очистка буфера

key=getchar(); //считываем с клавиатуры ключ

switch (key) { //в зависимости от введенного ключа

case '0': //0 - выход

return; //из программы

case '1':

add_rec(); //1 - вызов функции добавления записи

break;

case '2':

x=find(); //2 - поиск номера записи по фамилии

if (x>=0) { //если найдена запись

clrscr(); //очистка экрана

puts("Найдена запись:"); //печатаем сведения о записи

printf("%s\n %s\n %s\n %s\n %2d.%2d.%4d\n",rec[x].fam,rec[x].adr,rec[x].tel,rec[x].zajav,rec[x].day,rec[x].mon,rec[x].year);

getch(); //ждем нажатия любой клавиши

}

free(rec); //освобождение памяти

break;

case '3':

watch(1); //3 - функция просмотра активных записей

break;

case '4':

edit_rec(); //4 - редактирование записи

break;

case '5':

done_rec(); //5 - Установить отметку об обработке записи

break;

case '6':

watch(2); //6 - просмотр обработанных заявок

break;

case '7':

del_rec(); //7 - удалить устаревшие записи

break;

default: //по умолчанию - сообщение об ошибке

puts("Ошибка ввода номера режима");

getch();

}

} while (1);

}

// ----- ФУНКЦИЯ ПРИСВОЕНИЯ ТЕКУЩЕЙ СИСТЕМНОЙ ДАТЫ -----

void get_today(int* now_day,int* now_mon,int* now_year) {

struct date now;

getdate(&now);

*now_day=now.da_day;

*now_mon=now.da_mon;

*now_year=now.da_year;

}

// ----- ФУНКЦИЯ СОЗДАНИЯ И ЗАПОЛНЕНИЯ МАССИВА ЗАЯВОК -----

int read_baza() {

char line[41]; //буферная строка

int i; //параметр цикла

if ((baza=fopen("BAZA.TXT","r"))==NULL) //открываем файл базы

return 0; //если файл не открылся, возвращаем 0

fgets(line,41,baza); //считываем строку из файла

sscanf(line,"%d %d",&kol,&new_id); //распознаем кол-во записей и номер новой записи

rec=(rec_type*)calloc(kol,sizeof(rec_type)); //создаем динамический массив для размещения заявок

for (i=0;i<kol;i++) { // цикл чтения заявок из файла

fgets(line,41,baza); //считали строку

sscanf(line,"%d %d %d %d",&rec[i].id,&rec[i].day,&rec[i].mon,&rec[i].year); //распознали ID и дату обращения в компанию

fgets(line,16,baza); //считали строку

line[strlen(line)-1]='\0'; //поставили ограничитель

strcpy(rec[i].fam,line); //скопировали фамилию в массив

fgets(line,16,baza); //считали строку

line[strlen(line)-1]='\0'; //поставили ограничитель

strcpy(rec[i].adr,line); //скопировали адрес в массив

fgets(line,26,baza); //считали строку

line[strlen(line)-1]='\0'; //поставили ограничитель

strcpy(rec[i].zajav,line); //скопировали заявку в массив

fgets(line,16,baza); //считали строку

line[strlen(line)-1]='\0'; //поставили ограничитель

strcpy(rec[i].tel,line); //скопировали телефон в массив

fgets(line,16,baza); //считали строку

line[strlen(line)-1]='\0'; //поставили ограничитель

strcpy(rec[i].isp,line); //скопировали исполнителя в массив

if (strcmp(rec[i].isp,"active")==0) //если в строке исполнителя написно active

rec[i].d_done=0; //то заявка активная (d_done = 0)

else { //иначе (заявка обработана)

fgets(line,41,baza); //считали ещё одну строку

sscanf(line,"%d %d %d",&rec[i].d_done,&rec[i].m_done,&rec[i].y_done); //распознали дату обработки заявки

}

}

fclose(baza); //закрыли файл

return 1; //вернули 1

}

// ----- ФУНКЦИЯ ПЕРЕЗАПИСИ ФАЙЛА БАЗЫ ИЗ МАССИВА ЗАЯВОК -----

int write_baza() {

char line[41]; //буферная строка

int i; //параметр цикла

if ((baza=fopen("BAZA.TXT","w"))==NULL) //открываем файл для записи

return 0; //если файл не открылся, то возвращаем 0

fprintf(baza,"%d %d\n",kol,new_id); //печатаем в файл количество записей и ID новой записи

for (i=0;i<kol;i++) { //цикл обхода всех элементов массива

fprintf(baza,"%d %d %d %d\n",rec[i].id,rec[i].day,rec[i].mon,rec[i].year); //печатаем сведения о записи

fprintf(baza,"%s\n%s\n%s\n%s\n%s\n",rec[i].fam,rec[i].adr,rec[i].zajav,rec[i].tel,rec[i].isp);

if (strcmp(rec[i].isp,"active")!=0) //если запись обработана

fprintf(baza,"%d %d %d\n",rec[i].d_done,rec[i].m_done,rec[i].y_done); //то печатаем ещё строку с датой обработки

}

fclose(baza); //закрываем файловый поток

return 1; //возвращаем 1

}

// ----- ФУНКЦИЯ ДОБАВЛЕНИЯ ЗАЯВКИ -----

void add_rec() {

int i; //параметр цикла

char line[80]; //буферная строка

clrscr(); //очистка экрана

if (read_baza()!=1) { //если наша функция открытия прошла НЕ успешно

puts("Ошибка чтения из файла базы данных"); //то пишем сообщение об ошибке

getch(); //ждем нажатия любой клавиши

return; //выходим из функции

}

rec_type *rec1=(rec_type*)calloc(kol+1,sizeof(rec_type)); //(если файл открыт и создан массив, то) организуем ещё один массив, длина которого больше на единицу

for (i=0;i<kol;i++) { //цикл копирования записей массива rec в массив re1

rec1[i].id=rec[i].id;

strcpy(rec1[i].fam,rec[i].fam);

strcpy(rec1[i].adr,rec[i].adr);

strcpy(rec1[i].tel,rec[i].tel);

strcpy(rec1[i].zajav,rec[i].zajav);

strcpy(rec1[i].isp,rec[i].isp);

rec1[i].day=rec[i].day;

rec1[i].mon=rec[i].mon;

rec1[i].year=rec[i].year;

rec1[i].d_done=rec[i].d_done;

rec1[i].m_done=rec[i].m_done;

rec1[i].y_done=rec[i].y_done;

}

free(rec); //освобождаем массив rec

puts("Введите фамилию абонента:"); //подсказка

fflush(stdin); //очистка буфера

gets(line); //считали строку с клавиатуры

if (strlen(line)>=15) //ставим ограничитель

line[15]='\0';

else

line[strlen(line)]='\0';

strcpy(rec1[kol].fam,line); //копируем новую фамилию в последнюю запись массива rec1

puts("Укажите адрес абонента:"); //подсказка

fflush(stdin); //очистка буфера

gets(line); //считали строку с клавиатуры

if (strlen(line)>=15)//ставим ограничитель

line[15]='\0';

else

line[strlen(line)]='\0';

strcpy(rec1[kol].adr,line);//копируем новый адрес в последнюю запись массива rec1

puts("Укажите контактный телефон абонента:"); //подсказка

fflush(stdin); //очистка буфера

gets(line); //считали строку с клавиатуры

if (strlen(line)>=10) //ставим ограничитель

line[10]='\0';

else

line[strlen(line)]='\0';

strcpy(rec1[kol].tel,line); //копируем новый телефон в последнюю запись массива rec1

puts("Кратко опишите суть заявления абонента:"); //подсказка

fflush(stdin); //очистка буфера

gets(line); //считали строку с клавиатуры

if (strlen(line)>=25) //ставим ограничитель

line[25]='\0';

else

line[strlen(line)]='\0';

strcpy(rec1[kol].zajav,line); //копируем описание заявки в последнюю запись массива rec1

strcpy(rec1[kol].isp,"active"); //делаем запись активной (исполнитель - active)

get_today(&rec1[kol].day,&rec1[kol].mon,&rec1[kol].year); //определяем дату обращения

rec1[kol].id=new_id; //определяем ID новой записи

new_id++; //увеличиваем ID для следующей записи

kol++; //увеличиваем кол-во записей

rec=(rec_type*)calloc(kol,sizeof(rec_type)); //выделяем память для массива rec

for (i=0;i<kol;i++) { //цикл записи данных из массива rec1 в массив rec

rec[i].id=rec1[i].id;

strcpy(rec[i].fam,rec1[i].fam);

strcpy(rec[i].adr,rec1[i].adr);

strcpy(rec[i].tel,rec1[i].tel);

strcpy(rec[i].zajav,rec1[i].zajav);

strcpy(rec[i].isp,rec1[i].isp);

rec[i].day=rec1[i].day;

rec[i].mon=rec1[i].mon;

rec[i].year=rec1[i].year;

rec[i].d_done=rec1[i].d_done;

rec[i].m_done=rec1[i].m_done;

rec[i].y_done=rec1[i].y_done;

}

free(rec1); //освобождаем массив rec1

if (write_baza()!=1) //записываем данные из массива rec в файл, если возникла ошибка

puts("Ошибка записи в файл базы данных"); //то пишем собщение

else //иначе

puts("Заявление клиента внесено в базу"); //запись прошла успешно

free(rec); //освобождаем память, занятую массивом rec

getch(); //ждем нажатия клавиши

}

// ----- ФУНКЦИЯ, ВОЗВРАЩАЮЩАЯ НОМЕР ЗАПИСИ ПО ФАМИЛИИ -----

int find() {

int x_rec=-1,i; //искомый номер, параметр цикла

char line[80]; //буферная строка

char x_fam[16]; //искомая фамилия

clrscr(); //очистка экрана

puts("Укажите фамилию искомого абонента:"); //подсказка

fflush(stdin); //очистка буфера

gets(line); //считали строку

if (strlen(line)>=15) //ставим нуль-символ в конец строки

line[15]='\0';

else

line[strlen(line)]='\0';

strcpy(x_fam,line); //копируем фамилию из буферной строки в искомую фамилию

if (read_baza()!=1) { //если открытие файл не успешно

puts("Ошибка чтения из файла базы данных"); //то ошибка

getch();

return -1;

}

for (i=0;i<kol;i++) //обходим все записи массива

if (strcmp(rec[i].fam,x_fam)==0) { //если фамилия равна искомой

x_rec=i; //то параметр цикла приравниваем к номеру искомой записи

break; //покидаем массив

}

if (x_rec==-1) { //если x_rec осталось равным -1,

puts("\nНе найдено записи с указанной фамилией!"); //то записей нет

getch(); //ждем нажатия клавиши

}

return x_rec; //возвращаем x_rec

}

// ----- ФУНКЦИЯ РЕДАКТИРОВАНИЯ ЗАПИСИ -----

void edit_rec() {

int x; //номер редактируемой записи

char line[80]; //буферная строка

clrscr(); //очистка экрана

if ((x=find())==-1) //если запись не найдена

return; //то выходим из функции

clrscr(); //иначе очистка экрана

puts("Измените фамилию абонента:"); //подсказка

fflush(stdin); //очистка буфера ввода

gets(line); //считаил с клавиатуры строку

if (strlen(line)>=15) //поставили ограничитель

line[15]='\0';

else

line[strlen(line)]='\0';

strcpy(rec[x].fam,line); //скопировали новую фамилию

puts("Измените адрес абонента:"); //подсказка

fflush(stdin); //очистка буфера

gets(line); //ввод новых данных

if (strlen(line)>=15)

line[15]='\0';

else

line[strlen(line)]='\0';

strcpy(rec[x].adr,line); //редаткирование данных

puts("Измените контактный телефон абонента:"); //подсказка

fflush(stdin); //очистка буфера

gets(line); //считали строку

if (strlen(line)>=10) //поставили ограничитель

line[10]='\0';

else

line[strlen(line)]='\0';

strcpy(rec[x].tel,line); //изменили данные

if (write_baza()!=1) //записываем данные из массива в файл

puts("Ошибка записи в файл базы данных");

else

puts("Сведения об абоненте изменены в базе");

free(rec); //освобождаем память

getch(); //приостановка программы

}

// ----- ФУНКЦИЯ ПОМЕТКИ ЗАПИСИ КАК ОБРАБОТАННОЙ -----

void done_rec() {

int x; //номер обрабатываемой записи

char line[80]; //буферная строка

clrscr(); //очистка экрана

if ((x=find())==-1) //если записи не найдено

return; //то выход из функции

clrscr(); //очистка экрана

puts("Укажите фамилию исполнителя, обработавшего заявление:"); //подсказка

fflush(stdin); //очистка буфера

gets(line); //считали строку

if (strlen(line)>=15) //поставили ограничитель

line[15]='\0';

else

line[strlen(line)]='\0';

strcpy(rec[x].isp,line); //скопировали ФИО исоплнителя

get_today(&rec[x].d_done,&rec[x].m_done,&rec[x].y_done); //установили в качетве даты исполнения сегодня

if (write_baza()!=1) //запись данных из массива в файл

puts("Ошибка записи в файл базы данных");

else

puts("Сведения об обработке заявления добавлены в базу");

free(rec); //освобождение массива заявок

getch(); //приостановка программы

}

// ----- ФУНКЦИЯ ПРОСМОТРА НЕКОТОРЫХ ЗАПИСЕЙ -----

void watch(int key) { //key - режим просмотра (1 - активные записи, 2 - обработанные записи)

char line[41]; //буферная строка

int day1,mon1,year1; //дата начала периода

int day2,mon2,year2; //дата окончания периода просмотра

int daynow,monnow,yearnow; //текущая дата

int pr_today=0; //признак просмотра записей только за сегодня

int pr_find=0; //признак того, что мы нашли некоторую запись

int i; //параметр цикла

clrscr(); //очистка экрана

get_today(&daynow,&monnow,&yearnow); //определили текущую дату

if (read_baza()!=1) { //создали массив заявок из файла

puts("Ошибка чтения из файла базы данных");

getch();

return;

}

if (key==1) //если выбран режим просмотра активных записей

puts("Просмотр активных заявок за период\n");

else

puts("Просмотр обработанных заявок за период\n");

do { //цикл проверки корректности ввода

puts("Укажите дату начала периода (например, \"22 4 2012\")"); //подсказка

puts("(\"all\" - просмотр всех записей; \"today\" - просмотр записей за текущий день)");

fflush(stdin); //очистка буфера

gets(line); //сичтываем строку

line[strlen(line)]='\0';

if (strcmp(line,"all")==0) { //если в строку ввели all

key*=-1; //то делаем режим отрицательным

break; //выходим из цикла проверки

}

if (strcmp(line,"today")==0) { //есл иввели today

get_today(&day1,&mon1,&year1); //ставим дату начала периода

get_today(&day2,&mon2,&year2); //ставим дату окончания периода как сегодня

pr_today=1; //устанавливаем признак просмотра сегодняшних заявок

break; //выходим из цикла проверки

}

sscanf(line,"%d %d %d",&day1,&mon1,&year1); //распознаем число,месяц,год

} while (year1>yearnow || (year1==yearnow && mon1>monnow) || (year1==yearnow && mon1==monnow && day1>daynow));

if (key>0 && pr_today==0) //если надо ввести дату окончания периода

do { //цикл проверки ввода

puts("Укажите дату окончания периода (например, \"25 4 2012\")");

puts("(\"today\" - просмотр записей по сей день)"); //подсказки

fflush(stdin); //очистка буфера

gets(line); //считываем строку

line[strlen(line)]='\0';

if (strcmp(line,"today")==0) {//если иввели today

get_today(&day2,&mon2,&year2); //ставим дату начала периода как сегодня

break; //выходим из цикла проверки

}

sscanf(line,"%d %d %d",&day2,&mon2,&year2);//распознаем число,месяц,год

} while (year2>yearnow || (year2==yearnow && mon2>monnow) || (year2==yearnow && mon2==monnow && day2>daynow));

clrscr(); //очистка экрана

if (abs(key)==1) { //если просматриваем активные записи

printf("Просмотр активных записей ");

if (key>0)

printf("за период с %d.%d.%d по %d.%d.%d",day1,mon1,year1,day2,mon2,year2);

puts("\n\n Фамилия И. О. | Адрес | Телефон | Описание заявки | Дата");

for (i=0;i<kol;i++) //цикл обхода всех записей

if (rec[i].d_done==0) { //если запись активна

if (key>0) { //то если просмтариваем не все записи

if (year2>rec[i].year || (year2==rec[i].year && mon2>rec[i].mon) || (year2==rec[i].year && mon2==rec[i].mon && day2>=rec[i].day))

if (rec[i].year>year1 || (rec[i].year==year1 && rec[i].mon>mon1) || (rec[i].year==year1 && rec[i].mon==mon1 && rec[i].day>=day1)) {

printf("%15s|%15s|%10s|%25s|%2d.%2d.%4d\n",rec[i].fam,rec[i].adr,rec[i].tel,rec[i].zajav,rec[i].day,rec[i].mon,rec[i].year);

pr_find=1; //то печатаем запись, только если она находится в указанных временных пределах, устанавливаем признак нахождения записи

}

}

else { //иначе печатаем запись в любом файле

printf("%15s|%15s|%10s|%25s|%2d.%2d.%4d\n",rec[i].fam,rec[i].adr,rec[i].tel,rec[i].zajav,rec[i].day,rec[i].mon,rec[i].year);

pr_find=1;

}

}

}

else { //то же самое, но для обработанных записей

printf("Просмотр обработанных записей ");

if (key>0)

printf("за период с %d.%d.%d по %d.%d.%d",day1,mon1,year1,day2,mon2,year2);

puts("\n\n Фамилия И. О. | Телефон | Описание заявки | Исполнитель | Дата");

for (i=0;i<kol;i++)

if (rec[i].d_done>0) {

if (key>0) {

if (year2>rec[i].year || (year2==rec[i].year && mon2>rec[i].mon) || (year2==rec[i].year && mon2==rec[i].mon && day2>=rec[i].day))

if (rec[i].year>year1 || (rec[i].year==year1 && rec[i].mon>mon1) || (rec[i].year==year1 && rec[i].mon==mon1 && rec[i].day>=day1)) {

printf("%15s|%10s|%25s|%15s|%2d.%2d.%4d\n",rec[i].fam,rec[i].tel,rec[i].zajav,rec[i].isp,rec[i].d_done,rec[i].m_done,rec[i].y_done);

pr_find=1;

}

}

else {

printf("%15s|%10s|%25s|%15s|%2d.%2d.%4d\n",rec[i].fam,rec[i].tel,rec[i].zajav,rec[i].isp,rec[i].d_done,rec[i].m_done,rec[i].y_done);

pr_find=1;

}

}

}

if (pr_find==0) //если записей не напечатано

puts("\nНе найдено записей, удовлетворяющих заданным условиям"); //топечтатаем сообщение

free(rec); //освобождаем память

getch(); //приостановка проагрмым

}

// ----- ФУНКЦИЯ УДАЛЕНИЯ УСТАРЕВШИХ ЗАПИСЕЙ -----

void del_rec() {

int i,j=0,pr_del=0; //параметр цикла, число остающихся записей, признак уцдаленияккой-либо записи

int del_day,del_mon,del_year; //дата до которй удаляю.тся обработанные записи

char line[41]; //буферная строк

clrscr(); //очсиктат экрана

if (read_baza()!=1) { //открытие файл и создание массива записей

puts("Ошибка чтения из файла базы данных");

getch();

return;

}

rec_type *rec1=(rec_type*)calloc(kol,sizeof(rec_type)); //осоздание временного масива того же размера

get_today(&del_day,&del_mon,&del_year); //опреелили сегодняшнюю дату

del_day=1; //установили число 1

del_mon--; //уменбшили месяц

if (del_mon==0) { //если месяц стал равным нулю

del_mon=12; //то сделали декабр

del_year--; //и меньшили год на 1

}

printf("Обработанные до %d.%d.%d заявления будут удалены:",del_day,del_mon,del_year); //печатаь заголовков

puts("\n\n Фамилия И. О. | Телефон | Описание заявки | Исполнитель | Дата");

for (i=0;i<kol;i++) //обходим все записи

if (rec[i].d_done>0 && (del_year>rec[i].y_done || (del_year==rec[i].y_done && del_mon>rec[i].m_done) || (del_year==rec[i].y_done && del_mon==rec[i].m_done && del_day>=rec[i].d_done)))

printf("%15s|%10s|%25s|%15s|%2d.%2d.%4d\n",rec[i].fam,rec[i].tel,rec[i].zajav,rec[i].isp,rec[i].d_done,rec[i].m_done,rec[i].y_done);

else { //если запись надо улаить, пишем на экран, иначе копируем запись в массив rec1

rec1[j].id=rec[i].id;

strcpy(rec1[j].fam,rec[i].fam);

strcpy(rec1[j].adr,rec[i].adr);

strcpy(rec1[j].tel,rec[i].tel);

strcpy(rec1[j].zajav,rec[i].zajav);

strcpy(rec1[j].isp,rec[i].isp);

rec1[j].day=rec[i].day;

rec1[j].mon=rec[i].mon;

rec1[j].year=rec[i].year;

rec1[j].d_done=rec[i].d_done;

rec1[j].m_done=rec[i].m_done;

rec1[j].y_done=rec[i].y_done;

j++;

}

if ((kol-j)==0) { //есил все записи вошли в состав временого массива

puts("\nНет удаляемых записей");

}

else { //иначе

puts("Введите \"delete\" для подтверждения удаления указанных записей");

fflush(stdin); //очистка буфера

gets(line); //считали строку

if (strcmp(line,"delete")==0) { //если ввели delete

free(rec); //то освободили исходынй массив

kol=j; //сделали kol = j

rec=(rec_type*)calloc(kol,sizeof(rec_type)); //заново создали массив другого размера

for (i=0;i<kol;i++) { //перезаписали все записи из массива rec1 в rec

rec[i].id=rec1[i].id;

strcpy(rec[i].fam,rec1[i].fam);

strcpy(rec[i].adr,rec1[i].adr);

strcpy(rec[i].tel,rec1[i].tel);

strcpy(rec[i].zajav,rec1[i].zajav);

strcpy(rec[i].isp,rec1[i].isp);

rec[i].day=rec1[i].day;

rec[i].mon=rec1[i].mon;

rec[i].year=rec1[i].year;

rec[i].d_done=rec1[i].d_done;

rec[i].m_done=rec1[i].m_done;

rec[i].y_done=rec1[i].y_done;

}

if (write_baza()!=1) //записали аданные из массива rec в файл

puts("Ошибка записи в файл базы данных");

else

puts("Устаревшие записи удалены");

}

else {

puts("Отмена удаления старых записей...");

}

}

free(rec1); //высободили память

free(rec);

getch(); //ожидание надатия клавиши

}