return0;
}
2.15两队选手每队5人进行一对一的比赛,甲队为A、B、C、D、E,乙队为J、K、L、M、N,经过抽签决定比赛配对名单。
规定A不和J比赛,M不和D及E比赛。
列出所有可能的比赛名单。
解:
这是一个组合问题,使用穷举法。
共有5个位置,设甲队5名队员位置不变,乙队改变队员位置,进行配对。
注意第1个位置可在5个队员中任选一个,以后的位置必须扣除已选过的队员。
并扣除不能配对的情况,即得所有可能的比赛名单。
#include
usingnamespacestd;
intmain(){
charst1[5]={'A','B','C','D','E'},st2[5]={'J','K','L','M','N'};
inti=0,j,k,l,m,n;
for(j=0;j<5;j++){//0号位
if(j==0)continue;//A不与J比赛,即st1[0]不与st2[0]比赛
for(k=0;k<5;k++){//1号位
if(k==j)continue;
for(l=0;l<5;l++){//2号位
if(l==j||l==k)continue;
for(m=0;m<5;m++){//3号位
if(m==j||m==k||m==l)continue;
if(m==3)continue;//M不与D比赛,即st1[3]不与st2[3]比赛
for(n=0;n<5;n++){//4号位
if(n==3)continue;//M不与E比赛,即st1[4]不与st2[3]比赛
if(n==j||n==k||n==l||n==m)continue;
cout<cout<cout<i++;
}
}
}
}
}
cout<
return0;
}
2.16编程模拟选举过程。
假定四位候选人:
zhang、wang、li、zhao,代号分别为1、2、3、4。
选举人直接键入候选人代号,1~4之外的整数视为弃权票,-1为终止标志。
打印各位候选人的得票以及当选者(得票数超过选票总数一半)名单。
解:
用5个元素的整型数组,分别放弃权票和各候选人的得票,然后用开关语句打印。
#include
#include
usingnamespacestd;
intmain(){
enumcandidate{feipiao,zhang,wang,li,zhao}cand;
intvote[5]={0},i,k=0,n;
cin>>n;
while(n!
=-1){
k++;
if(n>=1&&n<=4)vote[n]++;
elsevote[0]++;
cin>>n;
}
for(i=0;i<5;i++){
cand=(candidate)i;
switch(cand){
casefeipiao:
cout<casezhang:
cout<if(vote[cand]>k/2)cout<<"当选"<elsecout<break;
casewang:
cout<if(vote[cand]>k/2)cout<<"当选"<elsecout<break;
caseli:
cout<if(vote[cand]>k/2)cout<<"当选"<elsecout<break;
casezhao:
cout<if(vote[cand]>k/2)cout<<"当选"<elsecout<break;
}
}
return0;
}
2.17改造【例2.14】,将运行结果(Fibonacii数列的前20项)存入文件。
解:
采用3步法。
所谓3步法,是将书上的第1和第2步合并,格式如下:
首先建立或打开一个输出文件,并与磁盘文件联系:
ofstreamofile("myfile2_17.txt");
再按一定格式存入数据:
ofile<然后关闭文件:
ofile.close();
如要读出数据,则用输入文件打开,并与同一磁盘文件联系:
ifstreamifile("myfile2_17.txt");
再按同一格式读入数据:
ifile>>i