**还挺长的(对本菜鸡来说T_T)
#include <bits/stdc++.h>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <ctime>
#include <windows.h>
#include <conio.h> // getch()的头文件
using namespace std;
#define N 20// 最多班次(可以按需修改)
typedef struct node
{
char num[10];
char year[6];
char mon[3];
char day[3];
char hour[3];
char min[3];
char from[10];
char to[10];
float hours;
int max;
int now;
} CLASS;
int class_num = 0;
CLASS records[N];
void NewMessage();
void ShowTable1();
void ShowTable2(int i);
void Display();
void add();
void save();
void load();
void search();
void quit();
void Ticketorder();
void Ticketdelete();
int menu_select();
int overtime(int);
void find(char s1[], char s2[]);
int findBynum(char s1[]);
void get(int);
bool judge(int x);
int sum(int x1,int x2,int x3,int d1);
int overdate(int i);
int overdate2(int i);
char *menu[] = {"***********欢迎使用机票管理系统**********",
"** 1. 录入班次 **",
"** 2. 显示所有班次 **",
"** 3. 查询班次 **",
"** 4. 增加班次 **",
"** 5. 购票 **",
"** 6. 退票 **",
"** 7. 退出 **"
};
// 菜单
int menu_select()
{
char s[5];
int c, i;
system("cls"); // 清屏
system("color 06"); // 改变字体颜色
for (i = 0; i < 8; i++)
{
printf("%s\n", menu[i]);
}
i = 0;
do
{
printf("请选择(1-7):");
scanf("%s", s);
c = atoi(s); // 转为整数
} while (c < 0 || c > 7);
return c;
}
// 录入航班信息
void NewMessage()
{
int i = 0, h;
char s[5];
FILE *fp;
system("cls");
system("color 02");
if ((fp = fopen("机票管理系统0.dat", "rb")) != NULL)
{// rb:只读不写。读方式打开一个二进制文件,不允许写数据,文件必须存在
printf("机票信息已存在,录入将覆盖已有信息!");
printf("是否继续(Y/N)");
scanf("%s", s);
if (s[0] != 'Y' && s[0] != 'y')
i = 1;
}
if (i == 0)
{
system("cls");
printf("请输入要录入班次总数:");
scanf("%d", &class_num);
system("cls");
for (i = 0; i < class_num; i++)
{
system("cls");
printf("请输入第%d个班次信息:\n", i + 1);
h = -1;
for (; h != i;)
{
printf("请输入班次:");
scanf("%s", records[i].num);
for (h = 0; h < i; h++)
{
if (strcmp(records[h].num, records[i].num) == 0)
{
printf("输入错误!该班次已存在!");
break;
}
}
}
get(i);
}
save();
}
}
// 展示班次
void Display()
{
int i, j;
system("cls");
system("color 07");
load();
ShowTable1();
for (i = 0, j = 0; i < class_num; i++, j += 2)
{
if (overtime(i))
printf("|%10s|%s_%02s_%02s %2s:%2s|%10s|%10s|%8.1f|%8d|%8d|\n",
records[i].num, records[i].year, records[i].mon,
records[i].day, records[i].hour, records[i].min,
records[i].from, records[i].to, records[i].hours,
records[i].max, records[i].now);
else
printf("|%10s| 已发出 |%10s|%10s|%8.1f|%8d|%8d|\n", records[i].num,
records[i].from, records[i].to, records[i].hours, records[i].max, records[i].now);
}
ShowTable2(j);
printf("\n按任意键继续....");
getch(); // 作用:等待按下任意键,再继续执行下面的语句(8太理解。。)
}
// 表头
void ShowTable1()
{
int i = 2;
system("cls");
printf("**********************************MESSAGE*************************************\n");
printf("|----------|----------------|----------|----------|--------|--------|--------|\n");
printf("| 班次 | 起飞时间 | 起点站 | 终点站 |飞行时间|额定载量| 已订票 |\n");
}
// 表尾(为了美观,其实不重要)
void ShowTable2(int i)
{
printf("|----------|----------------|----------|----------|--------|--------|--------|\n");
}
// 查询----一级函数
void search()
{
int i;
char s1[10] = {'\0'}, s2[10] = {'\0'};
system("cls");
system("color 03");
printf("1. 按班次查询");
printf("2. 按终点站查询");
printf("3. 退出");
printf("请选择(1-3):");
scanf("%d", &i);
load();
switch (i)
{
case 1:
printf("请输入要查询的班次:");
scanf("%s", s1);
find(s1, s2);
break;
case 2:
printf("请输入要查询终点站:");
scanf("%s", s2);
find(s1, s2);
break;
case 3:
break;
default:
printf("输入错误!");
break;
}
printf("按任意键继续....");
getch();
}
// 查询----二级函数
void find(char s1[], char s2[])
{
int i, h = 0, m;
ShowTable1();
if (s2[0] == '\0')
{
m = 1;
}
else
{
m = 0;
}
for (i = 0; i < class_num; i++)
{
if (strcmp(s1, records[i].num) == 0 || strcmp(s2, records[i].to) == 0)
{
printf("|%10s|%s_%02s_%02s %2s:%2s|%10s|%10s|%8.1f|%8d|%8d|\n",
records[i].num, records[i].year, records[i].mon,
records[i].day, records[i].hour, records[i].min,
records[i].from, records[i].to, records[i].hours,
records[i].max, records[i].now);
h += 2;
if (m == 1)
{
break;
}
}
}
if (h == 0)
{
printf("要查找的班次不存在!");
}
}
// 增加班次-----一级函数
void add()
{
int i;
load();
system("cls");
printf("1. 增加班次");
printf("2. 返回");
printf("请选择(1-2)");
scanf("%d", &i);
if (i == 1)
{
system("cls");
printf("1. 请输入要增加的班次:");
scanf("%s", records[class_num].num);
for (i = 0; i < class_num; i++)
{
if (strcmp(records[class_num].num, records[i].num) == 0)
{
printf("该班次已经存在!");
getch();
break;
}
}
if (i == class_num)
{
get(i);
class_num++;
save();
}
}
}
// 增加班次-----二级函数
void get(int i)
{
for (;;)
{
printf("请输入起飞时间(年 月 日 时 分)");
scanf("%s%s%s%s%s", records[i].year,records[i].mon,records[i].day,records[i].hour, records[i].min);
if ((atoi(records[i].mon) <= 12 && atoi(records[i].mon) >= 1) &&
(atoi(records[i].hour) < 24 && atoi(records[i].hour) >= 0) &&
(atoi(records[i].min) < 60 && atoi(records[i].min) >= 0))
{
break;
}
else
{
printf("输入错误!");
getch();
}
}
printf("请输入起点站:");
scanf("%s", records[i].from);
printf("请输入终点站:");
scanf("%s", records[i].to);
printf("请输入飞行时间:");
scanf("%f", &records[i].hours);
printf("请输入额定载量:");
scanf("%d", &records[i].max);
for (;;)
{
printf("请输入已订票人数:");
scanf("%d", &records[i].now);
if (records[i].now <= records[i].max)
{
break;
}
else
{
printf("输入错误!");
getch();
}
}
}
// 购买机票模块
void Ticketorder()
{
int i;
char num[10];
system("cls");
system("color 03");
printf("1. 购票");
printf("2. 返回");
printf("请选择(1-2):");
scanf("%d", &i);
if (i == 1)
{
load();
search();
printf("请输入要订票的班次(若无请输入0):");
scanf("%s", num);
for (i = 0; i < class_num; i++)
{
if (strcmp(num, records[i].num) == 0)
{
if (records[i].max > records[i].now && overdate2(i) <= 10 && overdate2(i) >= 0 && overtime(i) == 1)
{
records[i].now++;
printf("通向%s班次为%s的票订票成功!\n", records[i].to, records[i].num);
save();
getch();
break;
}
else
{
printf("抱歉,该班次机票目前无法购买!\n");
getch();
}
}
}
}
}
// 退订机票模块
void Ticketdelete()
{
int i;
char num[10];
system("color 03");
system("cls");
printf("1. 退票");
printf("2. 返回");
printf("请选择(1-2):");
scanf("%d", &i);
if (i == 1)
{
system("cls");
load();
printf("请输入要退票的班次:");
scanf("%s", num);
i = findBynum(num);
if (strcmp(num, records[i].num) == 0)
{
if (overtime(i) == 1 && overdate2(i) <= 10 && overdate2(i) >= 0)
{
printf("确定(Y/N)?");
scanf("%s", num);
if (num[0] == 'y' || num[0] == 'Y')
{
records[i].now--;
printf("退票成功!\n");
save();
getch();
}
}
else
{
printf("抱歉,该班次机票目前无法退票!\n");
getch();
}
}
if (i == class_num)
{
printf("输入错误!");
getch();
}
}
}
// 查询(退票专用)
int findBynum(char s1[])
{
int i, h = 0;
ShowTable1();
for (i = 0; i < class_num; i++)
{
if (strcmp(s1, records[i].num) == 0)
{
printf("|----------|----------------|----------|----------|--------|--------|--------|\n");
printf("|%10s|%s_%02s_%02s %2s:%2s|%10s|%10s|%8.1f|%8d|%8d|\n",
records[i].num, records[i].year, records[i].mon,
records[i].day, records[i].hour, records[i].min,
records[i].from, records[i].to, records[i].hours,
records[i].max, records[i].now);
h += 2;
break;
}
}
ShowTable2(h);
return i;
}
// 信息的保存
void save()
{
FILE *fp1, *fp2;
if ((fp1 = fopen("机票管理系统.dat", "wb")) == NULL)
{// wb:只写打开或新建一个二进制文件;只允许写数据
printf("文件打开错误!");
exit(0);
}
if ((fp2 = fopen("机票管理系统0.dat", "wb")) == NULL)
{
printf("文件打开错误!");
exit(0);
}
fwrite(&class_num, sizeof(int), 1, fp2);
fwrite(records, sizeof(CLASS), class_num, fp1);
fclose(fp1);
fclose(fp2);
}
// 打开文件的函数
void load()
{
FILE *fp1, *fp2;// fp1中是CLASS结构体的信息,fp2是class_num(总的班次数)
if ((fp1 = fopen("机票管理系统.dat", "rb")) == NULL)
{
system("cls");
printf("文件打开错误!");
getch();
exit(0);
}
if ((fp2 = fopen("机票管理系统0.dat", "rb")) == NULL)
{
system("cls");
printf("文件打开错误!");
getch();
exit(0);
}
fread(&class_num, sizeof(int), 1, fp2);
fread(records, sizeof(CLASS), class_num, fp1);
fclose(fp1);
fclose(fp2);
}
// 退出系统
void quit()
{
char s[5];
system("color 03");
printf("确认退出?(Y/N)");
scanf("%s", s);
if (s[0] == 'y' || s[0] == 'Y')
{
exit(0);
}
}
// 判断日期前的准备
bool judge(int x) {
if((x%4==0&&x%100!=0)||x%400==0) return true;
else return false;
}
int sum(int x1,int x2,int x3,int d1) {
switch(x2-1) {
case 11:d1+=30;
case 10:d1+=31;
case 9:d1+=30;
case 8:d1+=31;
case 7:d1+=31;
case 6:d1+=30;
case 5:d1+=31;
case 4:d1+=30;
case 3:d1+=31;
case 2:d1+=28;
case 1:d1+=31;
case 0:d1+=x3;
}
if(judge(x1)) {
if(x2>=3) d1+=1;
}
return d1;
}
// 判断日期(十天之前or之后) 返回相差的天数
int overdate(int i)
{
int d1 = 0, d2 = 0;
int x1 = atoi(records[i].year);
int x2 = atoi(records[i].mon);
int x3 = atoi(records[i].day);
struct tm *local;
time_t t;
t = time(NULL);
local = localtime(&t);// 得到当前系统日期
int y1 = local->tm_year+1900;
int y2 = local->tm_mon+1;
int y3 = local->tm_mday;
d1=sum(x1,x2,x3,d1);
d2=sum(y1,y2,y3,d2);
if(x1<y1) {
int ans=d2;
if(judge(x1)) ans+=366-d1;
else ans+=365-d1;
for(int i=x1+1;i<y1;i++) {
if(judge(i)) ans+=366;
else ans+=365;
}
return ans;
}
else if(x1==y1) {
int ans = abs(d1-d2);
return ans;
}
else {
swap(x1,y1);
swap(d1,d2);
int ans=d2;
if(judge(x1)) ans+=366-d1;
else ans+=365-d1;
for(int i=x1+1;i<y1;i++) {
if(judge(i)) ans+=366;
else ans+=365;
}
return ans;// 返回的是相差天数
}
}
// 根据相差天数的正负判断日期先后
int overdate2(int i){
int d1 = 0, d2 = 0;
int x1 = atoi(records[i].year);
int x2 = atoi(records[i].mon);
int x3 = atoi(records[i].day);
struct tm *local;
time_t t;
t = time(NULL);
local = localtime(&t);// 得到当前系统日期
int y1 = local->tm_year+1900;
int y2 = local->tm_mon+1;
int y3 = local->tm_mday;
bool f = 0;
if(x1>y1||(x1==y1&&x2>y2)||(x1==y1&&x2==y2&&x3>y3)){
f = 1;// 为正
}
int days = 0;
if(f == 1){
days = overdate(i);
}
else {
days = overdate(i)-2*overdate(i);
}
return days;// 返回负值代表起飞日期在当前系统日期之前!
}
// 判断飞机是否发出
int overtime(int i)
{
struct tm *local;
time_t t;
t = time(NULL);
local = localtime(&t);// 得到当前系统时间
if(overdate2(i) >= 1)
{// 飞机未发出
return 1;
}
else if (overdate(i) == 0 && (local->tm_hour < atoi(records[i].hour) ||
local->tm_hour == atoi(records[i].hour) && local->tm_min < atoi(records[i].min)))
{// 飞机未发出
return 1;
}
else
{// 飞机发出
return 0;
}
}
// 主函数模块
int main()
{
system("cls");
for (;;)
{
switch (menu_select())
{
case 1:
NewMessage();
break;
case 2:
Display();
break;
case 3:
search();
break;
case 4:
add();
break;
case 5:
Ticketorder();
break;
case 6:
Ticketdelete();
break;
case 7:
quit();
break;
}
}
return 0;
}
**忘记放上来了,,感jio这个题目算里面简单的了,很幸运~
小记:老师真是火眼金睛!比我都知道我写的是什么(她估计也是看这些看得够够的了hhh)
她提出的问题:如果一开始输入错误该怎么办?
应当提示出来并让其重新输入。但我妹有考虑到这一点,这里是如果输错了(或输入不合规范),程序就不会往下执行了,这不够人性化。