学生成绩管理数据结构课程设计报告

时间:2019-05-14 02:45:12下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《学生成绩管理数据结构课程设计报告》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《学生成绩管理数据结构课程设计报告》。

第一篇:学生成绩管理数据结构课程设计报告

学生成绩管理系统 数据结构课程设计

一、课程设计的内容与目的

利用所学数据结构理论知识完成“学生成绩管理系统”的设计。

通过课程设计提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。具体包括:

了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力; 初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能; 提高综合运用所学的理论知识和方法独立分析和解决问题的能力;

训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。

二、课程设计的要求与数据 1.系统功能需求分析:

1、输入功能:可以输入40位同学信息

2、增加功能,能增加学生的信息

3、浏览功能:完成对全部学生记录浏览

4、查询功能:采用散列查找完成按学号查找学生记录

5、排序功能:采用直接选择排序,将学生平均成绩从低到高排序输出

6、删除功能:可以删除学生信息

7、修改功能:可以对学生信息的各项信息进行修改

8、插入功能:完成数据的插入

9、统计功能:统计出各分数段学生人数(60分以下,60~70,71~80,...)

2.存储结构设计分析:

3.学生的信息:学生的信息采用结构体类型定义,每个元素表示一个学生的信息,包括学号,姓名及数据结构平均成绩4个数据项:

(1)struct student {char num[11];char name[20];int score[8];float ave;}stu[N];(2)散列表的结点类型定义:

typedef struct node {unsigned long int key;struct node * link;}HNode;3.源程序如下: #include #include #include /*控制学生记录的容量*/ #define N 40 #define PR printf(“nr%s %s %s %s %s %s %s %s %s %s %s ”,stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].score[3],stu[i].score[4],stu[i].score[5],stu[i].score[6],stu[i].score[7],stu[i].score[8],stu[i].ave)struct student {char num[11];char name[20];int score[8];float ave;}stu[N];typedef struct node {unsigned long int key;struct node * link;}HNode;typedef struct{int key;/*排序码*/ float data;/*其他数据项*/}RecNode;/*全新保存函数*/ save(int n)/*保存函数,保存n个记录*/ {FILE *fp;int i;if((fp=fopen(“sc.txt”,“wb”))==NULL)/*以输出打开方式,在此前的记录被覆盖*/ {printf(“n不能打开文件n”);getch();return NULL;} for(i=0;i'9')/*判断学号是否为数字*/ {puts(“Input error!Only be made up of(0-9).Please reinput!n”);w1=1;break;} if(w1!=1)for(k=0;knn 1).学号 2.姓名 3).英语 4).数学n 5).C语言 6).管理学 7).信检 8).体育 9).近代史n 10).线性代数 11).all score 12).all data 13).cancel and back”);printf(“请选择: [ ]bb”);scanf(“%d”,&c);if(c>13||c<1){puts(“n选择错误!重新选择!”);/*判断选择是否错误,若是则重新选择性*/ getchar();/*当输入是字符时可以防止死循环*/ } } while(c>13||c<1);do {switch(c)/*选择要修改的项目*/ {case 1:no_input(i,n);break;/*调用学号输入函数*/ case 2:printf(“姓名:”);scanf(“%s”,stu[i].name);break;case 3:printf(“英语:”);scanf(“%d”,&stu[i].score[0]);break;case 4:printf(“数学:”);scanf(“%d”,&stu[i].score[1]);break;case 5:printf(“C语言:”);scanf(“%d”,&stu[i].score[2]);break;case 6:printf(“管理学:”);scanf(“%d”,&stu[i].score[3]);break;case 7:printf(“:信检”);scanf(“%d”,&stu[i].score[4]);break;case 8:printf(“体育:”);scanf(“%d”,&stu[i].score[5]);break;case 9:printf(“近代史:”);scanf(“%d”,&stu[i].score[6]);break;case 10:printf(“线性代数:”);scanf(“%d”,&stu[i].score[7]);break;case 11:score_input(i);break;/*调用分数输入函数*/ case 12:input(i);break;/*调用输入整条学生记录*/ case 13:teacher();/*直接返回教师介面*/ } if(c>2&&c<10)average(i);/*调用求平均值函数*/ puts(“nNow:n”);printf_face();/*调用显示数据结构项目函数*/ printf_one(i);/*修改后的记录让用户确认*/ printf(“n是否确定?nnt1).确定 2).重新修改 3).不保存返回 [ ]bb”);/*是否确定*/ scanf(“%d”,&w1);/*选择2则表示这次修改错误要重新修改*/ } while(w1==2);return(w1);/*返回控制值*/ } /****************输入模块****************/ enter()/*输入模块*/ {int i,n;printf(“输入学生总数(0-%d)?:”,N);scanf(“%d”,&n);/*要输入的记录个数*/ printf(“n现在输入数据nn”);for(i=0;ikey=k;p->link=NULL;t[i]=p;printf(“n inserted %lun ”,k);return(1);} else {p=t[i];while(p!=NULL)if(p->key==k){printf(“n retrieval %lun ”,k);return(0);} else if(p->link!=NULL)p=p->link;else{p->link=(HNode*)malloc(sizeof(HNode));p=p->link;p->key=k;p->link=NULL;printf(“n inserted %lun ”,k);return(1);getch();} } }

HNode *linksearch(HNode *t[],char k){/*在用拉链法处理冲突的散列表t中查找关键字为给定值k的记录*/ HNode *p;int i;i=h(k);if(t[i]==NULL)return(NULL);p=t[i];while(p!=NULL)if(p->key==k){printf(“%lun”,p->key);return(p);} else p=p->link;return(NULL);} search()/*查找模块*/ {int i,n,k,w1=1,w2,w3,w4;struct student s;n=load();do {do {k=-1;printf(“nn输入查找学号!NO.:”);scanf(“%s”,s.num);/*输入要修改的数据的学号*/ printf_face();/*调用显示数据结构项目函数*/ for(i=0;ij;i--)if(stu[i].ave>stu[i-1].ave){s=stu[i-1];stu[i-1]=stu[i];stu[i]=s;} save(n+1);printf_back();} else if(c!=2)teacher();} while(c==2);} /****************排序模块(按平均成绩)****************/ void sift(RecNode r[],int t,int w)/*用筛选法调整堆*/ {int i,j;RecNode x;i=t;x=r[i];j=2*i+1;while(j<=w){if((jr[j+1].key))j++;if(x.key>r[j].key){r[i]=r[j];i=j;j=2*j+1;} else break;} r[i]=x;}

void heapsort(RecNode r[],int n)/*堆排序*/ {int i;RecNode x;for(i=n/2-1;i>=0;i--)sift(r,i,n-1);for(i=n-1;i>0;i--){x=r[0];r[0]=r[i];r[i]=x;sift(r,0,i-1);} } /****************排序模块(按平均成绩)****************/ order()/*排序模块(按平均成绩)*/ {int i,j,k,n;struct student s;n=load();for(i=0;i

/*****************统计模块*******************/ void fenduantongji(){ int k,u,n,i,j,w1=1,w2;int a,b,c,d,e;a=0;b=0;c=0;d=0;e=0;printf(“ 1.英语 2.数学 3.C语言 4.管理学 5.信检 6.体育 7.近代史 8.线性代数 9.平均分n”);printf(“请输入要统计的科目:”);scanf(“%d”,&u);if(u<=8){n=u;for(i=0;i=90)a=a+1;else if(k<90&&k>=80)b=b+1;else if(k<80&&k>=70)c=c+1;else if(k<70&&k>=60)d=d+1;else if(k<60)e=e+1;}}} else {n=u;for(i=0;i=90)a=a+1;else if(k<90&&k>=80)b=b+1;else if(k<80&&k>=70)c=c+1;else if(k<70&&k>=60)d=d+1;else if(k<60)e=e+1;} } } printf(“学生成绩在 90~100 间有:n %dn”,a);printf(“学生成绩在 80~89 间有 :n %dn”,b);printf(“学生成绩在 70~79 间有 :n %dn”,c);printf(“学生成绩在 60~69 间有 :n %dn”,d);printf(“低于60的有:n %dn”,e);printf(“n是否继续?nnt1).是 2).否 [ ]bb”);scanf(“%d”,&w1);

if(w1==1)fenduantongji(w1);else teacher();} /****************教师界面****************/ teacher()/*教师界面*/ {int n,w1;do {system(“cls”);/*清屏*/ puts(“tt*********************MENU*********************nn”);puts(“tttt1.输入新数据”);puts(“tttt2.添加数据”);puts(“tttt3.修改数据”);puts(“tttt4.删除数据”);puts(“tttt5.浏览全部”);puts(“tttt6.学号查询”);puts(“tttt7.插入数据”);puts(“tttt8.按平均分排序”);puts(“tttt9.分段统计”);puts(“tttt10.退出”);puts(“tttt11.返回主界面”);puts(“nntt**********************************************n”);printf(“请选择序号:(1-11): [ ]bb”);scanf(“%d”,&n);if(n<1||n>11)/*对选择的数字作判断*/ {w1=1;getchar();} else w1=0;} while(w1==1);/*选择功能*/ switch(n){case 1:enter();break;/*输入模块*/ case 2:add();break;/*追加模块*/ case 3:modify();break;/*修改模块*/ case 4:del();break;/*删除模块*/ case 5:browse();break;/*浏览模块*/ case 6:search();break;/*查找模块*/ case 7:insert();break;/*插入模块*/ case 8:order();break;/*排序模块*/ case 9:fenduantongji();break;/*统计模块*/

case 10:exit(0);/*退出*/ case 11:menu();/*返回主界面*/ getch();} } /****************密码函数****************/ distin()/*密码函数*/ { int f;char mima[]={“gdut09”};char mi[6];printf(“输入密码:”);scanf(“%s”,mi);if(strcmp(mima,mi)==0){ teacher();} else

{ printf(“密码错误!n”);printf(“nn请选择:nt1).目录 2).退出 [ ]bb”);scanf(“%d”,&f);switch(f){ case 1: menu();break;case 2: exit(0);break;} } } /****************学生界面****************/ st()/*学生界面*/ {int i,n,k,w1=1,w2,w3,w4;struct student s;n=load();do {system(“cls”);do {k=-1;printf(“nn请输入学号 NO.:”);scanf(“%s”,s.num);printf_face();for(i=0;i

case 1: distin();break;case 2: st();break;case 3: exit(0);break;} } }

/*****************主函数****************/ main(){menu();getch();}

三、实验结果和数据处理: 1.、运行该程序,初始界面为欢迎界面:

2、输入数字1,按enter后,然后输入密码gdut09,进入教师菜单:

3、教师界面:

4、输入1,选择输入功能,再输入3个学生信息:

5、输入1,浏览全部数据:

6、返回教师界面,输入3,进行修改:

7、返回教师界面,输入2,进行追加数据

8、返回教师界面,输入4,进行删除数据:

9、返回教师界面,输入5,进行浏览:

10、返回教师界面,输入6,进行查找:

11、返回教师界面,输入7,进行插入数据:

12、进入教师界面后,输入进行按平均成绩(从小到大)排序:

13、在教师界面输入9,完成分段统计功能:

14、返回主界面,输入2,进入学生界面,按学号进行查找学生成绩:

四、参考文献:

《数据结构 C语言》 严蔚敏 清华大学出版社

《c语言程序设计》 谭浩强 清华大学出版社 《数据结构》 高教出版社

《数据结构习题》 李春保 清华大学出版社 《数据结构习题》 严蔚敏 清华大学出版社 《c语言与数据结构》 王立柱 清华大学出版社

《数据结构(C语言篇)习题与解析)李春葆 清华大学出版社

五、总结:

通过这次的课程设计,做一个程序设计,真的不容易。很多都不懂得怎么去做,虽然最后做完了这个课程设计,但是有些并不能满足老师的要求,而且因为有很多不懂的地方,所以发了很多时间去看书及请教同学。虽然不能说这个程序是完全自己做的,但是我也有很认真的去寻找错误并修改。我觉得这次自己也有一点点进步的,当自己发现了错误,会修改了也是一种进步吧。看到自己进步,其实也挺欣慰的,至少努力没白费,还是学到了一点知识的。就像我知道了怎样返回某些函数。

开始的时候本来是想要用堆排序进行学生平均分排序,可是做了很久,又问同学,最后还是不会做,虽然在懂堆排序,却不会用。所以只好用直接选择排序。而在分段统计中,原来有很多错误,不明确。之后我跟同学就把它改成按科目及平均分来统计,可是看了很久,改了很多次,其他分数段的没有错误,但是在60分以下的统计却不能实现,不知道该怎样去改。

第二篇:数据结构课程设计-学生成绩名次表

数据结构课程设计-学生成绩名次表

问题描述:建设一个年级(M个班)的学生参加某门课程的考试,每个班最多有N个学生,请输出各班的成绩名次表(M个)、以班级为单位的成绩名次表(1个)、以及以年级为单位的成绩名次表(1个)。

设计要求:

1.功能:每个班级的学生记录按学号顺序排列,每个学生记录至少包含排列名次、学号、成绩3个字段。

2.输入:随机产生M*N个成绩。3.输出:

(1)输出每个班级的成绩名次表,具有相同成绩的名次相同;(2)输出以班级为单位的成绩名次表。

(3)输出以年级为单位的成绩名次表,具有相同成绩的名次相同。

#include #include #include #include #define MAX1 5 #define MAX2 15 typedef struct student {

int num;//学号

int score;//成绩

}DataType1;//学生结点信息 typedef struct banji { DataType1 *data;char classname[10];//班级名称

int classnum;//班级人数 }Stu;//班级结点信息

int M;int Create(Stu S[MAX1][MAX2],int N){

int V;

int i,j,k;srand(time(NULL));

printf(“请输入你创建多少个年级:”);

scanf(“%d”,&M);

printf(“请输入你创建的一个年级有多少个班:”);

scanf(“%d”,&N);

for(i=0;i

for(j=0;j

{

printf(“---------------------创建第%d个年级第%d个班级的信息--------n”,i+1,j+1);

printf(“请输入第%d个年级第%d个班级的名称:”,i+1,j+1);

scanf(“%s”,S[i][j].classname);

printf(“请输入第%d个年级第%d个班级的人数:”,i+1,j+1);

scanf(“%d”,&V);

S[i][j].data=(DataType1 *)malloc(sizeof(DataType1)*V);

getchar();

S[i][j].classnum=V;

for(k=0;k

{

int x=S[i][j].data[k].num=(i+1)*1000+(j+1)*100+k;

printf(“产生该班第%d个学生的学号:%dn”,k+1,x);

int y=S[i][j].data[k].score=rand()%5+95;

printf(“随机产生该班该学生的成绩:%dn”,y);

}

} }

return N;

}

int classorder(Stu S[MAX1][MAX2], int N)//查询每个班级的成绩名次表 { int x,y,i,j,V,k,p=0;DataType1 temp;char b[10];printf(“请输入你要查询班级的名称:”);scanf(“%s”,b);

for(x=0;x

for(y=0;y

{

if(strcmp(S[x][y].classname,b)==0)

goto OK;

if(x==M-1&&y==N-1)

{

printf(“你查找的班级不存在!n”);

return-1;

}

} } OK: V=S[x][y].classnum;

for(i = 0;i

for(j = i+1;j

{

if(S[x][y].data[i].score< S[x][y].data[j].score)

{

temp = S[x][y].data[i];

S[x][y].data[i] =S[x][y].data[j];

S[x][y].data[j] = temp;

}

}

printf(“%d班排名:n学号t成绩t名次t班级名称n”,y+1);

for(k=0;k

{p++;

printf(“%4dt%4dt%4dt%sn”,S[x][y].data[k].num ,S[x][y].data[k].score ,p ,S[x][y].classname);

if(k

}

printf(“n”);

return 1;}

int Allclassorder(Stu S[MAX1][MAX2], int N)//查询以班级为单位的成绩名次表

{ int y,i,j,V,k;int c,p;DataType1 temp;

printf(“请输入你要查询那个年级的全部班级名次表<1-%d>:”,M);scanf(“%d”,&c);if(c>M||c<1){

printf(“输入错误!n”);

return-1;} printf(“----打印你要查询的第%d个年级的全部班级名次表----n”,c);

for(y=0;y

{

V=S[c-1][y].classnum;

for(i =0;i

for(j =i+1;j

{

if(S[c-1][y].data[i].score< S[c-1][y].data[j].score)

{

temp = S[c-1][y].data[i];

S[c-1][y].data[i] =S[c-1][y].data[j];

S[c-1][y].data[j] = temp;

}

}

p=0;

printf(“%d班排名:n学号t成绩t名次t班级名称n”,y+1);

for(k=0;k

{

p++;

printf(“%4dt%4dt%4dt%sn”,S[c-1][y].data[k].num ,S[c-1][y].data[k].score ,p ,S[c-1][y].classname);

if(k

}

printf(“n”);

}

return 1;}

int gradeorder(Stu S[MAX1][MAX2], int N)//查询以年级为单位的成绩名次表 { int V;int c;int x,y,i,j,k=0,p=0;DataType1 r[100], temp;printf(“请输入你要查询哪个年级的名次表<1-%d>:”,M);scanf(“%d”,&c);

if(c>M||c<1){

printf(“输入错误!n”);

return-1;}

for(x=0;x

{

V=S[c-1][x].classnum;

for(y=0;y

r[k++]=S[c-1][x].data[y];

}

for(i = 0;i

for(j = i+1;j

{

if(r[i].score< r[j].score)

{

temp = r[i];

r[i] = r[j];

r[j] = temp;

}

} printf(“t--------第%d年级总排名-------n”,c);printf(“ 学号t成绩t名次n”);

for(i=0;i

{

p++;

printf(“%4dt%4dt%4dn”,r[i].num ,r[i].score ,p);

if(i

}

return 1;}

void showface()//显示桌面菜单

{

printf(“********欢迎进入彭强学生成绩名次表查询系统*******n”);

printf(“*1 创建年级和班级信息

2查询每个班级的成绩名次表*n”);printf(“*3 查询以班级为单位的成绩名次表

*n”);printf(“*4 查询以年级为单位的成绩名次表

0 退出管理系统 *n”);printf(“*************************************************n”);

}

void main(){ Stu S[MAX1][MAX2];

int N;

char i;do {

showface();//调用菜单函数

printf(“请选择菜单0—5:”);

scanf(“%s”,&i);switch(i){

case '1': N=Create(S,N);break;

case '2': classorder(S,N);break;

case '3': Allclassorder(S,N);break;

case '4': gradeorder(S,N);break;

case '0': exit(0);

break;

default:printf(“选择菜单错误,请重新选择!n”);} }while(i!=0);}

第三篇:数据结构课程设计——成绩管理系统

数据结构 课程设计

(1)学生成绩管理问题(建议数据结构:单链表)

学生成绩管理是学校教务管理的重要组成部分,其处理信息量很大,本设计是对学生的成绩管理做一个简单的模拟,用菜单选择操作方式完成下列主要功能:

(1)登记学生成绩;

(2)查询学生成绩;(3)插入学生成绩;(4)删除学生成绩;

要求对每个功能分别用函数实现。

(2)学生成绩管理系统需求与功能分析

学生成绩的录入、统计、查询、修改、删除、输出。

(3)学生成绩管理系统的数据结构表

序号 成员名(字段名)数据类型 长度 字段含义class_0 char 20 班级num int 学号name char 8 姓名elec flaot 电子技术c_prog float C 程序设计media flaot 多媒体技术eng float 大学英语math float 高等数学 sport float 大学体育polity float 马克思主义政治经济学ave float平均成绩order int 名次

画出功能结构图。

(4)学生成绩管理系统测试数据表

class_0 num name elec c_prog media eng math sport polity ave order

网络30331 3033101 办公费 80 70 60 70 70 60 80 表中其余数据自己编造。

(5)使用链表编写程序(手写源程序代码,并给出注解)

0)定义链表结点

1)主函数main():定义链表头指针,调用录入、统计等函数对成绩表进行处理;

2)建立链表函数Create():输入班级到政治课成绩信息;

3)统计函数Statistic():计算平均成绩;

4)查询函数Lookup():查询指定学号学生成绩记录;

5)修改函数Modify():修改指定学号学生成绩记录;

6)删除函数删除():删除指定学号学生记录;

7)输出函数Output():输出班级所有学生成绩记录;

8)插入函数Insert():按平均分顺序插入新结点。

9)排序函数Sort():按平均分对学生成绩记录项进行降序排序;

程序如下:

#include #include #include #include #include

using namespace std;

struct Node//定义链表结点 {

char* class_0;//班级 int number;char* name;//姓名 float elec;//电子技术成绩 float c_prog;//C程序设计成绩 float media;//多媒体技术成绩 float eng;//大学英语成绩 float math;//高等数学成绩

float sport;//大学体育成绩

float polity;//马克思主义政治经济学成绩 float ave;//平均成绩 int order;//名次 Node* link;Node(){link=NULL;} Node(int _number,char* _class_0,char* _name,float _elec, float _c_prog,float _media,float _eng,float _math, float _sport,float _polity,float _ave,int _order,Node* next){ number=_number;class_0=new char[21];strcpy(class_0,_class_0);name=new char[9];strcpy(name,_name);elec=_elec;c_prog=_c_prog;media=_media;eng=_eng;math=_math;sport=_sport;polity=_polity;ave=_ave;order=_order;link=next;} ~Node(){ 删除 []class_0;删除 []name;}

};class StudentScore { private: Node* first;//链表的头指针

int choice;//选择数据的读入方式 int fileNum;//当前文件数减一 int fileLoc;//定位当前文件 string* fileName;int operChoice;int RecordLength;public: StudentScore();void Save();void BuildList();//手工建立成绩链表

void ReadInfo(int k);//从内存中读入学生信息 void ClearList();void Statistic();void Sort();void Add();void 删除();void PrintList();void Menu();};StudentScore::StudentScore(){ RecordLength=0;operChoice=0;first=NULL;choice=0;fileLoc=0;fileNum=0;fileName=new string[10];//最多可以存10个文件 } int GetOrder(Node* first,float ave);void StudentScore::BuildList(){ int _number;//学号

char* _class_0=new char[21];//班级 char* _name=new char[9];//姓名 float _elec;//电子技术成绩 float _c_prog;//C程序设计成绩 float _media;//多媒体技术成绩 float _eng;//大学英语成绩 float _math;//高等数学成绩 float _sport;//大学体育成绩

float _polity;//马克思主义政治经济学成绩 float _ave;//平均成绩 int _order;//名次 char c;Node *p,*r=NULL;first=NULL;cout<<“您要输入学生成绩信息?”< while((c=getchar())=='n');while(tolower(c)!='n'){ cin>>_class_0;//班级 cin>>_number;cin>>_name;//姓名 cin>>_elec;cin>>_c_prog;cin>>_media;cin>>_eng;cin>>_math;cin>>_sport;cin>>_polity;_ave=(_elec+_c_prog+_media+_eng+_math+_sport+_polity)/7;//求得平均成绩 _order=GetOrder(first,_ave);

p=new Node(_number,_class_0,_name,_elec, _c_prog,_media,_eng,_math,_sport,_polity, _ave,_order,NULL);//建立一个新的结点储存信息

if(first!=NULL)r->link=p;else first=p;r=p;RecordLength++;cout<<“您要输入学生成绩信息?”< while((c=getchar())=='n');} } int GetOrder(Node* first,float ave)//名次记录有严重问题 { int order=1;Node* temp=first;for(;temp;temp=temp->link){ if(temp->ave>ave)order++;if(temp->aveorder)++;} return order;}

void StudentScore::Statistic(){ Node* temp=first;float a_elec=0.0;//电子技术成绩 float a_c_prog=0.0;//C程序设计成绩 float a_media=0.0;//多媒体技术成绩 float a_eng=0.0;//大学英语成绩 float a_math=0.0;//高等数学成绩 float a_sport=0.0;//大学体育成绩

float a_polity=0.0;//马克思主义政治经济学成绩 int i=0;while(temp){ a_elec+=temp->elec;a_c_prog+=temp->c_prog;a_media+=temp->media;a_eng+=temp->eng;a_math+=temp->math;a_sport+=temp->sport;a_polity+=temp->polity;i++;temp=temp->link;} a_elec=a_elec/i;a_c_prog=a_c_prog/i;a_media=a_media/i;a_eng=a_eng/i;a_math=a_math/i;a_sport=a_sport/i;a_polity=a_polity/i;cout<<“电子技术平均成绩为:”< cout<<“c程序设计平均成绩为:”< cout<<“多媒体技术平均成绩为:”< cout<<“英语平均成绩为:”< cout<<“高等数学平均成绩为:”< cout<<“体育平均成绩为:”< cout<<“政治平均成绩为:”<} void StudentScore::删除(){ int studNum;Node* p;Node* temp=first;cout<<“请输入要删除的学生学号”< cin>>studNum;float average;for(;temp;temp=temp->link){ cout

if(temp->number==studNum){ average=temp->ave;if(temp==first)//说明是第一次

{ first=first->link;删除 temp;break;//如果不跳出的话 temp=temp->link会出错 } else { p->link=temp->link;删除 temp;break;} } p=temp;RecordLength--;

}

//下面修改学生排名 temp=first;for(;temp;temp=temp->link)if(temp->aveorder--;} void StudentScore::Add(){ int _number;//学号

char* _class_0=new char[21];//班级 char* _name=new char[9];//姓名 float _elec;//电子技术成绩 float _c_prog;//C程序设计成绩 float _media;//多媒体技术成绩 float _eng;//大学英语成绩 float _math;//高等数学成绩

float _sport;//大学体育成绩

float _polity;//马克思主义政治经济学成绩 float _ave;//平均成绩 int _order;//名次 char c;Node *p,*r=NULL;r=first;while(r->link)r=r->link;// first=NULL;cout<<“您要输入学生成绩信息?”< while((c=getchar())=='n');while(tolower(c)!='n'){ cin>>_class_0;//班级 cin>>_number;cin>>_name;//姓名 cin>>_elec;cin>>_c_prog;cin>>_media;cin>>_eng;cin>>_math;cin>>_sport;cin>>_polity;_ave=(_elec+_c_prog+_media+_eng+_math+_sport+_polity)/7;//求得平均成绩 //写一个返回排名的程序

_order=GetOrder(first,_ave);

p=new Node(_number,_class_0,_name,_elec, _c_prog,_media,_eng,_math,_sport,_polity, _ave,_order,NULL);//建立一个新的结点储存信息

if(first!=NULL)r->link=p;else first=p;r=p;RecordLength++;cout<<“您要输入学生成绩信息?”< while((c=getchar())=='n');}

} void StudentScore::Sort()//简单bubble排序从高分到低分排序 { int i=0;Node* temp=first;Node* before;// Node* p=first;for(;temp->link;){ if(temp->avelink->ave){

if(temp==first)//说明是第一个结点 { first=first->link;// p=temp;// temp=temp->link;temp->link=temp->link->link;first->link=temp;before=first;} else//不是第一个结点 { before->link=temp->link;temp->link=temp->link->link;before->link->link=temp;before=before->link;} } else { temp=temp->link;}

i++;//计算次数 } for(;i>0;i--){ temp=first;for(int j=0;j { if(temp->avelink->ave){ cout<<“small!”< if(temp==first)//说明是第一个结点 {

first=first->link;// p=temp;// temp=temp->link;temp->link=temp->link->link;first->link=temp;before=first;} else//不是第一个结点 { before->link=temp->link;temp->link=temp->link->link;before->link->link=temp;before=before->link;} } else { temp=temp->link;} } } } /* bool IsSorted(Node* first){ for(;first;first=first->link)if(first->avelink->ave)return false;return true;}*/

void StudentScore::PrintList()//打印链表程序 { cout<<“The list contains:”< Node* temp=first;for(;temp;temp=temp->link){ cout

void StudentScore::ClearList()//清除链表 { Node* p=new Node;while(first){ p=first->link;删除 first;first=p;} }

//读函数

void StudentScore::ReadInfo(int k)//读第k个文件的信息存入链表 { // int wordLength;//记录子段长度 int _number;//学号

char* _class_0=new char[21];//班级 char* _name=new char[9];//姓名 float _elec;//电子技术成绩 float _c_prog;//C程序设计成绩 float _media;//多媒体技术成绩 float _eng;//大学英语成绩 float _math;//高等数学成绩

float _sport;//大学体育成绩

float _polity;//马克思主义政治经济学成绩 float _ave;//平均成绩 int _order;//名次 Node *p,*r=NULL;first=NULL;ifstream Infile(fileName[k].c_str());if(!Infile){ cout<<“file is not present!”< return;} Infile>>RecordLength;cout< for(int i=0;i { Infile>>_class_0;//班级 // cout<<_class_0;Infile>>_number;Infile>>_name;//姓名 Infile>>_elec;Infile>>_c_prog;Infile>>_media;Infile>>_eng;Infile>>_math;Infile>>_sport;Infile>>_polity;Infile>>_ave;Infile>>_order;_ave=(_elec+_c_prog+_media+_eng+_math+_sport+_polity)/7;//求得平均成绩 //写一个返回排名的程序 _order=GetOrder(first,_ave);

p=new Node(_number,_class_0,_name,_elec, _c_prog,_media,_eng,_math,_sport,_polity, _ave,_order,NULL);//建立一个新的结点储存信息

if(first!=NULL)r->link=p;else first=p;r=p;}

} void StudentScore::Save(){ string tempName;cout<<“请输入将要保存的文件名:”< //要判断是否跟现有文件重名 cin>>tempName;ofstream savefile(tempName.c_str());//要做一个转换 Node* temp=first;savefile< for(;temp;temp=temp->link){ savefile//读取文件表信息

ifstream Readfileinfo(“FileRecord.txt”);Readfileinfo>>fileNum;for(int i=0;i Readfileinfo>>fileName[i];Readfileinfo.close();fileNum++;fileName[i]=tempName;//修改文件表信息

ofstream changefile(“FileRecord.txt”);changefile< for(i=0;i changefile< changefile.close();}

void StudentScore::Menu(){ cout<<“请您选择数据的读入方式:”< cout<<“(1)重新手动建立一份新的数据表”< cout<<“(2)从文件中读入数据”< cout<<“请选择:”;cin>>choice;if(choice==1){ BuildList();} if(choice==2){ cout<<“当前有如下文件,请选择读入文件:”< ifstream fileRecord(“fileRecord.txt”);if(!fileRecord){ cout<<“fileRecord is not present!”< return;} fileRecord>>fileNum;cout<<“当前有”< for(int i=0;i { fileRecord>>fileName[i];cout< cin>>fileLoc;ReadInfo(fileLoc-1);PrintList();

} cout<<“请选择您需要的操作:”< cout<<“(1)统计学生各科成绩”< cout<<“(2)删除某个学生成绩记录”< cout<<“(3)增加某个学生成绩记录”< cout<<“(4)在链表中为所有学生成绩记录排序”< cin>>operChoice;if(operChoice==1)Statistic();if(operChoice==2)删除();if(operChoice==3)Add();if(operChoice==4)Sort();Save();ClearList();}

int main(){ cout<<“//////////////////////////////////”< cout<<“欢迎使用学生成绩管理系统!”< cout<<“//////////////////////////////////”< cout< cout< StudentScore s;s.Menu();return 0;}

第四篇:数据结构课程设计报告

数据结构课程设计

散列表的应用:插队买票

专业 计算机科学与技术(网络技术)

金玲 计算机131 1310704114 张静林 2015年1月23日 学生姓名 班学级 号

指导教师 完成日期

目录概述……………………………………………………………………………………1 1.1 课程设计目的……………………………………………………………………….1 1.2 课程设计内容……………………………………………………………………….1 2 系统需求分析……………………………………………………………………….1 2.1 主体功能…………………………………………………………………………....2 3系统概要设计…………………………………………………………………………2 3.1 系统流程图………………………………………………………………………….2 4 系统详细设计…………………………………………………………………………3 5 测试……………………………………………………………………………………5 5.1 测试方案…………………………………………………………………………….5 5.2 测试结果…………………………………………………………………………….5 6 小结……………………………………………………………………………………5 参考文献…………………………………………………………………………………5 附录………………………………………………………………………………………7 附录1 源程序清单……………………………………………………………………...7 概述

1.1 课程设计目的

数据结构课程设计是为数据结构课程独立开设的实践性教学环节。数据结构课程设计对于巩固数据结构知识,加强学生的实际动手能力和提高学生综合素质是十分必要的。课程设计的目的:

1.要求学生达到熟练掌握C语言的基本知识和技能。

2.了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力。3.提高程序设计和调试能力。学生通过上机实习,验证自己设计的算法的正确性。学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。

4.培养算法分析能力。分析所设计算法的时间复杂度和空间复杂度,进一步提高程序设计水平。

5.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能。

1.2课程设计内容

本课程设计的任务是写一个程序模拟这种情况。每个队伍都允许插队。如果你在排队,有一个以上的朋友要求插队,则你可以安排他们的次序。每次一个人入队,并且如果这个入队的人发现队伍中有自己的朋友,则可以插入到这个朋友的后面;当队伍中的朋友不止一个的时候,这个人会排在最后一个朋友的后面;如果队伍中没有朋友,则他只能够排在这个队伍的最后面。每一个入队的人都先进行上述的判断。当队伍前面的人买到车票之后,依次出队。系统需求分析

2.1 主体功能

程序从“input.txt”文件读入测试用例,一个文件可包含多个测试用例。每个用例的第一行是朋友组的数目n(1<=n<=1000)。对于一个朋友组以朋友的数目j(1<=j<=1000)开始,由朋友的个数以及他们的名字组成,一个空格后接该组朋友的名字,以空格分开,并且每个人的名字都不同。每个名字不超过四个字母,由{A,B,...,Z,a,b,...,z}组成。一个朋友组最多有1000个人,每个人只属于一个朋友组。n=0时,测试数据结束。

下面是一些具体命令:.ENQUEUE——X入队;.DEQUEUE——排队头的人买票,离开队伍,即出队;.STOP——一个测试用例结束。

测试结果输出到“output.txt”文件中。每个测试用例第一行输出“Scenario#k”,k是测试用例的序号(从1开始)。对每一个出队命令,输出刚买票离开队伍的人名。两个测试试用例 之间隔一空行,最后一个用例结束不输出空行。系统概要设计

3.1 系统流程图 系统详细设计

本题目主要解决两个问题:一是怎么存放和查找大量数据(主要是姓名);二是怎么操作“ENQUEUE”和“DEQUEUE”命令。

用散列表来存放和查找数据。由于最多有1000个朋友组,每组最多有1000人,使用平方探测法解决冲突,则表的大小是2*(1000*1000),所以选择TableSize=2000003(2000003是大于2000000的最小素数)。同一个组内的都是朋友,所以每个人除了记录他的名字name,还要记录他属于哪个组group,另外用info来表示该单元是否被占用,数据结构如图4.1所示。散列函数是根据Honer法则计算一个以64为阶的多项式,如图4.2所示。冲突解决方法采用平方探测法,如图4.3所示。

#define TabSize 2000003 typedef struct hashtab *PtrToHash;struct hashtab

/*散列表数据结构*/ { char name[5];

/*名字*/ int group;

/*属于哪个朋友组*/ char info;

/*标志位,该单元是否被占用*/ };图4.1数据结构:散列表

Int Hash(char *key,int TableSize){

Int HashVal=0;

While(key!=NULL)

HashVal=(HashVal<<6)+*key;

Return HashVal%TableSize;} 图4.2散列函数

Long int Find(PtrToHash hash,char *c){

key=c;

CurrentPos=Hash(key,TableSize);

CollisionNum=0;

While((单元被占用)and(单元内的名字与查找的名字不同))

{

CurrentPos+=2*(++CollisionNum)-1;

If(CurrentPos>=TabSize)

CurrentPos=TabSize;

}

Return CurrentPos;} 图4.3用平方探测法解决冲突

第二个问题是关于怎么操作“ENQUEUE”和“DEQUEUE”命令。这可以用队列来模拟。由于有插队现象的存在,不能单纯的用一个数组来表示队列,因为这样的话,插入一个朋友,则他后面的人都要往后移一个单位,删除一个人,则他后面的人都要前移一个,会降低效率。所以,采用一个Index标记来表示当前元素的后继元素,最后一个单元的后继元素是第0个,形成环,数据结构如图4.4所示。不用链表是因为链表存放指针也需要空间,并且链表插入、删除的效率没有数组高。

typedef struct Que *PtrToQue;struct Que

/*队列数据结构*/ { long int HashVal;

/*散列值*/ long int Index;

/*在中的队列序号*/ };图4.4数据结构:队列

输入ENQUEUE命令,如果队伍里有朋友,则排在朋友后面;如果没有朋友,则排在队尾。入队时,用一个数组记录每个朋友组的最后一位,以便下一个朋友到来时排到他后面,这个数组被称为“插队数组”。

输入DEQUEUE命令,则根据“先进先出”,按照各个元素和它后继元素的先后顺序,每次删除队列重的第一个。程序结构如图4.5所示。

While(读测试文件){

if(输入”ENQUEUE”)

{

读入名字;

插入散列表;

插入队列;

}

else if(输入”DEQUEUE”)

{

删除队列第一个名字;

将该名字输出到文件;

}

else stop;} 图4.5入队、出队操作 测试

5.1 测试方案 按输入要求输入正常测试数据,测试程序是否能正确解决问题,得到正确答案。应注意边界测试。例如,将n,j分别取为1的用例和n为1000的用例。n,j比较大时需写程序生成测试用例。

不按输入要求输入数据,测试程序能否对输入内容进行数据合法性检测并进行相应的异常处理。例如,将n或j取为小于1或大于1000的数,名字超过4个字母等情况下的测试用例。5.2 测试结果 小结

在前面的学习过程中我们学到了很多知识而这次课程设计又是对我们所学的 一次总结,刚开始,可以说是没有头绪,于是就去图书馆找资料,找到了一些关于程序方面的,可这远远不够,这只是小小的开始。我们必须掌握很多已学的知识才能很好的完成本次的课程设计。在这次课程设计中,总的感觉是我遇到了很多困难这主要是由于我编写代码的经验不足,有时虽然是一个很小的问题但解决起来却花费了我不少的时间,值得欣慰的是,当自己苦思冥想或者和其它同学一起探讨把问题解决的时候我还是觉得获益非浅,这就是在摸索中寻求到的知识。在设计时也免不了存在着些不足,所以在今后的学习中我会努力取得更大的进步。虽然对着电脑做程序,有些累,可当看到劳动成果时,却有另一番滋味。

参考文献

[1]范策,周世平,胡晓琨.《算法与数据结构(C语言版)》[M].北京:机械工业出版社,2004 [2]严蔚敏.《数据结构(C语言版)》.北京:清华大学出版社,2004 [3]许卓群,杨冬青,唐世渭,张铭.《数据结构与算法》.北京:高等教育出版社,2004 [4]徐孝凯.《数据结构实用教程(第二版)》.北京:清华大学出版社,2006

附录

附录1 源程序清单

#include #include #include #define TabSize 2000003

/*散列表大小TabSize 是大于表最大空间的素数*/ #define Max 1000001

/*队列空间最大值*/ struct hashtab;typedef struct hashtab *PtrToHash;struct hashtab

/*散列表数据结构*/ { char name[5];

/*名字*/ int group;

/*属于哪个朋友组*/ char info;

/*标志位,该单元是否被占用*/ };struct Que;typedef struct Que *PtrToQue;struct Que

/*队列数据结构*/ { long int HashVal;

/*散列值*/ long int Index;

/*在中的队列序号*/ };

int hashedx=0;

/*标记元素是否已经在散列表里*/ long int Find(PtrToHash hash,char *c)/*查找在散列表中的位置*/ { char *key;long int CurrentPos,CollisionNum;

key=c;for(CurrentPos=0;*key;++key)

/*散列函数,计算散列值*/

CurrentPos=(CurrentPos<<6)+*key;CurrentPos%=TabSize;

/*散列值*/ CollisionNum=0;/*如果当前单元被占用:单元内的元素与当前操作的名字不同,使用平方探测法解决冲突;与当前操作的名字相同,则直接返回在散列中的位置*/ while((hash[CurrentPos].info)&&(strcmp(hash[CurrentPos].name,c)))

{

/*平方探测法*/

CurrentPos+=2*(++CollisionNum)-1;

if(CurrentPos>=TabSize)

CurrentPos-=TabSize;}

if((hash[CurrentPos].info)&&(strcmp(hash[CurrentPos].name,c)==0))

/*元素已经在散列表里*/

hashedx=1;else /*元素不在散列表里*/

hashedx=0;return CurrentPos;/*返回在散列表中的位置*/ }

int main(){ long int Find(PtrToHash hash,char *c);

/*查找在散列表中的位置*/

PtrToHash hash;

/*散列表*/ PtrToQue queue;

/*队列*/ int *grouppos;

/*记录每个朋友组的最后一位,即插队数组*/ int n;

/*测试用例数目*/ int num;

/*当前测试用例序号*/ long int i,ii,j,key,temp;long int head,last;

/*队列的头和尾*/ char c[8],tempc[8];

/*名字*/ FILE *fpin,*fpout;

/*输入、输出文件指针*/

if(!(fpin=fopen(“input.txt”,“r”)))

/*打开测试文件*/ {

printf(“fopen error!”);

/*文件打开错误*/

return-1;} if(!(fpout=fopen(“output.txt”,“w”)))

/*打开输出文件*/ {

printf(“fopen error!”);

return-1;}

hash=(PtrToHash)malloc(sizeof(struct hashtab)*TabSize);/*为散列表申请空间*/ queue=(PtrToQue)malloc(sizeof(struct Que)*Max);/*为队列申请空间*/ grouppos=(int *)malloc(sizeof(int)*1000);/*申请空间记录每个朋友组的最后一位*/ for(i=0,j=1;i

queue[i].Index=j;queue[i-1].Index=0;/*最后一个单元的后继单元是第0个,形成环*/ num=0;for(fscanf(fpin,“%d”,&n);n;fscanf(fpin,“%d”,&n))/*输入当前测试用例的朋友组数*/ {

if(n<1||n>1000)

/*处理异常输入n*/

{

fprintf(fpout,“n is out of rangen”);

return-1;

}

num++;

if(num!=1)

/*两个测试用例间输入一空行*/

fprintf(fpout,“n”);

for(i=0;i

hash[i++].info=0;

/*初始化散列表,标记位置0*/

for(i=0;i

/*对每一组朋友*/

{

fscanf(fpin,“%d”,&j);

/*当前组里的人数*/

if(j<1||j>1000)

/*处理异常输入j*/

{

fprintf(fpout,“j is out of rangen”);

return-1;

}

for(;j;--j)

{

fscanf(fpin,“%s”,c);

/*输入名字*/

for(ii=0;ii

tempc[ii]='';

strcpy(tempc,c);

ii=0;

while(tempc[ii]!='')

/* 是否由四个以内字母组成*/

{

if(tempc[ii]<'A'||('Z''z'||ii>4)

{

fprintf(fpout,“Group %d: Nonstandard namen ”,i);

return-1;

}

ii++;

}

key=Find(hash,c);

/*找到在散列表中的位置*/

if(hashedx==1)/*重名*/

{

fprintf(fpout,“repeated name %sn”,c);

return-1;

}

strcpy(hash[key].name,c);/*插入散列表*/

hash[key].info=1;

/*标记置1,该单元被占用*/

hash[key].group=i;

/*记录他属于哪个组*/

} } for(i=0;i<1000;)

grouppos[i++]=0;/*初始化插队数组*/ head=0;

/*初始化队列头、尾标记*/ last=0;fprintf(fpout,“Scenario #%dn”,num);/*输出当前用例序号到文件*/ for(fscanf(fpin,“%s”,c);;fscanf(fpin,“%s”,c))/*输入命令*/ {

if(*c=='E')

/*入队命令*/

{

fscanf(fpin,“%s”,c);

/*输入名字*/

key=Find(hash,c);

/*查找在散列表中的位置*/

if(hashedx==0)/*散列表里没这个人*/ {

fprintf(fpout,“no %sn”,c);

return-1;}

temp=queue[0].Index;

/*队列第0个位置记录队尾的后继单元*/ queue[0].Index=queue[temp].Index;

/*在队列中申请一个新单元,队尾标记后移一个位置 */ queue[temp].HashVal=key;/*入队*/ if(!head)/*如果是队列里的第一个元素 */ last=head=temp;/*队头、队尾标记指向第一个元素*/ if(!grouppos[hash[key].group])/*如果队列里没朋友*/ { queue[temp].Index=0;/*队尾指向对头,形成环*/ queue[last].Index=temp;/*前一次队尾的后继元素是当前元素*/ last=temp;

/*队尾标记指向当前元素*/ grouppos[hash[key].group]=temp;/*插队数组记录该朋友组里已入队的最后一位*/ } else/*如果队列中已经有他的朋友*/ {

queue[temp].Index=queue[grouppos[hash[key].group]].Index;

/*插队到朋友的后面*/

queue[grouppos[hash[key].group]].Index=temp;

/*插队到朋友后面一位的前面*/

grouppos[hash[key].group]=temp;

/*替换插队数组里该组的元素为当前元素*/

if(hash[queue[last].HashVal].group==hash[key].group)

/*如果当前元素和前一元素是朋友,队尾标志指向当前元素*/

last=temp;

}

}

else if(*c=='D')/*出队命令*/

{

if(last==0)

/*不能对空队列执行出队命令*/

{

fprintf(fpout,“Empty queue!nCan't execute DEQUEUE!n”);

return-1;

}

fprintf(fpout,“%sn”,hash[queue[head].HashVal].name);

/*输出队头元素到文件*/

temp=head;

head=queue[temp].Index;

/*队列第一位出队,队头标记后移一位*/

queue[temp].Index=queue[0].Index;

/*队列第0个元素后移一位*/

queue[0].Index=temp;

/*释放空间*/

if(grouppos[hash[queue[temp].HashVal].group]==temp)

/*当前删除的元素是该朋友组在队列里的最后一位*/

grouppos[hash[queue[temp].HashVal].group]=0;

if(last==temp)

/*出队后,队列为空*/

last=0;

}

else

/*输入 “STOP”*/

break;

/*测试结束*/

} } fprintf(fpout,“b”);fclose(fpin);fclose(fpout);return 1;}

第五篇:数据结构课程设计报告

正文要求:对每一个题目,正文必须包括以下几个方面 知识点回顾: 实验要求:

实验过程:包括设计思路,算法描述,程序清单,调试等等; 实验小结:

注意:(1)正文中字体用小四号宋体,行间距1.25倍行距;

(2)页码居中;

(3)A4纸双面打印,在纸的左侧装订。

(4)上交的课程设计报告控制在10页以内。

齐鲁工业大学

理学院

信计11-1

郑桥

一、提示:对于单窗口的服务系统知识点回顾如下:

1、什么是负指数分布?

又称指数分布。泊松事件流的等待时间(相继两次出现之间的间隔)服从指数分布。用于描述非老化性元件的寿命(元件不老化,仅由于突然故障而毁坏)。常假定排队系统中服务器的服务时间和Petri网中变迁的实施速率符合指数分布。

2、用C语言如何产生随机序列? double rd_MN1(double m,double n){ double r;if(m>n){r=n;n=m;m=r;};r =((double)rand()/((double)(RAND_MAX)+(double)(1)));r = m+ r*(n-m);return r;}

3、用C语言如何产生负指数分布的时间序列? double expntl(double x){ double z;do { z =((double)rand()/ RAND_MAX);} while((z == 0)||(z == 1));return(-x * log(z));//z相当于1-x,而x相当于1/lamda。} 其中的x相当于1/λ

4、排队论简单叙述;

排队系统主要有:X/Y/Z,其中X表示到达时间间隔的分布,Y表示服务时间的分布,Z表示并列的服务设备的数目。表示相继到达的时间间隔或服务时间的分布的符号是:

M——负指数分布,D——确定性,Ek——k阶Erlang,GI——相互独立的一般随机分布,G——一般的随机分布。

例如:M/M/1表示达到时间间隔为负指数分布,服务时间为负指数分布,单服务设备的排队系统。

这里我们用静态仿真的思想来实现M/M/1仿真。在排队系统中的每一个动态实体的状态可以有三个量来反映:与前一个实体到达的时间间隔,在排到自己服务前的等待时间以及服务时间。其中服务时间和到达时间间隔服从指数分布,不受别的因素的影响。开始服务前的等待时间则受到排在前面的动态实体的状态的影响。其更新算法如下:

即:如果某个实体到达以后,发现处在它前面的动态实体已经结束服务,所以这个实体就不用等待,直接接受服务;反之,处在它前面的动态实体如果没有结束服务(包括没有开始服务),则这个实体的等待时间就是它前一实体结束服务的时刻减去它到达的时刻。

5、如何得到每个顾客的到达时刻,服务时间,等待时间和离开时刻; 到达时间=前面各个到达时间之和; 服务时间就是负指数随机生成的时间;

等待时刻:如果前一个人的离开时间小于这个人的到达时间,等待时间=0;

如果不是,则等待时间=该人的离开时间-他的到达时间-服务时间

6、如何排队,排队的主要算法思想? 排队就是来到的人数多于离开的人数;

如果下一个人到达时前一个人依旧在接受服务,则此人就要排队。

7、如何求队长?以及最大的队长?

假设以5分钟为一个时间段,则在第5分钟时用这5分钟内来到的人数减去这5分钟内离开的人数即是排队人数

8、如何求平均等待时间?

求平均等待时间首先要求出总的等待时间与接受服务的人数;

总的等待时间=每个人的等待时间之和;接受服务的人数由时间540分钟来控制,如果在540分钟之后才到达的人则不再算入接受服务的人数之内。

9、用C语言如何将得到的数据输出到文件?

在C语言中用fopen函数打开文件,然后把数据输出比如用fprintf函数,最后fclose。

利用ofstream fcout(“d:arr_time.txt”);语句来实现C++中的输出文件

10、如何用已学的数学语言程序(如:Mathematica, Matlab)把C语言得到的数据文件画出其相应的图像?

11、如果是两个窗口的服务系统,则该怎么修改程序?

12、如果到达时间间隔,服务时间服从泊松分布或者其他分布,该程序该如何改进?

二、数据结构课程设计题目

单窗口的排队模型的数值仿真(参考课本上第四章的离散事件模拟)要求如下:(1)要求相邻两个顾客的到达时间间隔服从负指数分布;且每个顾客接受服务的时间也服从负指数分布;

(2)求出各个时刻的队长(以五分钟为一时间单位,即求零时刻的队长,五分钟时的队长,十分钟时的队长,依次类推);

(3)一个工作日内的顾客总数,约定8:30上班,17:30下班,中午不休息;(4)求平均等待时间(顾客总等待时间除以总人数);

(5)画出顾客的到达,离开图像(横坐标是顾客图,纵坐标是到达时刻,和离开时刻);

(6)画出队长变换图像(横坐标是时刻图,纵坐标是队长个数);(7)求出一个工作日内的最大队长;

三、设计思路:

1)把8::30记做第0分钟,17:30记做第540分钟。

2)首先利用C++随机生成200个服从负指数分布的到达时间与200个服务时间 然后根据随机生成的数计算到达的时刻,即到达时间的逐步加和,然后计算离开的时刻;

3)根据到达时刻与离开时刻来计算等待时刻,于是便可得到平均等待时间; 同时根据这两个时刻求出每5分钟到达人数与离开的人数,于是便得出每5分钟的队长,同时也可求出最大队长。4)再利用MATLAB画出相应的图像。

四、算法描述:

1)首先将8:30这个时刻化为0时刻,17:30化为第540分钟这个时刻,全体单位为分钟。

2)定义到达时间间隔arr_time[200],服务时间ser_time[200],到达时刻arr_time1[200],离开时间lea_time[200],等待时间sta_time[200],离开人数lea_num[200],到达人数arr_num[200]等变量。3)根据负指数函数

来利用C++程序生成随机到达时间间隔与服务时间。

4)利用到达时刻与离开时刻之间的关系来求出等待时间。同时将这540分钟划分为5分钟间隔的108个时间段来求出在每个时间段到达人数与离开人数,再求出队长。

5)利用已知的服务人数,平均到达时间与平均离开时间来做出图像。(借助MATLAB软件。)

五、总结

(1)求出各个时刻的队长(以五分钟为一时间单位,即求零时刻的队长,五分钟时的队长,十分钟时的队长,依次类推);见程序清单中数据部分对长。(2)求平均等待时间(顾客总等待时间除以总人数);根据程序可得,平均等待时间为21.6分钟。

(3)画出顾客的到达,离开图像(横坐标是顾客图,纵坐标是到达时刻,和离开时刻);

***0100806040200 0Arrive curveleave curve***600

(6)画出队长变换图像(横坐标是时刻图,纵坐标是队长个数);

25Queue Length Curve 20151050 ***0600

(7)求出一个工作日内的最大队长: 最大对长为16个人在排队。

六、程序清单:

求随机产生负指数 #include #include #include #include #include

#include using namespace std;

void main(){ long int i,k;double m,n;//m,n控制时间间隔

double r;double a,s,sum;//arr为到达时间,ser为服务时间

double LAM=1.2;

//f(x)=LAM*exp(-LAM*x);double arr_time[200];double ser_time[200];ofstream fcout(“d:arr_time.txt”);ofstream fscout(“d:ser_time.txt”);m=2.0;n=5.0;srand((unsigned)time(NULL));

k=0;loop: r=((double)rand()/((double)(RAND_MAX)+(double)(1)));

a =-log(r)/LAM;if(a >= m && a <= n){

arr_time[k]=a;

k++;};if(k < 200)goto loop;

// 产生200个指数分布随机数

for(i=0;i<200;i++){

fcout<

//cout<

if(i!=0 && i%5==0)

//cout<

fcout<

s =-log(r)/LAM;if(s >= m && s <= n){ ser_time[k]=s;k++;};if(k < 100)goto loop1;

// 产生200个指数分布随机数 m=3.0;n=5.5;

srand((unsigned)time(NULL));k=100;loop2: r=((double)rand()/((double)(RAND_MAX)+(double)(1)));

s =-log(r)/LAM;if(s >= m && s <= n){ ser_time[k]=s;k++;};if(k < 200)goto loop2;

// 产生200个指数分布随机数

for(i=0;i<200;i++){

fscout<

//cout<

if(i!=0 && i%5==0)

//cout<

fscout< #include #include #include #include

#include using namespace std;void main(){ //下面求离开时间、等待时间 int i;double lea_time[200];//离开时间

double sta_time[200];//等待时间

double arr_time[200];//随机生成到达时间

double ser_time[200];//随机生成服务时间

double arr_time1[200];//到达时间

ifstream fcin(“d:arr_time.txt”);ifstream fscin(“d:ser_time.txt”);ofstream fcout(“d:arr_time1.txt”);ofstream flcout(“d:lea_time.txt”);ofstream fscout(“d:sta_time.txt”);

//求到达的时间

for(i=0;i<200;i++){

fcin>>arr_time[i];

arr_time1[i]=arr_time[i];} double sum=0.0;for(i=0;i<200;i++){

sum+=arr_time1[i];

arr_time1[i]=sum;} for(i=0;i<200;i++){

fcout<

if(i!=0 && i%5==0)

fcout<

//求离开时间

fscin>>ser_time[0];lea_time[0]=arr_time1[0]+ser_time[0];for(i=1;i<200;i++){

fscin>>ser_time[i];

if(lea_time[i-1]>arr_time1[i])

{lea_time[i]=lea_time[i-1]+ser_time[i];}

else

{lea_time[i]=arr_time1[i]+ser_time[i];} }

for(i=0;i<200;i++){

flcout<

if(i!=0 && i%5==0)

flcout<

sta_time[i]=lea_time[i]-arr_time1[i]-ser_time[i];//

if(sta_time[i]<0)

{

sta_time[i]=0;

} } for(i=0;i<200;i++){

fscout<

if(i!=0 && i%5==0)

fscout<

sta_sum+=sta_time[i];}

//求平均等待时间

double ave;int peo_sum;for(i=0;i<200;i++){

if(lea_time[i]<540)

peo_sum=i;} cout<<“总的服务人数为:”<

求离开人数和到达人数 #include #include #include #include #include

#include using namespace std;void main(){ //求离开人数和到达人数

int i,j;

int arr_num[200];//到达人数arr int lea_num[200];//lea离开人数

int arr_jian=0;//时间间隔

double arr_time1[200];double lea_time[200];int peo_sum;int count=0;int count1=0;ifstream fcin(“d:arr_time1.txt”);ifstream flcin(“d:lea_time.txt”);ofstream fcout(“d:arr_num.txt”);ofstream flcout(“d:lea_num.txt”);for(i=0;i<200;i++){

fcin>>arr_time1[i];

flcin>>lea_time[i];} for(i=0;i<200;i++){

if(lea_time[i]<540)

peo_sum=i;} while(arr_jian<540){

for(i=0;i

{

if(arr_time1[i]>arr_jian)

{

arr_num[count]=i;

count++;

//cout<

break;

}

}

for(j=0;j

{

if(lea_time[j]>arr_jian)

{

lea_num[count1]=j;

count1++;

break;

}

}

arr_jian=arr_jian+5;} for(i=0;i<108;i++){

fcout<

//cout<

if(i!=0 && i%5==0)

//cout<

fcout<

for(i=0;i<108;i++){

flcout<

//cout<

if(i!=0 && i%5==0)

//cout<

flcout<

求对长

#include #include using namespace std;int main(){

int i;int max;int que[200];int arr_num[200];int lea_num[200];ifstream fcin(“d:arr_num.txt”);ifstream flcin(“d:lea_num.txt”);ofstream fcout(“d:que.txt”);

for(i=0;i<200;i++){

fcin>>arr_num[i];

//cout<

flcin>>lea_num[i];

//cout<

for(i=0;i<200;i++){

que[i]=arr_num[i]-lea_num[i];

//cout<

} for(i=0;i<200;i++){

fcout<

if(i!=0 && i%5==0)

{

fcout<

} } max=que[0];for(i=1;i<200;i++)

{

if(que[i]>max)

{

max=que[i];

//cout<

} }

cout<<“最大对长是”<

画图: function[maxque,mwait_t,mstay_t,queue_l,use_rate]=MM1queue(mean_arr,mean_lea,peo_num)status=zeros(3,peo_num);

%用一个3行矩阵表示每个顾客的状态;

%到达时间间隔,服务时间,等待时间;status(1,:)=exprnd(mean_arr,1,peo_num);

%按照指数分布随机生成各顾客的到达间隔;status(2,:)=exprnd(mean_lea,1,peo_num);

%按照指数分布随机生成各顾客的服务时间;for i=2:peo_num

if status(1,i)<=status(2,i-1)+status(3,i-1)

status(3,i)=status(2,i-1)+status(3,i-1)-status(1,i);

else

status(3,i)=0;

end;

%对状态进行更新; end;arr_time=cumsum(status(1,:));status(1,:)=arr_time;lea_time=sum(status);stairs([0 arr_time],0:peo_num);

%绘出各顾客的到达时间图;

hold on;stairs([0 lea_time],0:peo_num,'r');

%绘出各顾客的离去时间图;legend('Arrive curve','leave curve',0)hold off figure;plot(1:peo_num,status(3,:),'r:',1:peo_num,status(2,:)+status(3,:),'k-');

%绘出每个顾客的等待时间和停留时间;legend('Wait Time','Stay Time',0);n1=1;n2=1;mstay_t=(sum(status(2,:))+sum(status(3,:)))/peo_num;mwait_t=mean(status(3,:));

%求平均停留时间和等待时间;queue_num=zeros(1,2*peo_num+1);queue_time=zeros(1,2*peo_num+1);n3=1;

%while循环求每个时间队列的长度;while n1<=peo_num

n3=n3+1;

if arr_time(n1)

queue_num(1,n3)=n1-n2+1;

queue_time(1,n3)=arr_time(n1);

n1=n1+1;

else

queue_num(1,n3)=n1-n2-1;

queue_time(1,n3)=lea_time(n2);

n2=n2+1;

end;end;while n2<=peo_num

n3=n3+1;

queue_num(1,n3)=peo_num-n2;

queue_time(1,n3)=lea_time(n2);

n2=n2+1;end;figure;stairs(queue_time,queue_num,'k');

%绘出队列长度的时间变化曲线, stairs 是Matlab的函数

legend('Queue Length Curve',0);hold off;temp=diff(queue_time);overtime=max(queue_time);queue_l=sum(temp.*queue_num(2:(2*peo_num+1)))/overtime;use_rate=sum(temp(find(queue_num)))/overtime;maxque=max(queue_num);% 最大队长

在MATLAB中命令窗口中输入MM1queue(2.86,3.22,175)数据结果:

随机到达时间arr_time 2.2218 2.91038 2.70151 3.20392 2.20729 2.23954 2.27037 2.12161 2.97105 2.59537 2.05195 2.33276 2.40885 2.54536 3.18395 4.34619 2.9621 4.03687 2.56005 4.3556 2.59767 2.6854 2.2156 2.35007 2.01546 3.16558 2.51725 2.4227 3.00499 2.68796 2.57445 2.29238 2.04275 3.56593 4.12181 3.14539 4.60806 2.85305 2.18215 4.15836 2.75386 2.45691 3.15095 3.84449 3.29556 2.35349 2.88082 2.96656 2.60517 3.09175 3.77562 2.12649 2.17347 2.28761 2.91709 2.59767 2.20084 3.64077 2.09167 2.30401 2.89137 2.78563 2.35564 2.60401 3.47721 2.31212 2.2892 2.26189 2.71001 3.23541 3.15543 4.04989 2.33905 2.60575 2.93069 2.63466 2.33025 2.67211 2.13304 2.46765 2.01119 2.66026 2.17867 4.26591 2.56115 2.84451 3.37485 2.22326 2.3109 3.08451 2.75872 3.02393 2.32155 2.37607 2.43489 3.70764 3.07631 2.56943 2.81941 2.81567 2.18215 3.78511 2.72393 2.02062 2.28013 2.03219 2.9324 4.02088 2.83606 2.01804 2.82241 2.23062 2.38448 2.15369 4.07996 2.02407 2.77847 2.93584 4.92381 4.07996 2.52143 2.10523 3.29291 2.34922 2.60807 2.83989 3.77091 2.4652 2.12096 2.36601 4.23257 2.29039 2.03278 3.42756 3.04233 2.80972 4.46149 2.04867 3.6673 2.04363 3.56409 4.8267 4.40435 3.60347 2.01375 4.41955 2.28406 2.49971 2.85853 2.11547 2.29079 2.2037 3.0078 2.43726 2.43963 3.82172 2.26189 3.14207 3.02297 2.39612 2.26381 3.59773 2.454 4.98197 3.60539 3.04233 3.21228 2.48553 2.16591 2.17244 2.25882 2.11773 3.77326 2.1113 3.15319 2.4011 2.66648 3.58261 3.36182 2.74012 2.16046 2.53464 2.21742 2.48754 2.86484 2.45837 2.4213 2.81047 4.02405 2.08667 2.24179 2.17971 3.1465 2.96925 2.07709 2.6139 3.48217 4.50565 3.25667 2.71528

随机服务时间ser_time 1.36266 1.25234 1.19953 1.81288 1.7025 1.49777 1.18475 1.2005 2.2218 2.91038 1.69353 1.06181 1.95277 1.86629 1.35603 1.36501 1.98628 1.05845 1.48635 2.70151 1.56285 1.7392 1.00964 1.69024 1.23548 1.68311 3.20392 2.20729 2.23954 1.0431 1.986 1.09644 2.27037 1.53367 2.12161 2.97105 1.68177 2.59537 2.05195 1.54594 1.24156 1.42946 2.33276 1.06994 2.40885 1.9069 2.54536 3.18395 4.34619 2.9621 1.09313 4.03687 2.56005 1.01332 1.97996 1.76143 1.26501 1.34689 1.66416 4.3556 1.6471 1.46631 2.59767 2.6854 1.92952 1.51985 1.85138 1.04044 2.2156 1.30726 1.1663 1.16661 5.21173 2.35007 1.3357 1.00973 2.01546 3.16558 2.51725 1.27905 2.4227 1.04284 1.69508 1.63761 1.13783 1.05052 1.94433 1.53127 3.00499 2.68796 2.57445 2.29238 1.40015 1.2112 1.64527 2.04275 1.29598 1.29286 3.56593 1.07538 3.20392 3.18395 4.34619 4.03687 4.3556 5.21173 3.16558 3.00499 3.56593 4.12181 3.14539 4.60806 4.15836 3.15095 3.84449 3.29556 5.29513 3.09175 3.77562 3.64077 3.47721 3.23541 3.15543 4.04989 4.26591 3.37485 3.08451 3.02393 3.70764 3.07631 3.78511 4.02088 4.07996 4.92381 4.07996 3.29291 3.77091 4.23257 3.42756 3.04233 4.46149 3.6673 3.56409 4.8267 4.40435 3.60347 4.41955 3.0078 3.82172 3.14207 3.02297 3.59773 4.98197 3.60539 3.04233 3.21228 3.77326 3.15319 3.58261 3.36182 5.0445 4.02405 3.1465 3.48217 4.50565 3.25667 4.85208 4.16211 4.13261 3.21952 3.46087 3.74548 4.5463 3.72969 3.29423 3.0804 3.08657 3.47556 4.09022 3.17586 5.29513 3.75694 3.74548 3.30222 3.01725 3.18627 3.40305 4.12539 3.49556 3.02777 3.87053 3.39703 3.51433 3.67983 3.27072 4.11115 4.22444 4.08337 3.37339 5.03375

到达时刻:arr_time1 2.2218 5.13218 7.83369 11.0376 13.2449 15.4844 17.7548 19.8764 22.8475 25.4428 27.4948 29.8276 32.2364 34.7818 37.9657 42.3119 45.274 49.3109 51.8709 56.2265 58.8242 61.5096 63.7252 66.0753 68.0907 71.2563 73.7736 76.1963 79.2012 81.8892 84.4637 86.756 88.7988 92.3647 96.4865 99.6319 104.24 107.093 109.275 113.434 116.187 118.644 121.795 125.64 128.935 131.289 134.17 137.136 139.741 142.833 146.609 148.735 150.909 153.196 156.113 158.711 160.912 164.553 166.644 168.948 171.84 174.625 176.981 179.585 183.062 185.374 187.664 189.925 192.635 195.871 199.026 203.076 205.415 208.021 210.952 213.586 215.917 218.589 220.722 223.189 225.201 227.861 230.039 234.305 236.867 239.711 243.086 245.309 247.62 250.705 253.463 256.487 258.809 261.185 263.62 267.327 270.404 272.973 275.793 278.608 280.79 284.575 287.299 289.32 291.6 293.632 296.565 300.586 303.422 305.44 308.262 310.493 312.877 315.031 319.111 321.135 323.913 326.849 331.773 335.853 338.374 340.48 343.773 346.122 348.73 351.57 355.341 357.806 359.927 362.293 366.525 368.816 370.849 374.276 377.318 380.128 384.59 386.638 390.306 392.349 395.913 400.74 405.144 408.748 410.762 415.181 417.465 419.965 422.823 424.939 427.23 429.433 432.441 434.878 437.318 441.14 443.402 446.544 449.567 451.963 454.227 457.824 460.278 465.26 468.866 471.908 475.12 477.606 479.772 481.944 484.203 486.321 490.094 492.205 495.359 497.76 500.426 504.009 507.371 510.111 512.271 514.806 517.023 519.511 522.376 524.834 527.255 530.066 534.09 536.176 538.418 540.598 543.744 546.714 548.791 551.405 554.887 559.393 562.649 565.364

离开时刻:lea_time 3.58446 6.38452 9.03322 12.8505 14.9474 16.9822 18.9396 21.0769 25.0693 28.3532 30.0467 31.1086 34.1892 36.6481 39.3217 43.6769 47.2603 50.3693 53.3573 58.928 60.4909 63.2488 64.7348 67.7655 69.3262 72.9394 76.9775 79.1848 81.4408 82.9323 86.4497 87.8525 91.0692 93.8984 98.6081 102.603 105.922 109.688 111.74 114.979 117.429 120.074 124.128 126.71 131.344 133.251 136.715 140.32 144.666 147.628 148.722 152.772 155.332 156.345 158.325 160.472 162.177 165.9 168.308 173.304 174.951 176.417 179.579 182.27 184.992 186.894 189.515 190.966 194.851 197.178 200.193 204.243 210.627 212.977 214.313 215.322 217.932 221.754 224.271 225.551 227.973 229.016 231.735 235.943 238.004 240.762 245.03 246.84 250.625 253.393 256.038 258.78 260.209 262.396 265.265 269.37 271.7 274.266 279.358 280.434 283.994 287.759 292.106 296.142 300.498 305.71 308.875 311.88 315.446 319.568 322.713 327.322 331.48 334.631 338.475 341.771 347.066 350.158 353.933 357.574 361.051 364.287 367.442 371.492 375.758 379.133 382.217 385.241 388.949 392.025 395.81 399.831 403.911 408.835 412.915 416.208 419.979 424.211 427.639 430.681 435.143 438.81 442.374 447.201 451.605 455.209 459.628 462.636 466.458 469.6 472.623 476.22 481.202 484.808 487.85 491.062 494.836 497.989 501.572 504.933 509.978 514.002 517.148 520.631 525.136 528.393 533.245 537.407 541.54 544.759 548.22 551.966 556.512 560.242 563.536 566.616 569.703 573.178 577.269 580.444 585.74 589.496 593.242 596.544 599.561 602.748 606.151 610.276 613.772 616.799 620.67 624.067 627.581 631.261 634.532 638.643 642.867 646.951 650.324 655.358

到达人数:peo_num 0 1 3 5 8 9 12 14 15 16 18 19 21 23 25 27 29 31 33 34 36

39 40 42 43 45 47 49 50 52 54 56 58 60 62 64 65 68 69 71

74 76 78 80 82 84 86 87 89 91 93 95 96 98 100 102 104 106 107 109 111 113 115 117 118 119 121 123 125 126 129 130 132 134 135 137 138 140 141 142 144 145 148 150 152 154 155 157 159

161 162 163 165 166 167 169 170 171

173174 175 177 离开人数:lea_num 0 1 3 5 7 8 10 13 15 16 17 19 20 23 25 26 28 30 32 34 35

38 40 41 43 44 46 47 49 51 52 55 57 59 61 63 65 67 69 70

72 75 77 79 82 83 85 86 88 90 92 94 96 98 99 101 102 103 104 105 107 108 110 111 112 114 115 116 117 119 120 122 123 124

127 129 130 132 133 134 135 137 138 139 140 142 143 144

147 148 150 151 152 154 155 157 158 160 161 162

队长que 0 0 0 0 1 1 2 1 0 0 1 0 1 0 0 1 1 1 1 0 1 1 1 0 1 0 1 2 1 1 2 1 1 1 1 1 0 1 0 1 0 2 1 1 1 0 1 1 1 1 1 1 0 0 1 1 2 3 3 4 4 5 5 6 6 5 6 7 8 7 9 8 9 10

0 10 9 10 9 9 10 10 11 12 13 14 13 14 15 16 15 15 15 15

0 0 0 0 0 0 0 0

605040302010Wait TimeStay Time***401601800 0

下载学生成绩管理数据结构课程设计报告word格式文档
下载学生成绩管理数据结构课程设计报告.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    数据结构课程设计报告

    计算机科学与工程系 数据结构课程设计报告 课程设计题目 迷宫 航班信息查询系统 学 号 姓 名 班 级 专 业 网络工程 完 成 时 间 2013-1-4 指 导 教 师 数据结构课程设计......

    数据结构课程设计报告

    《数据结构》课程设计 哈希表实现电话号码查询系统 一目的 利用《数据结构》课程的相关知识完成一个具有一定难度的综合设计题目,利用C/C++语言进行程序设计,并规范地完成课程......

    数据结构课程设计报告

    青岛理工大学 数据结构课程设计报告题目:宿舍管理查询软件院(系):计算机工程学院 学生姓名:谢茂盛 班级:网络121学号: 201207131 起迄日期:2014.07.07-2014.07.20 指导教师:张艳......

    数据结构课程设计报告

    《数据结构》 课程设计报告 1 目录 《数据结构》 ......................................................................................................................

    数据结构课程设计报告

    数据结构课程设计报告 数据结构课程设计报告 院系:计算机学院班级:软件121班姓名:程猛 学号:201200834122 题目:最小生成树 软件121 程猛 201200834122 数据结构课程设计报告......

    数据结构课程设计报告

    扬州大学信息工程学院 《数据结构》 ---课程设计报告 题目: 校园导游咨询班级: 学号: 姓名 指导教师: 一、 设计题目 设计一个校园导游程序,为来访的客人提供各种信息查询服务。......

    VB学生成绩管理系统课程设计报告

    VB程序设计 课程设计报告 班 级:***** 姓 名:***** 序 号:***** 指导老师:***** 目录 第 0 页 共 31 页 1、课设的目的 .........................................................

    数据结构课程设计-停车场管理

    课 程 设 计 报 告 课程名称 数据 结构题目 停车场管理学生姓名 班级/学号 191103 一、 需求分析 设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供 汽车进出。汽......