-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtrain.cpp
405 lines (391 loc) · 13.2 KB
/
train.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//定义结构体,记录车次信息
typedef struct train_infor
{
char number[10];//车次
char start[20];//始发地
char end[20];//终点站
int year1,month1,day1,h1,m1;//发车日期时间
int year2,month2,day2,h2,m2;//到达日期时间
}train;
int cnum=0;//记录总共有多少个列车信息;
train info[10000];//结构体类型的数组用来保存所有的车次信息;
train users[100][100];//二维数组用来保存用户信息,每一行可以用来表示一个用户的购票信息
int vcs[100]={0};//用来记录每一个人自己账户的票数,初始全为0;
//录入火车票信息
void create()
{
int sum,i;
printf("请输入要录入的列车信息条数:");
scanf("%d",&sum);
printf("请依次输入车次 始发地 终点站 发车时间(年/月/日 时:分) 到达时间(年/月/日 时:分);\n");
for(i=cnum;i<cnum+sum;i++)//录入信息从cnum开始的原因是避免管理员先进行插入或添加操作后再来录入数据,发生覆盖;同时这样可以多次进行录入操作(在之前的信息下继续添加)
scanf("%s %s %s %d/%d/%d %d:%d %d/%d/%d %d:%d",info[i].number,info[i].start,info[i].end,&info[i].year1,&info[i].month1,&info[i].day1,&info[i].h1,&info[i].m1,&info[i].year2,&info[i].month2,&info[i].day2,&info[i].h2,&info[i].m2);
printf("录入成功!\n");
cnum+=sum;
return ;
}
//显示火车票信息
void print()
{
if(cnum==0)
{
printf("无列车信息!\n");
return ;
}
int i;
printf("车次\t始发地\t终点站\t发车时间\t\t到达时间\n");
for(i=0;i<cnum;i++)
printf("%s\t%s\t%s\t%d/%02d/%02d %02d:%02d\t%d/%02d/%02d %02d:%02d\n",info[i].number,info[i].start,info[i].end,info[i].year1,info[i].month1,info[i].day1,info[i].h1,info[i].m1,info[i].year2,info[i].month2,info[i].day2,info[i].h2,info[i].m2);
return ;
}
//查询火车票信息
void query()
{
int i;
printf("请输入查询车次:");
char ch[10];//记录要查询的车次
scanf("%s",ch);
for(i=0;i<cnum;i++)
{
if(strcmp(ch,info[i].number)==0)//比较所有的列车信息一直到和输入的车次相同则找到并输出,字符串的比较要是用strcmp()函数;如果相等则为0
{
printf("%s\t%s\t%s\t%d/%02d/%02d %02d:%02d\t%d/%02d/%02d %02d:%02d\n",info[i].number,info[i].start,info[i].end,info[i].year1,info[i].month1,info[i].day1,info[i].h1,info[i].m1,info[i].year2,info[i].month2,info[i].day2,info[i].h2,info[i].m2);
return ;//找到后直接结束无需再查找
}
}
printf("无此列车信息!\n");//如果找到前面就结束则不会运行到此处;所以运行到此处只能是没有找到;
return ;
}
//修改火车票信息
void update()
{
int i;
printf("请输入要修改的车次:");
char ch[10];//记录要修改的车次
scanf("%s",ch);
//和查询一样先找到该列车所在的位置,然后对其进行修改
for(i=0;i<cnum;i++)
{
if(strcmp(ch,info[i].number)==0)//比较所有的列车信息一直到和输入的车次相同则找到并输出,字符串的比较要是用strcmp()函数;如果相等则为0
{
printf("该列车原信息:\n");
printf("车次\t始发地\t终点站\t发车时间\t\t到达时间\n");
printf("%s\t%s\t%s\t%d/%02d/%02d %02d:%02d\t%d/%02d/%02d %02d:%02d\n",info[i].number,info[i].start,info[i].end,info[i].year1,info[i].month1,info[i].day1,info[i].h1,info[i].m1,info[i].year2,info[i].month2,info[i].day2,info[i].h2,info[i].m2);
printf("请输入新的数据:\n");
printf("车次\t始发地\t终点站\t发车时间\t\t到达时间\n");
scanf("%s %s %s %d/%d/%d %d:%d %d/%d/%d %d:%d",info[i].number,info[i].start,info[i].end,&info[i].year1,&info[i].month1,&info[i].day1,&info[i].h1,&info[i].m1,&info[i].year2,&info[i].month2,&info[i].day2,&info[i].h2,&info[i].m2);
printf("修改成功!\n");
return ;//修改后直接结束无需再进行
}
}
printf("无此列车信息!\n");//如果找到前面就结束则不会运行到此处;所以运行到此处只能是没有找到;
return ;
}
//添加火车票信息
void insert()
{
int i=cnum;
printf("请输入插入的信息:\n");
printf("车次\t始发地\t终点站\t发车时间\t\t到达时间\n");
scanf("%s %s %s %d/%d/%d %d:%d %d/%d/%d %d:%d",info[i].number,info[i].start,info[i].end,&info[i].year1,&info[i].month1,&info[i].day1,&info[i].h1,&info[i].m1,&info[i].year2,&info[i].month2,&info[i].day2,&info[i].h2,&info[i].m2);
cnum++;//列车信息总条数加一
printf("插入成功!\n");
return ;
}
//删除火车票信息
void dele()
{
int i,vis=-1;
printf("请输入要删除的车次:");
char ch[10];//记录要删除的车次
scanf("%s",ch);
//和查询一样先找到该列车所在的位置,然后对其进行删除
for(i=0;i<cnum;i++)
{
if(strcmp(ch,info[i].number)==0)//比较所有的列车信息一直到和输入的车次相同则找到并输出,字符串的比较要是用strcmp()函数;如果相等则为0
{
vis=i;//将要删除的车次的下标保存下来,为后边的删除操作服务;
break;//找到后就可以结束循环
}
}
if(vis==-1)//vis初始值设为-1因为下标不存在负值,如果经过查找后还没变说明没有找到该车次所以可以直接结束
{
printf("无此列车信息!\n");
return ;
}
else
{
for(i=vis;i<cnum-1;i++)//vis为要删除列车信息的下标,要想把它删除只用把后边的信息依次往前进行覆盖即可;此处i<cnum-1是为了避免最后越界;
{
info[i]=info[i+1];
}
printf("删除成功!\n");
cnum--;//列车信息总条数减一;
return ;
}
}
//管理员菜单
void admin_menu()
{
printf("***************************************************************\n");
printf("* 欢迎进入火车票信息管理系统 *\n");
printf("***************************************************************\n");
printf("* 1、录入火车票信息 *\n");
printf("* 2、显示火车票信息 *\n");
printf("* 3、查询火车票信息 *\n");
printf("* 4、修改火车票信息 *\n");
printf("* 5、添加火车票信息 *\n");
printf("* 6、删除火车票信息 *\n");
printf("* 0、退出 *\n");
printf("***************************************************************\n");
}
//管理员界面
void admin()
{
admin_menu();
int choose2;
while(~scanf("%d",&choose2))//选择对应的操作;
{
switch (choose2)
{
case 1:
create();
break;
case 2:
print();
break;
case 3:
query();
break;
case 4:
update();
break;
case 5:
insert();
break;
case 6:
dele();
break;
case 0:
return ;//输入0直接退出整个函数
default :
printf("请选择有效操作对应编号哦!\n");
break ;
}
admin_menu();//每次操作结束后再次打印菜单栏
}
}
//买票
void buy(int no)
{
int i;
printf("请输入你要购票的车次:\n");
char che[10];
scanf("%s",che);
for(i=0;i<cnum;i++)
{
if(strcmp(che,info[i].number)==0)
{
users[no][vcs[no]]=info[i];
vcs[no]++;//该用户的购票数加一;
printf("购票成功!\n");
return ;
}
}
printf("无此列车信息!\n");
return ;
}
//火车票区间查询
void look_up(int no)
{
if(cnum==0)
{
printf("无车次信息,请管理员进行车次信息录入!\n");
return ;
}
char starts[20];
char ends[20];
int cnums=0,i;//记录查询到的车次条数
printf("请输入查询的起始 终止区间(空格隔开哦!):\n");
scanf("%s %s",starts,ends);
for(i=0;i<cnum;i++)
{
if(strcmp(starts,info[i].start)==0&&strcmp(ends,info[i].end)==0)
{
printf("%s\t%s\t%s\t%d/%02d/%02d %02d:%02d\t%d/%02d/%02d %02d:%02d\n",info[i].number,info[i].start,info[i].end,info[i].year1,info[i].month1,info[i].day1,info[i].h1,info[i].m1,info[i].year2,info[i].month2,info[i].day2,info[i].h2,info[i].m2);
cnums++;
}
}
if(cnums==0)
{
printf("无此区间车次信息!\n");
return ;
}
else
{
printf("------------------------\n");
printf("| 是否购票 |\n");
printf("------------------------\n");
printf("| 1、是 | 2、否 |\n");
printf("------------------------\n");
int choose4;//记录用户的选择
while(~scanf("%d",&choose4))
{
switch(choose4)
{
case 1:
buy(no);
break;
case 2:
return ;
default :
printf("请选择有效操作对应编号哦!\n");
break ;
}
printf("------------------------\n");
printf("| 是否购票 |\n");
printf("------------------------\n");
printf("| 1、是 | 2、否 |\n");
printf("------------------------\n");
}
}
}
//退票
void refund(int no)
{
int vis=-1,i;
if(vcs[no]==0)
{
printf("你还尚未购票哦!\n");
return ;
}
else
{
printf("你的购票信息:\n");
printf("车次\t始发地\t终点站\t发车时间\t\t到达时间\n");
for(i=0;i<vcs[no];i++)
{
printf("%s\t%s\t%s\t%d/%02d/%02d %02d:%02d\t%d/%02d/%02d %02d:%02d\n",users[no][i].number,users[no][i].start,users[no][i].end,users[no][i].year1,users[no][i].month1,users[no][i].day1,users[no][i].h1,users[no][i].m1,users[no][i].year2,users[no][i].month2,users[no][i].day2,users[no][i].h2,users[no][i].m2);
}
printf("请输入退票车次:");
char cs[10];
scanf("%s",cs);
for(i=0;i<vcs[no];i++)
{
if(strcmp(cs,users[no][i].number)==0)//比较你所购票的列车信息一直到和输入的车次相同则找到并输出,字符串的比较要是用strcmp()函数;如果相等则为0
{
vis=i;//将要退票的车次的下标保存下来,为后边的删除操作服务;
break;//找到后就可以结束循环
}
}
if(vis==-1)//vis初始值设为-1因为下标不存在负值,如果经过查找后还没变说明没有找到该车次所以可以直接结束
{
printf("你尚未购买此列车车票!\n");
return ;
}
else
{
for(i=vis;i<vcs[no]-1;i++)//vis为要删除列车信息的下标,要想把它删除只用把后边的信息依次往前进行覆盖即可;此处i<vcs[no]-1是为了避免最后越界;
{
users[no][i]=users[no][i+1];
}
printf("退票成功!\n");
vcs[no]--;//购票总条数减一;
return ;
}
}
}
//打印购票信息
void out_print(int no)
{
int i;
if(vcs[no]==0)
{
printf("无购票记录!\n");
return ;
}
else
{
printf("车次\t始发地\t终点站\t发车时间\t\t到达时间\n");
for(i=0;i<vcs[no];i++)
{
printf("%s\t%s\t%s\t%d/%02d/%02d %02d:%02d\t%d/%02d/%02d %02d:%02d\n",users[no][i].number,users[no][i].start,users[no][i].end,users[no][i].year1,users[no][i].month1,users[no][i].day1,users[no][i].h1,users[no][i].m1,users[no][i].year2,users[no][i].month2,users[no][i].day2,users[no][i].h2,users[no][i].m2);
}
}
}
//用户菜单
void user_menu()
{
printf("***************************************************************\n");
printf("* 欢迎进入火车票售票系统 *\n");
printf("***************************************************************\n");
printf("* 1、火车票区间查询 *\n");
printf("* 2、打印购票信息 *\n");
printf("* 3、退票 *\n");
printf("* 0、退出 *\n");
printf("***************************************************************\n");
}
//用户界面
void user()
{
int no;
printf("请输入你的用户编码:");
scanf("%d",&no);//记录用户编码用来对应的保存其购票信息
user_menu();
int choose3;
while(~scanf("%d",&choose3))//记录用户选择的操作;
{
switch(choose3)
{
case 1:
look_up(no);
break;
case 2:
out_print(no);
break;
case 3:
refund(no);
break;
case 0:
return ;//输入0直接退出整个函数
default :
printf("请选择有效操作对应编号哦!\n");
break ;
}
user_menu();
}
}
int main()
{
printf("提示:整个输入过程请严格按照格式,标点均为英文!\n");
printf("-------------请选择身份-------------\n");
printf("| 1、管 理 员 | 2、用 户 |\n");
printf("| 0、结束程序 |\n");
printf("------------------------------------\n");//输入1表示进入管理员界面,2进入用户界面
int choose1;
while(~scanf("%d",&choose1))//记录选择的序号,多组测试
{
if(choose1==0)
break;
switch (choose1)
{
case 1:
admin();
break;
case 2:
user();
break;
default :
printf("请选择有效操作对应编号哦!\n");
break;
}
printf("-------------请选择身份-------------\n");
printf("| 1、管 理 员 | 2、用 户 |\n");
printf("| 0、结束程序 |\n");
printf("------------------------------------\n");
}
return 0;
}