使用Visual studio进行实验
设计一个订票系统,要求实现订票系统的基本管理,例如输入、查询、保存、订票、退票功能。
需要输入提前设置好的密码(若输入错误则退出系统):
界面大体是这样:
心得体会:
通过这次实验,我更明白了c语言的学习对我们是必要的。本实验对我的知识应用能力和认真严谨的态度有着很高的要求。在实验中,我对代码进行了反复多次的修改以及完善,每次运行程序后,总会发现一些小bug,一些与理想状况冲突的地方,这需要我耐心修改和完善。并不断对代码进行改进,有时会冒出一些新想法和思路,会加进程序中。通过这次实验学习,我们了解了一些关于c语言的知识,理解巩固了我们c语言的理论知识,会是我未来实验历程中的难忘经历。
源码:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
typedef struct {
int yue;
int ri;
int shi;
int fen;
}shijian; //时间信息的结构体
typedef struct {
char xingming[10];
long long ID;
int checi;
int zuoweihao;
shijian chufa;
shijian daoda;
}achengke; //乘客信息的结构体
typedef struct {
int checi;
char shifazhan[10];
char mudizhan[10];
shijian chufa;
shijian daoda;
shijian shichang;
int shengyu;
int zuoweihao[50];
}acheci; //车次信息的结构体
shijian shurushijian() {
shijian a = { 0 };
printf("\t\t月:\t");
scanf("%d", &a.yue);
while (a.yue > 12 || a.yue < 1) {
printf("输入不符合实际,请重新输入:");
scanf("%d", &a.yue);
}
printf("\t\t日:\t");
scanf("%d", &a.ri);
while (a.ri > 30 || a.ri < 1) {
printf("输入不符合实际,请重新输入:");
scanf("%d", &a.ri);
}
printf("\t\t时:\t");
scanf("%d", &a.shi);
while (a.shi > 23 || a.shi < 0) {
printf("输入不符合实际,请重新输入:");
scanf("%d", &a.shi);
}
printf("\t\t分:\t");
scanf("%d", &a.fen);
while (a.fen > 59 || a.fen < 0) {
printf("输入不符合实际,请重新输入:");
scanf("%d", &a.fen);
}
return a;
} //对车次信息的时间进行输入
shijian tujingshijian(acheci a)
{
shijian b = { 0 };
b.fen = a.daoda.fen - a.chufa.fen;
b.shi = a.daoda.shi - a.chufa.shi;
b.ri = a.daoda.ri - a.chufa.ri;
if (b.fen < 0)b.fen += 60, b.shi++;
if (b.shi < 0) b.shi += 24, b.ri++;
if (b.ri < 0) b.ri += 30, b.yue++;
return b;
} //计算到达时间和起始时间的差值
void checibaocun(acheci* che) {
int i = 0;
FILE* fp = fopen("checi.dat", "w");
while (che[i].checi) {
fprintf(fp, "%d %s %s %d %d %d %d %d %d %d %d %d \n", che[i].checi, che[i].shifazhan, che[i].mudizhan, che[i].chufa.yue, che[i].chufa.ri, che[i].chufa.shi, che[i].chufa.fen, che[i].daoda.yue, che[i].daoda.ri, che[i].daoda.shi, che[i].daoda.fen, che[i].shengyu);
for (int a = 0; a < 50; a++) (a + 1) % 10 == 0 ? fprintf(fp, "%d \n", che[i].zuoweihao[a]) : fprintf(fp, "%d ", che[i].zuoweihao[a]);
i++;
}
fclose(fp);
} //把后台输入的车次保存起来
void checishuchu(acheci* che) {
int i = 0;
printf("车次\t\t始发站\t\t终点站\t\t出发时间\t\t到达时间\t\t剩余座位数\n");
while (che[i].checi) {
printf("%d\t\t%s\t\t%s\t\t%d月%d日%d时%d分\t\t%d月%d日%d时%d分\t\t%d\n", che[i].checi, che[i].shifazhan, che[i].mudizhan, che[i].chufa.yue, che[i].chufa.ri, che[i].chufa.shi, che[i].chufa.fen, che[i].daoda.yue, che[i].daoda.ri, che[i].daoda.shi, che[i].daoda.fen, che[i].shengyu);
i++;
}
} //输出到dat文件中
void checiduqu(acheci* che) {
int i = 0;
FILE* fp = fopen("checi.dat", "r");
do {
fscanf(fp, "%d %s %s %d %d %d %d %d %d %d %d %d \n", &che[i].checi, &che[i].shifazhan, &che[i].mudizhan, &che[i].chufa.yue, &che[i].chufa.ri, &che[i].chufa.shi, &che[i].chufa.fen, &che[i].daoda.yue, &che[i].daoda.ri, &che[i].daoda.shi, &che[i].daoda.fen, &che[i].shengyu);
for (int a = 0; a < 50; a++) (a + 1) % 10 == 0 ? fscanf(fp, "%d \n", &che[i].zuoweihao[a]) : fscanf(fp, "%d ", &che[i].zuoweihao[a]);
i++;
} while (che[i - 1].checi);
fclose(fp);
} //把dat文件里内容读取出来
void guanliyuan(acheci* che) {
int i = 0;
int a = 0;
long long passid = 88888888;
printf("\n请输入后台管理的通行密码:");
scanf("%d", &a);
if (a == passid) {
while (che[i].checi)i++;
printf("\t正在添加车次中_\n请输入车次信息(车次为0结束):");
while (1) {
printf("\n\t请输入车次:");
scanf("%d", &che[i].checi);
if (che[i].checi == 0) {
printf("添加完成!");
break;
}
printf("\t请输入起始地:\t");
scanf("%s", &che[i].shifazhan);
printf("\t请输入目的地:\t");
scanf("%s", &che[i].mudizhan);
printf("\t请输入出发时间:\n");
che[i].chufa = shurushijian();
printf("\t请输入到达时间:\n");
che[i].daoda = shurushijian();
che[i].shichang = tujingshijian(che[i]);
che[i].shengyu = 50;
for (int a = 0; a < 50; a++) che[i].zuoweihao[a] = a + 1;
i++;
}
checibaocun(che);
}
else printf("\n输入错误,该功能只能内部工作人员使用!\n");
} //进行后台操作,输入车次信息
void caidan() {
printf("\n\t★★★★★★★★★★★★★★★★★★★★★★★★★");
printf("\n\t★\t\t1.购票信息查询 ★");
printf("\n\t★\t\t2.执行订票 \t\t★");
printf("\n\t★\t\t3.执行退票 ★");
printf("\n\t★\t\t4.保存(自动) ★");
printf("\n\t★\t\t0.退出系统 ★");
printf("\n\t★★★★★★★★★★★★★★★★★★★★★★★★★");
} //订票退票功能的菜单
void duqu(achengke* ren) {
int i = 0;
FILE* fp = fopen("f1.dat", "r");
if (fp == NULL) {
printf("cannot open file\n");
return;
}
do {
fscanf(fp, "%lld %s %d %d %d %d %d %d %d %d %d %d ", &ren[i].ID, &ren[i].xingming, &ren[i].checi, &ren[i].zuoweihao, &ren[i].chufa.yue, &ren[i].chufa.ri, &ren[i].chufa.shi, &ren[i].chufa.fen, &ren[i].daoda.yue, &ren[i].daoda.ri, &ren[i].daoda.shi, &ren[i].daoda.fen);
i++;
} while (ren[i - 1].ID);
fclose(fp);
} //读取乘客信息
void chaxun(achengke* ren, achengke b) {
achengke a = { 0 };
int i = 0;
while (ren[i].ID) {
if (ren[i].ID == b.ID) {
a = ren[i];
printf("姓名:%s\t身份证号:%lld\t车次:%d\t座位号:%d\t出发时间:%d月%d日%d时%d分\t到达时间:%d月%d日%d时%d分\n", a.xingming, a.ID, a.checi, a.zuoweihao, a.chufa.yue, a.chufa.ri, a.chufa.shi, a.chufa.fen, a.daoda.yue, a.daoda.ri, a.daoda.shi, a.daoda.fen);
}
i++;
}
if (a.ID == 0) printf("未找到您的信息!");
} //查询功能,对乘客购买的票进行查询
int xuanzecheci(acheci* che, int* checi) {
int i = 0;
while (1) {
while (che[i].checi) {
if (che[i].checi == *checi)return i;
i++;
}
printf("未找到改车次!请重新输入:");
scanf("%d", checi);
i = 0;
}
} //对录入的车次信息进行选择
void baocun(achengke* ren) {
int i = 0;
FILE* fp = fopen("f1.dat", "w");
if (fp == NULL) {
printf("cannot open file\n");
return;
}
while (ren[i].ID) {
fprintf(fp, "%lld %s %d %d %d %d %d %d %d %d %d %d \n", ren[i].ID, ren[i].xingming, ren[i].checi, ren[i].zuoweihao, ren[i].chufa.yue, ren[i].chufa.ri, ren[i].chufa.shi, ren[i].chufa.fen, ren[i].daoda.yue, ren[i].daoda.ri, ren[i].daoda.shi, ren[i].daoda.fen);
i++;
}
fclose(fp);
printf("已保存系统!");
} //保存功能,保存乘客的购票信息
void zuoweihaoshuchu(acheci* che, int a) {
int i = 0;
for (i = 0; i < 50; i++) {
che[a].zuoweihao[i] < 0 ? printf(" ") : printf("%02d ", che[a].zuoweihao[i]);
if ((i + 1) % 10 == 0)printf("\n");
}
} //给乘客提供50个座位进行选择
void dingpiao(acheci* che, achengke* ren, achengke* b) {
int a = 0;
int m = 0;
int i = 0;
checishuchu(che);
printf("请输入您选择的车次:");
scanf("%d", &b->checi);
while (ren[i].ID) {
if (b->ID == ren[i].ID&&b->checi==ren[i].checi) {
printf("已购买该车次,重新输入:");
scanf("%d", &b->checi);
i = 0;
} //不可以重复购买一趟车次
i++;
}
a = xuanzecheci(che, &b->checi);
b->chufa = che[a].chufa;
b->daoda = che[a].daoda;
printf("剩余座位号为:\n");
zuoweihaoshuchu(che, a);
printf("请输入您选择的座位号:");
scanf("%d", &b->zuoweihao);
while (che[a].zuoweihao[b->zuoweihao - 1] < 0) {
printf("该座位不可挑选,请重新选取:");
scanf("%d", &b->zuoweihao);
} //座位不可以重复挑选或者选择不存在的座位
che[a].shengyu--;
che[a].zuoweihao[b->zuoweihao - 1] = (-1) * b->zuoweihao;
while (ren[m].ID) { m++; }
ren[m] = *b;
checibaocun(che);
baocun(ren);
printf("购票成功");
} //执行购票操作
void tuipiao(acheci* che, achengke* ren, achengke* b) {
int a = 0;
int h = 0;
int d = 0;
int m = 0;
shijian k = { 0 };
while (ren[m].ID) {
if (ren[m].ID = b->ID) {
d = m;
printf("姓名:%s\t身份证号:%lld\t车次:%d\t座位号:%d\t出发时间:%d月%d日%d时%d分\t到达时间:%d月%d日%d时%d分\n", ren[m].xingming, ren[m].ID, ren[m].checi, ren[m].zuoweihao, ren[m].chufa.yue, ren[m].chufa.ri, ren[m].chufa.shi, ren[m].chufa.fen, ren[m].daoda.yue, ren[m].daoda.ri, ren[m].daoda.shi, ren[m].daoda.fen);
}
m++;
}
if (ren[m-1].ID == 0) {
printf("未找到信息!");
return;
}
m = d;
printf("(请输入1确认退票) \n确认退票:");
scanf("%d", &h);
if (h != 1)return; //输入1才可以确认退票
*b = ren[m];
while (ren[m].ID) {
ren[m] = ren[m + 1];
m++;
}
a = xuanzecheci(che, &b->checi);
che[a].zuoweihao[b->zuoweihao - 1] = b->zuoweihao;
che[a].shengyu++;
b->checi = 0;
b->zuoweihao = 0;
b->chufa = k;
b->daoda = k;
checibaocun(che);
baocun(ren);
printf("退票成功!");
} //实现退票操作
void chengke(achengke* ren, acheci* che) {
int i = 0;
achengke a = { 0 };
printf("请输入您的信息:\n");
printf("\t请输入姓名:");
scanf("%s", &a.xingming);
printf("\t请输入身份证号:");
scanf("%lld", &a.ID);
do {
caidan();
printf("\n请输入你要办理的业务:");
scanf("%d", &i);
while (i != 1 && i != 2 && i != 3 && i != 4 && i != 0) {
printf("输入错误,请重新输入:");
scanf("%d", &i);
}
switch (i) {
case 1:
chaxun(ren, a);
break;
case 2:
dingpiao(che, ren, &a);
break;
case 3:
tuipiao(che, ren, &a);
break;
case 4:
baocun(ren);
break;
}
} while (i);
} //输入乘客的信息,以供后续订票退票使用
int main() {
acheci che[5]={0};
achengke ren[100] = {0};
int a = 0;
checiduqu(che);
duqu(ren);
printf("\n\t★★★★★★★★★★★★★★★★★★★★★★★★★");
printf("\n\t★\t\t订票管理系统 ★");
printf("\n\t★~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~★");
printf("\n\t★\t\t1.订票退票 \t\t★");
printf("\n\t★\t\t2.后台操作 ★");
printf("\n\t★\t\t0.退出系统 ★");
printf("\n\t★★★★★★★★★★★★★★★★★★★★★★★★★");
printf("\n\n请选择您要执行的操作:"); //订票管理系统主菜单
scanf("%d", &a);
while (a != 1 && a != 2&&a!=0) {
printf("输入错误,请重新输入:");
scanf("%d", &a);
}
duqu(ren);
checiduqu(che);
switch (a) {
case 1:chengke(ren, che); break;
case 2:guanliyuan(che); break;
case 0:break;
}
} //主函数,调用已定义的函数,来对初始功能进行选择