数据结构课程设计内包五个程序源代码.docx

上传人:b****5 文档编号:29854915 上传时间:2023-07-27 格式:DOCX 页数:33 大小:71.20KB
下载 相关 举报
数据结构课程设计内包五个程序源代码.docx_第1页
第1页 / 共33页
数据结构课程设计内包五个程序源代码.docx_第2页
第2页 / 共33页
数据结构课程设计内包五个程序源代码.docx_第3页
第3页 / 共33页
数据结构课程设计内包五个程序源代码.docx_第4页
第4页 / 共33页
数据结构课程设计内包五个程序源代码.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

数据结构课程设计内包五个程序源代码.docx

《数据结构课程设计内包五个程序源代码.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计内包五个程序源代码.docx(33页珍藏版)》请在冰豆网上搜索。

数据结构课程设计内包五个程序源代码.docx

数据结构课程设计内包五个程序源代码

 

数据结构课程设计

网络工程112班

赵凡举

201101024229

 

《数据结构课程设计》实验报告

【完成题目1】猴子选大王

【问题描述】

一堆猴子都有编号,编号是1,2,3...m,这群猴子(m个)按照1--m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。

【基本要求】

输入数据:

输入m,n。

m,n为整数,n

输出形式:

中文提示按照m个猴子,数n个数的方法,输出为大王的猴子是几号,建立一个函数来实现此功能。

【算法设计】

采用头指针和尾指针指针,将m个猴子编号构成环,从第一个开始数,数到第n个猴子,将其淘汰,即第n-1个的后继变成第n+1个,然后从第n+1个开始数,如此循环,直到剩下最后一个即为大王

【源代码】

#include

usingnamespacestd;

structNode

{

intdata;

structNode*next;

};

intmain()

{

structNode*head,*s,*q,*t;

intn,m,count=0,i;

cout<<"输入猴子个数m"<

cin>>m;

cout<<"输入淘汰第几个n"<

cin>>n;

if(i=1)

cout<<"大王是"<

else

{

for(i=0;i

{

s=(structNode*)malloc(sizeof(structNode));

s->data=i+1;

s->next=NULL;

if(i==0)

{

head=s;

q=head;

}

else

{

q->next=s;

q=q->next;

}

}

q->next=head;

q=head;

do

{

count++;

if(count==n-1)

{

t=q->next;

q->next=t->next;

count=0;

}

q=q->next;

}

while(q->next!

=q);

cout<<"大王是"<data<

}

return0;

}

运行演示

【收获及体会】

猴子选大王问题,也可以用数组来实现,所用思想一样,查到第n个就将其删除,从下一个继续数,构成环是要有语句q=head;

【完成题目2】随机整数排序问题

【问题描述】

针对随机产生2000个以上的整数,采用多种方法进行排序,并显示排序结果,比较各种算法的效率。

【基本要求】

1.为了提高效率,所产生的随机整数可以用文件保存,供各排序算法共用;

2.为了更好地进行比较,采用3种以上方法实现排序,并分别保存排序结果;

3.记录每种排序所耗费的时间。

【算法设计】

随机整数的产生srand(time(0));for(i=1;i<=n;i++){a[i]=rand();}n可以控制个数,采用冒泡,选择,归并三种排序方法,计算时间的算法为start=clock();......finish=clock();tim=(double)(finish-start)/CLOCKS_PER_SEC;省略号为排序代码,tim即为排序耗费时间

【源代码】

#include

#include

#include

usingnamespacestd;

voidmergesort(int*num,intstart,intend);

voidmerge(int*num,intstart,intmiddle,intend);

voidmergesort(int*num,intstart,intend)

{

intmiddle;

if(start

{

middle=(start+end)/2;

mergesort(num,start,middle);

mergesort(num,middle+1,end);

merge(num,start,middle,end);

}

}

voidmerge(int*num,intstart,intmiddle,intend)

{

intn1=middle-start+1;intn2=end-middle;

int*L=newint[n1+1];int*R=newint[n2+1];

inti,j=0,k;

for(i=0;i

{

*(L+i)=*(num+start+i);

}

*(L+n1)=1000000;

for(i=0;i

{

*(R+i)=*(num+middle+i+1);

}

*(R+n2)=1000000;

i=0;

for(k=start;k<=end;k++)

{

if(L[i]<=R[j])

{

num[k]=L[i];

i++;

}else

{

num[k]=R[j];

j++;

}

}

}

intmain()

{

clock_tstart,finish;

doubleduration;

intn,i,j,t,b;

floattim;

inta[100000];

cout<<"输入个数(100000以内)"<

cin>>n;

srand(time(0));

for(i=1;i<=n;i++)

{

a[i]=rand();

}

cout<<"产生的随机数:

"<

for(j=1;j<=n;j++)

cout<

cout<

while

(1)

{

cout<<"****选择****"<

cout<<"

(1)冒泡排序"<

cout<<"

(2)选择排序"<

cout<<"(3)归并排序"<

cout<<"(4)退出"<

cin>>b;

if(b==4)

break;

switch(b)

{

case1:

{

start=clock();

for(j=1;j<=n;j++)

for(i=1;i<=n-j;i++)

{

if(a[i]>a[i+1])

{

t=a[i];

a[i]=a[i+1];

a[i+1]=t;

}

}

cout<<"冒泡排序结果"<

for(j=1;j<=n;j++)

cout<

cout<

finish=clock();

tim=(double)(finish-start)/CLOCKS_PER_SEC;

cout<<"用时:

"<

}break;

case2:

{

start=clock();

for(i=1;i

{

intk=i;

for(j=i+1;j<=n;j++)

{

if(a[j]

k=j;

t=a[k];

a[k]=a[i];

a[i]=t;}

}

cout<<"选择排序结果"<

for(j=1;j<=n;j++)

cout<

cout<

finish=clock();

tim=(double)(finish-start)/CLOCKS_PER_SEC;

cout<<"用时:

"<

}break;

case3:

{

start=clock();

mergesort(a,0,n);

cout<<"归并排序结果"<

for(i=1;i<=n;i++)

cout<

cout<

finish=clock();

tim=(double)(finish-start)/CLOCKS_PER_SEC;

cout<<"用时:

"<

}break;

}

}

return0;

}运行演示

【收获及体会】

在本程序所采用的三种方法里边,归并排序所耗费的时间最短,计算时间的算法start()和finish()之间放所要计算时间的代码,即可得出时间

【完成题目3】数制转换

【问题描述】

在日常生活中,常常使用各种编码,如身份证号码、电话号码和邮政编码等,这些编码都是由十进制数组成的。

同理,在计算机中采用由若干位二进制数组成的编码来表示字母、符号、汉字和颜色等非数值信息。

十进制数N和其他进制数的转换是计算机实现计算的基本算法,数制间转换的实质是进行基数的转换。

【基本要求】

设计实现十进制数与二进制数之间的数制转换程序,要求进行某种数制转换后,输入相应的格式正确的数值(也可以是混合小数的形式),程序按照设定的算法执行,给出相对应的进制数数值,对于输入数据的合法性可以不做检查。

【算法设计】

将输入数定义为float类型,先将整数部分和小数部分分开,分别进行转换,整数部分依次除以2,把余数存进数组,输出时倒着输出,并输出小数点小数部分依次乘以2,输出时正序输出

【源代码】

#include

usingnamespacestd;

intmain()

{

inta,b,i,w=0,m,n,j,du,u,g;

ints[100];

floatc,d,e,f;

cout<<"输入整数或小数"<

cin>>c;

cout<<"准确度(小数点后几位)"<

cin>>du;

d=c;

n=c;

u=du;

while(a!

=0)

{

w++;

a=n/2;

b=n%2;

n=a;

s[w]=b;

}

cout<<"转换结果"<

for(i=w;i>0;i--)

{

cout<

}

cout<<".";

j=w+1;

n=d/1;

e=d-n;

while(du)

{

w++;

f=e*2;

g=f/1;

e=f-g;

s[w]=g;

du--;

}

for(m=j;m

cout<

cout<

return0;

}

运行演示

 

【收获及体会】

小数进行数值转换时,要先将小数部分和整数部分分开,分别进行转换,转换时涉及的差积商余运算还有类型转换,此题目可以用数据结构栈来实现

【完成题目4】宿舍管理查询系统

【问题描述】

为宿舍管理人员编写一个宿舍管理查询系统

【基本要求】

1.采用交互工作方式;

2.可以增加、删除、修改信息;

3.建立数据文件,数据文件按关键字(姓名、学号、房号)进行排序;

4.查询(按姓名、学号、房间号查询);

5.打印任一查询结果(可以连续操作)。

【算法设计】

用结构体来实现,增加,删除,排序,查找,修改分模块来实现switch,case实现操作选择

【源代码】

#include

#include

#include

#include

usingnamespacestd;

structcomm_info

{

charname[16];

longnum;

charf[16];

};

intmain()

{

system("color75");

structcomm_infos[300],t;

inti=0,w,m=0,f=0;

charc[20];

intcount=3;

charname[20],pwd[20];

while(count!

=0)

{

cout<<"请输入用户名:

"<>name;

cout<<"请输入密码:

"<>pwd;

count--;

if(strcmp(name,"zhaofan")==0&&strcmp(pwd,"123")==0)

{

m++;

count=0;

}

else

{

cout<<"密码或用户名错误您还有"<

if(count==0)

cout<<"密码错误次数达到最大限制!

程序即将退出!

"<

}

}

if(m)

{

ifstreamfin1("f1.dat",ios:

:

binary);

memset(s,0,300*sizeof(comm_info));

for(w=0;w<300;w++)

{

fin1.read((char*)&s[w],sizeof(comm_info));

if(!

s[w].num==0)

{

f++;

}

}

i=f;

fin1.close();

while

(1)

{

system("cls");

cout<<"欢迎使用宿舍管理系统"<

cout<

cout<<"2查询"<

cout<<"3删除"<

cout<<"4修改"<

cout<<"5排序"<

cout<<"6当前操作下所有数据"<

cout<<"7将已处理数据写入文"<

cout<<"8退出"<

cin>>w;

if(w==8)

break;

switch(w)

{

case1:

cout<<"增加数据"<

{

do

{

cout<<"第"<

ofstreamfout1("f1.dat",ios:

:

app);

ofstreamfout2("f2.txt",ios:

:

app);

if(!

fout1)

{

cout<<"Cannotopenbinaryfile."<

exit(0);

}

if(!

fout2)

{

cout<<"Cannotopentextfile."<

exit(0);

}

cout<<"输入姓名:

";cin>>s[i].name;

cout<<"输入学号:

";cin>>s[i].num;

cout<<"输入房号:

";cin>>s[i].f;

fout1.write((char*)&s[i],sizeof(comm_info));//把记录写入二进制文件

//把记录写入文本文件

fout2<<"学号:

"<

"<

"<

fout1.close();

fout2.close();

i++;

cout<<"数据录入成功,继续录入吗(y/n)"<

cin>>c;

inta=0;

do

{

if(strcmp(c,"y")&&strcmp(c,"n"))

{

cout<<"指令错误!

请重新输入!

";

cin>>c;

}

else

a=1;

}while(a==0);

}while(strcmp(c,"y")==0);

break;

}

case2:

cout<<"查询"<

{

intm=0;

if(i<1)

{

cout<<"没有成员"<

m++;

_sleep(3000);

if(m)

break;

}

cout<<"1按姓名查找"<

cout<<"2查找组"<

cout<<"3退回主菜单"<

inta=0,b,d=0;

charname[20];

cin>>b;

if(b==3)

break;

switch(b)

{

case1:

do

{cout<<"按姓名查找"<

"<

cin>>name;

for(intj=0;j

{

if(strcmp(name,s[j].name)==0)

{

cout<<"姓名:

"<

cout<<"学号:

"<

cout<<"房号:

"<

d++;

}

}

if(d)

cout<<"存在,是否继续姓名操作(y/n)"<

else

cout<<"不存在,是否继续姓名操作(y/n)"<

cin>>c;

do

{

if(strcmp(c,"y")&&strcmp(c,"n"))

{

cout<<"指令错误!

请重新输入!

";

cin>>c;

}

else

a=1;

}while(a==0);

}while(strcmp(c,"y")==0);

break;

case2:

do

{cout<<"按小组查找"<

charf[16];

intd=0;

cin>>f;

for(intj=0;j

{

if(strcmp(f,s[j].f)==0)

{

cout<<"姓名:

"<

cout<<"学号:

"<

cout<<"房号:

"<

d++;

}

}

if(d)

cout<<"已经找到,是否继续房号查找操作(y/n)"<

else

cout<<"不存在,是否继续房号操作(y/n)"<

cin>>c;

do

{

if(strcmp(c,"y")&&strcmp(c,"n"))

{

cout<<"指令错误!

请重新输入(y/n)!

";

cin>>c;

}

else

a=1;

}while(a==0);

}while(strcmp(c,"y")==0);

break;

}

}break;

case3:

do

{

inta=0,b,d=0,num=0,m=0;

charname[20];

{

cout<<"按姓名删除"<

"<

cin>>name;}

for(intj=0;j

{

if(strcmp(name,s[j].name)==0)

{

cout<<"姓名:

"<

cout<<"学号:

"<

cout<<"房号:

"<

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 英语学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1