C++程序设计实践教程思考题答案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验1 C++基础
6.编写程序,输入某大写字母的ASCII码值,输出该字母的对应小写字母。

#in clude<iostream>
using n amespace std;
int mai n()
{
int i;
cin> >i;
if(i>=65 && 1<=90 )
cout<<char(i-'A'+'a')vve ndl;
else
cout«"输入有误"<<endl;
} return 0;
实验2
三、实验思考
1.输入直角三角形的两条直角边长,调用平方根库函数sqrt来求斜边的长度
#in clude<iostream>
#in clude<cmath>
using n amespace std;
int mai n()
{ float a,b,c;
coutvv"请输入直角三角形的两条边长:";
cin> >a>>b;
c二sqrt(a*a+b*b);
cout«"直角三角形的斜边="<<c<<endl;
return 0;
}
2 •从键盘输入一个字符,如果输入的是英文大写字母,则将它转换成小写字母后输出,否则输出原来输入的字符。

#in clude<iostream>
using n amespace std;
int mai n()
{
char c;
1
coutvv"请输入一个字符:";
cin> >c;
if(c>='A'&& c<='Z')
c+='a'-'A';
coutvvcvve ndl;
return 0;
3•输入一个学生的成绩,如高于60分,贝V输出“ pass” ;否则,输出“failed ”。

#include<iostream> using n amespace std;
int mai n()
{
float grade;
cout«"请输入成绩:";
cin> >grade;
if(grade>=60)
cout<<"pass"<<e ndl;
else
cout<<"failed";
return 0;
}
4. 计算分段函数
#in clude <iostream>
#in clude <cmath>
using n amespace std;
int mai n()
{
double x,y;
cout«"请输入一个数x:";
cin> >x;
if(!x)
y=cos(x)-pow(x,2)+3*x;
else
y=si n(x)+sqrt(pow(x,2)+1)+3*x;
cout«"y二"vvyvve ndl;
return 0;
}
2
5. 从键盘上输入1〜7之间的一个数字,输出其对应星期几的英文表示。

#in clude <iostream>
using n amespace std;
int mai n()
{
char c;
cout<<"E nter a character of nu mbers betwee n 1 and 7 :";
cin> >c;
switch(c)
{
case '1':cout<<" Mon day";break;
case 2:cout<v"Tuesdag";break;
case 3:cout<v"We nesday";break;
case '4':cout<v"Thursday";break;
case '5':cout<v"Friday";break;
case '6':cout<v"Saturday";break;
case '7':cout<v"S un day";break;
default: cout«" wrong nu mber";
}
cout«e ndl;
return 0;
}
6. 设计一个简单的计算器程序,能够进行加、减、乘、除简单运算并显示结果。

#i nclude <iostream>
using n amespace std;
int mai n()
{
coutvv"输入简单的算术表达式:(数操作符数)";
int leftOpera nd,rightOpera nd;
char Operator;
cin> >leftOpera nd>>Operator>>rightOpera nd;
int result;
switch(Operator)
{ case '+': result=leftOpera nd+rightOpera nd;break;
result=leftOpera nd-rightOpera nd;break;
case '*':
3result=leftOpera nd*rightOpera nd;break;
case '/':
if(rightOpera nd!=0)
result=leftOpera nd/rightOpera nd;
else
{
cout«"除数为0,除法不能进行"<<endl;
return 0;
}
break;
default:
coutvvOperatorvv"是本程序不支持的操作。

"<<endl; return 0;
}
coutvvleftOpera ndvvOperatorvvrightOpera nd<v'二'vvresultvve ndl; return 0;
}
实验3 二、思考题参考程序
1nr kn1.编程计算表达式k=1的值#in elude <iostream>
using n amespace std;
{
int n ,k=1,sum=0,mea n;
cout«"请输入n的值:";
cin>>n;
while(k< 二n)
{
sum+= k*k;
k++;
}
if (n >0)
mean二 sum/n;
else
mean=0;
cout<<"1〜n个整数平方和的均值="<<mean<<endl;
return 0;
4}
2.输入两个正整数,判别它们是否互为互质数。

所谓互质数,就是最大公约数是1。

#include <iostream>
using n amespace std;
int mai n()
int m,n,r;
cout«"请输入两个正整数:";
cin>>m>>n;
coutvvm<<”和” <<n;
if(m<n)
{ r二m;m二n;n 二r;}
while(r=m% n)
{
m二n;
n二r;
}
if(n==1)
cout«"是互质数"<<endl;
else
cout«”不是互质数” <<e ndl;
return 0;
}
3 .编写程序,输出从公元2000年至3000年间所有闰年的年号。

#in clude <iostream>
using n amespace std;
int mai n()
int year;
coutvv"公元2000年至3000年间闰年的年号:\n";
for(year=2000;year<=3000;yea 叶+)
if((year%4==0 && year%100 !=0)||(year%400==0))
cout<vyearvv'\t';
cout«e ndl;
return 0;
}
4.编写程序模拟猴子吃桃子问题:猴子第1天摘下若干桃子,当即吃了一半,还不过瘾,又多吃了一个。

第2天将剩下的桃子又吃了一半,又多吃一个。

以后每天都吃了前一天剩下的
5
一半零1个。

到了第10天,只剩下了一个桃子。

请问猴子第一天共摘
了多少个桃子?
方法1:
#in clude <iostream>
using n amespace std;
int mai n()
int day,qia n,hou=1;
for(day=9;day>=1;day--) {
qian=(hou+1)*2;
hou=qia n;
}
coutvvqia n«en dl;
return 0;
}
运行结果:1534
方法2:
#in clude <iostream>
using n amespace std;
int mai n()
{
int day ,nu mber=1;
for(day=9;day>=1;day--)
nu mber二(nu mber+1)*2; cout< <nu mber«e ndl; return 0; }
方法3:
#in elude <iostream> using n amespace std;
int peach(i nt);
int mai n()
{
cout«"第1 天共摘了"<<peach(1)<<"个"<<endl;
return 0;
}
int peach(i nt day)
{
int nu mber;
6
if(day==1O)
nu mber=1;
else nu mber=2*(peach(day+1)+1);
retu rn nu mber;
}
5 .计算s=1+ (1+2) + (1+2+3) + (1+2+3+4) + …+ (1+2+3+…+n )的值。

方法1:
#in clude <iostream> using n amespace std; int mai n()
{
int i,j,n;
long int sum,total(0); cout«"i nput n:";
cin>>n;
for(i=1;i< 二n ;i++)
{
sum=0;
for(j=1;j<=i;j++)
sum+=j;
total+=sum;
}
cout«"s二"vvtotalvve ndl;
return 0;
}
#in clude <iostream>
using n amespace std;
int mai n()
{
int i,n;
long int sum(0),total(0); cout«"i nput n:"; cin>>n;
for(i=1;i< 二n ;i++)
{
sum+=i;
total+=sum;
}
7
cout«"s二"vvtotalvve ndl;
return 0;
}
6.马克思曾经做过这样一道趣味数学题:有30个人在一家小饭馆用餐,其中有男人、女人和小孩。

每个男人花了3先令,每个女人花了2先令, 每个小孩花了1先令,一共花了50先令。

请问男人、女人以及小孩各有几个人?
#in clude <iostream>
using n amespace std;
int mai n()
{
int x,y,z;
for(x=1;x<=16;x++) for(y=1;yv=24;y++) z=30-x-y;
if(3*x+2*y+z==50)
cout«"Me n are "<<x<<",wome n are "<<y <<",childre n are "<<z<< "."<<e ndl; }
return 0;
}实验4常用程序设计算法
三、实验思考
1.读入一个整数N,若N为非负数,则计算N到2XN之间的整数和;若N 为负数,则求2XN到N之间的整数和。

分别利用for和while写出两个程序。

#in clude<iostream>
using n amespace std;
int mai n()
{
int N;
cin>>N;
int i=N;
long sum=0;
if(N>=0)
{ for(;i<=2*N;i++)
sum+=i;
}
else
{
for(;i>=2*N;i--) sum+=i; }
coutvvsumvve ndl; retu rn 0;
}
#in clude<iostream> using n amespace std; int mai n()
{
int N;
cin>>N;
int i=N;
long sum=0; if(N>=0) {
while(i<=2*N) {
sum+=i; i++; }
}
else
{
while(i>=2*N) { sum+=i; i--; } coutvvsumvve ndl; retu rn 0;
9
2 .设s =「111 一亠,求与8最接近的s的值及与之对应的n值。

23n #in clude<iostream>
using n amespace std;
int mai n()
{
float s=1.0;
int n=1;
do
{
++n;
s+=1.0/n;
}while(s<=8);
if((s-8)>(8-(s-1.0/n)))
cout<v"s二"vvs-1.0/n<<' '<<"n二"v<n-1v<endl;
else cout<<"s="<<s<<' '<<" n二"vvnvven dl;
return 0;
}
3. 已知A >B>C且A+B+C<100求满足1+仁1的共有多少组。

A2B2C2
#in elude <iostream>
using n amespace std;
int mai n()
{
int A,B,C;
int coun t=0;
for(C=0;C!=33;++C )
for(B=1OO; B>C;--B )
for(A=100; A>B; --A)
{
if((A + B + C < 100) && ((A * A * B * B) == ((A * A + B * B)
* C * C))) {
cout << A << ' ' << B << ' ' << C << endl;
++ count;
}
}
cout << "co unt is:" << count << en dl;
10
return 0;
4个数的平方和就 4. 一司机出车祸后驾车逃离现场,第一位目击者记得车牌号前两位数 字相同,且后两位数字也相同;第二位目击者是一位数学家,他看出车 牌号是四位完全平方数。

试推算肇事车的车牌号。

#in clude<iostream> using n amespace std;
int mai n()
{
int n,i;
for(i=32;i<100;i++)
{
n 二i*i;
if(n%10 == n%100/10 && n/1000 == n/100%10)
cout< <n<<en dl;
}
return 0;
}
11
5. 编程验证“四方定理”:所有自然数至多只要用
可以表示。

#in clude<iostream>
using n amespace std;
int nu mber,i,j,k,l;
cout«"Please en ter a nu mber:";
cin>>nu mber;
for(i=1;i <nu mber/2;i++)
for(j=0;j<=i;j++)
for(k=0;k<=j;k++)
for(l=0;l<=k;l++)
if(nu mber==i*i+j*j+k*k+l*l)
{
cout< <nu mber<<"二"vvivv"*"vvivv"+"vvjvv"*"vvjvv"+"vvkvv"*"vvk< <"+"<<l<<"*"<<l<<e ndl;
exit(O);
}
return 0;
}
6 •编程验证“角谷猜想”:任给一个自然数,若为偶数则除以2,若为奇数则乘3加1,得到一个新的自然数,然后按同样的方法继续运算,若干次运算后得到的结果必然为1。

#in clude<iostream>
using n amespace std;
int n flag;
flag=1;
cout«"please in put n:"<<e ndl;
cin>>n;
while(flag)
{
if(n %2==0)
n=n /2;
else
n=n*3+1;
12
} if(n二=1) { flag=0; cout<<"success!"<<e ndl; } } retu rn 0; 实验5函数和编译预处理
三、实验思考
1. 参考程序如下:
#in clude <iostream>
using n amespace std;
long int Fib on acci (int n);
void mai n()
{ long int t,t1;
cout«"please in put t:"«e ndl;
cin> >t;
for (i=2;;i++)
{
t1=Fib on acci(i);
if (t1>t) {cout<< "min Fib on acci="<<t1<<e ndl;break;} }
}
long int Fib on acci (int n)
{
if (n==0) retu rn 1;
else if (n二=1) retu rn 1;
else retu rn Fib onacci(n-1)+Fib on acc i(n-2);
}
2. 参考程序如下:
#in clude <iostream>
using n amespace std;
int num_n(int n,int a)// 由n个a组成的多位数的计算{ if (n二=1) retu rn a;
13
else retu rn num_n(n-1,a)*10+a;
素数,函 void mai n()
{
int i,n;
long int sum=0;
cout«"please in put n:"<<e ndl;
cin>>n;
for (i=1;i< 二n ;i++)
{coutv <num_n( i,2)«e ndl;
sum+二num_n( i,2);
}
cout«" n 二"<<n< v":sum 二"vvsumvve ndl; }
3. 参考程序如下:
#in clude <iostream>
using n amespace std;
int isprime(int n) // 判断n 是否为素数的函数{
int i;
for (i=2;i< n-1;i++)
if (n%i==0) return 0;// 非素数,函数值返回 0 return 1;//
数值返回1
}
void mai n()
int i,min_prime,max_prime;
for (i=1000;i<=2000;i++)
if(isprime(i)==1)
{coutvv"最小素数="<<i<<endl; break;} for (i=2000;i>=1000;i--) if(isprime(i)==1)
{coutvv"最大素数="<<i<<endl; break;} }
4. 参考程序如下:
#in elude <iostream>
using n amespace std;
int sum(i nt n)
14{
static s=0;
s=s+n;
return s;
}
void mai n()
{
int i, n,s;
coutvv"情指定n:";
cin>>n;
for (i=1;i< 二n ;i++) s=sum(i);
cout<<"1~n 之禾口="<<s<<endl;
}
5. 参考程序如下:
#in elude <iostream>
using n amespace std;
int is_h(int n) // 判断参数n是否为回文
{
int i,m,fn;//i 用来记录n的某一位数字,m初值为n,fn用于记录n的倒序数m二n;
fn=O;
while(m!=O)
{
i=(m%10);
fn=(fn*10+i);
m=m/10;
}
if(fn==n) return 1; // 是回文数返回1
else return 0; // 不是回文数返回0
}
void mai n()
{ int i;
int t; cin> >t;
for (i=1;i<=t;i++)
if (is_h(i)==1)
cout«"回文数:"vvivvendl;
15
}
6. 参考程序如下:
#in elude <iostream>
using n amespace std;
#defi ne X (a+b)/2
#defi ne AREA X*h
void mai n()
{
float a,b,h,s;
cout«"请分别输入a,b,h的值,用空格分隔!"<<endl; cin>>a>>b>>h; s=AREA;
coutvvAREAvve ndl;
}
实验六数组
三、实验思考题
参考源代码
思考题1. shi_6_3_1.cpp
#in elude <iostream.h>
#defi ne N 5
int lookup(i nt [],i nt ,int ); // 函数说明
void mai n()
{ int i, a[N],i ndex,yLooked;
cout«"请输入N(=5)个整数:"<<endl;
for(i=0;i<N;i++) cin>>a[i];
cout«"请输入您要找的整数:"<<endl;
cin> >yLooked;
index=lookup(a,N,yLooked); // 函数调用if(index!=-1) cout«"您要找的数下标为:"<<index<<endl; else
cout«"没有找到"vvyLookedvvendl;
cout«"\n 谢谢使用本程序,再见!"<<endl; cin.get();
16cin.get();
}
int lookup( int x[],i nt n,i nt y) // 函数定义
{int flag=-1; // 首先假设找不到
int i;
for(i=0;i< n;i++)
if(x[i]==y) {flag二i;
break; //找到了则不必再往后找
retu rn flag;
}
------------------------ 思考题2. shi_6_3_2.cpp #in elude <iostream.h>
#defi ne N 5
int max(i nt [],i nt ); // 函数说明
void mai n()
{ int i, a[N],xMax;
cout«"请输入N(=5)个整数:"<<endl;
for(i=0;i<N;i++) cin>>a[i];
xMax=max(a,N);
coutvv"数组中最大的的整数:"vvxMaxvvendl;
cout<<"\n谢谢使用本程序,再见!"<<endl;
cin.get();
cin.get();
}
int max(i nt x[],i nt n)
{int i,r=x[0]; // 首先假设x[0]最大,且存于r中
for(i=1;i<n;i++) // 也可写成for(i=0;i<n;i++)
return r; // r 中存有最大元素的值
}
仃思考题3. shi_6_3_3.cpp
#in elude <iostream.h>
#defi ne N 5
void in vert(i nt [],i nt); // 函数说明
void mai n()
{ int i, a[N];
cout«"请输入N(=5)个整数:"<<endl;
for(i=O;i<N;i++) cin>>a[i];
in vert(a,N);
cout<<"\n 这些数逆序输出如下:\n"<<endl; for(i=0;i<N;i++) cou t<<a[i]<<"";
cout<<"\n 谢谢使用本程序,再见!"<<endl; cin.get();
cin.get();
}
void in vert(i nt x[],i nt n)
{int i=0, j=n-1,t; //
while(ivj)
for (i=0;i<M;++i)
t=x[i]; x[i]=xj x[j]=t; i++;j--;
}
return;
}
思考题 4. shi_6_3_4.cpp
#in elude <iostream.h>
#defi ne M 3 〃M 行
#defi ne N 4 〃N 列
void mai n()
{
int num[M][N]; 〃二{{1,6,9}, {3,5,4}, {2,7,8}}; int i,j,it,itt,
t,jt,exist=0;
coutvv"请输入 3 行 4 列 的 二维 数组:"<<endl; for (i=0;i<M;+ +i) for (j=O;j<N;++j) cin>>nu m[i][j];
{ t=num[i][0]; jt=0; for (j=0;j<N;++j) if ( t<num[i][j]) { t=num[i][j], jt=j; } itt=i; for(it=0;it<M;++it)
if ( t>num[it][jt]){ t=num[it][jt], itt二it; } if (i==itt) { e
xist=1;break;} }
if (exist) coutvv" 鞍点为"<<t<<endl; else cout<<" 无鞍点"<<en
dl;
cout«"\n 谢谢使用本程序,再见!"<<endl; cin.get(); cin.get(); }
思考题5. shi_6_3_5.cpp
分析:采用3个数组,它们元素值含义如下:
19
第19/23页ba[b[0]] <a[b[1]] w、... 、w a[b[N -1]]
a、b、c数组元素值含义示意图
#defi ne N 7
#i nclude <iostream> #i nclude <ioma nip> using n amespace std; i
nt main( ) {int i,j,t,k,ik;
in t a[N],b[N],c[N]; cout<<"please in put N numbers:"<<e ndl; fo
r (i=0;i<N;i++)
cin>>a[i]; // 从键盘上输入N个元素,a[0]保存第一个数据
cout<<"a 数组各元素的值:"<v'\n: for(i=0;i<N;i++) cout<<setw(6)<<a[i]; cout<<e ndl;
for (i=0;i<N;i++) b[i]=i;
for (i=0;i<N-1;i++)// 排序,使a[b[0]] <a[b[1]] w、... 、w a[b [N-1]] { k=i; // 每轮选择过程开始时假定a[b[i]] 最小,将下标i
保存在k 中for (j=i+1;j<N;j++) //a[b[k]] 与a[b[i]] 后面的元素
逐个比较
if (a[b[k]]>a[b[j]]) k=j; // 若发现某个a[b[j]] 小于a[b[k]],则将
k 修改为j if (k!=i)
20
q” 、忙1 431 44| 曲
第20/23页{ t=b[i]; b[i]=b[k]; b[k]=t; } }
cout«"b 数组各元素的值:"<v'\n: for(i=0;i<N;i++)
cout<<setw(6)vvb[i]; cout<<e ndl;
ik=1;
c[b[0]]=ik;
for (i=1;i<N;i++)
{ if (a[b[i]]!=a[b[i-1]]) // a[b[i]]==a[b[i-1]] 时,它们的编号
相同ik++; c[b[i]]=ik; }
cout<v"c数组各元素的值(a数组元素按大小编号):"<v'\n'; for(i=0;
i<N;i++)
cout<<setw(6)vvc[i]; cout<<e ndl; retu rn 0; }
第1题程序一:
#in clude<iostream> #i nclude <ioma nip> using n amespace std;
void invert(int *a,int n); // 函数申明int main()
{ int x[]={1,2,3,4,5,6,7,8,9,10,11},i; invert(x,11);
for(i=0;i<11;i++)
cout<<setw(6)vv*(x+i);
21
第21/23页cout«e ndl; retu rn 0; }
void invert(int *a,int n) //int *a 与int a[] 等价{
int t,i;
for(i=0;i<=n/2;i++) { // 复合语句t=*(a+i);
*(a+i)=*(a+n-i-1); *(a+n-i-1)=t; } }
第1题程序二:
#in clude<iostream> #i nclude <ioma nip> using n amespace std;
void invert(int *a,int n); // 函数申明int main()
{ int x[]={1,2,3,4,5,6,7,8,9,10,11},i; in vert(x,11);
for(i=0;i<11;i++) cout<<setw(6)vv*(x+i); cout<<e ndl; retur n 0; }
与int a[] 等价{ 第22/23页
void in vert(i nt *a,i nt n) 〃int *a int t,i; for(i=0;i<=n/2;i++) { // 复合语句 t=a[i];
a[i]=a [n-i-1]; a[n-i-1]=t; } }
第2题程序一:
#in clude<iostream>
22
using n amespace std;
void f(float x,i nt *m,float *y) {
*m=x; *y=x-*m; }
mai n() {
float x,y; int k; cin> >x;
f(x,&k,&y);
coutvvxvv'二'vvkvv'+'vvyvve ndl; }
第2题程序二:
#in clude<iostream> using n amespace std; int f(float x,float * y) {
int m; m=x; *y=x-m; return m; }
mai n() {
float x,y; int k; cin> >x; k=f(x ,& y);
coutvvxvv'二'vvkvv'+'vvyvve ndl; }
23。

相关文档
最新文档