C语言课程设计报告停车场管理系统.doc
C语言课程设计报告 目录一、 题目要求,需求分析二、 总体设计思路与功能模块划分三、 程序设计四、 程序运行测试五、 总结前 言计算机科学技术的发展,不仅极大地促进了整个科学技术的发展,而且明显地加快了经济信息化和社会信息化的进程。因此,计算机教育在全国备受重视,计算机知识与能力已成为21世纪人才素质的基本要素之一。如今,高等教育的计算机教育发展十分迅速。十多年前,只有部分理工科专业开设计算机课程。今天,几乎所有高校的所有专业都开设了程度不同的计算机课程。人们已经认识到,计算机知识已成为当代知识分子知识结构中不可缺少的重要组成部分。而除了掌握计算机的基础知识和操作的基本能力外,掌握一门高级编程语言,并可以熟练运用它,已成为当代大学生综合能力必要组成。计算机技术发展如此迅猛,计算机应用如此广泛,需要学习的东西愈来愈多,而我们的总学时是有限的。一般来说,计算机课程学习可以分为两部分:一部分是理论课程学习,一部分是上机应用实习。根据我们专业的性质和要求,则应侧重于上机操作运用。为此,学校特意在本学期最后安排了32个学时的上机实习。现将一星期的实习内容及结果分析分列如下:一、题目要求:27.停车场管理21、有一个两层的停车场,每层有6个车位,当第一层车停满后才允许使用第二层,(停车场可用一个二维数组实现,每个数组元素存放一个车牌号)每辆车的信息包括车牌号,层号,车位号,停车时间共4项,其中停车时间按分钟计算。2、假设停车场初始状态为第一层已经停有4辆车,其车位号依次为14,停车时间依次为20,15,10,5。即先将这四辆车的信息存入文件“car.dat"中(数组的对应元素也要进行赋值)。3、停车操作:当一辆车进入停车场时,先输入其车牌号,再为它分配一个层号和一个车位号(分配前先查询车位的使用情况,如果第一层有空则必须停在第一层),停车时间设为5,最后将新停入的汽车的信息添加文件"car.dat"中,并将在此之前的所有车的停车时间加5。4、收费管理(取车):当有车离开时,输入其车牌号,先按其停车时间计算费用,每5分钟0.2元。(停车费用可设置一个变量进行保存),同时从文件"car.dat"中删除该车的信息,并将该车对应的车位设置为可使用状态(即二维数组对应元素清零)。按用户的选择来判断是否要输出停车收费的总计。5、输出停车场中全部车辆的信息。6、退出系统。需求分析:车辆信息用文件储存,提供文件的输入输出操作;当车离开时要删除文件中该车的信息,因而要提供文件的删除操作;另外还要用键盘式菜单实现功能选择。二、总体设计思路:整个管理系统设计可设计为停车模块、取车模块、车辆浏览信息模块。另外车辆停放信息涉及到从car.dat中读取,保存和修改,为了方便起见,和程序的模块化,我们将文件的读入和保存单独设计为两个子程序。输入车辆车牌号存车 putCar停车模块saveAll将车辆信息存入car.dat输入车牌号码取车getCar取车模块删除车辆信息显示停车费用Main键盘式菜单showInfo车位信息Exit退出 图1 整体模块图各子程序设计如下:1.使用全局变量数组,用一个二维数组实现停车场车位的信息, int cars124;2.通过读取car.dat的数据,对程序初始化。下图为car.dat的初始数据:在init()通过一个for循环完成对car.dat中数据的读取。for(i=0;i<12;i+) fscanf(fp,"%d ", &carsi0); fscanf(fp,"%d ", &carsi1); fscanf(fp,"%d ", &carsi2); fscanf(fp,"%d ", &carsi3); 3.同理,我们设计一个子程序saveAll()用来保存停车场车位的信息到car.dat。用for循环再将处理后的数据存入文件中。for(i=0;i<12;i+) fprintf(fp,"%d ", carsi0);fprintf(fp,"%d ", carsi1);fprintf(fp,"%d ", carsi2);fprintf(fp,"%d ", carsi3);fprintf(fp,"n" );4.进行对停车模块的设计:首先,输入车辆的车牌号,我们从键盘读取车牌号码,并判断车牌号码是否正确(五位数整型车牌号码)。输入出错时要求继续输入。我们引入flag标志量判断车牌号是否正确,初始int flag=1,从键盘读入车牌号码,并判断:printf("请输入您的车牌号:");doscanf("%d",&temp);if(temp>9999)&&(temp<100000)break;flag=0;printf("请重新输入五位数车牌号n :");while(!flag);其次,读取的车牌号正确之后对标志量清零flag=0,代表没有没有找到车位,进行为车辆找停车位的操作,如下:flag=0; for(i=1;i<13;i+) if(carsi0!=0)continue; carsi0=temp; flag=1; break; 通过for循环和continue语句找到没有停车的车位,即cari0不等于0,并将标志量flag赋值1,表示有车位,用break语句跳出循环。再用if语句处理flag=1的情况,即停车场车位已满无法停车。最后,对存入的车辆赋初始时间5,并且前面的已存入的车辆时间都加5。语句如下:for(i=0;i<12;i+) if(carsi0!=0)carsi3+=5;carsi2+=i;又因为我在car.dat已经对车辆的停放楼层和车位有过初始赋值,可以省去再对carsi1和carsi2的操作。并且可以满足“第一层有空位必须停在第一层”的要求,不过存在一个问题就是车辆只能按车位序号停放。5、取车模块:第一步,读取要提取车辆的车牌号码。再通过flag标志量对所输入车牌号正误分别处理。(初始flag=0)第二步,对于输入正确的车辆进行操作:删除车辆信息,再计算费用,再对时间清零并标志取车成功。第三步,进过上一步后取车不成功时即flag还是为0时,提示重复输入车牌号直道成功为止。程序如下:doscanf("%d",&temp);if(temp>9999)&&(temp<100000)for(i=0;i<12;i+)if(carsi0=temp)carsi0=0; cost=0.2*carsi3/5;carsi3=0;flag=1;break;if(flag=0)printf("您输入的车牌号码有误,请重新输入。n");while(!flag);第四步,有选择性的显示收费价格:printf("n 显示停车费用?是(1)/否(2)");scanf("%d",&i);switch(i)case 1:printf("n车牌号 : %d 费用 %8.2f元n",temp,cost);case 2:default: break;最后,调用saveAll()函数来保存数据到car.dat。6、车辆信息浏览模块:注意我们只需要显示有车的车位可以用for循环语句再加上if判断语句来实现显示功能。printf("车牌号tt楼层t 车位 tt时间n");for(i=0;i<12;i+)if(carsi0!=0)printf("%dtt %d tt%d tt %dn",carsi0,carsi1,carsi2,carsi3);7、主函数:调用子函数init()初始化读取car.dat文件。用printf在屏幕上显示停车场的菜单。再用switch语句实现选择执行哪个模块语句。switch(a) case 1:putCar(); break;case 2:getCar();break;case 3:showInfo();break;case 4:exit(0); break; default:printf("您输入的信息有误!n"); break;getchar();三、程序设计#include <stdio.h>#include <stdlib.h>#include<conio.h>#include<io.h>int cars124; /*停车场使用数组*/void init() /*初始化*/char filename = "car.dat"FILE *fp;int i;if(fp = fopen(filename,"r") = NULL)printf("无法打开文件 " car.dat"n");return ;for(i=0;i<12;i+) /*读数据文件内容到数组*/fscanf(fp,"%d ", &carsi0);fscanf(fp,"%d ", &carsi1);fscanf(fp,"%d ", &carsi2);fscanf(fp,"%d ", &carsi3);fclose(fp);void saveAll() /*保存数据到car.dat*/char filename = "car.dat"FILE *fp;int i=0;if(fp = fopen(filename,"w") = NULL)printf("无法打开文件 " car.dat"n");return ;for(i=0;i<12;i+) /*写数据到文件*/fprintf(fp,"%d ", carsi0);fprintf(fp,"%d ", carsi1);fprintf(fp,"%d ", carsi2);fprintf(fp,"%d ", carsi3);fprintf(fp,"n" );fclose(fp);void putCar() /*停车操作*/int i;int temp;int flag=1;printf("nn*欢迎来到地大停车场*n");printf("请输入你的车牌号:");doscanf("%d",&temp);if(temp>0)&&(temp<10000)break;flag=0;printf("Your car number is a digit between 0 and 10000:");while(!flag);flag=0;for(i=0;i<12;i+)if(carsi0!=0)continue;carsi0=temp;flag=1;break;if(flag=0) /*没有找到位置,停车场已满*/printf("很抱歉!车位已满:n");return ;for(i=0;i<12;i+) /*所有车的停车时间一起加5*/if(carsi0!=0)carsi3+=5;saveAll();getchar();printf("存车成功!n按任意键回到主菜单.");void getCar() /*取车*/int i,temp,flag=0;float cost;printf("nn*从停车场取车*n ");printf(" 请输入你的车牌号码:");doscanf("%d",&temp);if(temp>0)&&(temp<10000)for(i=0;i<12;i+)if(carsi0=temp)carsi0=0; /*删除该车位车辆信息*/cost=0.2*carsi3/5;carsi3=0;flag=1;break;if(flag=0)printf("您输入的车牌号码有误,请重新输入。n");while(!flag);printf("n Printf out the cost?Yes(1)/No(2)");scanf("%d",&i);switch(i)case 1:printf("n车牌号 : %d 费用 %8.2f元n",temp,cost);case 2:default: break;saveAll(); /*保存数据*/getchar();printf("取车成功!n按任意键回到主菜单.");void showInfo() /*显示当前停车场信息*/int i;printf("nn*当前停车场车位信息*n");printf("车牌号tt楼层t 车位 tt时间n");for(i=0;i<12;i+)if(carsi0!=0)printf("%dtt %d tt%d tt %dn",carsi0,carsi1,carsi2,carsi3);getchar();printf("输入任意键返回主菜单.");int main()int a;init();do printf("nnn*n");printf("* 地大停车场管理系统 *n");printf("* 1.停车 *n");printf("* 2.取车 *n");printf("* 3.当前车位信息 *n");printf("* 4.退出 *n"); printf("*n");printf("请输入选项:");scanf("%d",&a); switch(a) /*菜单选择*/case 1:putCar(); break;case 2:getCar();break;case 3:showInfo();break;case 4:exit(0); break; default:printf("您输入的信息有误!n"); break;getchar();while(1);return 0;四、 程序运行测试:1、 打开程序进入键盘式界面菜单,选择您所需要进行的操作选项。2、 车辆车位的初始化,查看当前车位信息如下:3、停入车牌号为20000的车:4、查看当前车位信息:出现错误,车辆无法按楼层和车位要求停。对car.dat进行修改楼层号初始化为1 1 1 1 1 1 2 2 2 2 2 2车位号初始化为1 2 3 4 5 6 1 2 3 4 5 6。在使用停车操作时,车辆从一楼到二楼依次按序停放。对程序修改后运行 如下:查看修改后取车,并显示费用:再存入5辆车:停车车位顺次排下。取出两辆车:再存入两辆:后存入的车占据取出车的空车位将车库存满:输入4,程序结束。