文章目录
学生管理系统结构体问题
项目功能需求
本系统演示如何使用结构体如何存储复杂的数据结构(学生信息),并结合数组操作一定数量的对象(学生人数的确定),不涉及变化的学生人数和数据的物理储存操作,输出的学生的信息的图如图所示:
知识点分析
程序处理的对象是学生,由于每个学生有姓名,性别等若干属性,所以属于复杂的数据类型,可以使用结构体的处理。
学生人数的确定,并且程序的运行中不能要求改变,可以考虑用数组介意储存。
- 通过实验可达到如下目标:
(1)进一步掌握数据导入声明和使用
(2)掌握结构体的声明,结构体的变量声明和赋值
(3)掌握结构体的成员的访问
(4)掌握结构体数组的使用
(5)使用结构体处理复杂的数据结构
算法思想
(1)学生对象包含学学号,姓名,年龄,成绩等若干属性,因此应该宏定义一个结构体。同时,其属性“成绩”包含三个科目的成绩,英语,高数,C语言。故成绩属于复合属性,应考虑其定义一个结构体,即学生结构体中嵌套另一个结构体
(2)学生人数的确定,宏定义一个数组,并且不会发生任何变化
(3)程序包括输入学生信息,显示操作菜单,排序,显示信息等功能,这些功能相对独立,根据结构化,模块化的编程思想,应该将他们单独编写函数,除了输入学生下信息值运行一次以外,其他都应该放到训话体当中反复操作。
(4)程序与用户交互中有不少接受用户的输入环节,如:选择菜单的项,选择排序等,考虑到用户可能输入错误,并且可能多次出错,所以也应该设置无线循环,当输入错误的时候,给予适当的提示,并继续显示操作菜单,知道用户选择一个正确的交互为止。
(5)排序操作:经典的排序算法包括快速排序,归并排序,插入排序,冒泡排序等,由于参与的排序的数量不大,所以结合时间复杂度和空间复杂度上不做过多的考虑,就采用冒泡的算法及逆行排序。
系统流程图
图1学生管理系统流程图
项目实现
运行效果图:
项目扩展
(1)如果对输入的子覅长度(如学号长度必须为12位,数字构成)类型(成绩必须为整数)范围(成绩范围必须是0~100)等加以合法性的验证,该如何完善程序
(2)如果要求可以根据学号,姓名等不同的信息进行查询,并显示查询的结果,该如何完善程序
(3)如果增加删除功能(根据学号删除相应的学生),该如何完善程序
(4)如果学生的人数不确定即在程序运行时临时确定或根据操作人员的实际输入去确定,该如何处理
(5)一次处理完成,退出程序后,再次运行程序,上一次的输入的数据还在吗?如果希望不在重新输入数据或者继续上次数据的基础上进行操作,该如何处理?
拓展项目1项目实现和运行效果图:
项目小结
学习结构体的时候,看了相关的视频,懂得如何使用结构体,如何定义一个结构体,也知道代码时什么意思,但是轮到自己谢=些就不会,不知道该怎么去定义,也不知道该怎么用,包括后面的链表也是这样,懂代码什么意思,怎么用的,自己写一个程序就不会,所以还是基础不牢,需要每天都练习,不能停止,一定要每天都能看C语言,基础基础加强。
参考文献
《C语言综合项目实战》 科学出版社。
代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#include <time.h>
int studentDisplayMenu();
int CPractise5MainDisplayMenu();
int trainDisplayMenu();
//学生信息登记问题菜单
void studentRegisterwenti();
//购买火车票问题菜单
void buyTicketwenti();
//图书信息系统问题的菜单
void bookManagewenti();
//学生管理系统声明
void manageStudent();
//学生管理系统问题扩展声明
void manageStudentkz();
//火车票购票系统声明
void BuyTicket();
//火车票购票系统声明扩展
void BuyTicketkz();
//实战五菜单
void HandlePractise5()
{
int key;
for (;;)
{
key = CPractise5MainDisplayMenu();
switch (key)
{
case 1:
studentRegisterwenti();
break;
/*case 2:
buyTicketwenti();
break;
case 3:
bookManagewenti();
break;*/
case 4:
return;
case 0:
printf("\n*******谢谢你的使用,欢迎多提意见****!\n");
exit(0);
default:
printf("对不起,你输入有误!\n");
break;
}
}
}
//实战五菜单显示函数
int CPractise5MainDisplayMenu()
{
int key;
/*system("CLS");*/
printf("******************实战五功能显示菜单菜单*****************\n");
printf("************* 1.项目1-学生信息登记系统问题 ********\n");
printf("************* 2.项目2-购买火车票问题 ********\n");
printf("************* 3.项目3-图书管理系统问题 ********\n");
printf("**************4.返回上一步********\n");
printf("*****************0.退出系统****************:");
printf("******************************************\n");
printf("请选择功能号(1或2或3或4或0:");
printf(" \n");
printf(" \n");
printf(" \n");
scanf_s("%d", &key);
while (key < 0 || key>4)
{
printf("\n输入有误,请重新输入完成对应的操作\n请输入:");
scanf_s("%d", &key);
}
return key;
}
//学生信息登记系统问题菜单
void studentRegisterwenti()
{
int key;
for (;;)
{
key = studentDisplayMenu();
switch (key)
{
case 1:
manageStudent();
break;
case 2:
manageStudentkz();
break;
case 3:
return;
case 0:
printf("\n*******谢谢你的使用,欢迎多提意见****!\n");
exit(0);
default:
printf("对不起,你输入有误!\n");
break;
}
}
}
//学生管理系统问题菜单页面显示
int studentDisplayMenu()
{
int key;
/*system("CLS");*/
printf("******************学生管理系统问题菜单*****************\n");
printf("************* 1.学生管理系统基础问题 ********\n");
printf("************* 2.扩展问题 ********\n");
printf("**************3.返回上一步********\n");
printf("*****************0.退出系统****************:");
printf("******************************************\n");
printf("请选择功能号(1或2或3或0:");
printf(" \n");
printf(" \n");
printf(" \n");
scanf_s("%d", &key);
while (key < 0 || key>4)
{
printf("\n输入有误,请重新输入完成对应的操作\n请输入:");
scanf_s("%d", &key);
}
return key;
}
#define N 3
#define IDLEN 13
#define NAMELEN 11
#define SEXLEN 5 //性别
struct Score
{
int cp;
int english;
int math;
};
typedef struct Stu
{
char id[IDLEN];
char name[NAMELEN];
char sex[SEXLEN];
int age;
struct Score score;
double avg;
}student;
student stu[N]; //原始输入学生的信息
student sorted[N]; //排序操作学生的信息
static int choice = 0;
static int dir = 0;
static int i = 0;
//各级菜单调用
void InputStudent();
void Meau();
void GetOrderDir();
void SortStudent();
void OutputStudent(student s[]);
void manageStudent() {
InputStudent();
while (1) {
Meau();
if (0 == choice) {
printf("谢谢使用,再见\n");
return;
}
else if (9 == choice) {
dir = 1;
OutputStudent(stu);
}
else {
getchar();
GetOrderDir();
if (0 == dir)
continue;
if (1 == dir || 2 == dir) {
SortStudent();
OutputStudent(sorted);
}
}
}
}
void InputStudent() {
for (i = 0; i < N; i++) {
fflush(stdin);
printf("\n请输入第%d/%d个学生的信息\n", i + 1, N);
printf("============================\n");
printf("\n请输入该学生学号(12个字符以内):");
getchar();
gets_s(stu[i].id);
stu[i].id[IDLEN - 1] = '\0';
printf("请输入该学生姓名(10个字符以内):");
getchar();
gets_s(stu[i].name);
stu[i].name[NAMELEN - 1] = '\0';
printf("请输入该学生性别(4个字符以内):");
getchar();
gets_s(stu[i].sex);
stu[i].sex[SEXLEN - 1] = '\0';
printf("请输入该学生的年龄(整数):");
scanf_s("%d", &stu[i].age);
printf("请输入该学生《C语言》成绩(整数):");
scanf_s("%d", &stu[i].score.cp);
while ((stu[i].score.cp >= 0 && stu[i].score.cp <= 100) != 1)
{
printf("成绩不在0到100之间\n");
printf("请重新输入该学生《C语言》成绩(整数):\t");
scanf_s("%d", &stu[i].score.cp);
}
printf("请输入该学生《英语》成绩(整数):");
scanf_s("%d", &stu[i].score.english);
while ((stu[i].score.english >= 0 && stu[i].score.english <= 100) != 1)
{
printf("成绩不在0到100之间\n");
printf("请重新输入该学生《英语》成绩(整数):\t");
scanf_s("%d", &stu[i].score.english);
}
printf("请输入该学生《数学》成绩(整数):");
scanf_s("%d", &stu[i].score.math);
while ((stu[i].score.math >= 0 && stu[i].score.math <= 100) != 1)
{
printf("成绩不在0到100之间\n");
printf("请重新输入该学生《数学》成绩(整数):");
scanf_s("%d", &stu[i].score.math);
}
stu[i].avg = ((double)stu[i].score.cp + (double)stu[i].score.english + (double)stu[i].score.math) / 3.0;
printf("\n-----------------------------\n");
}
for (i = 0; i < N; i++) {
sorted[i] = stu[i];
}
}
void Meau() {
while (1) {
printf("\n\n请选择排序字段:\n");
printf("-----------------------------------------\n");
printf("(1)学号\t(2)姓名\t(3)性别\t(4)年龄\n(5)C语言 (6)英语 (7)数学 (8)平均分\n");
printf("(9)显示全部原始信息\n(0)退出程序\n");
printf("-----------------------------------------\n");
scanf_s("%d", &choice);
getchar();
if (choice < 0 || choice > 9)
printf("\n请选择正确的操作!");
else
return;
}
}
void SortStudent() {
student s;
int j = 0, f = 0;
for (j = 0; j < N; j++) {
for (i = 0; i < N - 1; i++) {
f = 0;
switch (choice) {
case 1:
if (strcmp(sorted[i].id, sorted[i + 1].id) > 0)
f = 1;
break;
case 2:
if (strcmp(sorted[i].name, sorted[i + 1].name) > 0)
f = 1;
break;
case 3:
if (strcmp(sorted[i].sex, sorted[i + 1].sex) > 0)
f = 1;
break;
case 4:
if (sorted[i].age > sorted[i + 1].age)
f = 1;
break;
case 5:
if (sorted[i].score.cp > sorted[i + 1].score.cp)
f = 1;
break;
case 6:
if (sorted[i].score.english > sorted[i + 1].score.english)
f = 1;
break;
case 7:
if (sorted[i].score.math > sorted[i + 1].score.math)
f = 1;
break;
case 8:
if (sorted[i].avg > sorted[i + 1].avg)
f = 1;
break;
default:
printf("错误,请选择正确操作!");
break;
}
if (1 == f) {
s = sorted[i];
sorted[i] = sorted[i + 1];
sorted[i + 1] = s;
}
}
}
}
void OutputStudent(student s[]) {
printf("\n学生信息:\n===================================================================================\n");
printf("%-15s\t%-14s\t%-7s\t%-7s\t%-7s\t%-7s\t%-7s\t%-7s\n", "学号", "姓名", "性别", "年龄", "C语言", "英语", "数学", "平均分");
printf("----------------------------------------------------------------------------------\n");
if (1 == dir) {
for (i = 0; i < N; i++) {
printf("%-15s\t%-14s\t%-7s\t%-7d\t", s[i].id, s[i].name, s[i].sex, s[i].age);
printf("%-7d%-7d%-7d%-7.1f\n", s[i].score.cp, s[i].score.english, s[i].score.math, s[i].avg);
}
}
else {
for (i = N - 1; i >= 0; i--)
{
printf("%-15s\t%-14s\t%-7s\t%-7d\t", s[i].id, s[i].name, s[i].sex, s[i].age);
printf("%-7d%-7d%-7d%-7.1f\n", s[i].score.cp, s[i].score.english, s[i].score.math, s[i].avg);
}
}
dir = 0;
printf("----------------------------------------------------------------------------------\n");
}
void GetOrderDir() {
while (1) {
printf("\n请选择排序方向:\n");
printf("-----------------------------------------\n");
printf("(1)升序\t(2)降序\t(0)返回主菜单\n");
printf("-----------------------------------------\n");
printf("请选择:");
scanf_s("%d", &dir);
if (dir < 0 || dir > 3)
printf("您的输入有误,请重新输入!\n");
else
return;
}
}
void manageStudentkz()
{
}
火车票购买系统结构体问题
项目功能需求
实现火车订票系统的功能:
(1)查询功能:查询车票信息,包括起始地,车次,余票和票价
(2)订票功能
(3)修改功能:修改订票信息
(4)录入管理功能:输入车票的基本信息
(5)显示功能:将查询到的信息显示出来
知识点分析
(1)需要对各种对象设计合理的数组和结构体,掌握结构体变量和结构体数组的声明和使用
(2)对各个功能进行归类整理和嵌套使用
(3)掌握结构体成员的访问
(4)使用结构体处理复杂的数据结构
(5)级联菜单功能的实现
算法思想
根据需求不同对功能进行模块化分析
实现程序反复运行,直到菜单选择退出(通过无限循环反复调用practise5火车票()函数使得程序运行结构体的定义和辅助结构体的设计使用
系统流程图
图1火车票购买系统流程图
项目实现
运行效果图:
项目小结
学习结构体的时候,看了相关的视频,懂得如何使用结构体,如何定义一个结构体,也知道代码时什么意思,但是轮到自己谢=些就不会,不知道该怎么去定义,也不知道该怎么用,包括后面的链表也是这样,懂代码什么意思,怎么用的,自己写一个程序就不会,所以还是基础不牢,需要每天都练习,不能停止,一定要每天都能看C语言,基础基础加强。
参考文献
《C语言综合项目实战》 科学出版社。
代码:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#include <time.h>
#define STATION_NUM 100 //车站数
#define TICKET_NUM 1000 //车票数
#define STR_LEN 10 //字符数组的长度
//车站服务
typedef struct {
int stationID;
char from[STR_LEN]; //起始站
char to[STR_LEN]; //终点站
int money;
int numbers;
}StationInformation;
typedef struct {
StationInformation station[STATION_NUM];
int count;
}Station;
//车票服务
typedef struct {
int stationID;
int seatID;
int ticketID;
char trainID[STR_LEN];
char date[STR_LEN];
char time[STR_LEN];
}TicketInformation;
typedef struct {
TicketInformation ticket[TICKET_NUM];
int count;
}Ticket;
//订票服务
typedef struct {
int autoID; //随机生成的订票号,退票使用
char name[STR_LEN];
TicketInformation ticketinformation;
}BookInformation; //订票信息
typedef struct {
BookInformation book[TICKET_NUM];
int count;
}Book;
Station station;
Ticket ticket;
Book book;
int flag = 1;
int f = 0;
//函数的声明
void start(int& flag);
void addStation(Station& s, Ticket& t, int snum);
void ticketServices(Station& s, Ticket& t, Book& b, int& flag);
void systemManage(Station& s, Ticket& t, Book& b, int& flag);
void stationManage(Station& s, Ticket& t, Book& b, int& flag);
void ticketManage(Station& s, Ticket& t, Book& b, int& flag);
void printStation(Station& s);
void updateStation(Station& s, Ticket& t);
void updateTicketPrice(Station& s, int ID);
void updateTicketNum(Station& s, int stationID, Ticket& t);
void deleteStation(Station& s, Ticket& t);
void addTicket(int stationID, int numbeer, Ticket& t);
void deleteTicket(int station, Ticket& t);
void showSaledTickets(Book& b);
void showOnsaleTickets(Station& s);
void ticketInquire(Station& s, Ticket& t);
void ticketInquire2(Station& s, Ticket& t);
void ticketBook(Book& b, Station& s, Ticket& t);
void addBookInfo(Book& b, Ticket& t, int stationID, int bookNum);
void deleteBook(Book& b, Station& s);
//计数器初始化
void initialize(Station& station, Ticket& ticket, Book& book, int& flag) {
station.count = 0;
ticket.count = 0;
book.count = 0;
}
//火车票系统主程序
void BuyTicket() {
printf("\n----------火车订票系统问题-----------\n");
printf("\n");
srand((unsigned)time(NULL));
while (1) {
start(flag);
if (f == 1)
break;
}
}
int main()
{
BuyTicket();
}
//开始
void start(int& flag) {
int option;
if (flag) {
int i = 0;
printf("\n本系统第一次运行,请添加站点及对应车票信息!\n");
initialize(station, ticket, book, flag);
printf("\n请输入添加车站信息的个数:");
scanf_s("%d", &i);
if (i > 0) {
addStation(station, ticket, i);
flag = 0;
}
else {
printf("\n输入错误,请重试\n");
start(flag);
}
}
printf("\n");
printf("\t\t*****************************\n");
printf("\t\t\t售票服务 1\n");
printf("\t\t\t系统管理 2\n");
printf("\t\t\t退出系统 0\n");
printf("\t\t*****************************\n");
printf("\t\t请选择:");
scanf_s("%d", &option);
getchar();
switch (option) {
case 1:
ticketServices(station, ticket, book, flag);
flag = 0;
break;
case 2:
systemManage(station, ticket, book, flag);
flag = 0;
break;
case 0:
printf("谢谢您的使用!\n");
flag = 0;
f = 1;
break;
default:
printf("\n选择出错!\n");
flag = 0;
start(flag);
break;
}
printf("\n");
}
//系统服务
void systemManage(Station& s, Ticket& t, Book& b, int& flag) {
int option;
printf("\t\t**********************************\n");
printf("\t\t\t站点操作 1\n");
printf("\t\t\t票务操作 2\n");
printf("\t\t\t返回上一级菜单 0\n");
printf("\t\t**********************************\n");
printf("\t\t请选择:");
scanf_s("%d", &option);
switch (option) {
case 1:
stationManage(station, ticket, book, flag);
break;
case 2:
ticketManage(station, ticket, book, flag);
break;
case 0:
start(flag);
break;
default:
printf("\n选择出错!\n");
systemManage(station, ticket, book, flag);
break;
}
}
//****************************************************************
//车站服务
void stationManage(Station& s, Ticket& t, Book& b, int& flag) {
int option, i = 0;
printf("\t\t************************************\n");
printf("\t\t\t查看车站信息 1\n");
printf("\t\t\t添加车站信息 2\n");
printf("\t\t\t修改车站信息 3\n");
printf("\t\t\t删除车站信息 4\n");
printf("\t\t\t返回上一级菜单 0\n");
printf("\t\t************************************\n");
printf("\t\t请选择:");
scanf_s("%d", &option);
switch (option) {
case 1:
printStation(station);
break;
case 2:
printf("\n请输入添加车站信息的个数:");
scanf_s("%d", &i);
printf("%d\n", i);
if (i > 0)
addStation(station, ticket, i);
break;
case 3:
updateStation(station, ticket);
break;
case 4:
deleteStation(station, ticket);
break;
case 0:
systemManage(station, ticket, book, flag);
break;
default:
printf("\n选择出错\n");
break;
}
}
//添加车票信息
void addStation(Station& s, Ticket& t, int snum) {
int i = s.count;
int end = s.count + snum;
printf("\n请输入%d个车站信息:\n", snum);
for (; i < end; i++) {
printf("-------------------------------------------\n");
printf("\n请输入第%d个车站信息:\n", i + 1);
printf("\t1.请输入起始站名称:\t");
scanf_s("%s", s.station[i].from, 10);
printf("\t2.请输入终点站名称:\t");
scanf_s("%s", s.station[i].to, 10);
printf("\t3.请输入票价:\t\t");
scanf_s("%d", &s.station[i].money);
getchar();
printf("\t4.请输入票数:\t\t");
scanf_s("%d", &s.station[i].numbers);
getchar();
s.station[i].stationID = rand() % 1000;
printf("\n\t5.请添加票务信息:\n");
addTicket(s.station[i].stationID, s.station[i].numbers, t);
printf("**第%d个车站信息和票务信息添加记录成功!**\n", i + 1);
printf("-------------------------------------------\n");
system("pause");
system("cls");
s.count++;
}
}
//打印车票信息
void printStation(Station& s) {
int i;
printf("\n\t\t车站编号 \t起站\t终站\t票价\t剩余票数\n");
printf("\t\t---------------------------------------------------\n");
for (i = 0; i < s.count; i++) {
if (!s.station[i].stationID) {
printf("无车票信息!\n");
break;
}
printf("\t\t%d\t\t%s\t%s\t%d\t%d\n",
s.station[i].stationID, s.station[i].from,
s.station[i].to, s.station[i].money,
s.station[i].numbers);
printf("\t\t----------------------------------------------\n");
}
}
//修改车票信息
void updateStation(Station& s, Ticket& t) {
int stationID, i;
printStation(s);
printf("\n\t\t请选择要修改的车站序号:");
scanf_s("%d", &stationID);
for (;;)
{
printf("\t\t--------------------------\n");
printf("\t\t------1 更新车票价格\n");
printf("\t\t------2 更新车票数量\n");
printf("\t\t------0 返回上级菜单\n");
printf("\t\t--------------------------\n");
printf("\t\t请输入你的选择:");
scanf_s("%d", &i);
getchar();
switch (i)
{
case 1:
updateTicketPrice(s, stationID); //更新车票价格
break;
case 2:
updateTicketNum(s, stationID, t); //更新车票数量
break;
case 0:
break;
}
if (i == 0)
break;
}
}
//更改车票价格
void updateTicketPrice(Station& s, int ID)//Station& s, int stationId
{
//int id,
int i = 0;
//printStation(s);
//printf("\t\t请输入要修改的车站编号:");
//scanf_s("%d", &id);
for (i = 0; i < s.count; i++)
{
if (s.station[i].stationID == ID)
{
printf("\t\t请输入新的价格:");
scanf_s("%d", &s.station[i].money);
printf("\t\t修改成功!\n");
break;
}
}
if (i == s.count)
printf("\t\t该车站不存在\n");
}
//更新车票数量
void updateTicketNum(Station& s, int stationID, Ticket& t)
{
int id, i = 0;
printStation(s);
printf("\t\t请输入要修改的车站序号:");
scanf_s("%d", &id);
for (i = 0; i < s.count; i++)
{
if (s.station[i].stationID == id)
{
printf("\t\t请输入新的车票数量:");
scanf_s("%d", &s.station[i].numbers);
printf("\t\t修改成功!\n");
break;
}
}
if (i == s.count)
printf("\t\t该车站不存在\n");
}
//删除车站信息
void deleteStation(Station& s, Ticket& t) {
int id, i = 0, j;
printStation(s);
printf("请输入要删除的车站编号:\n");
scanf_s("%d", &id);
for (i = 0; i < s.count; i++)
{
if (s.station[i].stationID == id)
{
for (j = i; j < s.count; j++)
{
s.station[j] = s.station[j + 1];
}
s.count--;
deleteTicket(id, t);
printf("\t\t该车站的所有信息已删除!\n");
break;
}
}
if (i == s.count)
printf("\t\t该车站不存在\n");
}
//*****************************************************************
//车票信息
void ticketManage(Station& station, Ticket& ticket, Book& book, int& flag) {
int option;
printf("\t\t*******************************\n");
printf("\t\t\t已售车票 1\n");
printf("\t\t\t剩余车票 2\n");
printf("\t\t\t返回上一级菜单 0\n");
printf("\t\t*******************************\n");
printf("\t\t请选择:");
scanf_s("%d", &option);
switch (option) {
case 1:
showSaledTickets(book);
break;
case 2:
showOnsaleTickets(station);
break;
case 0:
systemManage(station, ticket, book, flag);
break;
default:
printf("\n选择错误!\n");
ticketManage(station, ticket, book, flag);
break;
}
}
//添加车票信息
void addTicket(int stationID, int number, Ticket& t) {
int i = t.count;
int end = t.count + number;
char trainID[STR_LEN], date[STR_LEN], time[STR_LEN];
printf("\t\t列车车次(%d个字符以内):", STR_LEN);
scanf_s("%s", trainID, 10);
printf("\t\t列车出发日期(%d个字符以内):", STR_LEN);
scanf_s("%s", date, 10);
printf("\t\t列车出发时间(%d个字符以内):", STR_LEN);
scanf_s("%s", time, 10);
for (; i < end; i++) {
t.ticket[1].stationID = stationID;
t.ticket[i].seatID = rand() / 100;
t.ticket[i].ticketID = rand() / 10000;
strcpy_s(t.ticket[i].date, date);
strcpy_s(t.ticket[i].time, time);
strcpy_s(t.ticket[i].trainID, trainID);
t.count++;
}
}
//删除车票信息
void deleteTicket(int stationID, Ticket& t) {
int i, j;
for (i = 0; i < t.count; i++) {
if (t.ticket[i].stationID == stationID) {
for (j = i; i < t.count; j++) {
t.ticket[j] = t.ticket[j + 1];
}
}
}
}
//显示已售的车票
void showSaledTickets(Book& b) {
int i;
printf("\t\t售票情况如下:\n");
printf("\t\t--------------------------------------------------------\n");
printf("\t\t订票号\t车次\t出发日期\t出发时间\t座号\t订票人\n");
printf("\t\t--------------------------------------------------------\n");
for (i = 0; i < b.count; i++) {
printf("\t\t%d\t%d\t%s\t%s\t%d\t%s\n",
b.book[i].autoID, b.book[i].ticketinformation.ticketID,
b.book[i].ticketinformation.date, b.book[i].ticketinformation.time,
b.book[i].ticketinformation.seatID, b.book[i].name);
printf("\t\t--------------------------------------------------------\n");
}
}
//显示剩余的车票
void showOnsaleTickets(Station& s) {
printStation(s);
getchar();
}
//*************************************************************
//票务服务
void ticketServices(Station& s, Ticket& t, Book& b, int& flag) {
int option;
printf("\t\t**************************\n");
printf("\t\t\t查询车票------------1\n");
printf("\t\t\t扩展->日期查询车票--2\n");
printf("\t\t\t预定车票------------3\n");
printf("\t\t\t退订车票------------4\n");
printf("\t\t\t返回上级菜单--------0\n");
printf("\t\t**************************\n");
printf("\t\t请选择:");
scanf_s("%d", &option);
switch (option) {
case 1:
ticketInquire(s, t);
break;
case 2:
ticketInquire2(s, t);
break;
case 3:
ticketBook(b, s, t);
break;
case 4:
deleteBook(b, s);
break;
//退订服务
case 0:
flag = 0;
start(flag);
break;
default:
printf("\n选择出错!\n");
ticketServices(s, t, b, flag);
break;
}
}
//查询车票
void ticketInquire(Station& s, Ticket& t) {
int i, k, j = 0;
char from[STR_LEN], to[STR_LEN];
char time[STR_LEN], date[STR_LEN], begin[STR_LEN], end[STR_LEN];
int numbers, money, stationID = 0;
printf("\t请输入查询起点站名称:\t");
scanf_s("%s", from, 10);
int l1 = strlen(from);
from[l1 + 1] = '\0';
printf("\t请输入查询终点站名称:\t");
scanf_s("%s", to, 10);
int l2 = strlen(to);
to[l2 + 1] = '\0';
printf("\t站点序号\t起站\t终站\t日期\t\t时间\t票数\t价格\n");
printf("\t---------------------------------------------------------\n");
for (i = 0; i < s.count; i++) {
if (strcmp(s.station[i].from, from) == 0 &&
strcmp(s.station[i].to, to) == 0) {
stationID = s.station[i].stationID;
numbers = s.station[i].numbers;
money = s.station[i].money;
strcpy_s(begin, from);
strcpy_s(end, to);
for (k = 0; k < t.count; k++) {
if (t.ticket[k].stationID == stationID) {
strcpy_s(time, t.ticket[k].time);
strcpy_s(date, t.ticket[k].date);
j++;
break;
}
}
}
if (j)
break;
}
printf("\n");
printf("\t%d\t\t%s\t%s\t%s\t%s\t%d\t%d\n",
stationID, begin, end, date, time, numbers, money);
printf("\t---------------------------------------------------------\n");
}
//扩展项目->通过其他方式实现查询车票
void ticketInquire2(Station& s, Ticket& t) {
int i, k, j = 0;
char* from, * to;
char num = 0;
from = &num, to = # //对指针变量from和to进行初始化
char time[STR_LEN], date[STR_LEN];
char Time[STR_LEN], Date[STR_LEN];
int money, stationID = 0;
int numbers, Numbers;
printf("\t请输入查询车票对应日期:\t");
scanf_s("%s", date, 10);
printf("\t请输入查询车票发车时间:\t");
scanf_s("%s", time, 10);
printf("\t请输入查询车票的车票数:\t");
scanf_s("%d", &numbers);
printf("\t站点序号\t起站\t终站\t日期\t\t时间\t票数\t价格\n");
printf("\t---------------------------------------------------------\n");
for (i = 0; i < s.count; i++) {
if (strcmp(t.ticket[i].date, date) == 0 &&
strcmp(t.ticket[i].time, time) == 0 &&
(s.station[i].numbers == numbers)) {
stationID = s.station[i].stationID;
from = s.station[i].from;
to = s.station[i].to;
money = s.station[i].money;
strcpy_s(Date, date);
strcpy_s(Time, time);
Numbers = numbers;
for (k = 0; k < t.count; k++) {
if (t.ticket[k].stationID == stationID) {
strcpy(from, s.station[i].from);
strcpy(to, s.station[i].to);
j++;
break;
}
}
}
if (j)
break;
}
printf("\n");
printf("\t%d\t\t%s\t%s\t%s\t%s\t%d\t%d\n",
stationID, from, to, Date, Time, Numbers, money);
printf("\t---------------------------------------------------------\n");
}
//根据车站订购车票
void ticketBook(Book& b, Station& s, Ticket& t) {
int i, stationID, bookNum;
printStation(s);
printf("\t\t请输入订票的车站编号:");
scanf_s("%d", &stationID);
printf("\t\t请输入订票数量:");
scanf_s("%d", &bookNum);
for (i = 0; i < s.count; i++) {
if (s.station[i].stationID == stationID && s.station[i].numbers >= bookNum) {
s.station[i].numbers -= bookNum;
addBookInfo(b, t, stationID, bookNum);
}
}
}
//添加订票信息
void addBookInfo(Book& b, Ticket& t, int stationID, int bookNum) {
int j, i = b.count, end = b.count + bookNum;
for (; i < end; i++) {
b.book[i].autoID = rand() % 10000;
printf("\t\t订票人姓名(%d个字符以内):", STR_LEN);
scanf_s("%s", b.book[i].name, 10);
printf("\t\t%s的订票号为%d:\n", b.book[i].name, b.book[i].autoID);
for (j = 0; j < t.count; j++) {
if (t.ticket[j].stationID == stationID) {
strcpy_s(b.book[i].ticketinformation.date, t.ticket[j].date);
strcpy_s(b.book[i].ticketinformation.time, t.ticket[j].time);
strcpy_s(b.book[i].ticketinformation.trainID, t.ticket[j].trainID);
b.book[i].ticketinformation.ticketID = t.ticket[j].ticketID;
b.book[i].ticketinformation.seatID = t.ticket[j].seatID;
b.book[i].ticketinformation.stationID = t.ticket[j].stationID;
}
}
b.count++;
}
}
//删除车票信息
void deleteBook(Book& b, Station& s) {
int id, i, j, stationid;
char name[STR_LEN];
printf("\t\t输入退票人姓名(%d个字符以内):", STR_LEN);
//scanf_s("%s", name);
getchar();
gets_s(name);
int l = strlen(name);
name[l + 1] = '\0';
printf("\t\t输入需要退票的订票号:");
scanf_s("%d", &id);
for (i = 0; i < b.count; i++)
{
if (id == b.book[i].autoID && strcmp(name, b.book[i].name) == 0)
{
stationid = b.book[i].ticketinformation.stationID;
for (j = i; j < b.count; j++)
{
b.book[j] = b.book[j + 1];
}
b.count--;
for (i = 0; i < s.count; i++)
{
if (stationid == s.station[i].stationID)
s.station[i].numbers++;
}
printf("\t\t退票成功\n");
break;
}
}
if (i == b.count)
printf("\t\t查询不到订票信息\n");
}
//扩展项目
void BuyTicketkz()
{
}