22C++数组(3)——教学
一、逻辑到断与推理
兔子尼克、马克、马尼、波力四兄妹个头差不多,长得很像。一天,格莱尔到他们家玩,他们让格莱尔猜谁大谁小。莱尔第1次猜:马克老大,波力最小,马尼老三,尼克老二;第2次猜:波力老大,马克最小,马尼老二.尼克老三;第3次猜:波力最小,马克老三;第4次猜:马克老大,尼克最小,波力老三,马尼老二。
格莱尔每次仅猜对了一半,试编一程序算一算这四兄妺的大小。
兔子尼克四兄妹,需要4个变量,4个排行次序(数字),可用多重循环枚举出所有的可能一一进行逻辑判。数组tj[0]到tj[3]分别保存格莱尔第1次到第4次猜的逻辑值。
#include <iostream>
using namespace std;
int main()
{
int make,boli,mani,nike;
bool tj[4];
for(make=1;make<=4;make++)
for(boli=1;boli<=4;boli++)
for(mani=1;mani<=4;mani++)
{
nike=10-make-boli-mani;
if(make*boli*mani*nike==1*2*3*4)
{
tj[0]=((make==1)+(boli==4)+(mani==3)+(nike==2)==2);
tj[1]=((boli== )+(make== )+(mani== )+(nike== )== );
tj[2]=((boli==4)+(make==3)==1);
tj[3]=((make== )+(nike== )+(boli== )+(mani==2)== );
if(tj[0]&&tj[1]&&tj[2]&&tj[3])
{
cout<<"马克:"<<make<<endl;
cout<<"波力:"<<boli<<endl;
cout<<"马尼:"<<mani<<endl;
cout<<"尼克:"<<nike<<endl;
break;
}
}
}
return 0;
}
二、模拟法
尼克喜欢胡萝卜,格莱尔喜欢骨头。15根胡萝卜和15根骨头排成一圈,狐狸老师要求尼克从第一根开始按1~9数数,逢九取出,直到剩下15根骨头为止。
试编一程序,算一算这15根胡萝卜和15根骨头应该如何排列,才能使剩下的15根全是骨头。
用数组a的下标表示胡萝卜或骨头原来在圈中的位置,其元素a[i]值为0时表示仍在圈内,为1则表示已取出,用变量num表示已取出的数的个数,变量top表示第1次开始数的位置,变量k的值1~9为所数的数。
每当数到9时(k等于9).赋值a[i]=1,表示已取出,同时将k赋值为0,重新开始1~9数数。当取出的个数达到15个时(num等于15).检索数组各元素的值,为0时表示仍在圈内,就输出它的编号。流程图如下图:


#include <iostream>
using namespace std;
int main()
{
int i,top,a[31],num=0,k=0;
for(i=1;i<=30;i++)
a[i]=0;
top=1;
i=top;
while(num<15)
{
if(i>30) i=1;
if(a[i]==0) _______;
if(k==9)
{
a[i]=1;
k=0;
__________;
}
i++;
}
cout<<"骨头所在的位置:";
for(i=1;i<=30;i++)
if(a[i]==0) cout<<i<<" ";
return 0;
}
三、二进制数的应用
(第70课 读心术)
尼克和格莱尔玩读心术猜数游戏,尼克先从1~7中选一个数记在心里,格莱尔依次出示3张卡片如下图所示,尼克只要回答卡片上有没有选中的那个数,格莱尔就能猜出尼克选的数。

试编一个读心术猜数的程序。
下面狐狸老师给大家讲讲读心术的秘密,读心术最关键的是卡片的设计。
把十进制数1到7转化为二进制数后(如表下所示),把从右数第1位是1的数(1,3,5,7)写在第1张卡片上,把从右数第2位是1的数(2,3,6,7)写在第2张卡片上,把从右数第3位是1的数(4,5,6,7)写在第3张卡片上。


假如尼克选的数是4,出示第1张卡片时尼克的选择是“没有”,出示第2张卡片时尼克的选择是“没有”,出示第3张卡片时尼克的选择是“有”。我们将“有”用“1”表示,“没有”用“0”表示,可以将尼克的选择标识为(100)B,然后把二进制数(100)B转化为十进制数(4)(1×4+0×2-0×1=4),可以得出尼克选择的数是4。使用此方法可以算出尼克选择的任何数。流程图如下图:

#include <iostream>
#include <cstdlib> //调用system()函数
#include <string>
using namespace std;
int main()
{
int i,a[4],ans;
string t[4];
t[0]="1,2,3,4,5,6,7";
t[1]="1,3,5,7";
t[2]="2,3,6,7";
t[3]="4,5,6,7";
cout<<"读心术猜数"<<endl;
cout<<"请你在下面7个数中,选一个并记在心里。"<<endl;
cout<<t[0]<<endl;
system("pause"); //暂停
for(i=1;i<=3;i++)
{
system("cls"); //清屏
cout<<i<<"问:下面的数中有吗? 0:没有, 1:有"<<endl;
cout<<t[i]<<endl;
do
{
cin>>a[i];
}while(_______);
}
ans=4*a[3]+2*a[2]+a[1];
system("cls");
cout<<"你心中想的数是:" ;
cout<<ans<<endl;
return 0;
}

浙公网安备 33010602011771号