C语言课程设计实习报告姓名:成帅安学号:20141002605院(系):工程学院专业:土木工程2016年6 月2016.6 中国地质大学C语言课程设计 1 第一章停车场管理系统§1.1题目描述1、有一个两层的停车场,每层有6个车位,当第一层车停满后才允许使用第二层,(停车场可用一个二维数组实现,每个数组元素存放一个车牌号)每辆车的信息包括车牌号,层号,车位号,停车时间共4项,其中停车时间按分钟计算。
2、假设停车场初始状态为第一层已经停有4辆车,其车位号依次为1-4,停车时间依次为20,15,10,5。
即先将这四辆车的信息存入文件“car.dat"中(数组的对应元素也要进行赋值)。
3、停车操作:当一辆车进入停车场时,先输入其车牌号,再为它分配一个层号和一个车位号(分配前先查询车位的使用情况,如果第一层有空则必须停在第一层),停车时间设为5,最后将新停入的汽车的信息添加文件"car.dat"中,并将在此之前的所有车的停车时间加5。
4、收费管理(取车):当有车离开时,输入其车牌号,先按其停车时间计算费用,每5分钟0.2元。
(停车费用可设置一个变量进行保存),同时从文件"car.dat"中删除该车的信息,并将该车对应的车位设置为可使用状态(即二维数组对应元素清零)。
按用户的选择来判断是否要输出停车收费的总计。
5、输出停车场中全部车辆的信息。
6、退出系统。
§1.2算法设计1、需求分析:车辆信息用文件储存,提供文件的输入输出操作;当车离开时要删除文件中该车的信息,因而要提供文件的删除操作;用键盘式菜单实现功能选择。
2、总体设计思路:整个管理系统设计可设计为停车模块、取车模块、车辆浏览信息模块。
另外车辆停放信息涉及到从car.dat中读取,保存和修改,为了方便起见和程序的模块化,我将文件的读入和保存单独设计为两个子程序。
整体模块图如下:23、各子程序设计如下:(1)使用全局变量数组,用一个二维数组实现停车场车位的信息,int cars[12][4];2016.6 中国地质大学C语言课程设计 3 (2)通过读取car.dat的数据,对程序初始化。
下图为car.dat的初始数据:在init()通过一个for循环完成对car.dat中数据的读取。
for(i=0;i<12;i++){fscanf(fp,"%d ", &cars[i][0]);fscanf(fp,"%d ", &cars[i][1]);fscanf(fp,"%d ", &cars[i][2]);fscanf(fp,"%d ", &cars[i][3]);}(3)设计一个子程序saveAll()用来保存停车场车位的信息到car.dat。
用for循环再将处理后的数据存入文件中。
for(i=0;i<12;i++){fprintf(fp,"%d ", cars[i][0]);fprintf(fp,"%d ", cars[i][1]);fprintf(fp,"%d ", cars[i][2]);fprintf(fp,"%d ", cars[i][3]);fprintf(fp,"\n" );}(4)停车模块:首先,输入车辆的车牌号,我们从键盘读取车牌号码,并判断车牌号码是否正确(五位数整型车牌号码)。
输入出错时要求继续输入。
我们引入flag标志量判断车牌号是否正确,初始int flag=1,从键盘读入车牌号码,并判断:4 printf("请输入您的车牌号:");do{scanf("%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(cars[i][0]!=0)continue;cars[i][0]=temp;flag=1;break;}通过for循环和continue语句找到没有停车的车位,即car[i][0]不等于0,并将标志量flag赋值1,表示有车位,用break语句跳出循环。
再用if语句处理flag==1的情况,即停车场车位已满无法停车。
最后,对存入的车辆赋初始时间5,并且前面的已存入的车辆时间都加5。
语句如下:for(i=0;i<12;i++){if(cars[i][0]!=0)cars[i][3]+=5;cars[i][2]+=i;}又因为我在car.dat已经对车辆的停放楼层和车位有过初始赋值,可以省去再对cars[i][1]和cars[i][2]的操作。
并且可以满足“第一层有空位必须停在第一层”的要求,不过存在一个问题就是车辆只能按车位序号停放。
(5)取车模块:第一步,读取要提取车辆的车牌号码。
再通过flag标志量对所输入车牌号正误分别处理。
(初始flag=0)2016.6 中国地质大学C语言课程设计 5 第二步,对于输入正确的车辆进行操作:删除车辆信息,再计算费用,再对时间清零并标志取车成功。
第三步,进过上一步后取车不成功时即flag还是为0时,提示重复输入车牌号直道成功为止。
程序如下:do{scanf("%d",&temp);if((temp>9999)&&(temp<100000)){for(i=0;i<12;i++)if(cars[i][0]==temp){cars[i][0]=0;cost=0.2*cars[i][3]/5;cars[i][3]=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("车牌号\t\t楼层\t 车位 \t\t时间\n");for(i=0;i<12;i++)if(cars[i][0]!=0)printf("%d\t\t %d \t\t%d\t\t %d\n",cars[i][0],cars[i][1],cars[i][2],cars[i][3]);6 (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();§1.3程序设计及代码分析程序代码如下:#include <stdio.h>#include <stdlib.h>#include<conio.h>#include<io.h>int park[12][4]; /*停车场使用数组*/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 ", &park[i][0]);fscanf(fp,"%d ", &park[i][1]);fscanf(fp,"%d ", &park[i][2]);fscanf(fp,"%d ", &park[i][3]);}2016.6 中国地质大学C语言课程设计7 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 ", park[i][0]);fprintf(fp,"%d ", park[i][1]);fprintf(fp,"%d ", park[i][2]);fprintf(fp,"%d ", park[i][3]);fprintf(fp,"\n" );}fclose(fp);}void putCar(){ /*停车操作*/ int i;int temp;int flag=1;printf("\n\n*********欢迎来到地大停车场*********\n");printf("请输入你的车牌号:");do{scanf("%d",&temp);if((temp>9999)&&(temp<100000))break;flag=0;printf("您输入的车牌号格式有误");}while(!flag);flag=0;8 for(i=0;i<12;i++){if(park[i][0]!=0)continue;park[i][0]=temp;flag=1;break;}if(flag==0){ /*没有找到位置,停车场已满*/ printf("很抱歉!车位已满:\n");return ;}for(i=0;i<12;i++){ /*所有车的停车时间一起加5*/ if(park[i][0]!=0)park[i][3]+=5;}saveAll();getchar();printf("存车成功!\n按任意键回到主菜单...");}void getCar(){ /*取车*/ int i,temp,flag=0;float cost;printf("\n\n*********从停车场取车*********\n ");printf(" 请输入你的车牌号码:");do{scanf("%d",&temp);if((temp>9999)&&(temp<100000)){for(i=0;i<12;i++)if(park[i][0]==temp){park[i][0]=0; /*删除该车位车辆信息*/cost=0.2*park[i][3]/5;park[i][3]=0;flag=1;break;2016.6 中国地质大学C语言课程设计9}}if(flag==0)printf("您输入的车牌号码有误,请重新输入。