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:
}

浙公网安备 33010602011771号