C++第三章 基本控制结构程序设计习题解答
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第三章基本控制结构程序设计习题
一.基本概念与基础知识自测题
3.1 程序阅读题
3.1.3 请看如下程序段:
if(num==1) cout<<”Alpha”;
else if(num==2) cout<<”Bata”;
else if(num==3) cout<<”Gamma”;
else cout<<”Delta”;
当num的值分别为1、2、3时,上面程序段的输出分别为(1)、(2)、(3)。
解答:
检查条件语句与字符串输出概念:
(1)Alpha
(2)Bata
(3)Gamma
3.1.4 执行下面程序段后,m和k的值分别为(1)、(2)。
int m,k;
for(k=1,m=0;k<=50;k++){
if(m>=10) break;
if(m%2==0){
m+=5;
continue;
}
m-=3;
}
(2)6
二.编程与综合练习题
3.2 编程求一元二次方程ax2+bx+c=0的根。
包括以下判断和结果:若输入a=0,给出提示;若∆>0,输出两个不等实根;若∆=0,输出两个相等实根;若∆<0,输出两个复数根。
解:本题以一个绝对值极小的数作为实数0。
#include <iostream.h>
#include <math.h>
#include <stdlib.h>
void main(){
double a,b,c;
double delta,x1,x2;
const double zero=1e-9; //定义一个很小的常数
int sign;
cout<<"输入三个系数a(a!=0), b, c:"<<endl;
cin>>a>>b>>c;
if(fabs(a)<zero){
cout<<"二次项系数为0,方程根是-c/b";
exit(0);
}
cout<<"a="<<a<<'\t'<<"b="<<b<<'\t'<<"c="<<c<<endl;
delta=b*b-4*a*c;
if(fabs(delta)<zero){//绝对值很小的数即被认为是0
cout<<"方程有两个相同实根:";
cout<<"x1=x2="<<-b/(2*a)<<endl;
}
else {
if(delta>0)
sign=1;
else
sign=0;
delta=sqrt(fabs(delta));
x1=-b/(2*a);
x2=delta/(2*a);
if(sign){
cout<<"方程有两个不同实根:";
cout<<"x1="<<x1+x2<<'\t'<<"x2="<<x1-x2<<endl;
}
else{//delta<0
cout<<"方程无实根!有两个不同复数根:";
cout<<"x1="<<x1<<"+i"<<x2<<'\t'<<"x2="<<x1<<"-i"<<x2<<endl;
}
}
}
3.3 设计程序将输入的百分制成绩转换为五分制输出,90分以上为5分,80~89分为4分,70~79分为3分,60~69分为2分,60分以下为1分。
解:10分一档用10进行整除获得,转换用开关语句实行。
#include <iostream.h>
void main(){
int mark,result; //mark是百分制成绩,result是5分制
cout<<"请输入百分制成绩:"<<endl;
cin>>mark;
if(mark<0) {
cout<<"缺考!"<<endl;
return;
}
switch (mark/10){
case 9: case 10:
result=5;
cout<<"输出五分制成绩:"<<result<<endl;
break;
case 8:
result=4;
cout<<"输出五分制成绩:"<<result<<endl;
break;
case 7:
result=3;
cout<<"输出五分制成绩:"<<result<<endl;
break;
case 6:
result=2;
cout<<"输出五分制成绩:"<<result<<endl;
break;
case 5:case 4:case 3:case 2:case 1:case 0:
result=1;
cout<<"输出五分制成绩:"<<result<<endl;
break;
default:
cout<<"输入错误!"<<endl;
}
}
3.6 输入n,求1!+2!+3!+…+n!
解:通常求和作为外循环,阶乘作为内循环。
这里考虑到:n!=n*(n-1)!,利用递推法运算速度大大提高,同时两者可合并为一个循环。
本程序考虑了输入的健壮性。
#include <iostream.h>
#include <stdlib.h>
void main(){
int n;
double result=0; //result是结果
cin>>n;
if(n<1)
{
cout<<"输入错误!"<<endl;
//return;
exit(0);
}
result=1;
for(int i=2,jch=1;i<=n;i++)
{
jch*=i; //jch是i的阶乘,注意n!=n*(n-1)!这样可少一层循环
result+=jch;
}
cout<<result<<endl;
}
3.7 猴子吃桃问题:猴子摘下若干个桃子,第一天吃了桃子的一半多一个,以后每天吃了前一天剩下的一半多一个,到第十天吃以前发现只剩下一个桃子,问猴子共摘了几个桃子。
解:采用递推法。
从最后一天逆推到第一天,9次循环。
#include <iostream.h>
const int day=10;
void main(){
int i,x=1;//最后一天只有一个
for(i=1;i<day;i++)//从一天前推到九天前
x=(x+1)*2;
cout<<"开始共有桃子"<<x<<"个。
\n";
}
3.8 从键盘输入一组非0整数,以输入0标志结束,求这组整数的平均值,并统计其中的个数。
解:将这组整数放在整型数组中,一边输入一边求和及统计正数和负数的个数,平均数由和除以整数数量取得。
#include <fstream.h>
#include <iostream.h>
void main(){
int stem[256],sum=0,pnum=0,nnum=0,i=0;
cout<<"从键盘输入一组非0整数,以输入0标志结束:"<<endl;
cin>>stem[i];
while(stem[i]!=0){
sum+=stem[i];//求和
if(stem[i]>0) pnum++;//正数数量
else nnum++;//负数数量
i++;
cin>>stem[i];
}
if(!i) cout<<"0个数"<<endl;
else {
cout<<"平均值="<<(double)sum/(pnum+nnum)<<endl;//平均值习惯不用整数
cout<<"正数个数="<<pnum<<endl;
cout<<"负数个数="<<nnum<<endl;
}
}
3.9 编程找出1~500之中满足除以3余2,除以5余3,除以7余2的整数。
解:中国古代数学问题(韩信点兵),采用穷举法。
注意三个条件同时成立用&&。
#include <iostream.h>
void main(){
int i;
for(i=1;i<=500;i++)
if((i%3==2)&&(i%5==3)&&(i%7==2))
cout<<i<<endl;
}
3.15 编程模拟选举过程。
假定四位候选人:zhang、wang、li、zhao,代号分别为1、2、3、4。
选举人直接键入候选人代号,1~4之外的整数视为弃权票,-1为终止标志。
打印各位候选人的得票以及当选者(得票数超过选票总数一半)名单。
解:用5个元素的整型数组,分别放弃权票和各候选人的得票,然后用开关语句打印。
#include<iostream.h>
#include<iomanip.h>
void main(){
enum candidate{feipiao,zhang,wang,li,zhao}cand;
int vote[5]={0},i,k=0,n;
cin>>n;
while(n!=-1){
k++;
if(n>=1&&n<=4) vote[n]++;
else vote[0]++;
cin>>n;
}
for(i=0;i<5;i++){
cand=(candidate)i;
switch(cand){
case feipiao:
cout<<setw(10)<<"feipiao"<<'\t'<<vote[cand]<<endl;break;
case zhang:cout<<setw(10)<<"zhang"<<'\t'<<vote[cand];
if(vote[cand]>k/2) cout<<" 当选"<<endl;
else cout<<endl;
break;
case wang:cout<<setw(10)<<"wang"<<'\t'<<vote[cand];
if(vote[cand]>k/2) cout<<" 当选"<<endl;
else cout<<endl;
break;
case li:cout<<setw(10)<<"li"<<'\t'<<vote[cand];
if(vote[cand]>k/2) cout<<" 当选"<<endl;
else cout<<endl;
break;
case zhao:cout<<setw(10)<<"zhao"<<'\t'<<vote[cand];
if(vote[cand]>k/2) cout<<" 当选"<<endl;
else cout<<endl;
break;
}
}
}。