程序设计综合实验报告册.docx
《程序设计综合实验报告册.docx》由会员分享,可在线阅读,更多相关《程序设计综合实验报告册.docx(44页珍藏版)》请在冰点文库上搜索。
程序设计综合实验报告册
西南交通大学
程序设计综合实验
实验地点:
实验学期:
学生班级:
学生学号:
学生姓名:
任课教师:
龚勋
信息科学与技术学院
2012年4月
实验一:
ATM机用户操作界面、业务逻辑编写
●实验目的及内容
1、根据ATM的工作流程编写用户界面,掌握文本用户菜单的编写方法;
2、根据ATM的工作流程编写业务罗杰,掌握搭建一个完整的应用系统的方法及软件编程思想。
●实验要求
1、除提示用户输入的数字外,界面上不能响应、出现任何其他用户输入;
2、每个菜单界面独立显示,不要出现多组菜单重叠显示的现象;
3、每个业务逻辑可以多次执行,直到用户选择退出业务。
●实验步骤及核心代码
voidmain()
{intbExit=0;
charin;//控制语言的选择
while(!
bExit)
{
MainMenu();
in=getch();
system("cls");
switch(in){.....语言选择}
}
}
voidMainMenu(){......}
voidLanguageMenu(intt)
{
intcExit=0;
charin;
while(!
cExit)
{
if(t==1)
{......//显示中文功能选择菜单
in=getch();
system("cls");
switch(in)
{中文功能函数的选择}
}
else{同上,只需将中文函数改为英文函数}
}
}
//中文的查询函数
voidQuery1()
{
printf("======================\n")
printf(“此账户有%.2f元\n",sum);//对sum已初始化
system("pause");
system("cls");
}
//中文的存钱函数
voidDeposit1(float*p)
{
floatx;
printf("================================\n");
printf("输入您要存的数目:
");
scanf("%f",&x);
*p+=x;
system("pause");
system("cls");
}
//中文的取钱函数
voidWithDraw1(float*p)
{
floaty;
inta=1;
printf("====================================\n");
printf("输入您要取的数目:
");
while(a)
{
scanf("%f",&y);
if(y>sum)
{printf("\n余额不足,按任意键后重新输入\n");}
else
{*p-=y;
a=0;
}
}
system("pause");
system("cls");
}
实验二:
进制转换器
●实验目的及内容
写一个进制转换器,实现十进制、二进制、十六进制的相互转换
●实验要求
1、转换要求包括整数和小数;
2、提供清晰、有好的用户界面;
3、各种转换可以反复多次执行,直到用户选择”退出“按钮。
●实验步骤及核心代码
voidmain(){...}
voidMainmenu(){...}
//二进制到十进制和十六进制
voidBtoDH()
{
intiExit=0;
while(!
iExit)
{system("cls");
strings1,s2,s3,s;
inti,len;
......//输入字符串s
s=s1;
len=s1.length();
for(i=0;i{s3=s1.substr(0,1);//截取从0到1的字符,包括0不包括1s1=s1.substr(1,s1.length()-1);
if(s3==".")
{s2=s.substr(0,i);//截取0到i的字符
break;
}
}
if(s2.length()==0)
{
s2=s;
s1="";
}
intin=BtoDint(s2);//把二进制数分离开后,调用整数部分
floatdou=BtoDdecimal(s1);//调用二进制小数部分
dou=in+dou;
stringss1,ss2;
ss1=BtoHint(s2,1);
ss2=BtoHint(s1,0);
......//输出十进制形式和十六进制形式
}
}
//二进制整数到十进制整数
intBtoDint(strings)
{
inti,ss=0,len,l;
len=s.length()-1;
l=len;
for(i=0;i<=len;i++)
{
stringch=s.substr(0,1);
s=s.substr(1,s.length()-1);
if(ch=="1")
{
ss+=pow(2,l);
l--;
}
else
l--;
}
returnss;
}
//二进制小数到十进制小数
floatBtoDdecimal(strings)
{
floatss=0.0;
inti,len,l;
len=s.length()-1;
l=-1;
for(i=0;i<=len;i++)
{
stringch=s.substr(0,1);
s=s.substr(1,s.length()-1);
if(ch=="1")
{ss+=pow(2,i);//pow函数返回值为计算2的i次方
l--;
}
else
l--;
}
returnss;
}
//十六进制到二进制和十进制
voidHtoBD()
{
intiExit=0,len,i;
strings,s1,s3,s2,ss1,ss2;
while(!
iExit)
{
system("cls");
cout<<"pleaseinputthenumber";
cin>>s1;
s=s1;
len=s1.length();
for(i=0;i{
s3=s1.substr(0,1);
s1=s1.substr(1,s1.length()-1);
if(s3==".")
{
s2=s.substr(0,i);
break;
}
}
if(s2.length()==0)
{
s2=s;
s1="";
}
ss1=HtoBint(s2,1);
ss2=HtoBint(s1,0);
intin=BtoDint(ss1);
floatdou=BtoDdecimal(ss2);
dou=in+dou;
......//输出二进制形式和十进制形式
}
}
stringHtoBint(strings,intin)
{
strings1;
intlen;
len=s.length();
stringret="";
for(inti=0;i{
s1=s.substr(0,1);
s=s.substr(1,s.length()-1);
if(in==1)
ret=HtoBbit(s1)+ret;
else
ret+=HtoBbit(s1);
}
returnret;
}
//十六进制字符与二进制字符串的互相转换
stringHtoBbit(strings)
{stringret;
if(s=="0")ret="0000";
...
}
//二进制到十六进制
stringBtoHint(strings,intin)
{
intlen=s.length();
intt=len%4;
len=(4-t)%4;
while(len--)
{
if(in==1)
s="0"+s;
else
s+="0";
}
intnum=s.length()/4,i;
stringret;
for(i=0;i{
stringtemp=s.substr(0,4);
s=s.substr(4,s.length()-4);
ret+=BtoHbit(temp);//BtiHbit函数使二进制字符串与十六进制字符互相转换,与上面相似,略写
}
returnret;
}
//十进制到二进制和十六进制
voidDtoBH()
{
doublenum,n2;
intiExit=0,len,n1;
strings1,s2,s3,s4;
while(!
iExit)
{
system("cls");
cout<<"pleaseinputthenumberandthelengthofdecimal";
cin>>num>>len;
n1=int(num);
n2=num-n1;
s1=DtoBdecimal(n2,len);
s2=DtoBint(n1);
s3=BtoHint(s2,1);
s4=BtoHint(s1,2);
......//输出二进制形式和十六进制形式
}
}
//十进制小数到二进制小数
stringDtoBdecimal(doublein,intlen)
{
stringret;
doublep=in;
while(len--)
{
p*=2;
if(p>=1)
{
ret+="1";
p-=1.0;
}
else
ret+="0";
}
returnret;
}
//十进制整数到二进制整数
stringDtoBint(intin)
{if(in==0)
return"0";
stringret="";
intq=in,remain;
while(q)
{remain=q%2;
q=q/2;
if(remain)ret="1"+ret;
elseret="0"+ret;
}
returnret;
}
实验三:
随机数生成、中奖者
●实验目的及内容
生成一组均匀分布的伪随机数,根据随机数编写一个抽奖程序
●实验要求
1、能够根据用户的输入,控制随机数生成的数目,随机数用动态数组保存;
2、能够根据用过的输入,控制随机数的范围:
比如能够生成一组【a,b】范围内的随机数;
3、由用户输入抽奖者人数N;
4、为每一个人分配一个代号(类似于名字)和一个随机号码(即抽奖票号,加你控制在1-N之间)并将其打印出来;
5、由机器摇号:
生成一个在1-N之间的随机数作为中奖号码,查找中奖者,并公布中奖者信息(注:
可以有多人同时中奖);
6、如果没有对应的中奖者,需要将该号码公布出来,然后重新生成一个中奖号码,知道中奖者存在为止。
●实验步骤及核心代码
#include
#include
#include
usingnamespacestd;
staticunsignedholdrand=1L;
voidLottery(intn);
voidmysrand(unsignedseed);
intmyrand(void);
intllottery(intnum);
intn;
structPEOPLE{
char*name;
intnumber;
}mem[100];
voidmain()
{
cout<<"Inputthetotalnumberofthepeople:
";
cin>>n;
cout<<"==========================="<cout<<"Informationofall:
"<Lottery(n);
}
voidLottery(intn)
{
inti,N,k;
intnum;
cout<<"InputN:
";
cin>>N;
mysrand((unsigned)time(NULL));
for(i=0;i{
k=myrand();
k=k%(N-1)+1;
mem[i].number=k;
}
for(i=0;i{
cout<p"<
}
num=myrand();
num=num%(N-1)+1;
while(!
llottery(num))
{
num=myrand();
num=num%(N-1)+1;
}
}
voidmysrand(unsignedseed)
{
holdrand=seed;
}
intmyrand(void)
{
return(((holdrand=holdrand*201413+2531011L)>>16)&0x7fff);
}
intllottery(intnum)
{
inti,j=0;
cout<"<for(i=0;i{
if(mem[i].number==num)
{cout<<"Theinvalidis:
p"<
j++;
}
}
if(j==0)
return0;
else
return1;
}
实验四:
插入排序、快速排序
●实验目的及内容
1、生成一组随机整数,对该组数据进行排序,采用插入排序法;
2、生成一组随机整数,对该组数据尽心排序,采用快速排序法。
●实验要求
1、数组长度由用户输入;
2、随机数范围在【100,10000】范围内;
3、采用插入排序法和快速排序法进行排序;
4、根据用户要求,可以实现增序、降序两种排序。
●实验步骤及核心代码
1、插入排序
intmain()
{
......//用户定义数组长度len
lottery(len);
}
voidlottery(intlen)
{inti;
charch;
mysrand((unsigned)time(NULL));//time函数返回1970年1月1日00:
00:
00起距函数调用时相聚的时间,以秒为单位,在的头文件中
......
if(ch=='1')swap1(b,len);//升序
elseif(ch=='2')swap2(b,len);//降序
for(i=0;icout<
}
voidmysrand(unsignedseed){......}
intmyrand(void)//此函数在实验三里有写
{......
h=h%(10000-100)+100;//控制随机数范围在【100-10000】之内,
returnh;
}
voidswap1(int*c,intn)
{
inti,j,x,k=1;
c[0]=myrand();
for(j=1;j{
x=myrand();
i=j-1;
while(i>=0&&c[i]>x)
{
c[i+1]=c[i];
i--;
}
c[i+1]=x;
}
}
2、快速排序
voidmain()
{
intA[100],n,k;
...//用户定义数组长度
intexit=0;
charch;
while(!
exit)
{
for(inti=0;i{
k=myrand();//与产生随机数有关的函数略,实验三有写
k=k%(MAX-MIN)+MIN;//控制随机数的范围,MIN=1,MAX=100,在开始有定义
A[i]=k;
}
mainmenu();//mainmenu函数为主菜单,略写
ch=getch();
system("cls");
switch(ch)
{
case'1':
QuikUp(A,0,n-1);print(A,n);system("pause");system("cls");break;
case'2':
QuikDown(A,0,n-1);print(A,n);system("pause");system("cls");break;
case'3':
exit=1;
default:
printf("error!
\n");break;
}
}
}
//升序排序
voidQuikUp(inta[],intp,intr)
{
if(p>=r)
return;
inti=p;
intj=r+1;
intx=a[p];
while
(1)
{
while(i<=r&&a[++i]while(j>=p&&a[--j]>x);
if(i>=j)break;
Swap(&a[i],&a[j]);//Swap函数为交换*p与*q的值,略写
}
if(i==j)
j--;
a[p]=a[j];
a[j]=x;
QuikUp(a,p,j-1);
QuikUp(a,j+1,r);
}
实验五:
模块计时器、常用排序算性能测试
●实验目的及内容
设计一组计时函数,封装所有计时函数,采用测试性能函数对快速函数、插入函数、选择排序算法进行性能测试。
●实验要求
1、计时精确:
封装的高精度的计时API函数QueryPerformanceCounter(),可以达到微秒级的精度;
2、使用简单:
只用在待测试的模块前后加上两个宏BM_START和BM_END,不需要对结果进行计算,也不需要考虑对各个模块结果数据的维护;
3、多组测试:
最多可以同时实现20个模块的测试,及可以保存20组数据;
4、结果输出独立:
在系统运行结果时,只需要用一个函数就可以把计时结果保存在一个文本文件里
5、对一组数据进行排序;
6、数组长度为10000,数组应随机产生;
7、为了保证测试数据的稳定,每种排序算法运行10次,计算总的时间
●实验步骤及核心代码
voidmain()
{inti;
intret[BENCHMARK_MAX_COUNT];//BENCHMARK_MAX_COUNT为模块总数
InitBenchmark();
BMTimerStart
(1);//开始计时
for(i=0;i<10;i++)
{
sort_quick(a,10000);//快速排序,实验四有写,略写
sort_chr(a,10000);//插入排序,实验四有写,略写
sort_choice(a,10000);//选择排序,略写
}
BMTimerEnd
(1);//结束计时
WriteData(1,"Test1","D:
\\log.txt");//将数据填入文件中
}
voidInitBenchmark()
{
ResetBenchmarkCounters();//对数组gStats,gEnds,gCounter清零
GetClockFrequent();//获得机器内部定时时钟频率
}
voidBMTimerStart(intiModel)
{
LARGE_INTEGERlitmp;
QueryPerformanceCounter(&litmp);//提高精度,在头文件"windows.h"中
gStarts[iModel]=litmp.QuadPart;
}
voidBMTimerEnd(intiModel)
{
LARGE_INTEGERlitmp;
QueryPerformanceCounter(&litmp);
gEnds[iModel]=litmp.QuadPart;
gCounters[iModel]+=(((gEnds[iModel]-gStarts[iModel])/dfFreq)*1000000000);
}
voidWriteData(intTotalCount,stringsModel,stringpath)
{
//openthefileandmovepointertotheendofthefile,需要头文件"fstream"
ofstreampFile(path.data(),ios:
:
app|ios:
:
out);
//1Header
stringtitle,s2;
stringsperator="\r\n\r\n=========================================\r\n";
title="Model---"+sModel;
chartemp1[100],temp2[100];
sprintf(temp1,"\r\nIterationCounter:
5d\r\n",TotalCount);
title+=temp1;
//2Times
strings;
doublegTotal=0;
for(inti=0;i{
if(gCounters[i]==0)
continue;
sprintf(temp1,"Total%d",i);
intlen=strlen(temp1)/8;//*calculatethenumberof'\t'
s+=