计算机实习指导书c++_第1页
计算机实习指导书c++_第2页
计算机实习指导书c++_第3页
计算机实习指导书c++_第4页
计算机实习指导书c++_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机实习(C语言)指导书作者雷电上海大学自动化系2计算机实习指导书(C语言)学好一门编程语言,最重要的是进行大量的编程实践。通过计算机C语言实习,把已学过的编程语言知识和操作技能进行综合应用,加深对C语言的语法规范、程序结构以及编程方法和技巧的理解,培养良好的程序设计习惯,提高程序设计水平。在计算机的主流PC机上,由于Windows的广泛应用,基于Windows编程的MicrosoftVisualStudio已经成为主流,VisualC++/C#是程序员选择的主要编程工具,TurboC等PC机上的C语言编程工具已很少使用。但C语言是C++的基础,且在嵌入式系统中发挥着不可替代的作用,大量的单片机系统支持C语言编程,进行系统而扎实的C语言程序设计实习是非常重要的。考虑到这些,我们采用VisualC++6.0作为编程工具,选择编写Win32ConsoleApplication类型的C语言程序。编程环境简介打开VisualC++6.0运行选择菜单file/New...,出现一个选择界面,在Project属性页中选择Win32ConsoleApplication,然后在Projectname文本框中填入一个工程名,如Exl,在Location文本框中选择存放这一新工程的文件夹,如D:\MyProject\Ex1,此文件夹下将存放Ex1工程的所有相关文件。第2步确定后,出现一个新的选择界面,在此选择Asimpleapplication.第3步完成后,VC会为你创建Win32ConsoleApplication编程框架,在main()中可编写你的代码。(不要删除框架为你所加的代码,女冲include“StdAfx.h”)。5•编程中常常需要创建多个源文件,并添加到工程中,这可以通过选择菜单file/New...,出现一个选择界面,在File属性页中,选择C/C++HeaderFile,用于创建*.h头文件,选择C/C++SourceFile,用于创建*.c/*.cpp文件,并在File文本框中填入你想创建的文件名,0K.6.工具栏中按纽:Build(F7)编译连接,go(F5)调试运行,!(ctrl+F5)非调试运行,手插入断点。F10单步执行,F11进入函数体,ctrl+F10运行到光标处。实习内容掌握visualC++6.0控制台应用程序开发环境,掌握基本的程序调试技术。用C语言编6个简单熟悉的覆盖C语言知识的解决实际问题的应用程序.做一个较复杂的C语言应用程序设计(电梯运行系统)。每次上机,做好实习笔记,按时间按实习题目记录下实习心得,编程中的问题、经验、技术技巧.每次上机后,按工程文件夹组织保存程序代码到软盘或U盘,只要保存.c,.cpp,.h,.dsw,.dsp文件。记住:不能包含Debug子目录文件,否则太大。撰写实习报告,报告分二部分,第一部分内容为:按时间按实习题目记录整理的实习心得,编程中的问题、经验、技术技巧.第二部分是实验七的程序设计书,用框图、文字说明,写作规范见后。报告要写在正规的统一的实验报告上。实习题目实验一:计算平均成绩实验内容:输入成绩,计算并显示平均成绩。运行效果:输入3门课程的成绩:69.58090.5平均成绩:80.00退出否?y实验说明:上述显示效果中,下划线数字为用户的输入。当退出否不为y,则重复。初学C语言编程是一个充满挫折的艰难历程,特别是在使用scanf,printf进行数据的输入输出上常常容易出错,挫伤了初学者的积极性,实际上scanf已很少使用。可以使用C++的控制台输入输出流cin、cout取代scanf,printf,出错机会大为减少,而又更容易理解,cin理解为键盘,cout理解为屏幕。使用方法:1.包含iostream头文件,指定std名空间2.用〉〉从cin输入数据,用〈〈向cout输出数据显示,都不必考虑输入输出的数据类型,当同时多个数据输入时,用空格来分隔其多个数据,回车接受输入。例:#include〈iostream〉Usingnamespacestd;voidmain(){inta;cin〉〉a;/*等价scanf("%d",&i);*/cout〈〈a;/*等价printf("%d",i);*/}目的要求:熟悉控制台输入输出,for、while、do循环语句的使用。实验二:数据的不同数制显示实验内容:输入小于128的十进制整数,显示其ASCII码字符。输入十六进制整数,显示其十进制整数。输入十进制整数,显示其十六进制整数运行效果:输入小于128的十进制整数:63?输入一个字符:?63输入十六进制整数:0x1A26输入十进制整数:261A目的要求:理解数字在计算机中的表示。实验三:猜数游戏实验内容:(1)先由计算机“想”一个数请人猜,如果猜对了,则继续猜下一个数,否则计算机给出提示,告诉所猜的数是太小还是太大。(2) 当猜对或一个数猜了20次仍未猜中停止本次猜数,仍然继续猜下一个数。(3) 计算机记录猜的次数,以此来反映猜数者“猜”的水平。(4) 每次运行程序可反复猜多个数,直到操作者停止时才结束。运行效果:20太大,10太小,15太大,12对了!猜4次成功继续否?n目的要求:本实验用于循环语句、条件语句的编程练习。实验说明:随机数产生头文件stdlib.h,时间头文件time.h4始初化随机数种子srand(clock());或srand(time(NULL));实验四:兔子生崽实验内容:假设一对小兔的成熟期是一个月,即一个月可长成成兔,那么,如果每对成兔每个月都可以生一对小兔,一对新生的小兔从第二个月起就开始生兔子,试问从一对兔子开始繁殖,以后各月的可有多少对兔子?实验说明:这是13世纪意大利Fibonacci借助民间的“兔子生崽”问题引入的一个著名的递推数列即Fibonacci数列。,采用递推分析法:第0个月兔子对数f(0)=1;第1个月兔子对数f(1)=2;第2个月兔子对数f(2)=3;第n个月兔子对数f(n)=f(n-1)+f(n-2)运行效果:一对兔子开始繁殖,以后各月的兔子对数:不用子函数计算结果:123581321345589144233用子函数计算结果:123581321345589144233目的要求:体会递推算法是把科学或工程计算中数学模型转变为计算机运算模型的重要方法。掌握数组、指针的编程,求各月的有多少对兔子用或不用一个子函数实现。以后实验都必须采用模块化的程序设计方法,每个子任务对应一个子函数,完成总任务的程序由一个主函数和若干子函数组成,主函数起任务调度的总控作用。理解模块化程序设计方法,掌握函数的实现、调用编程技术。实验五:学生成绩统计实验内容:从键盘输入一个班(最多30人)的某门课程的学生成绩,当输入为负值时或已达30人时输入结束,分别统计下列内容:统计不及格人数并打印其学生名单。统计成绩在全班平均分及平均分之上的学生人数并打印其学生名单。统计各分数段的学生人数及所占百分比。运行效果:学号成绩学号成绩学号成绩学号成绩602002802003902004100200570200640200780-1-1不及格人数:1名单:2006平均分:74.3平均分及平均分之上的学生:2002,2003,2004,2007不及格:14.3%60-69分:14.3%70-79分:14.3%80-89分:28.6%90-100分:28.6%实验说明:学号、成绩输入小于0的数表示结束输入。目的要求:该实验是数组、指针、函数的综合练习,理解指针及数据在函数间传递的编程方法。实验六:学生成绩管理系统实验内容:1)选课登记动态输入学生成绩。查询学生成绩。4)修改成绩运行效果:《学生成绩管理系统》[0]新生注册选课登记学生成绩输入成绩查询修改成绩5退出命令?0学号姓名2001李1李2李3-1学生数据库共有3个个记录继续新的注册?n(注:清屏返回主采单)命令?1课程号:1001输入选择该课程的学生学号:20012002-1共有2个学生选此课程继续新的选课输入?y课程号:1002输入选择该课程的学生学号:20022003-1共有2个学生选此课程继续新的选课输入?n(注:清屏返回主采单)命令?2课程号:1001学号:2001姓名:李1成绩:80学号:2002姓名:李2成绩:901001课程成绩已输入完成继续其他课程成绩输入?y课程号:1002学号:2003姓名:李3成绩:70学号:2002姓名:李2成绩:601002课程成绩已输入完成继续其他课程成绩输入?n(注:清屏返回主采单)命令?3学号:2002姓名:李2成绩:课程号:0001成绩:90课程号:0002成绩:60继续查询?n(注:清屏并返回主采单)命令?4学号:2002课程号:0001原成绩:90成绩修改为:70继续修改?n命令:5(注:清屏并返回主采单)实验提示:1)清屏方法:包含头文件#include<stdlib.h〉调用函数system("cls");2)目的要求:本实验是较综合的实习,要求掌握结构体、指针、函数等基本知识,理解链6表的实现技术,理解模块化程序设计方法。实验七:办公楼电梯运行系统实验内容:这是一个规模稍大的软件,它是要编写一个程序,模拟办公大楼中全部电梯的工作过程。这个仿真程序可以用来改善大楼管理,它也可以看成是一种游戏程序。下面让我们对这个系统作一个初步描述:办公大楼有二十层,每层有电梯,同时有步行楼梯;全楼有不多于10部电梯可同时供使用,电梯容量为24人,速度每上下一层需5秒,其运行状态可分:向上、向下、停止,当前乘客数,当前所在层数。它设有一个“按钮数组”,例如第五层的按钮按下,意味着有乘客在第5层到达目标层,等等。在楼的每一层,有当前电梯所在楼层显示,有按钮表示有人等待向上或向下,有若干人在等待,有若干电梯在本层停下,等等。在大楼中(包括进出)的总人数不超过500人,每个人站在电梯前有个目标层,他有一个最大的忍受等待时间,因为他可以选择电梯或是步行走楼梯,等等。若干假设:在每个时间段要进大楼的人数在0~24之间随机取值;用电梯的每个人的目标层在0~19之间取值;一个人在进电梯或改走楼梯之前的等待时间在8~18秒范围内随机发生;一个人到达目标层后第二次再乘电梯中间的工作时间在40~68秒间随机取值。以及其他假设。总之,在我们设计仿真程序之前应对整个系统有个比较量化的了解,同时应对整个系统的几方面因素有一定的划分。例如,可以把整个大楼视为系统的整体,在这个系统中运行的有不同类的对象:电梯、电梯集合、人、人的集合,楼层,楼层的集合,大楼。每个对象有他的数据结构,及在此数据集上的操作(函数)。运行效果:《办公楼电梯运行系统》Floor453574109:--::::::::8:--::::::::7:--::::Dn:1:::6:-D1:::::::5:--:Up:11:Up:5:::4:--Up:9:Up:4::3:--Up:13::2:--Up:15:1:--Up:130:U-3按任意键停止实验说明:第一行数字表当前电梯位置,第一列表楼层号及上下按钮是否亮,等待人数中间区表各个电梯的运行状态(上/下、电梯中的人数)。以下所附实验七源代码是采用面向对象的程序设计思想和事件驱动技术编程的,这是当代程序设计的基本方法,望同学们详细研究,好好体会。附:实验六部分参考源代码(//{。。。//}中间的代码要求自己完成)#include"stdafx.h"#include<iostream.h>#include<stdlib.h>//链表结构head->[,->next]...[data0,->next][data1,->next]...[datan,->head]7structSCORE{intcourseId;intscore;SCORE*pnext;};structSTU_SCORE{charname[16];intstuId;SCORE*scoreHead;//学生课程成绩列表structSTU_SCORE*pnext;};intmainMenu();intstuReg(STU_SCORE*pHead);intselCourse(STU_SCORE*pHead);intinputData(STU_SCORE*pHead);intscoreSort(STU_SCORE*pHead);intscoreQuery(STU_SCORE*pHead);intmodify(STU_SCORE*pHead);enumMAIN_CMD{REG,SEL=1,INPUT,QUERY,MODI,EXIT};intmain(intargc,char*argv[]){STU_SCORE*head=(STU_SCORE*)malloc(sizeof(STU_SCORE));head->stuId=-1;head->pnext=head;while(1){intcmd=mainMenu();switch(cmd){caseREG:stuReg(head);break;caseSEL:selCourse(head);break;caseINPUT:inputData(head);break;caseQUERY:scoreQuery(head);break;caseMODI:modify(head);break;caseEXIT:8return0;}}return0;}intmainMenu(){system("cls");cout〈〈"\t\t《学生成绩管理系统》\n";cout〈〈"\t\t[0]新生注册\n";cout〈〈"\t\t[1]选课登记\n";cout〈〈"\t\t[2]学生成绩输入\n";cout〈〈"\t\t[3]成绩查询\n";cout〈〈"\t\t[4]修改成绩\n";cout〈〈"\t\t[5]退出\n";cout〈〈"命令?";intcmd;cin>>cmd;returncmd;}//新生注册:建立学生信息链表,从键盘输入学生姓名学号,插入到链表中intstuReg(STU_SCORE*pHead){cout〈〈"注意:新生注册学号不能重复!\n";start://{//oooooo//}cout〈〈"继续新的注册?";charc;cin>>c;if(c=='y'||c=='Y')gotostart;return0;}//学生选课intselCourse(STU_SCORE*pHead){start:intcid;cout〈〈〃课程号:〃;cin>>cid;cout〈〈"输入选择该课程的学生学号\n〃;intstuId;cin>>stuId;while(stuId>0){STU_SCORE*pStu=pHead->pnext;9while(pStu!二pHead)//链表已有记录{f(pStu-〉stuld==stuld)//有该学号{boolbe=false;SCORE*pcourse=pStu-〉scoreHead-〉pnext;while(pcourse!=pStu-〉scoreHead)//已有选课{if(pcourse-〉courseId==cid){be二true;////已有该选课break;}pcourse=pcourse-〉pnext;}if(!be){//还没有选此课程SCORE*pNewcourse=(SCORE*)malloc(sizeof(SCORE));//{//。。。。。。插入到选课链的头节点后//}}}pStu=pStu->pnext;}cin>>stuId;}intcount=0;STU_SCORE*pStu=pHead->pnext;while(pStu!二pHead)//链表已有记录{SCORE*pcourse=pStu->scoreHead->pnext;while(pcourse!=pStu->scoreHead){if(pcourse->courseId==cid){count++;}pcourse=pcourse->pnext;}pStu=pStu->pnext;}cout〈〈"共有"〈〈count〈〈"个学生选此课程\n";cout〈〈〃继续新的选课输入?〃;charc;cin>>c;if(c=='y'||c=='Y')gotostart;return0;10}//学生成绩输入intinputData(STU_SCORE*pStuHead){intcount;start:count=0;cout〈〈〃课程号:〃;intcid;cin>>cid;STU_SCORE*pStu=pStuHead->pnext;while(pStu!二pStuHead)//if链表已有学生记录{SCORE*pcourse=pStu->scoreHead->pnext;while(pcourse!=pStu->scoreHead){if(pcourse->courseId==cid){cout〈〈"学号:"〈〈pStu-〉stuld〈〈"姓名:"〈〈pStu-〉name;cout<<"成绩:";if(pcourse-〉score〉=0)cout〈〈"已输入";else{cin〉〉pcourse-〉score;count++;}break;}pcourse=pcourse-〉pnext;}pStu=pStu-〉pnext;}if(count==0)cout〈〈"该课程无学生选!\n";elsecout〈〈cid〈〈〃课程成绩已输入完成!〃〈〈〃\n〃;cout〈〈〃继续其他课程成绩输入?〃;charc;cin〉〉c;if(c=='y'||c=='Y')gotostart;return0;}//课程成绩查询intscoreQuery(STU_SCORE*pStuHead){//{//。。。。。。11//}return0;}//课程成绩修改modify(STU_SCORE*pStuHead){//{//。。。。。。//}return0;}附:实验七源代码////////////Ex7.cpp/////////////////#include"stdafx.h"#include"大楼.h"#include"Timer1.h"intmain(intargc,char*argv[]){iniTimer();initBuilder();timerRun();return0;}/////////////////////////////stdafx.h/////////////////////////////////////stdafx.h:includefileforstandardsystemincludefiles,//orprojectspecificincludefilesthatareusedfrequently,but//arechangedinfrequently//#if!defined(AFX_STDAFX_H__EED464F0_F241_47EA_87DA_8C5457EE1D58__INCLUDED_)#defineAFX_STDAFX_H__EED464F0_F241_47EA_87DA_8C5457EE1D58__INCLUDED_#if_MSC_VER>1000#pragmaonce#endif//_MSC_VER>1000//TODO:referenceadditionalheadersyourprogramrequireshere#include<stdio.h>#include<stdlib.h>#include<time.h>#include<assert.h>//{{AFX_INSERT_LOCATION}}12//MicrosoftVisualC++willinsertadditionaldeclarationsimmediatelybeforethepreviousline.#endif//!defined(AFX_STDAFX_H__EED464F0_F241_47EA_87DA_8C5457EE1D58__INCLUDED_)///////////////////////////Timer1.h//////////////////////////////////#ifndef_TIMER1_H#define_TIMER1_H#include<time.h>typedefvoid(*TimerHandle)(void*sink,time_tt);/定/时器时间到事件处理函数说明externintdone;voidiniTimer();//初始化定时器voidtimerRun();//定时器运行//创建定时器,返回定时器ID,sink:接收定时器事件的对象intsetTimer(void*sink,intdt,TimerHandletimerHandleFunc);intkillTimer(intTimerID);//删除定时器#endif///////////////////////////大楼.h//////////////////////#ifndef_BUILDING_H#define_BUILDING_H#include"模拟.h"#include"人.h"#include"电梯.h"structFloor{boolup;//上按钮booldown;//下按钮PersonNode*pWaiting;//等电梯人列表PersonNode*pInFloor;//在本楼办公人员列表};structBuilding{Floorfloors[MAXFLOORS];Elevatorelevators[MAXELEVS];PersonNode*ptookStair;//走楼人列表inttotalPeople;//楼内总人数inttimerID;};voidinitBuilder();voidPushFloorButton(PersonNode*);voidwaitElev(boolwait,PersonNode*one);voidtakeStair(boolgo,PersonNode*one);13voidintoOffice(boolwork,PersonNode*one);voidOnElevStoped(Elevator*elev,intfloor);externBuildingbuilding;#endif////////////////////电梯.h////////////////////////////////////////#ifndef_ELEV_H#define_ELEV_HenumDirection{DOWN=-1,NODIRECTION=0,UP=1};structPersonNode;structElevator{intelevNumber;//本电梯号intfloorNumber;//当前楼层号boolruning;//是否正在Directiondir;boolbuttons[MAXFL00RS];//电梯内按钮inttimerID;PersonNode*inList;};typedefvoid(*ElevArrivedHandle)(void*sink,Elevator*elev);voidPushClose(Elevator*elev);boolRequestDn(Elevator*elev);boolRequestUp(Elevator*elev);boolRequestOpen(Elevator*elev);voidRun(Elevator*elev);voidOnArrived(Elevator*p);#endif//////////////////模拟.h////////////////////////////////////////#ifndef.SIMULATION」#define_SIMULATION_H#defineMAXELEVS7//电梯数#defineMAXFLOORS20//楼层数#defineMAXPERSONS500//最多人数#defineCAPACITY24//电梯容量#defineTRAVELTINE2//层间运行时间#defineMAXWAITTIME(5*TRAVELTINE)//最大等待时间intNewPersons();//每次进入大楼人数intBusinessT();//连续工作时间intWaitingForElevT();//可等待时间intDestFloor();//确定目标层14#endif///////////////////////人.h///////////////////////////#ifndef_PERSON_H#define_PERSON_H//#include"电梯.h"//#include"大楼.h"structElevator;enumPersonState{waitingForElev,//等待电梯elevNowIn,//在电梯中officeIn,//在办公takingStairs,//走楼梯outside};structPersonNode{PersonStatestate;intfloorNowOn;//所在楼层intdestination;//目标楼层inttimeID;//PersonNode*next;};voidEnterBuilding(PersonNode*p);//进入大楼voidOnElevtArrived(Elevator*elev,PersonNode*passengers);//passenger,电梯到达了voidOnElevtCome(Elevator*elev,PersonNode*waitPerson);//waitPerson,电梯到了voidOnTimer(void*person,time_tt);//person,定时到了boolIntoElev(boolin,PersonNode*one,Elevator*elev);//进出电梯PersonNode*delPerson(PersonNode*head,PersonNode*one);//从队列删除onePersonNode*addPerson(PersonNode*head,PersonNode*one);//one加入到队列intgetPersonNum(PersonNode*head);#endif///////////////////////Timer1.cpp///////////////////////////////////#include"stdafx.h"#include<time.h>#include<conio.h>#include<stdlib.h>#include"Timer1.h"intTIMERNUM=3;//定时器数intdone=0;structSTimer{15inttimerID;void*sink;TimerHandleOnTimer;//obj对象的函数intisUsing;clock_tstartT;longdt;};STimer*timers;//[TIMERNUM];voidiniTimer(){timers=(STimer*)malloc(TIMERNUM*sizeof(STimer));inti;for(i=0;i<TIMERNUM;i++)timers[i].isUsing=0;}voidtimerRun(){inti;charc=0;clock_tcurrT;while(!c){currT=clock();for(i=0;i<TIMERNUM;i++){if(timers[i].isUsing){clock_tendT=timers[i].startT+timers[i].dt;if(currT>=endT){timers[i].OnTimer(timers[i].sink,time(NULL));timers[i].startT=currT;}}}c=_kbhit();}}intkillTimer(intTimerID){if(TimerID>0&&TimerID<=TIMERNUM){timers[TimerID-1].isUsing=0;returnTimerID;}16return0;}intsetTimer(void*sink1,intdt,TimerHandletimerHandleFunc){inti;for(i=0;i<TIMERNUM;i++){if(timers[i].isUsing==0){timers[i].sink=sink1;timers[i].isUsing=1;timers[i].timerID=i+1;timers[i].OnTimer=timerHandleFunc;timers[i].startT=clock();timers[i].dt=dt;returni+1;}}//定时器不够,再分配。#defineGROWN3TIMERNUM=TIMERNUM+GROWN;timers=(STimer*)realloc(timers,TIMERNUM*sizeof(STimer));timers[i].sink=sink1;timers[i].isUsing=1;timers[i].timerID=i+1;timers[i].OnTimer=timerHandleFunc;timers[i].startT=clock();timers[i].dt=dt;for(i=i+1;i<TIMERNUM;i++)timers[i].isUsing=0;returni+1;}/////////////////大楼.cpp///////////////////////#include"stdafx.h"#include<Windows.h>#include"大楼.h"#include"Timer1.h"Buildingbuilding;voiddisplay(void*sink,time_tt);voidOnEnterBuilding(void*sink,time_tt){intn=NewPersons();inti;for(i=0;i<n;i++){PersonNode*p=(PersonNode*)malloc(sizeof(PersonNode));building.totalPeople+=1;17EnterBuilding(p);}}voidinitBuilder(){inti;building.ptookStair=0;building.totalPeople=0;for(i=0;i<MAXELEVS;i++){building.elevators[i].elevNumber=i;building.elevators[i].floorNumber=0;building.elevators[i].runing=false;building.elevators[i].dir=NODIRECTION;building.elevators[i].inList=0;building.elevators[i].timerID=0;}for(i=0;i<MAXFLOORS;i++){building.floors[i].pInFloor=0;building.floors[i].pWaiting=0;}building.timerID=setTimer(0,2000,OnEnterBuilding);setTimer(0,1000,display);}voidwaitElev(boolwait,PersonNode*one){intfloor=one->floorNowOn;if(wait){PushFloorButton(one);building.floors[floor].pWaiting=addPerson(building.floors[floor].pWaiting,one);inti;for(i=0;i<MAXELEVS;i++){if(!building.elevators[i].runing&&building.elevators[i].floorNumber==floor){//电梯已停在此,通知等候乘客OnElevtCome(&building.elevators[i],building.floors[floor].pWaiting);}}}else{18building.floors[floor].pWaiting=delPerson(building.floors[floor].pWaiting,one);}}voidPushFloorButton(PersonNode*one){assert(one->state==waitingForElev);intfloor=one->floorNowOn;assert(one->destination!=floor);if(one->destination>floor)building.floors[floor].up=true;elsebuilding.floors[floor].down=true;}voidintoOffice(boolwork,PersonNode*one){intfloor=one->floorNowOn;PersonNode*head=building.floors[floor].pInFloor;if(work)building.floors[floor].pInFloor=addPerson(head,one);elsebuilding.floors[floor].pInFloor=delPerson(head,one);}voiddisplay(void*sink,time_tt){inti;chars[1000];charszNum[10];HANDLEhandle;sprintf(s,"\t\t\t《办公楼电梯运行系统》\n");strcat(s,"Floor");for(i=0;i<MAXELEVS;i++){//当前电梯所在楼层strcat(s,"\t");intf=building.elevators[i].floorNumber;sprintf(szNum,"%d",f);strcat(s,szNum);}for(i=MAXFLOORS-1;i>=0;i--){strcat(s,"\n");sprintf(szNum,"%d",i);strcat(s,szNum);//strcat(s,":");19if(building.floors[i].up)strcat(s,"U");elsestrcat(s,"-");if(building.floors[i].down)strcat(s,"D");elsestrcat(s,"-");intn=getPersonNum(building.floors[i].pWaiting);if(n==0)sprintf(szNum,"");elsesprintf(szNum,"%d",n);strcat(s,szNum);strcat(s,"\t");for(intj=0;j<MAXELEVS;j++){f(building.elevators[j].floorNumber〈i)//电梯在该楼以下strcat(s,":\t");elseif(building.elevators[j].floorNumber==i)//elevS[j]->floorNumber==i){if(building.elevators[j].dir==UP)//elevS[j]->dir==UP)strcat(s,"Up");elseif(building.elevators[j].dir==DOWN)strcat(s,"Dn");elsestrcat(s,"");intpn=getPersonNum(building.elevators[j].inList);sprintf(szNum,"%d",pn);strcat(s,szNum);strcat(s,"\t");}else{strcat(s,"\t");}}}strcat(s,"\n");strcat(s,"楼内总人数:");sprintf(szNum,"%d",building.totalPeople);strcat(s,szNum);strcat(s,"走楼梯人数:");intn=getPersonNum(building.ptookStair);sprintf(szNum,"%d",n);strcat(s,szNum);strcat(s,"电梯平均人数:");intk;20n=0;for(k=0;k〈MAXELEVS;k++){n+=getPersonNum(building.elevators[k].inList);}sprintf(szNum,"%d\n",n/MAXELEVS);strcat(s,szNum);strcat(s,"按任意键结束.");handle=GetStdHandle(STD_OUTPUT_HANDLE);COORDpos={0,0};SetConsoleCursorPosition(handle,pos);DWORDdw;WriteConsole(handle,s,strlen(s),&dw,0);}boolIntoElev(boolin,PersonNode*one,Elevator*elev){if(in){//进入电梯//intfloor=one->floorNowOn;elev->inList=addPerson(elev->inList,one);elev->buttons[one->destination]=true;//按目标层returntrue;}else{//出电梯elev->inList=delPerson(elev->inList,one);returntrue;}}voidtakeStair(boolgo,PersonNode*one){//intfloor=one->floorNowOn;if(go){//走楼building.ptookStair=addPerson(building.ptookStair,one);}else{//到达building.ptookStair=delPerson(building.ptookStair,one);}}///////////////////电梯.cpp///////////////////////////////////////////#include"stdafx.h"#include"Timer1.h"#include"大楼.h"21voidOnElevTimer(void*sink,time_tt){Elevator*p=(Elevator*)sink;if(p->runing){if(p->dir==UP){if(p->floorNumber<MAXFLOORS-1)p->floorNumber+=1;assert(p->floorNumber<MAXFLOORS);if(p->buttons[p->floorNumber]||RequestOpen(p)){killTimer(p->timerID);p->timerID=0;p->runing=false;OnArrived(p);}}elseif(p->dir==DOWN){if(p->floorNumber>0)p->floorNumber-=1;if(p->buttons[p->floorNumber]||RequestOpen(p)){killTimer(p->timerID);p->timerID=0;p->runing=false;OnArrived(p);}}}}voidOnArrived(Elevator*p){intfloor=p->floorNumber;p->buttons[floor]=false;if(floor>=MAXFLOORS-1)p->dir=DOWN;//NODIRECTION;if(floor<=0)p->dir=UP;//NODIRECTION;OnElevtArrived(p,p->inList);OnElevStoped(p,floor);//通知楼层,电梯已停在此Run(p);}voidRun(Elevator*elev){22if(elev->runing)return;booldirUp=RequestUp(elev);//false;booldirDn=RequestDn(elev);//false;if(elev->dir==UP){if(!dirUp){if(dirDn)elev->dir=DOWN;elseelev->dir=NODIRECTION;}}elseif(elev->dir==DOWN){if(!dirDn){if(dirUp)elev->dir=UP;elseelev->dir=NODIRECTION;}}else{if(dirDn)elev->dir=DOWN;elseif(dirUp)elev->dir=UP;//;}intdt=1000*TRAVELTINE;//层间运行时间if(elev->dir!=NODIRECTION){elev->runing=true;assert(elev->timerID==0);elev->timerID=setTimer(elev,dt,OnElevTimer);}}voidPushClose(Elevator*elev){Run(elev);}boolRequestOpen(Elevator*elev){intf=elev->floorNumber;if(building.floors[f].down||building.floors[f].up)returntrue;returnfalse;}23boolRequestUp(Elevator*elev)//是否有请求电梯向上{inti;for(i=elev->floorNumber+1;i<MAXFLOORS;i++){if(elev->buttons[i]){returntrue;}if(building.floors[i].down)returntrue;}returnfalse;}boolRequestDn(Elevator*elev)//是否有请求电梯向下{inti;for(i=elev->floorNumber-1;i>=0;i--){if(elev->buttons[i]){returntrue;}if(building.floors[i].up)returntrue;}returnfalse;}voidOnElevStoped(Elevator*elev,intfloor){if(elev->dir==UP)building.floors[floor].up=false;elseif(elev->dir==DOWN)building.floors[floor].down=false;//通知等待人OnElevtCome(elev,building.floors[floor].pWaiting);}/////////////////////////模拟.cpp///////////////////////#include"stdafx.h"#include"大楼.h"intNewPersons()//每次进入大楼人数{intn=(MAXPERSONS-building.totalPeople);if(n<=0)return0;n=rand()%8;returnn;}24intBusinessT(){return40+(rand()%18);//连续工作时间}intWaitingForElevT(){return8+(rand()%MAXWAITTIME);//等待时间}intDestFloor()//确定目标层{returnrand()%(MAXFLOORS-1);}//////////////////////人.cpp///////////////////////////////////////////#include"stdafx.h"#include〈stdlib.h〉#include"Timer1.h"#include"大楼.h"voidEnterBuilding(PersonNode*p){p-〉floorNowOn=0;p-〉destination=DestFloor();if(p-〉destination!=0){p-〉state=waitingForElev;intdt=WaitingForElevT()*1000;p-〉timeID=setTimer(p,dt,OnTimer);waitElev(true,p);//开始等候}}voidOnTimer(void*sender,time_tt){PersonNode*p=(PersonNode*)sender;killTimer(p-〉timeID);p-〉timeID=0;if(p-〉state==officeIn){//下班或到其他楼p-〉destination=DestFloor();if(p-〉floorNowOn==p-〉destination)return;intoOffice(false,p);//leaveOffice(p);p->state=waitingForElev;waitElev(true,p);//PushFloorButton(p);//开始等候电梯intdt=1000*WaitingForElevT();assert(p->timeID==0);p->timelD二setTimer(p,dt,OnTimer);//等时间25}elseif(p->state==takingStairs){//到达p->state=officeIn;p->floorNowOn=p->destination;takeStair(false,p);intoOffice(true,p);intdt=1000*BusinessT();assert(p->timeID==0);p->timeID=setTimer(p,dt,OnTimer);//办公时间}elseif(p->state==waitingForElev){p->state=takingStairs;waitElev(false,p);takeStair(true,p);}}voidOnElevtCome(Elevator*elev,PersonNode*persons){//persons等电梯的人PersonNode*p=persons;assert(elev->runing==false);//intn=getPersonNum(persons);boolinto=false;PersonNode*pnext=0;while(p){assert(p->state==waitingForElev);intpassengers=getPersonNum(elev->inList);if(passengers>=CAPACITY)//elev->{PushFloorButton(p);//乘客已满,再请求break;//}Directiondir=p->destination>p->floorNowOn?UP:DOWN;if(dir==elev->dir||elev->dir==NODIRECTION){pnext=p->next;killTimer(p->timeID);p->timeID=0;waitElev(false,p);into=IntoElev(true,p,elev);p->state=elevNowIn;p=pnext;continue;}p=p->next;26}if(into)//有人进入PushClose(elev);}voidOnElevtArrived(Elevator*elev,PersonNode*persons){//persons电梯中的人PersonNode*p=persons;while(p){assert(p->state==elevNowIn);PersonNode*pnext=0;if(p->destination==elev->floorNumber){pnext=p->next;IntoElev(false,p,elev);//elev->inList=delPerson(elev->inList,p);p->state=officeIn;p->floorNowOn=p->destination;intoOffice(true,p);//去办公intdt=1000*BusinessT();assert(p->timeID==0);p->timeID=setTimer(p,dt,OnTimer);//办公时间p=pnext;continue;}p=p->next;}}PersonNode*addPerson(PersonNode*head,PersonNode*one){PersonNode*p=head;one->next=0;if(p==0){p=one;returnp;}while(p->next!=0){p=p->next;}p->next=one;returnhead;}27intgetPersonNum(PersonNode*head){intcount=0;PersonNode*p=head;while(p){count++;p=p->next;}returncount;}PersonNode*delPerson(PersonNode*head,PersonNode*one){if(head==one){returnhead->next;}PersonNode*p=head;while(p->next!=one&&p->next!=0)p=p->next;if(p->next==one){p->next=one->next;}returnhead;}//注:assert函数用于调试,在调试版本运行中,测试表达式是否为true,是继续运行,否终止运行在该处,于是可检查各运行变量,发现错误的原因。//////////////////////////////////////////////////////////////////////////////////实习报告规范每个实验题包括2部分报告,规范如下第一部分编程笔记规范一.遇到的主要问题及采取的解决措施二.编程中经验、技术技巧。三.测试结果的分析与讨论.第二部分程序设计报告规范一.需求分析定义问题,不考虑如何实现、不考虑如何编程,描述系统的功能,系统操作规范,业务28逻辑等。二.界面设计描绘用户与系统交互的界面,及使用方法。(本书已有描述,可省或不写)三.数据、函数设计1.定义数据结构定义数据类型,数据间关系,说明数据含义。2.定义函数定义函数返回类型,函数名,函数参数。描述函数功能,参数含义,调用函数的条件,和调用前后状态的变化。四.函数设计方法、技巧、控制流程图。1.描述完成一个函数所需要的活动,即流程图。2.描述对象的状态迁移过程中的动作、事件。3.描述对象间交互行为中,各函数被调用的先后顺序(时序)。4.描述完成一个函数的编程技术。五.描述对象间的关系。整体和部分关系、拥有归属关系、父子关系等。办公楼电梯运行系统UML设计对象类别:主要有:人、电梯、大楼、定时器它们的属性、行为学生自己分析。系统状态图进入/Set等待Timer()等待电梯进入/Push电梯Button()乘电梯[方向=目标方向]在目标楼层/到达进入/Kill等待Timer(),Set走楼Timer()走楼梯[目标!=底楼]/进入大楼[下班且在底楼]进入/Set办公Timer()办公//////////////////////////////////////////////////////

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论