C语言订票系统(有心得体会)

使用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;
	}

}		//主函数,调用已定义的函数,来对初始功能进行选择

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

 ☆cwlulu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值