当前位置:文档之家› 软件课程设计第四阶段实验报告

软件课程设计第四阶段实验报告

编号:()字号《软件课程设计》报告班级:信科10--2姓名:潘寿岭学号: 08103502指导老师:王志晓2012年01 月第四阶段六、数据结构设计题46.1需求分析1、设计一个统计选票的算法,输出每个候选人的得票结果2、假设采用单链表存放选票,候选人编号依次为1,2,3,……,N,且每张选票选且只选一人3、以单链表存放选票,每个结点的data域存放该选票所选的候选人。

用一个数组a统计得票结果。

6.2概要设计用函数CreateList ( )动态建立一个单链表,链表中每个节点的data域为空,返回头节点。

Statistics( )函数统计各个后选人所得票数。

在主函数中先输入候选人数n,然后动态建立一维数组a[n]来存放每个候选人所得票数(如a[i]表示第i+1号候选人所得票数),统计选票时调用Statistics( )函数,将整个单链表全部遍历一遍,将各个候选人的得票个数计入到数组a[n]中,最后输出各个候选人的得票情况。

6.3详细设计与编码流程图程序代码#include <iostream>using namespace std;typedef struct node{int data;struct node *next;}LNode;int n;LNode *CreateList() //构建单链表,每投一票插入一个节点,节点data域存放所选的候选人号码{LNode *L,*p,*t;int m,i;L=new LNode;L->next=NULL;L->data=NULL; //头结点data域中为空t=L;cout<<"输入投选票的张数:";cin>>m;cout<<"请投选票:"<<endl;for(i=0;i<m;i++){p=new LNode;cout<<"请输入要投第几号候选人:";cin>>p->data;p->next=NULL;t->next=p;t=p;}return L; //返回头结点}void Statistics(LNode *L,int *a) //统计投票情况{LNode *p;p=L->next;while(p!=NULL){a[p->data-1]++; //a[i]中存放第i+1号候选人的得票个数p=p->next;}}void main(){int i;LNode *L;cout<<"请输入候选人人数:";cin>>n;int *a=new int[n]; //动态建立数组,用来存放候选人得票个数for(i=0;i<n;i++)a[i]=0;L=CreateList(); //构建单链表,返回头结点Statistics(L,a); //统计投票情况for(i=0;i<n;i++) //输出得票结果cout<<"第"<<i+1<<"个候选人的得票数为:"<<a[i]<<endl;}运行结果6.4调试分析由于候选人数不确定,所以要根据输入的候选人人数动态建立数组来存放得票情况。

在动态建立单链表的过程中系统出现过内存分配错误的问题,所以在建立链表时要保证尾节点的指针域始终为空,另设一个指针始终指向插入的节点,为下一个节点的插入做准备。

创建单链表的函数返回头节点的地址,所以函数类型为指针类型。

6.5用户使用说明用户进入界面后,先输入候选人数,在输入要投票数,接着开始投票,每输入一个号码后按回车,最终得到投票结果。

6.6设计心得本题是一道简单的数据结构链表创建和遍历问题。

通过本题的练习和思考,使我了解和掌握了单链表和循环链表的创建以及创建链表时应该注意的问题,了解了链表在解决一些问题时的优越性。

七、数据结构设计题97.1需求分析1、从一副扑克牌(54张)中任意抽出27张(不重复),摆放在不同的三行上(每行9张),用户“暗记”某张纸牌,输入所“暗记”的那张纸牌处于哪一行。

2、之后计算机再两次将纸牌重新摆放,并让用户再回答两次相同的提问(那张纸牌在重新摆放后又处在哪一行上)。

3将用户所“暗记”的那张纸牌给挑出来,显示到屏幕上。

7.2概要设计定义一个结构体pk,pk中存放扑克牌的数码和花色;成员函数有display( ),用来输出扑克牌的布局;int_char1( )函数用来将随机生成的整数转化为扑克牌的数码;int_char2 ( )函数用来将随机生成的整数转化为扑克牌的花色;move ( )函数用来重新摆放扑克牌,整数1—15对应的扑克牌数码依此为A 1 2 3 4 5 6 7 8 9 10 J Q K X Z,整数1—4对应扑克牌花色依此为a b c d (红桃、黑桃、梅花、方块)。

在主函数中定义结构体数组p[27]用来存放取出的27张牌的数码和花色。

先自动生成一张牌,之后每生成一张牌都要与前几张生成的牌进行比较,如果相同均要重新生成,直至生成27张不同的扑克牌为止;然后分三行显示这27张牌。

之后调用move ( )函数,用户暗记一张牌并输入改牌所在的行数,然后计算机根据用户输入的行数决定重新洗牌的方式,洗完牌后将重新摆放的扑克牌布局显示到屏幕上,用户继续输入所记扑克牌的行数,计算机第二次将牌重新摆放,输出摆放的布局,用户再次回答提问,最终计算机将用户暗记的牌挑出来显示到屏幕上。

7.3详细设计与编码流程图程序代码#include<iostream> #include<iomanip> using namespace std;struct pk{char data; //扑克牌上的数码char hs; //扑克牌的花色};void display(pk); //输出扑克牌的摆放情况char int_char1(int); //将随机生成的数字转化为扑克牌上的数码char int_char2(int); //将随机生成的数字转化为扑克牌上的花色void move(pk*); //重新摆放扑克牌void main(){pk p[27];for(;;){p[0].data=int_char1(rand()%15+1); //生成第1 张扑克牌的数码p[0].hs=int_char2(rand()%4+1); //生成第1 张扑克牌的花色for(int i=1;i<27;){pk g;g.data=int_char1(rand()%15+1); //生成第i+1 张扑克牌的数码g.hs=int_char2(rand()%4+1); //生成第i+1 张扑克牌的花色bool prime=true;for(int j=0;j<i;j++) //将生成的扑克牌与前i张进行比较,出现相同的则重新生成扑克牌{if((g.data==p[j].data&&g.hs==p[j].hs)||g.data=='X'&&p[j].data=='X'||g.data=='Z'&&p[j].data =='Z'){prime=false;break;}}if(prime){p[i].data=g.data;p[i].hs=g.hs;i++;}}int l=1;int k;cout<<"--------------------------------------------------------------"<<endl;for( k=0;k<27;k++){if(k==0||k==9||k==18){cout<<"Line"<<l<<" ";l++;}display(p[k]); //将扑克牌分行显示在屏幕上if((k+1)%9==0)cout<<endl;}move(p);char a;cout<<"是否继续游戏?(y/n)";cin>>a;while(a!='y'&&a!='n'){cout<<"输入错误请从新输入(继续输入y,退出输入n):";cin>>a;}if(a=='n')break;}}char int_char1(int i){char p;switch(i) // 将随机生成的数字转化为扑克牌上的数码,大小王为X和Z {case 1:p='A';break;case 2:p='2';break;case 3:p='3';break;case 4:p='4';break;case 5:p='5';break;case 6:p='6';break;case 7:p='7';break;case 8:p='8';break;case 9:p='9';break;case 10:p='W';break;case 11:p='J';break;case 12:p='Q';break;case 13:p='K';break;case 14:p='X';break;case 15:p='Z';break;}return p;}char int_char2(int i){char p;switch(i) //将随机生成的数字转化为扑克牌上的数码{case 1:p='a';break;case 2:p='b';break;case 3:p='c';break;case 4:p='d';break;}return p;}void display(pk h) //除了大小王,其余扑克牌均要输出数码和花色{if(h.data=='X')cout<<setw(8)<<"KING2";else if(h.data=='Z')cout<<setw(8)<<"KING1";else if(h.data=='W')cout<<setw(4)<<h.hs<<"-"<<"10";else cout<<setw(4)<<h.hs<<"-"<<h.data;}void move(pk *p){int i;pk k[27];pk k2[27];int line;int line2;int line3;cout<<"--------------------------------------------------------------"<<endl;cout<<"Remember a card, and tell me what line it reside in(1/2/3):"; //用户暗记一张牌,输入该牌在第几行cin>>line;switch(line) //根据输入的行数,选择相应的重新洗牌方式{case 1: for(i=0;i<3;i++){k[i]=p[i];k[i+9]=p[i+3];k[i+18]=p[i+6];}for(i=3;i<6;i++){k[i]=p[i+6];k[i+9]=p[i+9];k[i+18]=p[i+12];}for(i=6;i<9;i++){k[i]=p[i+12];k[i+9]=p[i+15];k[i+18]=p[i+18];}break;case 2:for(i=0;i<3;i++){k[i]=p[i+9];k[i+9]=p[i+12];k[i+18]=p[i+15];}for(i=3;i<6;i++){k[i]=p[i-3];k[i+9]=p[i];k[i+18]=p[i+3];}for(i=6;i<9;i++){k[i]=p[i+12];k[i+9]=p[i+15];k[i+18]=p[i+18];}break;case 3: for(i=0;i<3;i++){k[i]=p[i+18];k[i+9]=p[i+21];k[i+18]=p[i+24];}for(i=3;i<6;i++){k[i]=p[i+6];k[i+9]=p[i+9];k[i+18]=p[i+12];}for(i=6;i<9;i++){k[i]=p[i-6];k[i+9]=p[i-3];k[i+18]=p[i];}break;}int l=1;cout<<"----------------------------------------------------------"<<endl;for(i=0;i<27;i++){if(i==0||i==9||i==18){cout<<"Line"<<l<<" ";l++;}display(k[i]); //将扑克牌分行显示在屏幕上if((i+1)%9==0)cout<<endl;}cout<<"--------------------------------------------------------------"<<endl;cout<<"What line the card you remembered reside in now (1/2/3) :"; //输入暗记的牌所在行数cin>>line2;switch(line2) //根据输入的行数,选择相应的重新洗牌方式{case 1: k2[8]=k[0];k2[17]=k[1];k2[26]=k[2];for(i=9;i<=16;i++)k2[i]=k[i];for(i=18;i<=25;i++)k2[i]=k[i];k2[0]=k[8];k2[1]=k[17];k2[2]=k[26];for(i=3;i<=7;i++)k2[i]=k[i];break;case 2: k2[8]=k[9];k2[17]=k[10];k2[26]=k[11];for(i=0;i<=7;i++)k2[i]=k[i];for(i=18;i<=25;i++)k2[i]=k[i];k2[9]=k[8];k2[10]=k[26];k2[11]=k[17];for(i=12;i<=16;i++)k2[i]=k[i];break;case 3: k2[8]=k[18];k2[17]=k[19];k2[26]=k[20];for(i=0;i<=7;i++)k2[i]=k[i];for(i=9;i<=16;i++)k2[i]=k[i];k2[18]=k[8];k2[19]=k[17];k2[20]=k[26];for(i=21;i<=25;i++)k2[i]=k[i];}l=1;cout<<"----------------------------------------------------------"<<endl; for(i=0;i<27;i++){if(i==0||i==9||i==18){cout<<"Line"<<l<<" ";l++;}display(k2[i]); //将扑克牌分行显示在屏幕上if((i+1)%9==0)cout<<endl;}cout<<"--------------------------------------------------------------"<<endl;cout<<"What line the card you remembered reside in now (1/2/3) :"; //输入暗记的牌所在行数pk R;cin>>line3;switch(line3) //根据输入的行数,最终确认用户暗记的扑克牌{case 1:R=k2[8];break;case 2:R=k2[17];break;case 3:R=k2[26];break;}cout<<"----------------------------------"<<endl;cout<<"Your remembered card is :";display(R);cout<<endl;}运行结果7.4调试分析刚开始发现随机抽出的27张牌有一些是重复的,应为程序没有在生成牌的时候将新牌与已生成的牌进行比较。

相关主题