СОДЕРЖАНИЕ
Постановка задачи…………………………………………………………………2
Описание структуры данных………………………………………..………….…..2
Блок схемы функций…………………………………………….……..……….…..3
Текст программы………………………………………………………...……….....11
Контрольный пример…………………………………………………………….....23
Список используемой литературы…………………..………….……………….25
Постановка задачи:
1. Создать приложение для хранения информации.
2. В приложении должны быть реализованы следующие функции:
возможности редактирования, добавления и удаления данных;
Поиск всех рейсов по заданной дате вылета и печать их списка;
построить таблицу числа рейсов по городу прибытия (столбцы – города);
сохранение данных в файл и извлечение из файла.
Описание структуры данных:
struct Air_Schedule{
char city[20]; Город прибытия
char date[11]; Дата ближайшего вылета
char time[7]; Время вылета
unsigned int number; Номер рейса
unsigned int stopovers; Есть ли промежуточные посадки
struct Air_Schedule *Next; Указатель на следующий узел
}
С помощью typedef определены обозначения AS, PAS соответственно для узла и указателя на нeго.
struct list_AS{
PAS start_data; Указатель на первый элемент списка
unsigned int Count_AS; Количество элементов в списке
}
Опредены синонимы LAS, PLAS для типов список и указатель на список.
Блок схемы функций:
Текст программы:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef WIN32
#define FILENAME "as.bin"
#elif __BORLANDC__
#define FILENAME "as_dos.bin"
#endif
typedef struct Air_Schedule{
char city[20];
char date[11];
char time[7];
unsigned int number;
unsigned int stopovers;
struct Air_Schedule *Next;
} AS, *PAS; // Air_Schedule
typedef struct list_AS{
PAS start_data;
unsigned int Count_AS;
} LAS,*PLAS;
int Save_LAS(const char *filename,PLAS plas);
int Load_LAS(const char *filename,PLAS plas);
void PrintAS(PLAS plas,PAS pd);
void PrintFullAS(PAS pas);
void PrintS(int count);
int ChangeAS(PLAS plas,int ID);
int AddAS(PLAS plas);
int DeleteAS(PLAS plas,int ID);
PAS Find_id_AS(PLAS plas,int ID);
PAS FindAS(PLAS plas, char *date, PAS start);
PAS CreateAS();
PLAS CreateLAS();
int ClearLAS(PLAS plas);
int DeleteLAS(PLAS plas);
int isEmpty(PLAS plas);
int main()
{
char s[]="\n1. Load\n2. Save\n3. Print\n4. Search\n5. Add\n6. Delete\n7. Change\n8. Clear\n9. PrintAllInfo\n\nELSE ID -> EXIT\n";
int ID,id_as;
int out = 1;
PAS pas;
char date[11];
char yn;
PLAS plist_as;
plist_as = CreateLAS();
while(out)
{
system("pause");
system("cls");
printf("%s%s",s,"\nInput ID to Function: ");
scanf("%d",&ID);
switch(ID)
{
case 1:
if(Load_LAS(FILENAME,plist_as))
printf("Air Schedule is Loaded\n");
else
printf("Air Schedule is Not Loaded! Error!\n");
break;
case 2:
if(Save_LAS(FILENAME,plist_as))
printf("Air Schedule is Saved\n");
else
printf("Air Schedule is Not Saved! Error!\n");
break;
case 3:
PrintAS(plist_as,NULL);
break;
case 4:
if(isEmpty(plist_as))
{
printf("Air Schedule is Empty\n");
break;
}
printf("Input date to search(DD.MM.YYYY): ");
scanf("%s",&date);
pas = NULL;
pas = FindAS(plist_as,date, NULL);
while(pas)
{
PrintAS(plist_as, pas);
pas = FindAS(plist_as,date, pas->Next);
}
break;
case 5:
AddAS(plist_as);
break;
case 6:
if(isEmpty(plist_as))
{
printf("Air Schedule is Empty\n");
break;
}
PrintAS(plist_as,NULL);
printf("%s","Input ID to Delete: ");
scanf("%d",&ID);
if(DeleteAS(plist_as,ID))
printf("Deleting Complited!\n");
else
printf("Deleting is not Complited!!! Error!!!\n");
break;
case 7:
if(isEmpty(plist_as))
{
printf("Air Schedule is Empty\n");
break;
}
PrintAS(plist_as,NULL);
printf("%s","Input ID to Change: ");
scanf("%d",&ID);
if(ChangeAS(plist_as,ID))
printf("Air Schedule is Changed!!!\n");
else
printf("Air Schedule is not Changed!!! Error!!!\n");
break;
case 8:
ClearLAS(plist_as);
break;
case 9:
if(isEmpty(plist_as))
{
printf("Air Schedule is Empty\n");
break;
}
PrintAS(plist_as,NULL);
printf("%s","Input ID to Show Full Data: ");
scanf("%d",&ID);
pas = Find_id_AS(plist_as,ID);
PrintFullAS(pas);
break;
default:
out = 0;
break;
}
}
DeleteLAS(plist_as);
system("pause");
return 0;
}
PLAS CreateLAS()
{
PLAS plas;
PAS pas;
plas = (PLAS) malloc(sizeof(LAS) );
pas = CreateAS();
plas->Count_AS = 0;
plas->start_data = pas;
return plas;
}
PAS CreateAS()
{
PAS pas;
pas = (PAS)malloc(sizeof(AS));
pas->number = pas->stopovers = 0;
pas->date[0] = pas->city[0] = pas->time[0] = 0;
pas->Next = NULL;
return pas;
}
int ClearLAS(PLAS plas)
{
PAS pNext,pas;
pas = plas->start_data;
if(!pas->Next)
return 0;
while(pas)
{
pNext = pas->Next;
free(pas);
pas = pNext;
}
plas->start_data = CreateAS();
plas->Count_AS = 0;
return 1;
}
int DeleteLAS(PLAS plas)
{
if(!plas)
return 0;
ClearLAS(plas);
free(plas->start_data);
free(plas);
return 1;
}
int isEmpty(PLAS plas)
{
if((!plas) || (!plas->start_data) || (!plas->Count_AS))
return 1;
else return 0;
}
int AddAS(PLAS plas)
{
PAS pas;
if(!plas)
return 0;
plas->Count_AS++;
pas = CreateAS();
pas->Next = plas->start_data;
plas->start_data = pas;
printf("Input city: ");
scanf("%s",pas->city);
printf("Input new date (DD.MM.YYYY): ");
scanf("%s",pas->date);
printf("\nAre there any stopovers?\n0 is No\n1 is Yes\nInput ID: ");
scanf("%u",&pas->stopovers);
printf("Input time of departure (XX:XX): ");
scanf("%s",&pas->time);
printf("Input flight number: ");
scanf("%u",&pas->number);
return 1;
}
void PrintAS(PLAS plas,PAS as)
{
PAS pas;
int len, i;
if(isEmpty(plas))
{
printf("Database is empty!\n");
return ;
}
pas = plas->start_data;
if(as)
{
printf("%s",as->city);
len=strlen(as->city);
PrintS(len);
printf("%s\n",as->date);
}
else
{
printf("\n");
i = plas->Count_AS;
while(pas->Next)
{
printf("%d. %s",i,pas->city);
len=strlen(pas->city);
PrintS(len);
printf("%s\n",pas->date);
pas = pas->Next;
i--;
}
}
}
Void PrintFullAs(pas pas)
{
if(!pas)
{
printf("Database is empty!");
return ;
}
printf("\ncity %s\n", pas->city);
printf("date %s\n", pas->date);
printf("time %s\n", pas->time);
if(pas->stopovers)
printf("stopovers is yes");
else
printf("stopovers is no");
printf("\nflight number %d\n",pas->number);
}
Int ChangeAs(plas plas,int id)
{
char pole[]="\n\n1. city\n2. date\n3. time\n4. stopovers\n5. number\nELSE ID -> CONTINUE\n";
unsigned int id,out=1;
PAS pas;
pas = Find_id_AS(plas,ID);
while(out)
{
PrintFullAS(pas);
printf("%s%s",pole,"Input id: ");
scanf("%u",&id);
switch(id)
{
case 1:
printf("Input new city: ");
scanf("%s",pas->city);
break;
case 2:
printf("Input new date (XX.XX.XXXX): ");
scanf("%s",pas->date);
break;
case 3:
printf("Input new time (XX:XX): ");
scanf("%s",&pas->time);
break;
case 4:
printf("\nAre there any stopovers?\n0 is No\n1 is Yes\nInput new ID: ");
scanf("%u",&pas->stopovers);
break;
case 5:
printf("Input new flight number: ");
scanf("%u",&pas->number);
break;
default:
out=0;
break;
}
}
return 1;
}
PAS FindAS(PLAS plas, char *date, PAS start)
{
PAS pas;
if(isEmpty(plas))
return NULL;
if(start)
{
pas = start;
while(pas)
{
if(!strcmp(pas->date,date))
return pas;
pas = pas->Next;
}
}
else
{
pas = plas->start_data;
while(pas)
{
if(!strcmp(pas->date,date))
return pas;
pas = pas->Next;
}
}
return NULL;
}
PAS Find_id_AS(PLAS plas,int ID)
{
PAS pas;
int id = plas->Count_AS;
if((ID>id)||(isEmpty(plas)))
return NULL;
pas = plas->start_data;
while(id!=ID)
{
id--;
pas=pas->Next;
}
return pas;
}
Int DeleteAs(plas plas,int id)
{
PAS p,pNext,pas;
if((ID>plas->Count_AS)||(isEmpty(plas)))
{
printf("Error\n");
return 0;
}
pas = Find_id_AS(plas,ID);
if(pas == plas->start_data)
{
plas->start_data = pas->Next;
free(pas);
}
else
{
pNext = plas->start_data;
while(pas)
{
if(pas==pNext)
{
p->Next = pas->Next;
free(pas);
break;
}
else
{
p = pNext;
pNext = pNext->Next;
}
}
}
plas->Count_AS--;
return 1;
}
Void PrintS(int count)
{
#define MAX_LEX 25
int i;
int sp;
sp = MAX_LEX-count;
for(i = 0;i<sp;i++)
printf(" ");
}
Int Save_las(const char *filename,plas plas)
{
FILE* pfile;
PAS pas;
if(!plas->Count_AS)
{
printf("No data to save in the file!");
return 0;
}
pfile = fopen(filename,"wb");
pas = plas->start_data;
fwrite(&plas->Count_AS,sizeof(int),1,pfile);
while(pas->Next)
{
fwrite(pas,sizeof(AS),1,pfile);
pas = pas->Next;
}
fclose(pfile);
return 1;
}
Int Load_las(const char *filename,plas plas)
{
FILE* pfile;
int count, i;
PAS pas;
pfile = fopen(filename,"rb");
if(!pfile)
{
printf("Not find file! Error!");
return 0;
}
fread(&count,sizeof(int),1,pfile);
if(!count)
{
printf("No data to load in the file!");
fclose(pfile);
return 0;
}
ClearLAS(plas);
plas->Count_AS = count;
pas = plas->start_data ;
i = 0;
while(i < plas->Count_AS)
{
fread(pas, sizeof(AS), 1, pfile);
pas->Next = NULL;
pas->Next = CreateAS();
pas = pas->Next;
i++;
}
fclose(pfile);
return 1;
}
Контрольный пример:
Список используемой литературы:
Язык программирования C. Брайан Керниган, Деннис Ритчи
Язык С. Самюел П. Харбисон, Гай Л. Стил
Язык Си и особенности работы с ним. Н. И. Костюкова, Н. А. Калинина