航空订票系统

开发人员:东北大学20级计算机系学生
开发团队:三人小组
开发语言:C语言
开发工具:vs2015
有疑问欢迎进行讨论
总代码数量大概在三千五百行左右
耗时近一个月的时间完成了该次课设,写此博客作为分享同时也纪念第一个开发一个大的项目
主要添加了eazyx,实现了可视化的操作
整个程序分为两大块,员工界面和顾客界面
员工界面可进行个人信息的查询和修改,查看某一天某趟航班的座位情况以及乘客的具体信息
顾客界面可进行个人信息的查询和修改,进行机票的购买,对已购买机票的查询
主要的特色:实现了程序的可长久发展,不仅仅局限于固定的时间期内
注:以下代码并不完整,有些自定义的函数并未贴出,详情可私信我要源码

一、基本信息

1、主函数

主要通过一个全局变量i进行页面的控制

//界面的控制
int main()
{initgraph(1280, 800);SetWindowText(hWnd, "XXX航空机票预订系统");// 使用 Windows API 修改窗口名称setbkcolor(WHITE);cleardevice();CreateThread(NULL, 0, showtime, NULL, 0, NULL);canfnowtime();//可支持查询的时间weainformation();//生成十天内的天气信息loadweather();//加载天气loadimage(&bk, "背景.jfif", 1280, 750);while (1){while (i == 0){BeginBatchDraw();star();nowload();EndBatchDraw();getchar();i++;}MOUSEMSG m;//定义鼠标信息while (i == 1)//登陆界面{BeginBatchDraw();regist();loadbottom(&work);loadbottom(&customer);loadbottom(&post);loadbottom(&recode);m = GetMouseMsg();if (mousebottom(&work, m))//鼠标在员工登录按钮里{if (m.mkLButton){man = 1;loadwork();//若账户密码正确则进入员工界面    i++;}}if (mousebottom(&customer, m))//鼠标在顾客登录按钮里{if (m.mkLButton){man = 2;loadcustomer();//若账户密码正确则进入顾客界面i++;}}if (mousebottom(&post, m))//鼠标在注册账号按钮里{if (m.mkLButton){poster();}}if (mousebottom(&recode, m))//鼠标在忘记密码按钮里{if (m.mkLButton){repass();}}EndBatchDraw();FlushMouseMsgBuffer();}while (i == 2)//员工或顾客界面{BeginBatchDraw();nowload();putimage(0, 50, &bk);if (man == 1){loadbottom(&maindata1);loadbottom(&planedata1);loadbottom(&quit1);//按钮设置m = GetMouseMsg();if (mousebottom(&maindata1, m))//查看个人信息{if (m.mkLButton){i++;loaddate();}}if (mousebottom(&planedata1, m))//查看航班信息{if (m.mkLButton){i++;InputBox(iptime, 9, "可支持查询现在至十天后的航班信息(格式如20210101)");if ((strlen(iptime) != 8)){MessageBoxA(hWnd, "格式不正确请重试", "提示", MB_OK);i--;}else if (!checkuptime()){MessageBoxA(hWnd, "仅支持查询十天内的航班", "提示", MB_OK);i--;}else{flightdata();}}}if (mousebottom(&quit1, m))//退出当前登录{if (m.mkLButton){Sleep(500);i = 0;man = 0;}}}else{loadbottom(&maindata2);loadbottom(&planedata2);loadbottom(&bugtick2);loadbottom(&quit2);//按钮设置m = GetMouseMsg();if (mousebottom(&maindata2, m))//查看个人信息{if (m.mkLButton){i++;loaddate();}}if (mousebottom(&planedata2, m))//查看航班信息{if (m.mkLButton){i++;InputBox(iptime, 9, "可支持查询现在至十天后的航班信息(格式如20210101)");if ((strlen(iptime) != 8)){MessageBoxA(hWnd, "格式不正确请重试", "提示", MB_OK);i--;}else if (!checkuptime()){MessageBoxA(hWnd, "仅支持查询十天内的航班", "提示", MB_OK);i--;}else{flightdata();}}}if (mousebottom(&bugtick2, m))//查看购票信息{if (m.mkLButton){i++;bugdata();}}if (mousebottom(&quit2, m))//退出当前登录{if (m.mkLButton){Sleep(500);i = 0;man = 0;}}}EndBatchDraw();FlushMouseMsgBuffer();}}closegraph();
}

2、全局变量和结构体

整个程序中会用到的结构体和链表

//定义结构体struct bottom//定义按钮
{int x1;//按钮左上角坐标int y1;int x2;//按钮右下角坐标int y2;COLORREF color;char text[100];int page;//按钮的页码
};
struct workman//员工信息
{char num[5];//员工编号,四位char code[9];//八位密码char name[5];//员工姓名char idnumber[19];//身份证号char phonum[12];//手机号char sex[10];//性别
};
struct cusman//顾客信息
{char phonum[12];//手机号char code[9];//密码char name[10];//顾客姓名char idnumber[19];//身份证号char num[5];//顾客编号char sex[10];//性别char flytime[4];//已经乘坐过航班的次数
};
struct weather//天气信息
{int num;int weatype;//1代表晴,2代表多云,3代表少云,4代表雨,5代表阴,6代表多风
};
struct lover//伴侣信息
{char man[5];char woman[5];char start[10];char final[10];
};
struct seat
{char seatnum[4];struct cusman data;struct seat* next;
};
struct Flight
{char pdeparture[10];//出发地char pdestination[10];//目的地char tdaparture[10];//出发时间char tdestination[10];//落地时间char number[10];//航班编号char tnumber[9];//总char rnumber[9];//剩余char price[9];//价格
};//定义链表
struct cuslist
{struct cusman data;struct cuslist *next;
};
struct worklist
{struct workman data;struct worklist *next;
};
struct weatherlist
{struct weather data;struct weatherlist *next;
};
struct loverlist
{struct lover data;struct loverlist *next;
};
struct Flightlist
{struct Flight data;char time[9];char seatnum[4];struct Flightlist *next;
};

所用到的全局变量

extern int n;
extern IMAGE bk;//设置背景图片
extern HWND hWnd;// 获得窗口句柄
extern int man;//用于判断登录类型,1代表员工登录,2代表顾客登录
extern int i;//用于控制页面
extern int k;//控制按键
extern int m;//已购买的座位
extern char iptime[9];//用户输入时间//按钮的定义
extern struct bottom work;
extern struct bottom customer;
extern struct bottom post;
extern struct bottom recode;
extern struct bottom re;
extern struct bottom maindata1;
extern struct bottom planedata1;
extern struct bottom quit1;
extern struct bottom maindata2;
extern struct bottom planedata2;
extern struct bottom bugtick2;
extern struct bottom quit2;
extern struct bottom correct;//航班的定义
extern struct Flight one;
extern struct Flight two;
extern struct Flight three;
extern struct Flight four;
extern struct Flight five;//当前登录账户信息
extern struct workman *worker;
extern struct cusman *cuser;
extern struct lover *cuslover;//可支持查询的时间
extern struct tm *pt;
extern struct tm nowtime;
extern struct tm futuretime;//用户查询的时间
extern struct tm inputtime;

3、头文件和cpp文件

4、开始界面

二、时间系统

主要是同步系统时间,然后判断查询航班时的时间是否正确

1、同步系统时间

采用了多线程的方式,可以独立的刷新时间
该系统也是本程序能够实现长久运行的基础

//多线程程序与系统时间同步显示
DWORD WINAPI showtime(LPVOID lpParamter)
{char str[50];while (1){BeginBatchDraw();function1(str);//初始化字符串数组time_t timep;struct tm *p;time(&timep);p = localtime(&timep);sprintf(str, "%d.%2d.%2d %d:%02d", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday, p->tm_hour, p->tm_min);RECT r = { 1080,0,1280,50 };//字符串输出的矩形区域setfillcolor(WHITE);fillrectangle(1080, 0, 1280, 50);fillrectangle(0, 0, 200, 50);settextstyle(10, 10, "行楷");settextcolor(RED);setbkmode(TRANSPARENT);drawtext(str, &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);//将字符居中显示EndBatchDraw();Sleep(60000);}return 0L;
}

2、判断查询时间是否正确

//判断输入的时间格式是否正确
int checkuptime()
{int k = 0;long s = atoi(iptime);int year, day, mouth;day = s % 100;mouth = (s % 10000 - day) / 100;year = ((s - day) / 100 - mouth) / 100;inputtime.tm_year = year;inputtime.tm_mon = mouth;inputtime.tm_mday = day;if (futuretime.tm_year > nowtime.tm_year){if ((year == futuretime.tm_year || year == nowtime.tm_year) && (mouth == 12 || mouth == 1) && ((day <= 31 && day >= nowtime.tm_mday) || (day >= 1 && day <= futuretime.tm_mday))){return 1;}elsereturn 0;}else{if (year == futuretime.tm_year){if (futuretime.tm_mon > nowtime.tm_mon){if ((mouth == futuretime.tm_mon || mouth == nowtime.tm_mon) && ((day <= 31 && day >= nowtime.tm_mday) || (day >= 1 && day <= futuretime.tm_mday))){return 1;}else{return 0;}}else{if (mouth == futuretime.tm_mon && (day <= futuretime.tm_mday && day >= nowtime.tm_mday)){return 1;}else{return 0;}}}else{return 0;}}
}

3、加载可支持查询的时间

计算出可支持查询时间,赋给全局变量
使用了time.h里的函数

//加载可支持查询的时间
void canfnowtime()
{time_t ntsec;time(&ntsec);pt = localtime(&ntsec);nowtime.tm_year = pt->tm_year + 1900;nowtime.tm_mon = pt->tm_mon + 1;nowtime.tm_mday = pt->tm_mday;ntsec += 864000;pt = localtime(&ntsec);futuretime.tm_year = pt->tm_year + 1900;futuretime.tm_mon = pt->tm_mon + 1;futuretime.tm_mday = pt->tm_mday;
}

三、天气系统

1、天气信息读取插入保存

先读入文本里存的天气信息

struct weatherlist *inputwth()
{FILE *fp = fopen("天气信息.txt", "r+");int m = daydiff(nowtime.tm_year, nowtime.tm_mon, nowtime.tm_mday);int n = 1;struct weatherlist *head = NULL;struct weatherlist *p1, *p2;p1 = (struct weatherlist *)malloc(sizeof(struct weatherlist));p2 = (struct weatherlist *)malloc(sizeof(struct weatherlist));if (yncontent("天气信息.txt")){while (!feof(fp)){fscanf(fp, "%d %d\n", &p1->data.num, &p1->data.weatype);if (n == 1){head = p1;n++;}else{p2->next = p1;n++;}p2 = p1;p1 = (struct weatherlist *)malloc(sizeof(struct weatherlist));}p2->next = NULL;}fclose(fp);return head;
}

对新的天气进行创建,目前设置为创建到当天时间往后十天的天气

struct weatherlist *newweather(struct weatherlist *head)
{int j = daydiff(futuretime.tm_year, futuretime.tm_mon, futuretime.tm_mday);struct weatherlist *p1, *p2, *p3;int m = 0, n = 1;p1 = (struct weatherlist *)malloc(sizeof(struct weatherlist));p2 = inputwth();p3 = head;while (p2 != NULL){m = p2->data.num + 1;p2 = p2->next;}while (p3 != NULL  && p3->data.num != m - 1){p3 = p3->next;}while (m <= j){p1->data.num = m;m++;p1->data.weatype = random(6, 1);if (m == 1)head = p1;else p3->next = p1;p3 = p1;n++;p1 = (struct weatherlist *)malloc(sizeof(struct weatherlist));}p3->next = NULL;return head;
}

查找到当天的天气

struct weatherlist *findweather(struct weatherlist *head, int m)
{while (head != NULL)//找到当天的天气信息{if (head->data.num == m){break;}head = head->next;}return head;
}

保存至文本

void keepdata(struct weatherlist *head)
{FILE *fp = fopen("天气信息.txt", "w");while (head != NULL){fprintf(fp, "%d %d\n", head->data.num, head->data.weatype);head = head->next;}fclose(fp);
}

2、创建天气信息

在程序运行界面加载出来前,进行天气信息的创建
采用随机数种子,伪随机的创建天气

//创建天气信息
void weainformation()
{struct weatherlist *head;srand((unsigned int)time(0));//修改种子head = inputwth();head = newweather(head);keepdata(head);
}

3、加载天气情况

设置了6种天气

//加载天气情况
void showweather(struct weather *p, RECT r)
{char str[20];switch (p->weatype){case 1:sprintf(str, "天气:晴"); break;case 2:sprintf(str, "天气:多云"); break;case 3:sprintf(str, "天气:少云"); break;case 4:sprintf(str, "天气:雨"); break;case 5:sprintf(str, "天气:阴"); break;case 6:sprintf(str, "天气:多风"); break;default:break;}drawtext(str, &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}

4、显示当天的天气

//显示当前天气情况
void loadweather()
{RECT r = { 540,0,740,50 };//显示天气信息的区域setfillcolor(WHITE);fillrectangle(0, 0, 200, 50);settextstyle(10, 10, "行楷");settextcolor(RED);setbkmode(TRANSPARENT);int m = daydiff(nowtime.tm_year, nowtime.tm_mon, nowtime.tm_mday);struct weatherlist *head;head = inputwth();head = findweather(head, m);showweather(&head->data, r);
}

5、显示查询的天气

在航班查询时,进行查询当天天气信息的显示

//显示选择查询时间的天气情况
void inquireweather(struct weatherlist *head)
{RECT r = { 1080,50,1280,100 };setfillcolor(RGB(137, 145, 255));solidroundrect(1080, 50, 1280, 100, 15, 15);int m = daydiff(inputtime.tm_year, inputtime.tm_mon, inputtime.tm_mday);head = findweather(head, m);showweather(&head->data, r);
}

四、伴侣系统

这也是我选择此项目作为本次课设的原因
也是我最想要完成的一个系统,也算是我们此次课设的特色之一吧
每个用户可以进行伴侣的绑定,并选择一趟优惠航班
(最初是打算给每个用户一个地址,然后选择该地址到伴侣地址的航班时进行优惠,后面采取了简化)
若选择优惠航班,则会对机票价格减半
但绑定后将无法更改

1、进行绑定

//账号进行绑定
int bind()
{char str[4][10];InputBox(str[0], 5, "请输入用户的姓名:");if (strlen(str[0])){InputBox(str[1], 10, "请输入一个地点:");if (strlen(str[1])){InputBox(str[2], 10, "请输入另一个地点:");if (strlen(str[2])){int a = checkupsex(str[0]);int j = checkupplane(str[1], str[2]);if (j == 1)//存在该趟航班{if (a == 1){strcpy(cuslover->start, str[1]);strcpy(cuslover->final, str[2]);if (strcmp(cuser->sex, "man") == 0){strcpy(cuslover->man, cuser->name);strcpy(cuslover->woman, str[0]);}else if (strcmp(cuser->sex, "woman") == 0){strcpy(cuslover->man, str[0]);strcpy(cuslover->woman, cuser->name);}MessageBox(hWnd, "绑定成功", "提示", MB_OK);return 1;}else if (a == 2){MessageBox(hWnd, "暂不支持同性进行绑定", "提示", MB_OK);}else if (a == 3){MessageBox(hWnd, "该用户已绑定请重试", "提示", MB_OK);}else{MessageBox(hWnd, "该账户未注册", "提示", MB_OK);}}else{MessageBox(hWnd, "不存在该趟航班请重试", "提示", MB_OK);}}else{MessageBox(hWnd, "格式错误", "提示", MB_OK);}}else{MessageBox(hWnd, "格式错误", "提示", MB_OK);}}else{MessageBox(hWnd, "格式错误", "提示", MB_OK);}return 0;
}

2、查询航班是否存在

//查找是否存在该趟航班
int checkupplane(char *start, char *final)
{if ((strcmp(start, one.pdeparture) == 0 && strcmp(final, one.pdestination) == 0) || (strcmp(final, one.pdeparture) == 0 && strcmp(start, one.pdestination) == 0)){return 1;}else if ((strcmp(start, two.pdeparture) == 0 && strcmp(final, two.pdestination) == 0) || (strcmp(final, two.pdeparture) == 0 && strcmp(start, two.pdestination) == 0)){return 1;}else if ((strcmp(start, three.pdeparture) == 0 && strcmp(final, three.pdestination) == 0) || (strcmp(final, three.pdeparture) == 0 && strcmp(start, three.pdestination) == 0)){return 1;}else if ((strcmp(start, four.pdeparture) == 0 && strcmp(final, four.pdestination) == 0) || (strcmp(final, four.pdeparture) == 0 && strcmp(start, four.pdestination) == 0)){return 1;}else if ((strcmp(start, five.pdeparture) == 0 && strcmp(final, five.pdestination) == 0) || (strcmp(final, five.pdeparture) == 0 && strcmp(start, five.pdestination) == 0)){return 1;}else{return 0;}
}

3、判断性别是否为异性,以及用户是否存在和是否绑定

//查找绑定账号是否存在并且是否为异性且该账户未被绑定
int checkupsex(char *name)
{int a;//判断账号是否存在并且是否为异性struct cuslist *head = inputcus();while (head != NULL){if (strcmp(head->data.name, name) == 0){if (strcmp(head->data.sex, cuser->sex) != 0)a = 1;//存在且为异性elsea = 2;//存在为同性break;}head = head->next;a = 0;//账号不存在}//判断该账号是否绑定if (a == 1){struct loverlist *p = inputlove();while (p != NULL){if (strcmp(p->data.man, name) == 0 || strcmp(p->data.woman, name) == 0){a = 3;//账号已被绑定}p = p->next;}}return a;
}

4、加载绑定信息

//查找绑定账号是否存在并且是否为异性且该账户未被绑定
int checkupsex(char *name)
{int a;//判断账号是否存在并且是否为异性struct cuslist *head = inputcus();while (head != NULL){if (strcmp(head->data.name, name) == 0){if (strcmp(head->data.sex, cuser->sex) != 0)a = 1;//存在且为异性elsea = 2;//存在为同性break;}head = head->next;a = 0;//账号不存在}//判断该账号是否绑定if (a == 1){struct loverlist *p = inputlove();while (p != NULL){if (strcmp(p->data.man, name) == 0 || strcmp(p->data.woman, name) == 0){a = 3;//账号已被绑定}p = p->next;}}return a;
}

五、注册和忘记账号

1、注册账号

//注册账号
void poster()
{MOUSEMSG m;struct bottom workpost = { 200, 500, 600, 700, YELLOW, "员工注册" ,1 };struct bottom cuspost = { 680, 500, 1080, 700, YELLOW, "顾客注册" ,1 };while (i == 1){BeginBatchDraw();putimage(0, 50, &bk);loadbottom(&re);loadbottom(&workpost);loadbottom(&cuspost);RECT r = { 240, 200, 1040, 400 };settextcolor(RGB(85, 117, 246));settextstyle(30, 30, "行楷");setbkmode(TRANSPARENT);drawtext("请选择账号注册类型", &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);m = GetMouseMsg();if (mousebottom(&re, m))//返回{if (m.mkLButton){break;}}if (mousebottom(&workpost, m))//员工注册{if (m.mkLButton){FILE *fp = fopen("员工信息.txt", "r");if (fp == NULL){fp = fopen("员工信息.txt", "w");}//判断文本文件是否存在,若不存在则创建fclose(fp);man = 1;inputdatawork();//填写注册信息并写入文件夹}}if (mousebottom(&cuspost, m))//顾客注册{if (m.mkLButton){FILE *fp = fopen("顾客信息.txt", "r");if (fp == NULL){fp = fopen("顾客信息.txt", "w");}//判断文本文件是否存在,若不存在则创建fclose(fp);man = 2;inputdatacus();}}EndBatchDraw();FlushMouseMsgBuffer();}}

2、判断账户是否存在

一个身份证号或者电话号码仅能绑定一个账号

//检查当前注册账号信息是否已存在,保证一身份证号或者一手机号绑定一个账号
int checkup(struct workman *p)
{struct worklist *head = inputwork();while (head != NULL){if (strcpy(head->data.phonum, p->phonum) == 0 || strcpy(head->data.idnumber, p->idnumber) == 0){return 0;}head = head->next;}return 1;
}
int checkup(struct cusman *p)
{struct cuslist *head = inputcus();while (head != NULL){if (strcpy(head->data.phonum, p->phonum) == 0 || strcpy(head->data.idnumber, p->idnumber) == 0){return 0;}head = head->next;}return 1;
}

3、存入注册信息

//存入注册员工信息
void inputdatawork()
{struct worklist *head = (struct worklist *)malloc(sizeof(struct worklist));struct workman *p = (struct workman*)malloc(sizeof(struct workman));head = inputwork();//存入数据InputBox(p->name, 5, "请输入你的名字");if (strlen(p->name) == 0){MessageBoxA(hWnd, "格式不正确请重试", "提示", MB_OK);man = 0;}else{InputBox(p->code, 9, "请输入八位密码");if (strlen(p->code) != 8){MessageBoxA(hWnd, "格式不正确请重试", "提示", MB_OK);man = 0;}else{InputBox(p->idnumber, 19, "请输入你的身份证号");if (strlen(p->idnumber) != 18){MessageBoxA(hWnd, "格式不正确请重试", "提示", MB_OK);man = 0;}else{InputBox(p->phonum, 12, "请输入你的电话号码");if (strlen(p->phonum) != 11){MessageBoxA(hWnd, "格式不正确请重试", "提示", MB_OK);man = 0;}else{InputBox(p->sex, 6, "请输入你的性别(woman or man)");if (strncmp(p->sex, "woman", 5) == 0 || strncmp(p->sex, "man", 3) == 0){if (!checkup(p))//已存在用户信息,重新注册{MessageBoxA(hWnd, "已存在该用户信息,请重新进行注册", "提示", MB_OK);man = 0;}else{head = newwork(head, p);keepdata(head);worker = p;//输入正确则将注册信息传递给当前登录用户i++;//进入下一界面}}else{MessageBoxA(hWnd, "格式不正确请重试", "提示", MB_OK);man = 0;}}}}}
}
//存入注册顾客信息
void inputdatacus()
{struct cuslist *head = (struct cuslist *)malloc(sizeof(struct cuslist));struct cusman *p = (struct cusman *)malloc(sizeof(struct cusman));head = inputcus();InputBox(p->name, 5, "请输入你的名字");if (strlen(p->name) == 0){MessageBoxA(hWnd, "格式不正确请重试", "提示", MB_OK);man = 0;}else{InputBox(p->code, 9, "请输入八位密码");if (strlen(p->code) != 8){MessageBoxA(hWnd, "格式不正确请重试", "提示", MB_OK);man = 0;}else{InputBox(p->idnumber, 19, "请输入你的身份证号");if (strlen(p->idnumber) != 18){MessageBoxA(hWnd, "格式不正确请重试", "提示", MB_OK);man = 0;}else{InputBox(p->phonum, 12, "请输入你的电话号码");if (strlen(p->phonum) != 11){MessageBoxA(hWnd, "格式不正确请重试", "提示", MB_OK);man = 0;}else{InputBox(p->sex, 6, "请输入你的性别(woman or man)");if (strncmp(p->sex, "woman", 5) == 0 || strncmp(p->sex, "man", 3) == 0){if (!checkup(p))//已存在用户信息,重新注册{MessageBoxA(hWnd, "已存在该用户信息,请重新进行注册", "提示", MB_OK);man = 0;}else{head = newcus(head, p);keepdata(head);cuser = p;//输入正确则将注册信息传递给当前登录用户i++;//进入下一界面}}else{MessageBoxA(hWnd, "格式不正确请重试", "提示", MB_OK);man = 0;}}}}}
}

4、忘记密码

//忘记密码
void repass()
{MOUSEMSG m;struct bottom workpost = { 200, 500, 600, 700, YELLOW, "员工" ,1 };struct bottom cuspost = { 680, 500, 1080, 700, YELLOW, "顾客" ,1 };while (i == 1){BeginBatchDraw();putimage(0, 50, &bk);loadbottom(&re);loadbottom(&workpost);loadbottom(&cuspost);RECT r = { 240, 200, 1040, 400 };settextcolor(RGB(85, 117, 246));settextstyle(30, 30, "行楷");setbkmode(TRANSPARENT);drawtext("请选择账号类型", &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);m = GetMouseMsg();if (mousebottom(&re, m)){if (m.mkLButton){break;}}if (mousebottom(&workpost, m)){if (m.mkLButton){char data1[12];char data2[9];InputBox(data1, 12, "请输入账户绑定的电话号码");if (strlen(data1) != 11){MessageBoxA(hWnd, "格式不正确请重试", "提示", MB_OK);}else{InputBox(data2, 9, "请输入修改后的密码");if (strlen(data2) != 8){MessageBoxA(hWnd, "格式不正确请重试", "提示", MB_OK);}else{int m = 0;FILE *fp = fopen("员工信息.txt", "r+");if (fp == NULL || yncontent("员工信息.txt")){MessageBoxA(hWnd, "还未注册请先注册", "提示", MB_OK);break;}else{struct workman *p1, *p2;p1 = (struct workman*)malloc(sizeof(struct workman));p2 = (struct workman*)malloc(sizeof(struct workman));char str[5];while (!feof(fp)){fscanf(fp, "%s %s %s %s %s %s", p1->num, p1->code, p1->name, p1->idnumber, p1->phonum, p1->sex);if (strcmp(p1->phonum, data1) == 0)//找到该账号,m=1{m = 1;break;}}if (m == 1)//该账户存在{sprintf(str, "%d", atoi(p1->num) - 1);rewind(fp);while (!feof(fp)){fscanf(fp, "%s %s %s %s %s %s", p2->num, p2->code, p2->name, p2->idnumber, p2->phonum, p2->sex);if (strcmp(p2->num, str) == 0){strcpy(p1->code, data2);break;}}fseek(fp, 0l, 1);worker = p1;fprintf(fp, "\n%s %s %s %s %s %s", worker->num, worker->code, worker->name, worker->idnumber, worker->phonum, worker->sex);MessageBoxA(hWnd, "密码修改成功", "提示", MB_OK);man = 1;i++;}else//该账户不存在{MessageBoxA(hWnd, "不存在该账户请重试", "提示", MB_OK);}free(p1);free(p2);fclose(fp);}}}}}if (mousebottom(&cuspost, m)){if (m.mkLButton){char data1[12];char data2[9];InputBox(data1, 12, "请输入账户绑定的电话号码");if (strlen(data1) != 11){MessageBoxA(hWnd, "格式不正确请重试", "提示", MB_OK);}else{InputBox(data2, 9, "请输入修改后的密码");if (strlen(data2) != 8){MessageBoxA(hWnd, "格式不正确请重试", "提示", MB_OK);}else{int m = 0;FILE *fp = fopen("顾客信息.txt", "r+");if (fp == NULL || !yncontent("顾客信息.txt")){MessageBoxA(hWnd, "还未注册请先注册", "提示", MB_OK);break;}else{struct cusman *p1, *p2;p1 = (struct cusman *)malloc(sizeof(struct cusman));p2 = (struct cusman *)malloc(sizeof(struct cusman));char str[5];while (!feof(fp)){fscanf(fp, "%s %s %s %s %s %s %s", p1->phonum, p1->code, p1->name, p1->idnumber, p1->num, p1->sex, p1->flytime);if (strcmp(data1, p1->phonum) == 0)//找到账户信息{m = 1;break;}}if (m == 1){rewind(fp);sprintf(str, "%d", atoi(p1->num) - 1);while (!feof(fp)){fscanf(fp, "%s %s %s %s %s %s %s", p2->phonum, p2->code, p2->name, p2->idnumber, p2->num, p2->sex, p2->flytime);if (strcmp(str, p2->num) == 0){strcpy(p1->code, data2);break;}}fseek(fp, 0l, 1);cuser = p1;fprintf(fp, "\n%s %s %s %s %s %s %s", cuser->phonum, cuser->code, cuser->name, cuser->idnumber, cuser->num, cuser->sex, cuser->flytime);MessageBoxA(hWnd, "密码修改成功", "提示", MB_OK);man = 2;i++;}else//该账户不存在{MessageBoxA(hWnd, "不存在该账户请重试", "提示", MB_OK);}free(p1);free(p2);fclose(fp);}}}}}EndBatchDraw();FlushMouseMsgBuffer();}}

六、员工界面

1、员工信息读取查找修改保存插入(链表)

从指定的文本文档里读取员工的信息到链表中

//读取信息
struct worklist *inputwork()
{FILE *fp = fopen("员工信息.txt", "r+");int n = 1;//定义结点数struct worklist *head = NULL;struct worklist *p1 = (struct worklist *)malloc(sizeof(struct worklist));struct worklist *p2 = (struct worklist *)malloc(sizeof(struct worklist));if (yncontent("员工信息.txt")){while (!feof(fp)){fscanf(fp, "%s %s %s %s %s %s\n", p1->data.num, p1->data.code, p1->data.name, p1->data.idnumber, p1->data.phonum, p1->data.sex);if (n == 1){head = p1;n++;}else{p2->next = p1;}p2 = p1;p1 = (struct worklist *)malloc(sizeof(struct worklist));}p2->next = NULL;}fclose(fp);return head;
}
struct worklist *findwork(struct worklist *head)
{while (head != NULL){if (strcmp(head->data.num, worker->num) == 0){break;}head = head->next;}return head;
}
//修改数据
struct worklist *crtwork(struct worklist *head, int m, char *str)
{struct worklist *p1 = head;p1 = findwork(p1);switch (m){case 1:strcpy(p1->data.name, str); break;case 2:strcpy(p1->data.code, str); break;case 3:strcpy(p1->data.idnumber, str); break;case 4:strcpy(p1->data.phonum, str); break;default:break;}return head;
}
//插入数据
struct worklist * newwork(struct worklist *head, struct workman *p)
{int n = 1;char str[5];struct worklist *p1 = head;struct worklist *p2;while (p1->next != NULL){p1 = p1->next;n++;}p2 = (struct worklist*)malloc(sizeof(struct worklist));sprintf(str, "%d", atoi(p1->data.num) + 1);strcpy(p->num, str);p2->data = *p;p2->next = NULL;if (n == 1)head = p2;elsep1->next = p2;return head;
}
//将数据存入文本
void keepdata(struct worklist *head)
{FILE *fp = fopen("员工信息.txt", "w");//创建一个文本作为过渡while (head != NULL){fprintf(fp, "%s %s %s %s %s %s\n", head->data.num, head->data.code, head->data.name, head->data.idnumber, head->data.phonum, head->data.sex);head = head->next;}fclose(fp);
}

2、员工登录

通过链表里的数据对输入的员工编号和密码进行对比(对比的函数并未贴出)

//员工进行登录
void loadwork()
{struct workman *p = (struct workman *)malloc(sizeof(struct workman));InputBox(p->num, 5, "请输入员工编号");if (strlen(p->num) == 0){MessageBoxA(hWnd, "格式不正确请重试", "提示", MB_OK);man = 0;i--;}else{InputBox(p->code, 9, "请输入密码");if (strlen(p->code) != 8){MessageBoxA(hWnd, "格式不正确请重试", "提示", MB_OK);man = 0;i--;}else{//验证账号密码是否正确int c = checking(p->num, p->code);if (c == 0){MessageBoxA(hWnd, "密码错误请重试", "提示", MB_OK);man = 0;i--;}else if (c == 2){MessageBoxA(hWnd, "还未进行注册,请先注册", "提示", MB_OK);man = 0;i--;}}}free(p);
}

登录成功后i++,进入员工界面

3、个人信息的加载

//加载个人信息
void loaddate()
{struct loverlist *head = inputlove();while (i == 3){BeginBatchDraw();nowload();putimage(0, 50, &bk);loadbottom(&re);loadbottom(&correct);setfillcolor(RGB(166, 171, 248));fillroundrect(340, 100, 940, 700, 15, 15);if (man == 1){char str[5][50];RECT r1 = { 340,120,940,200 };//用户编号RECT r2 = { 340,240,940,320 };//姓名RECT r3 = { 340,360,940,440 };//身份证号RECT r4 = { 340,480,940,560 };//性别RECT r5 = { 340,600,940,680 };//电话//基本信息输出sprintf(str[0], "用户编号:%s", worker->num);sprintf(str[1], "姓名;%s", worker->name);sprintf(str[2], "身份证号:%s", worker->idnumber);sprintf(str[3], "性别:%s", worker->sex);sprintf(str[4], "电话:%s", worker->phonum);settextcolor(RGB(45, 49, 56));settextstyle(20, 20, "行楷");drawtext(str[0], &r1, DT_CENTER | DT_VCENTER | DT_SINGLELINE);drawtext(str[1], &r2, DT_CENTER | DT_VCENTER | DT_SINGLELINE);drawtext(str[2], &r3, DT_CENTER | DT_VCENTER | DT_SINGLELINE);drawtext(str[3], &r4, DT_CENTER | DT_VCENTER | DT_SINGLELINE);drawtext(str[4], &r5, DT_CENTER | DT_VCENTER | DT_SINGLELINE);MOUSEMSG m;m = GetMouseMsg();if (mousebottom(&re, m)){if (m.mkLButton){i--;Sleep(500);}}if (mousebottom(&correct, m)){if (m.mkLButton){i++;correctdata();}}}else if (man == 2){char str[6][50];struct loverlist *p = head;p = loadlover(p);RECT r1 = { 340,100,940,200 };//用户编号RECT r2 = { 340,200,940,300 };//姓名RECT r3 = { 340,300,940,400 };//身份证号RECT r4 = { 340,400,940, 500 };//性别RECT r5 = { 340,500,940, 600 };//电话RECT r6 = { 340,600, 940,700 };//飞行次数//基本信息输出sprintf(str[0], "用户编号:%s", cuser->num);sprintf(str[1], "姓名;%s", cuser->name);sprintf(str[2], "身份证号:%s", cuser->idnumber);sprintf(str[3], "性别:%s", cuser->sex);sprintf(str[4], "电话:%s", cuser->phonum);sprintf(str[5], "飞行次数:%s", cuser->flytime);settextcolor(RGB(45, 49, 56));settextstyle(20, 20, "行楷");drawtext(str[0], &r1, DT_CENTER | DT_VCENTER | DT_SINGLELINE);drawtext(str[1], &r2, DT_CENTER | DT_VCENTER | DT_SINGLELINE);drawtext(str[2], &r3, DT_CENTER | DT_VCENTER | DT_SINGLELINE);drawtext(str[3], &r4, DT_CENTER | DT_VCENTER | DT_SINGLELINE);drawtext(str[4], &r5, DT_CENTER | DT_VCENTER | DT_SINGLELINE);drawtext(str[5], &r6, DT_CENTER | DT_VCENTER | DT_SINGLELINE);MOUSEMSG m;m = GetMouseMsg();if (p == NULL){if (m.x >= 200 && m.x <= 1080 && m.y >= 725 && m.y <= 775){RECT r = { 800, 625, 1180, 725 };char xx[] = "可点击进行绑定,与一名异性已注册账户进行绑定,并填写两人所在地,当购买该趟航班时,将进行优惠,但绑定后无法再更改";setfillcolor(RGB(239, 214, 178));solidroundrect(800, 625, 1180, 725, 15, 15);setbkmode(TRANSPARENT);//字符背景透明settextstyle(20, 15, "微软雅黑");drawtext(xx, &r, DT_WORDBREAK);if (m.mkLButton){int a;a = MessageBox(hWnd, "是否进行绑定", "提示", MB_OKCANCEL);if (a == 1){if (bind()){storedata();head = inputlove();}}FlushMouseMsgBuffer();}}}if (mousebottom(&re, m)){if (m.mkLButton){i--;Sleep(500);}}if (mousebottom(&correct, m)){if (m.mkLButton){i++;correctdata();}}}EndBatchDraw();}
}

4、个人信息的修改

//更改信息
void correctdata()
{struct worklist *workhead = inputwork();//写入数据struct cuslist *cushead = inputcus();while (i == 4){BeginBatchDraw();putimage(0, 50, &bk);MOUSEMSG m = GetMouseMsg();loadbottom(&re);RECT r = { 0,100,1280,200 };drawtext("请选择需要更改的信息", &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);struct bottom name = { 340,325,540,425,RGB(166, 171, 248),"姓名" ,4 };struct bottom code = { 740,325,940,425,RGB(166, 171, 248) ,"密码" ,4 };struct bottom idnumber = { 340,475,540,575,RGB(166, 171, 248) ,"身份证号",4 };struct bottom phonum = { 740,475,940,575,RGB(166, 171, 248) ,"手机号",4 };loadbottom(&name);loadbottom(&code);loadbottom(&idnumber);loadbottom(&phonum);if (man == 1){char data[20];if (mousebottom(&re, m)){if (m.mkLButton){i--;Sleep(500);}}if (mousebottom(&name, m))//更改姓名{if (m.mkLButton){InputBox(data, 5, "请输入更改的姓名");if (strlen(data) == 0){MessageBoxA(hWnd, "格式不正确请重试", "提示", MB_OK);}else{strcpy(worker->name, data);workhead = crtwork(workhead, 1, data);keepdata(workhead);}}}if (mousebottom(&code, m))//更改密码{if (m.mkLButton){InputBox(data, 9, "请输入更改的密码");if (strlen(data) != 8){MessageBoxA(hWnd, "格式不正确请重试", "提示", MB_OK);}else{strcpy(worker->code, data);workhead = crtwork(workhead, 2, data);keepdata(workhead);}}}if (mousebottom(&idnumber, m)){if (m.mkLButton){InputBox(data, 19, "请输入更改的身份证号");if (strlen(data) != 18){MessageBoxA(hWnd, "格式不正确请重试", "提示", MB_OK);}else{strcpy(worker->idnumber, data);workhead = crtwork(workhead, 3, data);keepdata(workhead);}}}if (mousebottom(&phonum, m)){if (m.mkLButton){InputBox(data, 12, "请输入更改的手机号");if (strlen(data) != 11){MessageBoxA(hWnd, "格式不正确请重试", "提示", MB_OK);}else{strcpy(worker->phonum, data);workhead = crtwork(workhead, 4, data);keepdata(workhead);}}}}else if (man == 2){char data[20];if (mousebottom(&re, m)){if (m.mkLButton){i--;Sleep(500);}}if (mousebottom(&name, m))//更改姓名{if (m.mkLButton){InputBox(data, 5, "请输入更改的姓名");if (strlen(data) == 0){MessageBoxA(hWnd, "格式不正确请重试", "提示", MB_OK);}else{strcpy(cuser->name, data);cushead = crtcus(cushead, 1, data);keepdata(cushead);}}}if (mousebottom(&code, m))//更改密码{if (m.mkLButton){InputBox(data, 9, "请输入更改的密码");if (strlen(data) != 8){MessageBoxA(hWnd, "格式不正确请重试", "提示", MB_OK);}else{strcpy(cuser->code, data);cushead = crtcus(cushead, 2, data);keepdata(cushead);}}}if (mousebottom(&idnumber, m)){if (m.mkLButton){InputBox(data, 19, "请输入更改的身份证号");if (strlen(data) != 18){MessageBoxA(hWnd, "格式不正确请重试", "提示", MB_OK);}else{strcpy(cuser->idnumber, data);cushead = crtcus(cushead, 3, data);keepdata(cushead);}}}if (mousebottom(&phonum, m)){if (m.mkLButton){InputBox(data, 12, "请输入更改的手机号");if (strlen(data) != 11){MessageBoxA(hWnd, "格式不正确请重试", "提示", MB_OK);}else{strcpy(cuser->phonum, data);cushead = crtcus(cushead, 4, data);keepdata(cushead);}}}}FlushMouseMsgBuffer();nowload();EndBatchDraw();}
}

5、查询航班

通过MessageBoxA函数的返回值确定所需查询的时间(具体见main函数),然后进入航班选择界面

void pageone()
{struct button* p1 = cbutton(450, 150, 350, 50, YELLOW, "001航班 重庆-郑州");struct button* p2 = cbutton(450, 205, 350, 50, YELLOW, "002航班 广州-天津");struct button* p3 = cbutton(450, 260, 350, 50, YELLOW, "003航班 沈阳-上海");struct button* p4 = cbutton(450, 315, 350, 50, YELLOW, "004航班 青岛-武汉");struct button* p5 = cbutton(450, 370, 350, 50, YELLOW, "005航班 北京-杭州");struct button* re = cbutton(0, 50, 100, 50, YELLOW, "返回");struct weatherlist *head = inputwth();while (i == 3){BeginBatchDraw();putimage(0, 50, &bk);//显示查询的时间inquiretime();//显示查询的天气inquireweather(head);drawbutton(p1);   //加按钮drawbutton(p2);drawbutton(p3);drawbutton(p4);drawbutton(p5);drawbutton(re);MOUSEMSG m = GetMouseMsg();if (clickbutton(re, m)){i--;}if (clickbutton(p1, m)){i++;k = 1;}if (clickbutton(p2, m)){i++;k = 2;}if (clickbutton(p3, m)){i++;k = 3;}if (clickbutton(p4, m)){i++;k = 4;}if (clickbutton(p5, m)){i++;k = 5;}EndBatchDraw();}
}

如果点击某趟航班则i++,通过全局变量k控制所选择的航班

6、航班信息的加载

只贴出一趟航班的代码,其余航班基本类似
可以通过该界面查询具体的座位情况

void pagetwo()
{int u = pricechange();char str[50];sprintf(str, "出发时间:%s", one.tdaparture);char rtr[50];sprintf(rtr, "落地时间:%s", one.tdestination);char qtr[50];sprintf(qtr, "剩余座位:%d", atoi(one.rnumber)-m);char p[50];sprintf(p, "价格:%.2f", atoi(one.price)*(1 - 0.09*u));struct button* p0 = cbutton(450, 95, 350, 50, YELLOW, p);struct button* p1 = cbutton(450, 150, 350, 50, YELLOW, "出发地:重庆");struct button* p2 = cbutton(450, 205, 350, 50, YELLOW, "目的地:郑州");struct button* p3 = cbutton(450, 260, 350, 50, YELLOW, str);struct button* p4 = cbutton(450, 315, 350, 50, YELLOW, rtr);struct button* p5 = cbutton(450, 370, 350, 50, YELLOW, "航班编号:001航班");struct button* p6 = cbutton(450, 425, 350, 50, YELLOW, "总座位:100");struct button* p7 = cbutton(450, 480, 350, 50, YELLOW, qtr);struct button* p8 = cbutton(450, 535, 170, 50, YELLOW, "确认");struct button* p9 = cbutton(630, 535, 170, 50, YELLOW, "返回");while (i == 4){char str[50];sprintf(str, "出发时间:%s", one.tdaparture);char rtr[50];sprintf(rtr, "落地时间:%s", one.tdestination);char qtr[50];sprintf(qtr, "剩余座位:%s", one.rnumber);BeginBatchDraw();drawbutton(p0);drawbutton(p1);   //加按钮drawbutton(p2);drawbutton(p3);drawbutton(p4);drawbutton(p5);drawbutton(p6);drawbutton(p7);drawbutton(p8);drawbutton(p9);MOUSEMSG m = GetMouseMsg();if (clickbutton(p8, m)){i++;}if (clickbutton(p9, m)){i--;Sleep(500);FlushMouseMsgBuffer();}EndBatchDraw();}
}

7、乘客信息的查询

先选择所要查询的乘客

int pageseven(struct seat* head)
{int a, j;int l, w;struct seat *p;struct button* m[12][8];struct button* p0 = cbutton(5, 720, 100, 50, YELLOW, "返回");p = head;for (a = 0, l = 0; a < 12; a++){for (j = 0; j < 8; j++){if (p == NULL){break;}(struct button*) m[a][j] = cbutton(5 + j * 155, 60 + a * 55, 150, 50, YELLOW, p->data.name);p = p->next;l++;}if (p == NULL){break;}}while (i == 5){BeginBatchDraw();MOUSEMSG o = GetMouseMsg();for (a = 0, w = 0; a < 12; a++){for (j = 0; j < 8; j++){if (w == l){break;}drawbutton(m[a][j]);w++;if (clickbutton(m[a][j], o)){i++;return w;}}}if (clickbutton(p0, o)){i--;Sleep(500);FlushMouseMsgBuffer();}drawbutton(p0);EndBatchDraw();}
}

然后在对乘客的具体信息进行展示

void cusinformation(struct seat* head, int q)
{int b;struct seat *p = head;for (b = 1; ; b++){if (b == q)break;p = p->next;}struct button* p1 = cbutton(450, 150, 350, 50, YELLOW, p->data.phonum);struct button* p2 = cbutton(450, 205, 350, 50, YELLOW, p->data.code);struct button* p3 = cbutton(450, 260, 350, 50, YELLOW, p->data.name);struct button* p4 = cbutton(450, 315, 350, 50, YELLOW, p->data.idnumber);struct button* p5 = cbutton(450, 370, 350, 50, YELLOW, p->data.num);struct button* p6 = cbutton(450, 425, 350, 50, YELLOW, p->data.sex);struct button* p7 = cbutton(450, 480, 350, 50, YELLOW, p->data.flytime);struct button* p8 = cbutton(450, 535, 350, 50, YELLOW, "返回");struct button* p9 = cbutton(255, 150, 200, 50, YELLOW, "手机号码");struct button* p10 = cbutton(255, 205, 200, 50, YELLOW, "用户密码");struct button* p11 = cbutton(255, 260, 200, 50, YELLOW, "用户姓名");struct button* p12 = cbutton(255, 315, 200, 50, YELLOW, "身份证号码");struct button* p13 = cbutton(255, 370, 200, 50, YELLOW, "用户编号");struct button* p14 = cbutton(255, 425, 200, 50, YELLOW, "用户性别");struct button* p15 = cbutton(255, 480, 200, 50, YELLOW, "飞行次数");while (i == 6){BeginBatchDraw();drawbutton(p1);   //加按钮drawbutton(p2);drawbutton(p3);drawbutton(p4);drawbutton(p5);drawbutton(p6);drawbutton(p7);drawbutton(p8);drawbutton(p9);   //加按钮drawbutton(p10);drawbutton(p11);drawbutton(p12);drawbutton(p13);drawbutton(p14);drawbutton(p15);MOUSEMSG m = GetMouseMsg();if (clickbutton(p8, m)){i--;}EndBatchDraw();}
}

七、顾客界面

1、顾客信息读取查找修改保存插入(链表)

//读取数据
struct cuslist *inputcus()
{FILE *fp = fopen("顾客信息.txt", "r+");int n = 1;struct cuslist *head = NULL;struct cuslist *p1 = (struct cuslist *)malloc(sizeof(struct cuslist));struct cuslist *p2 = (struct cuslist *)malloc(sizeof(struct cuslist));if (yncontent("顾客信息.txt")){while (!feof(fp)){fscanf(fp, "%s %s %s %s %s %s %s\n", p1->data.phonum, p1->data.code, p1->data.name, p1->data.idnumber, p1->data.num, p1->data.sex, p1->data.flytime);if (n == 1){head = p1;n++;}else{p2->next = p1;}p2 = p1;p1 = (struct cuslist *)malloc(sizeof(struct cuslist));}p2->next = NULL;}fclose(fp);return head;
}
//查找数据
struct cuslist *findcus(struct cuslist *head)
{while (head != NULL){if (strcmp(head->data.num, cuser->num) == 0){break;}head = head->next;}return head;
}
//修改数据
struct cuslist *crtcus(struct cuslist *head, int m, char *str)
{struct cuslist *p1 = head;p1 = findcus(p1);switch (m){case 1:strcpy(p1->data.name, str); break;case 2:strcpy(p1->data.code, str); break;case 3:strcpy(p1->data.idnumber, str); break;case 4:strcpy(p1->data.phonum, str); break;default:break;}return head;
}
//插入数据
struct cuslist * newcus(struct cuslist *head, struct cusman *p)
{int n = 1;char str[5];struct cuslist *p1 = head;struct cuslist *p2;while (p1->next != NULL){p1 = p1->next;n++;}p2 = (struct cuslist*)malloc(sizeof(struct cuslist));sprintf(str, "%d", atoi(p1->data.num) + 1);strcpy(p->num, str);strcpy(p->flytime, "0");p2->data = *p;p2->next = NULL;p1->next = p2;return head;
}
//保存输据
void keepdata(struct cuslist *head)
{FILE *fp = fopen("顾客信息.txt", "w");while (head != NULL){fprintf(fp, "%s %s %s %s %s %s %s\n", head->data.phonum, head->data.code, head->data.name, head->data.idnumber, head->data.num, head->data.sex, head->data.flytime);head = head->next;}fclose(fp);
}

2、顾客登录和个人信息加载和修改以及航班的查询

由于与员工界面类似,就不单独贴出,详见请看员工部分

3、剩余座位的判断

若等于0的话将无法进行购买

//找出该趟航班剩余座位
void findrest()
{struct seat *head = createlist();if (head != NULL){while (head->next != NULL){head = head->next;}m = atoi(head->seatnum);}else{m = 0;}
}

3、机票的购买

点击购票后会显示顾客的详细信息

//购票
void screenshuchu()
{checkuppre();struct seat *head = Createlist();head = insert(head);save(head);struct Zbutton* p = creatButton(0, 50, 100, 50, YELLOW, "返回");while (i == 6){BeginBatchDraw();putimage(0, 50, &bk);setfillcolor(RGB(166, 171, 248));fillroundrect(340, 100, 940, 700, 15, 15);char str[5][50];RECT p1 = { 340,120,940,200 };//用户电话RECT p2 = { 340,240,940,320 };//用户密码RECT p3 = { 340,360,940,440 };//用户姓名RECT p4 = { 340,480,940,560 };//用户身份证号RECT p5 = { 340,600,940,680 };//用户性别sprintf(str[0], "电话:%s", cuser->phonum);sprintf(str[1], "用户密码:%s", cuser->code);sprintf(str[2], "姓名:%s", cuser->name);sprintf(str[3], "身份证号:%s", cuser->idnumber);sprintf(str[4], "性别:%s", cuser->sex);settextcolor(RGB(45, 49, 56));settextstyle(30, 20, "楷体");drawtext(str[0], &p1, DT_CENTER | DT_VCENTER | DT_SINGLELINE);drawtext(str[1], &p2, DT_CENTER | DT_VCENTER | DT_SINGLELINE);drawtext(str[2], &p3, DT_CENTER | DT_VCENTER | DT_SINGLELINE);drawtext(str[3], &p4, DT_CENTER | DT_VCENTER | DT_SINGLELINE);drawtext(str[4], &p5, DT_CENTER | DT_VCENTER | DT_SINGLELINE);drawButton(p);MOUSEMSG m = GetMouseMsg();if (clickButton(p, m)){i -= 3;Sleep(500);FlushMouseMsgBuffer();}EndBatchDraw();}
}

4、已购买机票的查询

使用链表先在文本里查找用户购买的机票信息,然后存入链表

struct Flightlist *inputflight()
{struct Flightlist *head = NULL;struct Flightlist *p1, *p2;struct seat *p;int n = 0;int c = daydiff(futuretime.tm_year, futuretime.tm_mon, futuretime.tm_mday);p = (struct seat *)malloc(sizeof(struct seat));p1 = (struct Flightlist*)malloc(sizeof(struct Flightlist));p2 = (struct Flightlist*)malloc(sizeof(struct Flightlist));for (int a = 1; a <= 5; a++){for (int b = 0;b <= c; b++){char str[40];sprintf(str, "航班信息\\00%d\\%d.txt", a, b);FILE *fp = fopen(str, "r");if (fp == NULL || !yncontent(str)){continue;}else{while (!feof(fp)){fscanf(fp, "%s %s %s %s %s %s %s %s\n", p->data.phonum, p->data.code, p->data.name, p->data.idnumber, p->data.num, p->data.sex, p->data.flytime, p->seatnum);if (strcmp(p->data.num, cuser->num) == 0){switch (a){case 1:p1->data = one; break;case 2:p1->data = two; break;case 3:p1->data = three; break;case 4:p1->data = four; break;case 5:p1->data = five; break;default:break;}strcpy(p1->seatnum, p->seatnum);strcpy(p1->time, plusdata(b));if (n == 0)head = p1;else p2->next = p1;p2 = p1;n++;}p1 = (struct Flightlist*)malloc(sizeof(struct Flightlist));}p2->next = NULL;}fclose(fp);}}return head;
}

展示出已购买的机票基本信息(这一块做得并不是很好,比较暴力的展示,运行速率会有点慢)

//查询所购票
void bugdata()
{struct Flightlist *head = inputflight();struct Flightlist *p = head;struct bottom f;struct bottom prev = { 240,725,540,775,RGB(166, 171, 248),"上一页",3 };struct bottom next = { 740,725,1040,775,RGB(166, 171, 248) ,"下一页",3 };while (i == 3){int x = 0;int a;a = 0;while (p != NULL)//统计结点数{p = p->next;x++;}free(p);x = x / 6;while (a >= 0 && a <= x)//控制页数{BeginBatchDraw();putimage(0, 50, &bk);p = speed(head,a);MOUSEMSG m = GetMouseMsg();loadbottom(&re);if (a != 0){loadbottom(&prev);}if (a != x){loadbottom(&next);}for (int c = 0; c < 6 && p != NULL; c++, p = p->next){char str[50];RECT r;sprintf(str, "%s %s %s %s", p->time, p->data.pdeparture, p->data.pdestination, p->seatnum);switch (c){case 0:r = { 20,215,620,315 };f = { 20,215,620,315,RGB(166, 171, 248) ,"",3 }; break;case 1:r = { 660,215,1260,315 };f = { 660,215,1260,315 ,RGB(166, 171, 248) ,"",3 }; break;case 2:r = { 20,375,620,475 };f = { 20,375,620,475,RGB(166, 171, 248) ,"",3 }; break;case 3:r = { 660,375,1260,475 };f = { 660,375,1260,475,RGB(166, 171, 248) ,"",3 }; break;case 4:r = { 20,555,620,655 };f = { 20,555,620,655,RGB(166, 171, 248) ,"",3 }; break;case 5:r = { 660,555,1260,655 };f = { 660,555,1260,655,RGB(166, 171, 248) ,"",3 }; break;default:break;}strcpy(f.text, str);loadbottom(&f);if (mousebottom(&f, m)){if (m.mkLButton){i++;showbugflight(p);FlushMouseMsgBuffer();}}}if (a != 0){if (mousebottom(&prev, m)){if (m.mkLButton){a--;Sleep(500);}}}if (a != x){if (mousebottom(&next, m)){if (m.mkLButton){a++;Sleep(500);}}}if (mousebottom(&re, m)){if (m.mkLButton){a--;if (a < 0){i--;}Sleep(500);}}EndBatchDraw();}}
}

点击航班后进入下一界面,进行详细信息的展示

/展示具体航班信息
void showbugflight(struct Flightlist *p)
{//存储信息到字符串数组char str[8][50];sprintf(str[0], "%s", p->time);sprintf(str[1], "起点:%s", p->data.pdeparture);sprintf(str[2], "终点:%s", p->data.pdestination);sprintf(str[3], "起飞时间:%s", p->data.tdaparture);sprintf(str[4], "落地时间:%s", p->data.tdestination);sprintf(str[5], "座位号:%s", p->seatnum);RECT r1 = { 340,125,940,225 };RECT r2 = { 340,275,640,375 };RECT r3 = { 640,275,940,375 };RECT r4 = { 340,425,640,525 };RECT r5 = { 640,425,940,525 };RECT r6 = { 340,575,940,675 };while (i == 4){BeginBatchDraw();putimage(0, 50, &bk);loadbottom(&re);MOUSEMSG m = GetMouseMsg();//背景框setfillcolor(RGB(166, 171, 248));fillroundrect(340, 100, 940, 700, 15, 15);//展示信息settextcolor(BLACK);drawtext(str[0], &r1, DT_CENTER | DT_VCENTER | DT_SINGLELINE);drawtext(str[1], &r2, DT_CENTER | DT_VCENTER | DT_SINGLELINE);drawtext(str[2], &r3, DT_CENTER | DT_VCENTER | DT_SINGLELINE);drawtext(str[3], &r4, DT_CENTER | DT_VCENTER | DT_SINGLELINE);drawtext(str[4], &r5, DT_CENTER | DT_VCENTER | DT_SINGLELINE);drawtext(str[5], &r6, DT_CENTER | DT_VCENTER | DT_SINGLELINE);if (mousebottom(&re, m)){if (m.mkLButton){i--;Sleep(500);}}EndBatchDraw();}
}

东北大学20级计算机C语言课设-航空订票系统相关推荐

  1. C语言课设 航空订票系统

    大一写的时候没有写注释,后来也懒得加了.在这里说一下读写文件的思路吧. 就是利用二进制将一整个结构体中的数据存入文件,然后读取文件时再用二进制的形式将结构体中的数据读取出来,边读取边创建链表,将结构体 ...

  2. 数据结构课设航班订票系统(C语言版)

    数据结构课设航班订票系统(C语言版) 课设要求 (1) 航班管理.每条航线设计出合理的信息,包括:起点和终点站名,航班号,成员额定,飞行周期.飞机型号.余票量.航班票价等 (2) 客户管理.订票的客户 ...

  3. 数据结构课设——航空订票

    本系统可实现航空客运订票的主要业务活动.例如,浏览和查询航线.客票预订和办理 退等 要求: (1)航线管理,每条航线所涉及的信息有:终点站名.航班号.飞机号.飞行 周日(星 期几).乘员定额.余票量 ...

  4. 基于JAVA航空订票系统计算机毕业设计源码+数据库+lw文档+系统+部署

    基于JAVA航空订票系统计算机毕业设计源码+数据库+lw文档+系统+部署 基于JAVA航空订票系统计算机毕业设计源码+数据库+lw文档+系统+部署 本源码技术栈: 项目架构:B/S架构 开发语言:Ja ...

  5. JAVA毕业设计航空订票系统计算机源码+lw文档+系统+调试部署+数据库

    JAVA毕业设计航空订票系统计算机源码+lw文档+系统+调试部署+数据库 JAVA毕业设计航空订票系统计算机源码+lw文档+系统+调试部署+数据库 本源码技术栈: 项目架构:B/S架构 开发语言:Ja ...

  6. 飞机订票系统c语言大作业,c语言课程设计---飞机订票系统

    <c语言课程设计---飞机订票系统>由会员分享,可在线阅读,更多相关<c语言课程设计---飞机订票系统(46页珍藏版)>请在皮匠网上搜索. 1.C 语言程序设计课程设计报告设计 ...

  7. c语言航班订票管理系统源代码,简易C语言航空订票系统

    代码片段和文件信息 属性            大小     日期    时间   名称 ----------- ---------  ---------- -----  ---- 目录        ...

  8. 飞机订票系统c语言大作业,C语言知识学习飞机订票系统

    C语言知识学习飞机订票系统 课程设计 课程:数据结构 专业班级:xx软件工程 xx班 姓名:xx 学号:xxx 姓名:xxx 学号:xxx 设计时间:xxx 指导老师:xxx 课程设计题:飞机订票系统 ...

  9. 飞机订票系统程序设计c语言,C语言课程设计——飞机订票系统源代码

    <C语言课程设计--飞机订票系统源代码>由会员分享,可在线阅读,更多相关<C语言课程设计--飞机订票系统源代码(9页珍藏版)>请在人人文库网上搜索. 1.include/标准输 ...

最新文章

  1. strcpy.strcmp.strlen.strcat函数的实现
  2. zabbix监控深信服_Zabbix 远程代码执行漏洞CVE202011800
  3. Mysql数据库(五)——mysql事务及引擎
  4. 视网膜脱离oct报告图_刚刚,爱尔眼科发布关于艾芬医生诊疗过程的核查报告
  5. wsld2java axis_Weblogic+axis2安装
  6. 在TOC中添加右键查看属性信息菜单
  7. Confluence 6 使用电子邮件可见
  8. 第二节:使用IDEA创建React APP 并启动
  9. 实用的才是最好的,教你如何以MATLAB的方式实现高等应用数学问题(一)
  10. 离散数学及其应用 第一章习题
  11. 安装terrasolid模块的“setup.exe”弹窗setup.inf not found
  12. 企业如何选择短信平台
  13. 很全的路由器默认初始密码集合.txt_为何小企业要用企业级无线路由器?一次对比选购经历证实...
  14. 虚拟机vmware centos7 扩展磁盘空间
  15. 3.1 视频服务器介绍
  16. python 还原九宫格图片_python生成九宫格图片
  17. unity 实现了鼠标滚动放大和缩小物体暨拉近拉远相机的效果
  18. CSDN下载频道2013下半年超人气精华资源汇总
  19. 传统安防互联网化无插件直播分析及解决方案
  20. 模板编程:模板特例化以及特例化inline的做用

热门文章

  1. Find Abandoned Memory
  2. [BZOJ1296][SCOI2009]粉刷匠
  3. 那些,我们难以把握的人生
  4. 前端后端一起成长激励的句子
  5. Ubuntu中文语言包下载失败
  6. 对于新手来说怎么画出愤怒的表情?该怎么画?
  7. 五边形创意画_我做的数字布球~~看我怎样不用圆规画出正五边形!
  8. Ubuntu 14.04 Linux 3D桌面完全教程,显卡驱动安装方法,compiz特效介绍,常见问题解答
  9. java小作业:for循环输出带“ * ”的直角三角形,等腰三角形,镂空等腰三角形,平行四边形
  10. CFD解决一维标量问题(迎风、Lax-Wendroff、TVD、WENO5+3阶Runge-Kutta)