22C++数组(3)——教学

一、逻辑到断与推理

第68课谁大谁小——逻辑到断与推理

兔子尼克、马克、马尼、波力四兄妹个头差不多,长得很像。一天,格莱尔到他们家玩,他们让格莱尔猜谁大谁小。莱尔第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;
}

二、模拟法

第69课 胡萝卜与骨头——模拟法

尼克喜欢胡萝卜,格莱尔喜欢骨头。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;
}
posted @ 2025-05-16 21:27  gdyyx  阅读(101)  评论(0)    收藏  举报