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==1)+(make==4)+(mani==2)+(nike==3)==2);
          tj[2]=((boli==4)+(make==3)==1);
	      tj[3]=((make==1)+(nike==4)+(boli==3)+(mani==2)==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;
}

练习

(1)一般情况下,计算机内部存储和处理汉字信息时用的是()
A.十个字节的十进制编码
B.两个字节的二进制编码
C.两个字节的十进制编码
D.十个字节的二进制编码
(2)阅读程序写结果。

#include<iostream>
using namespace std;
int main()
{
 int a[3], ans=0;
 for(int i=0;i<3;i++)
   cin>>a[i];
 ans+=a[0]*(a[0]>a[1]&&a[0]>a[2]);
 ans+=a[1]*(a[1]>a[0]&&a[1]>a[2]);
 ans+=a[2]*(a[2]>a[0]&&a[2]>a[1]);
 cout << ans << endl;
 return 0;
}

输入:5 3 9
i,ans输出:__________
(3)完善程序。
狐狸老师、尼克、格莱尔在课间进行一分钟跳绳比赛。尼克说:“我第二,格莱尔第三”,格莱尔说:“狐狸老师第三”,狐狸老师说:“格莱尔不是第三”。他们三人说了4种情况,其中3种是正确,那么他们的名次究竟是怎样的呢?

#include<iostream>
using namespace std;
int main()
{
 int teacher, nike, glair;
 for(teacher=1; teacher<=3; teacher++)
  for(nike=1;____;nike++)
    for(glair=1;glair<=3;glair++)
    {
     if(((nike==2)+(_______)+(teacher==3)+(glair!=3))==3)
       if(nike*teacher*glair==1*2*3)
      {
        cout<<"狐狸老师: "<<teacher<<endl;
        cout<<"尼克: "<<nike<<endl;
        cout<<"格莱尔:"<<glair<<endl;
       }
      }
 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)  k++;
    if(k==9)
    {
      a[i]=1;
      k=0;
      num++;
    }
    i++;
  }
  cout<<"骨头所在的位置:"; 
  for(i=1;i<=30;i++)
	if(a[i]==0) cout<<i<<"  "; 
  return 0;
}

练习

(1)为了有效地保障计算机的数据安全,下列做法不正确的是( )。
A.不使用非法复制的软件
B.对重要程序和数据进行备份
C.不使用计算机
D.安装杀毒软件
(2)阅读程序写结果。

#include <iostream>
using namespace std;
int main()
{
 int i, n;
 long long sum[2], ans;
 sum[0]=0;
 sum[1]=1;
 cin>>n;
 for(i=1;i<=n;i++)
 {
  sum[1]*=i;
  while(sum[1]%10==0)
  {
   sum[1]/=10;
   sum[0]++;
   }
  sum[1]%=1000;
  }
  ans=sum[0];
  cout<< ans << endl;
  return 0;
}

输入:10
输出:__________
(3).完善程序。
10个小朋友手拉手站成一个圆圈,从第一个小朋友开始报数,报到n的那个小朋友退到圈外,然后从他的下一位小朋友开始重新报数····输出依次出圈的小朋友的编号。

#include <iostream>
using namespace std;
int main()
{
 const int M=10;
 int i,j,p,n;
 int a[M+1];     //为了便于理解,a[0]暂不用
 for(i=l;i<=M;i++)
   a[i]=i+1:
 a[M]=__________;
 cout<<"n=";
 cin>>n;
 p=M;
 for(i=1; i<=M;i++)
 {
  for(int j=1;j<=n-1;j++)
    p=_______;
  cout<<a[p]<<"  ";
  a[p]=a[a[p]];
  }
 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(a[i]<0||a[i]>1);
  }
  ans=4*a[3]+2*a[2]+a[1];
  system("cls");
  cout<<"你心中想的数是:" ;
  cout<<ans<<endl;  
  return 0;
}

将数组t定义为字符串型string,每个元素都能有放一个字符串。system("pause")表示暂停,运行时屏幕上会出现“请按任意键继续··”的字样。system("cls")表示清屏。
英汉小词典:
system ['sistem]系统
pause[po:z]停
cls清屏,是clear screen的简写

练习

(1)若用“嘀”表示0,用“嗒”表示1,“嘀嘀嗒嗒嗒”表示()。

   A.10101        B.01010        C.10100         D.00111

2.阅读程序写结果。

#include <iostream>
#include <string>
using namespace std;
int main()
{
int i;
string a[3]={"comp", "uter lan", "guage");
string ans="";
for(i=0;i<3;i++)
  ans+=a[i];
cout << ans << endl;
return 0;
}

输出:__________
(3)完善程序

编一程序,输入0~9中的某个数,输出它的摩尔斯电码。

#include <iostream>
#include <string>
using namespace std;
int main()
{
 int i, n;
 string a[10];
 a[0]="11111";
 a[1]="01111";
 a[2]="00111";
 a[3]="00011";
 a[4]="00001";
 a[5]="00000";
 a[6]="10000";
 a[7]="11000";
 a[8]="11100";
 a[9]="11110";
 cout<"请输入0~9中的某个数:";
 do
 {
  _______;
 }while(n<0||n>9);
 for( i=0; a[n][i]!='\0'; i++)        //a[n][i]表示字符串数组元素 a[n]的第 i+1个字符
 {
  if(an[n][i]_______)
    cout<<'.';
  else
    cout<<'-';
  }
return 0:
}
posted @ 2025-05-23 18:01  gdyyx  阅读(53)  评论(0)    收藏  举报