C语言 实验设备管理系统
实验设备信息管理系统
简单的思路,简单的算法
题目简述:实验室设备信息用文件存储,提供文件的输入输出操作;要能够完成设备的录入和修改,需要提供设备添加和修改操作;实现对设备进行分类统计,需要提供排序操作;实现对设备的查询需要提供查找操作。
结构体定义如下:
typedef struct equipmentInfo
{
char equipCode[10]; //设备编号
char equipType[20]; //设备总类
char equipName[20]; //设备名称
char equipPrice[20]; //设备价格
char buyDate[20]; //设备购入日期
int scrap; //是否报废,0表示没有报废,1表示报废
char scrapDate[20]; //报废日期
}EquInfo;
在此做了七个模块,分别是:实验设备信息输入模块、实验设备信息添加模块、实验设备信息修改模块、实验设备分类统计模块、实验设备查询模块、删除模块。
函数定义如下:
int Scaninfor();//浏览设备信息
int Inputinformation();//设备信息输入模块
int Addinfor();//设备信息添加模块
int Modifyinfor();//设备信息修改模块
int Classifyinfor();//设备分类统计模块
int Searchinfor();//设备查询模块
int Deleteinfor();//删除模块
设计思路:
1.设备信息输入模块为新建文件,已存在的文件会被覆盖;
2.设备信息添加模块,向文件尾部添加信息;
3.修改信息模块,先选择需要修改的设备编号,再选择需要修改的内容;
4.统计模块,计数功能(源码中提供了排序的代码,但没有将排序后的写入文件);
5.查询模块,查到就会输出;
6.删除模块,暂时只提供了按照设备编码删除的功能;
7.浏览,任何时候都可以浏览文件内的信息;
8.由main函数提供菜单,用户选择功能,功能实现后,函数返回用户的按键的ASCII码,判断继续执行main函数or结束程序。
遇到的问题及解决办法:
1.信息输入%s用的市scanf(),如果在某一个字符串中输入空格,将会出错。所以改为gets(),注意若在scanf()后使用,需要提前getchar();
2.信息修改模块,一开始提供的修改是让用户重新输入所有信息,改为重新输入需要修改的相应信息更高效;
3.删除模块,最好可以实现分类删除,比如删除所有已经报废的设备信息,删除在某个日期之前或某个时间段购入的设备信息等;
4.函数返回值判断是否结束程序时,最早只能输入数字,输入别的会出错(因为最后用户输入的时候我用的是%d啦)。改为%c后可以按键盘的 any key 了;
5.输出格式问题,虽然我在printf()内使用了\t,但后来发现某项内容长度不一样(本身长度有的不到8个字节,有的超过了8个字节),这样会发生错位。输出格式%s可以改为%-15s(左对齐),这样就可以了。
6.欢迎提出问题继续改进~
源代码:
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <math.h>
4 #include <string.h>
5 #include <conio.h>
6 #define N 20
7 typedef struct equipmentInfo
8 {
9 char equipCode[10]; //设备编号
10 char equipType[20]; //设备总类
11 char equipName[20]; //设备名称
12 char equipPrice[20]; //设备价格
13 char buyDate[20]; //设备购入日期
14 int scrap; //是否报废,0表示没有报废,1表示报废
15 char scrapDate[20]; //报废日期
16 }EquInfo;
17 EquInfo equip[N];
18 int Scaninfor();//浏览设备信息
19 int Inputinformation();//设备信息输入模块
20 int Addinfor();//设备信息添加模块
21 int Modifyinfor();//设备信息修改模块
22 int Classifyinfor();//设备分类统计模块
23 int Searchinfor();//设备查询模块
24 int Deleteinfor();//删除模块
25 int i = 0;
26 int main()
27 {
28 printf("*************************************\n");
29 printf("***** 输入对应数字标号选择菜单\t*****\n");
30 printf("*****\t[0] 浏览实验设备信息\t*****\n");
31 printf("*****\t[1] 输入实验设备信息\t*****\n");
32 printf("*****\t[2] 添加实验设备信息\t*****\n");
33 printf("*****\t[3] 修改实验设备信息\t*****\n");
34 printf("*****\t[4] 设备信息分类统计\t*****\n");
35 printf("*****\t[5] 查询实验设备信息\t*****\n");
36 printf("*****\t[6] 删除实验设备信息\t*****\n");
37 printf("*****\t[7] 退出 \t*****\n");
38 printf("*************************************\n");
39 int menu,t;
40 do
41 {
42 printf("请输入数字标号:\n");
43 scanf("%d",&menu);
44 }while(menu < 0 || menu > 6);
45 switch(menu)
46 {
47 case 0:
48 t = Scaninfor();break;
49 case 1:
50 t = Inputinformation();break;
51 case 2:
52 t = Addinfor();break;
53 case 3:
54 t = Modifyinfor();break;
55 case 4:
56 t = Classifyinfor();break;
57 case 5:
58 t = Searchinfor();break;
59 case 6:
60 t = Deleteinfor();break;
61 case 7:
62 exit(0);break;
63 default:
64 printf("INPUT ERROR !");
65 }
66 getchar();
67 if(t == 48)
68 return 0;
69 else
70 main();
71 }
72 int Scaninfor()
73 {
74 FILE *fp;
75 int j,k;
76 char a;
77 if((fp = fopen("equipInfor.txt","r")) == NULL)
78 {
79 printf("Failure to open equipInfor.txt!\n");
80 exit(0);
81 }
82 for(k = 0;!feof(fp);k++)
83 {
84 fread(&equip[k], sizeof(EquInfo), 1, fp);
85 }
86 printf("code\ttype \t\tname\tprice\tbuydate \tscrap\tscrapdate\n\n\n");
87 for(j = 0;j < k-1;j++)
88 {
89 printf("%s\t%-15s\t%-7s\t%s\t%s\t%d\t%s\n\n",equip[j].equipCode, equip[j].equipType, equip[j].equipName, equip[j].equipPrice, equip[j].buyDate, equip[j].scrap, equip[j].scrapDate);
90 }
91 fclose(fp);
92 printf("press 0 to exit or other key to return menu:\n");
93 scanf(" %c",&a);
94 return a;
95 }
96 int Inputinformation()
97 {
98 int n;
99 char a;
100 printf("Please input the number of equipments:");
101 scanf("%d",&n);
102 getchar();
103 printf("Please input the equipCode, equipType, equipName,");
104 printf(" equipPrice, buyDate, scrap(no 0 or yes 1), scrapDate:\n");
105 do
106 {
107 printf("please input the information of %d:\n",i+1);
108 strcpy(equip[i].scrapDate, "no scrap");
109 printf("please input the equipCode:\n");
110 gets(equip[i].equipCode);
111 printf("please input the equipType:\n");
112 gets(equip[i].equipType);
113 printf("please input the equipName:\n");
114 gets(equip[i].equipName);
115 printf("please input the equipPrice:\n");
116 gets(equip[i].equipPrice);
117 printf("please input the buyDate:\n");
118 gets(equip[i].buyDate);
119 printf("please input is(1) or not(0) scrap:\n");
120 scanf("%d",&equip[i].scrap);
121 getchar();
122 if(equip[i].scrap == 1)
123 {
124 printf("please input the scrap date:\n");
125 gets(equip[i].scrapDate);
126 }
127 i++;
128 }while(i < n);
129 FILE *fp;
130 if((fp = fopen("equipInfor.txt","w")) == NULL)
131 {
132 printf("Failure to open equipInfor.txt!\n");
133 exit(0);
134 }
135 fwrite(equip, sizeof(EquInfo), n, fp);
136 fclose(fp);
137 printf("press 0 to exit or other key to return menu:\n");
138 scanf(" %c",&a);
139 return a;
140 }
141 int Addinfor()
142 {
143 int k = 0,j;
144 FILE *fp;
145 if((fp = fopen("equipInfor.txt","a")) == NULL)
146 {
147 printf("Failure to open equipInfor.txt!\n");
148 exit(0);
149 }
150 int n;
151 char a;
152 printf("Please input the number of the adding equipments:");
153 scanf("%d",&n);
154 getchar();
155 printf("Please input the equipCode,equipType,equipName,");
156 printf("equipPrice,buyDate,scrap(no 0 or yes 1),scrapDate:\n");
157 do
158 {
159 printf("please input the adding information of %d:\n",k+1);
160 strcpy(equip[k].scrapDate, "no scrap");
161 printf("please input the equipCode:\n");
162 gets(equip[k].equipCode);
163 printf("please input the equipType:\n");
164 gets(equip[k].equipType);
165 printf("please input the equipName:\n");
166 gets(equip[k].equipName);
167 printf("please input the equipPrice:\n");
168 gets(equip[k].equipPrice);
169 printf("please input the buyDate:\n");
170 gets(equip[k].buyDate);
171 printf("please input is(1) or not(0) scrap:\n");
172 scanf("%d",&equip[k].scrap);
173 getchar();
174 if(equip[k].scrap == 1)
175 {
176 printf("please input the scrap date:\n");
177 gets(equip[k].scrapDate);
178 }
179 k++;
180 }while(k < n);
181 fseek(fp,0,SEEK_END);
182 for(j = 0;j<n;j++)
183 fwrite(&equip[j], sizeof(EquInfo), 1, fp);
184 fclose(fp);
185 printf("press 0 to exit or other key to return menu:\n");
186 scanf(" %c",&a);
187 return a;
188 }
189 int Modifyinfor()
190 {
191 FILE *fp;
192 int k,j,a,b,l;
193 char c;
194 char code[20];
195 getchar();
196 printf("please input the equipCode of the equipment which you want to modify:\n");
197 gets(code);
198 if((fp = fopen("equipInfor.txt","r")) == NULL)
199 {
200 printf("Failure to open equipInfor.txt!\n");
201 exit(0);
202 }
203 for(k = 0;!feof(fp);k++)
204 {
205 fread(&equip[k], sizeof(EquInfo), 1, fp);
206 }
207 for(j = 0;j < k;j++)
208 {
209 a = strcmp(equip[j].equipCode,code);
210 if(a == 0)
211 {
212 printf("Which information do you want to modify?\n");
213 printf("***[1] equipcode\t***\n");
214 printf("***[2] equiptype\t***\n");
215 printf("***[3] equipname\t***\n");
216 printf("***[4] equipprice\t***\n");
217 printf("***[5] buydate \t***\n");
218 printf("***[6] scrap \t***\n");
219 printf("***[7] scrapdate\t***\n");
220 printf("please input the number:");
221 scanf("%d",&b);
222 getchar();
223
224 switch(b)
225 {
226 case 1:
227 printf("please input the equipCode:\n");
228 gets(equip[j].equipCode);
229 break;
230 case 2:
231 printf("please input the equipType:\n");
232 gets(equip[j].equipType);
233 break;
234 case 3:
235 printf("please input the equipName:\n");
236 gets(equip[j].equipName);
237 break;
238 case 4:
239 printf("please input the equipPrice:\n");
240 gets(equip[j].equipPrice);
241 break;
242 case 5:
243 printf("please input the buyDate:\n");
244 gets(equip[j].buyDate);
245 break;
246 case 6:
247 printf("please input is(1) or not(0) scrap:\n");
248 scanf("%d",&equip[j].scrap);
249 getchar();
250 if(equip[j].scrap == 1)
251 {
252 printf("please input the scrap date:\n");
253 gets(equip[j].scrapDate);
254 }
255 else
256 strcpy(equip[j].scrapDate, "no scrap");
257 break;
258 case 7:
259 printf("please input the scrap date:\n");
260 gets(equip[j].scrapDate);
261 break;
262 default:
263 printf("INPUT ERROR !\n");
264 }
265 break;
266 }
267 }
268 fclose(fp);
269 if(a)
270 printf("don't find the equipCode that you input\n");
271 else
272 {
273 if((fp = fopen("equipInfor.txt","w")) == NULL)
274 {
275 printf("Failure to open equipInfor.txt!\n");
276 exit(0);
277 }
278 for(l = 0;l < k-1;l++)
279 fwrite(&equip[l], sizeof(EquInfo), 1, fp);
280 fclose(fp);
281 printf("MODIFY SUCCESSFULLY !\n");
282 }
283 printf("press 0 to exit or other key to return menu:\n");
284 scanf(" %c",&c);
285 return a;
286 }
287 int Classifyinfor()
288 {
289 char a;
290 FILE *fp;
291 int q,count = 0,j,k;
292 int total;
293 char s[N],temp[N],*te;
294 printf("*****\t[1] 设备种类\t*****\n");
295 printf("*****\t[2] 设备名称\t*****\n");
296 printf("*****\t[3] 购买日期\t*****\n");
297 printf("请输入你想要的分类方式:");
298 scanf("%d",&q);
299 getchar();
300 if((fp = fopen("equipInfor.txt","r")) == NULL)
301 {
302 printf("Failure to open equipInfor.txt!\n");
303 exit(0);
304 }
305 for(total = 0;!feof(fp);total++)
306 {
307 fread(&equip[total], sizeof(EquInfo), 1, fp);
308 }
309 switch(q)
310 {
311 case 1:
312 printf("please input the equipType:\n");
313 gets(s);
314 for(j = 0;j < total-1;j++)
315 {
316 for(k = 1;k < total;k++)
317 {
318 if(strcmp(equip[k].equipType,equip[j].equipType) < 0)
319 {
320 strcpy(temp, equip[k].equipType);
321 strcpy(equip[k].equipType, equip[j].equipType);
322 strcpy(equip[j].equipType, temp);
323 }
324 }
325 }
326 for(j = 0;j < total;j++)
327 {
328 if(strcmp(s,equip[j].equipType) == 0)
329 {
330 count++;
331 }
332 }
333 printf("%s类型的实验仪器有%d台\n",s,count);
334 break;
335 case 2:
336 printf("please input the equipName:\n");
337 gets(s);
338 for(j = 0;j < total - 1;j++)
339 {
340 for(k = 1;k < total;k++)
341 {
342 if(strcmp(temp,equip[j].equipName) < 0)
343 {
344 strcpy(temp, equip[k].equipName);
345 strcpy(equip[k].equipName, equip[j].equipName);
346 strcpy(equip[j].equipName, temp);
347 }
348 }
349 }
350 for(j = 0;j < total;j++)
351 {
352 if(strcmp(s,equip[j].equipName) == 0)
353 {
354 count++;
355 }
356 }
357 printf("%s名称的仪器有%d台\n",s,count);
358 break;
359 case 3:
360 printf("please input the buyDate:\n");
361 gets(s);
362 for(j = 0;j < total - 1;j++)
363 {
364 for(k = 1;k < total;k++)
365 {
366 if(strcmp(s, equip[j].buyDate) < 0)
367 {
368 strcpy(temp, equip[k].buyDate);
369 strcpy(equip[k].buyDate, equip[j].buyDate);
370 strcpy(equip[j].buyDate, temp);
371 }
372 }
373 }
374 for(j = 0;j < total;j++)
375 {
376 if(strcmp(s,equip[j].buyDate) == 0)
377 {
378 count++;
379 }
380 }
381 printf("%s日期购买的仪器有%d台\n",s,count);
382 break;
383 default:
384 printf("INPUT ERROR !\n");
385 }
386 printf("press 0 to exit or other key to return menu:\n");
387 scanf(" %c",&a);
388 return a;
389 }
390 int Searchinfor()
391 {
392 int n,m,k;
393 char a;
394 FILE *fp;
395 printf("*************************************\n");
396 printf("*****\t[1] 按设备编号查询\t*****\n");
397 printf("*****\t[2] 按设备种类查询\t*****\n");
398 printf("*****\t[3] 按设备名称查询\t*****\n");
399 printf("*****\t[4] 按设备购入日期查询\t*****\n");
400 printf("*****\t[5] 按设备状态查询\t*****\n");
401 printf("*************************************\n");
402 printf("请输入所需要的查询方式:");
403 scanf("%d",&n);
404 getchar();
405 if((fp = fopen("equipInfor.txt","r")) == NULL)
406 {
407 printf("Failure to open equipInfor.txt!\n");
408 exit(0);
409 }
410 for(k = 0;!feof(fp);k++)
411 {
412 fread(&equip[k], sizeof(EquInfo), 1, fp);
413 }
414 int j,flag,sc;
415 switch(n)
416 {
417 case 1:
418 flag = 0;
419 char code[N];
420 printf("please input the equipCode:");
421 gets(code);
422 for(j = 0;j < k-1;j++)
423 {
424 if(strcmp(equip[j].equipCode, code) == 0)
425 {
426 printf("%s\t%s\t%s\t%s\t%s\t%d\t%s\n",equip[j].equipCode, equip[j].equipType, equip[j].equipName, equip[j].equipPrice, equip[j].buyDate, equip[j].scrap, equip[j].scrapDate);
427 flag = 1;
428 }
429 }
430 if(!flag)
431 printf("not find !");
432 break;
433 case 2:
434 flag = 0;
435 char type[N];
436 printf("please input the equipType:");
437 gets(type);
438 for(j = 0;j < k-1;j++)
439 {
440 if(strcmp(equip[j].equipType, type) == 0)
441 {
442 printf("%s\t%s\t%s\t%s\t%s\t%d\t%s\n",equip[j].equipCode, equip[j].equipType, equip[j].equipName, equip[j].equipPrice, equip[j].buyDate, equip[j].scrap, equip[j].scrapDate);
443 flag = 1;
444 }
445 }
446 if(!flag)
447 printf("not find !");
448 break;
449 case 3:
450 flag = 0;
451 char name[N];
452 printf("please input the equipName:");
453 gets(name);
454 for(j = 0;j < k-1;j++)
455 {
456 if(strcmp(equip[j].equipName, name) == 0)
457 {
458 printf("%s\t%s\t%s\t%s\t%s\t%d\t%s\n",equip[j].equipCode, equip[j].equipType, equip[j].equipName, equip[j].equipPrice, equip[j].buyDate, equip[j].scrap, equip[j].scrapDate);
459 flag = 1;
460 }
461 }
462 if(!flag)
463 printf("not find !");
464 break;
465 case 4:
466 flag = 0;
467 char date[N];
468 printf("please input the buyDate:");
469 gets(date);
470 for(j = 0;j < k-1;j++)
471 {
472 if(strcmp(equip[j].buyDate, date) == 0)
473 {
474 printf("%s\t%s\t%s\t%s\t%s\t%d\t%s\n",equip[j].equipCode, equip[j].equipType, equip[j].equipName, equip[j].equipPrice, equip[j].buyDate, equip[j].scrap, equip[j].scrapDate);
475 flag = 1;
476 }
477 }
478 if(!flag)
479 printf("not find !");
480 break;
481 case 5:
482 flag = 0;
483 printf("please input the scrap:");
484 scanf("%d",&sc);
485 for(j = 0;j < k-1;j++)
486 {
487 if(equip[j].scrap == sc)
488 {
489 printf("%s\t%s\t%s\t%s\t%s\t%d\t%s\n",equip[j].equipCode, equip[j].equipType, equip[j].equipName, equip[j].equipPrice, equip[j].buyDate, equip[j].scrap, equip[j].scrapDate);
490 flag = 1;
491 }
492 }
493 if(!flag)
494 printf("not find !\n");
495 break;
496 default:
497 printf("INPUT ERROR !");
498 }
499 printf("press 0 to exit or other key to return menu\n");
500 scanf(" %c",&a);
501 return a;
502 }
503 int Deleteinfor()
504 {
505 FILE *fp;
506 int k,j,a,b,l;
507 char c;
508 char code[20];
509 getchar();
510 printf("please input the equipCode of the equipment which you want to delete:\n");
511 gets(code);
512 if((fp = fopen("equipInfor.txt","r")) == NULL)
513 {
514 printf("Failure to open equipInfor.txt!\n");
515 exit(0);
516 }
517 for(k = 0;!feof(fp);k++)
518 {
519 fread(&equip[k], sizeof(EquInfo), 1, fp);
520 }
521 for(j = 0;j < k;j++)
522 {
523 a = strcmp(equip[j].equipCode,code);
524 if(a == 0)
525 {
526 b = j;
527 break;
528 }
529 }
530 fclose(fp);
531 if(j == k)
532 {
533 printf("INPUT ERROR !\nDon't find the code !\n");
534 }
535 else
536 {
537 if((fp = fopen("equipInfor.txt","w")) == NULL)
538 {
539 printf("Failure to open equipInfor.txt!\n");
540 exit(0);
541 }
542 for(l = 0;l < b;l++)
543 fwrite(&equip[l], sizeof(EquInfo), 1, fp);
544 for(l = b+1;l < k-1;l++)
545 fwrite(&equip[l], sizeof(EquInfo), 1, fp);
546 fclose(fp);
547 printf("DELETE SUCCESSFULLY !\n");
548 }
549 printf("press 0 to exit or other key to return menu:\n");
550 scanf(" %c",&c);
551 return a;
552 }