




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C++程序设计基础教程(第2版)课后习题参考答案
第1章 C++基础一、选择题(1)B(2)D(3)B(4)C(5)A(6)D(7)B(8)B二、程序阅读题(写出各程序的输出结果)(1)******(2)inputa,b:3107(3)5.6(输入)98.4704三、编程题1、编写程序,输入两个数,按由大到小的顺序输出这两个数。#include<iostream>usingnamespacestd;intmain(){ inta,b; cin>>a>>b; if(a>b) cout<<a<<''<<b; else cout<<b<<''<<a; return0;}2、编写程序,输入某一年份,计算5月1日是该年份的第几天。#include<iostream>usingnamespacestd;intmain(){ intyear,days; cout<<"请输入年份:"; cin>>year; days=31+30+31+30+1; if((year%4==0&&year%100!=0)||(year%400==0))days++; cout<<"它是第"<<days<<"天"; return0;}
第2章 基本数据类型与运算符一、选择题(1)C(2)A(3)A(4)A(5)B二、程序阅读题(写出各程序的输出结果)(1)abc"abcabc\abc(2)i=2i=2(3)10333.204t3(4)011122212(5)113(6)2/*结果为2,预期应为3。主要的原因是在将双精度实型数据的表示是近似值,在转换为整型数据时有误差*/三、填空题(1)x*x*(a+b)/(a-b)(2)1(3)(m/100)(m/10)%10m%10(4)0.0双精度实型149.0双精度实型84.0双精度实型四、编程题1、编写程序,输入整型数a,b的值,分别计算并输出(a++)+b、a+(++b)和a+++b的值。#include<iostream>usingnamespacestd;intmain(){ inta,b; cin>>a>>b; cout<<(a++)+b<<endl; cin>>a>>b; cout<<a+(++b)<<endl; cin>>a>>b; cout<<a+++b<<endl; return0;}2、编写程序,对输入的一个3位正整数,分离出个位、十位和百位,并输出各位数之和。#include<iostream>usingnamespacestd;intmain(){ intn,a,b,c; cin>>n; a=n/100; b=(n/10)%10; c=n%10; cout<<a+b+c<<endl; return0;}
第3章 程序控制一、选择题(1)C(2)A(3)A(4)A(5)B二、编程题1、编程计算数学上的符号函数:y=#include<iostream>usingnamespacestd;#include<cmath>intmain(){ doublex,y; cin>>x; if(fabs(x)<1e-5) y=0; elseif(x>1) y=1; else y=-1; cout<<"x="<<x<<",y="<<y;return0;}2、编写一个程序,通过输入的年份,判断是否为闰年。#include<iostream>usingnamespacestd;intmain(){ intyear; cout<<"Pleaseinputayear:\n"; cin>>year; if(year%4==0&&year%100!=0||year%400==0) cout<<year<<"isaleapyear.\n"; else cout<<year<<"isnotaleapyear.\n"; return0;}3、编程求三个数中最小数,要求用户输入三个数,显示其中的最小值。#include<iostream>usingnamespacestd;intmain(){ inta,b,c; cout<<"Pleaseinputthreenumbers:\n"; cin>>a>>b>>c; intmin; min=a; if(b<min) min=b; if(c<min) min=c; cout<<"Theminimumnumberamong"<<a<<""<<b<<""<<c<<"is"<<min; return0;}4、编程计算一元二次方程ax2+#include<iostream>usingnamespacestd;intmain(){ doublea,b,c; doublex1,x2; cout<<"Pleaseinputthreenumbers:\n"; cin>>a>>b>>c; doubledelta=b*b-4*a*c; if(delta<0) cout<<"Theequtionhasnosolution." elseif(delta==0){ x1=x2=(-b)/(2*a); cout<<"Thisequationhasuniquesolution:"<<x1; } else{ x1=(-b-sqrt(delata))/(2*a)); x2=(-b+sqrt(delata))/(2*a)); cout<<"Thisequationhastwosolutions:x1="<<x1<<",x2="<<x2; } return0;}5、编写程序,输入月份(1~12),输出其英文名称和天数。#include<iostream>usingnamespacestd;intmain(){ intmonth; cout<<"Pleaseinputamonthinnumber(1-12):\n"; cin>>month; switch(month){ case1:cout<<"Januaryhas31days.";break; case2:cout<<"Februaryhas28/29days.";break; case3:cout<<"Marchhas31days.";break; case4:cout<<"Aprilhas30days.";break; case5:cout<<"Mayhas31days.";break; case6:cout<<"Junehas30days.";break; case7:cout<<"Julyhas31days.";break; case8:cout<<"Augusthas31days.";break; case0:cout<<"Septemberhas30days.";break; case10:cout<<"Octoberhas31days.";break; case11:cout<<"Novemberhas30days.";break; case12:cout<<"Decememberhas31days.";break; } return0;}6、输入一个百分制成绩(double型),要求输出成绩等级'A','B','C','D','E'。90分以上为'A',80~90分为'B',70~79分为'C',60~69分为'D',60分以下为'E'。#include<iostream>#include<cmath>usingnamespacestd;intmain(){ doublescore; chargrade; cout<<"pleaseenterscoreofstudent:"; cin>>score;//输入百分制成绩 while(score>100||score<0)//超出范围,则报错,重新接受输入 { cout<<"dataerror,enterdataagain."; cin>>score; } switch(int(score/10)) { case10: case9:if(fabs(score-90)<1e-6)grade='B'; elsegrade='A'; break; case8:grade='B';break; case7:grade='C';break; case6:grade='D';break; default:grade='E'; } cout<<"scoreis"<<score<<",gradeis"<<grade<<endl; return0;}7、编程计算n!。n由用户输入,输入的n#include<iostream>usingnamespacestd;intmain(){ intn; cout<<"Pleaseinputanumber(1-100):\n"; cin>>n; if(n>=100||n<0) { cout<<"Toobig!"; exit(1); } doublefactorial=1; for(inti=1;i<=n;i++) factorial*=i; cout<<n<<"'sfactorialis"<<factorial; return0;}8、输入n(n<13),计算#include<iostream>usingnamespacestd;intmain(){ intn; cout<<"Pleaseinputanumber(1-12):\n"; cin>>n; intsum=0; for(intx=1;x<=n;x++){ intsubSum=1; for(inti=1;i<=x;i++) subSum*=i; sum+=subSum; } cout<<"Thesumis:"<<sum; return0;}9、求100以内能同时被3和5整除的奇数。#include<iostream>usingnamespacestd;intmain(){ for(inti=1;i<=100;i+=2) { if(i%3==0&&i%5==0) cout<<i<<""; } return0;}10、给出一个不多于5位的正整数,(1)求它是几位数,(2)从最高位到最低位输出每位数字,(3)从最低位到最高位输出各位数字。【方法一】#include<iostream>usingnamespacestd;intmain(){ intnum; intindiv,ten,hundred,thousand,ten_thousand,bitCount; /*分别代表个位,十位,百位,千位,万位和位数*/ cout<<"enteraninteger(0~99999):"; cin>>num; if(num>9999) bitCount=5; elseif(num>999) bitCount=4; elseif(num>99) bitCount=3; elseif(num>9) bitCount=2; elsebitCount=1; cout<<"bitCount="<<bitCount<<endl; //计算各位数字 ten_thousand=num/10000; thousand=(int)(num-ten_thousand*10000)/1000; hundred=(int)(num-ten_thousand*10000-thousand*1000)/100; ten=(int)(num-ten_thousand*10000-thousand*1000-hundred*100)/10; indiv=(int)(num-ten_thousand*10000-thousand*1000-hundred*100-ten*10); cout<<"originalorder:"; switch(bitCount) {case5:cout<<ten_thousand<<","<<thousand<<","<<hundred<<","<<ten<<","<<indiv<<endl; cout<<"reverseorder:"; cout<<indiv<<ten<<hundred<<thousand<<ten_thousand<<endl; break; case4:cout<<thousand<<","<<hundred<<","<<ten<<","<<indiv<<endl; cout<<"reverseorder:"; cout<<indiv<<ten<<hundred<<thousand<<endl; break; case3:cout<<hundred<<","<<ten<<","<<indiv<<endl; cout<<"reverseorder:"; cout<<indiv<<ten<<hundred<<endl; break; case2:cout<<ten<<","<<indiv<<endl; cout<<"reverseorder:"; cout<<indiv<<ten<<endl; break; case1:cout<<indiv<<endl; cout<<"reverseorder:"; cout<<indiv<<endl; break; } return0;} 【方法二】#include<iostream>usingnamespacestd;#include<cmath>intmain(){ longintnum; intindiv,ten,hundred,thousand,ten_thousand,bitCount=0; /*分别代表个位,十位,百位,千位,万位和位数*/ cout<<"enteraninteger(0~99999):"; cin>>num; inttmp=num; while(tmp) { bitCount++; tmp/=10; } cout<<"它的位数为:"<<bitCount<<endl; //逆序输出 tmp=num; while(tmp) { cout<<tmp%10<<""; tmp/=10; } cout<<endl; //顺序输出 tmp=num; while(tmp) { cout<<int(tmp/pow(float(10),float(bitCount-1)))<<""; tmp=int(tmp%int(pow(float(10),float(bitCount-1)))); bitCount--; } return0;} 11、对于一个整数num,逆向输出其各位数字,同时求出其位数以及各位数字之和。#include<iostream>usingnamespacestd;intmain(){ intnum,sum=0,k,i=0; cin>>num; while(num>0) { k=num%10; cout<<k<<""; sum+=k; i++; num=num/10; } cout<<"\n各位数字之和:"<<sum<<endl; cout<<"位数:"<<i<<endl; return0;}12、分别使用while,dowhile语句打印输出九九乘法表。【while】#include<iostream>usingnamespacestd;intmain(){ inti=1,j; while(i<=9) { j=1; while(j<=i) { cout<<i<<"*"<<j<<"="<<i*j<<"\t"; j++; } cout<<endl; i++; } return0;}【do…while】#include<iostream>usingnamespacestd;intmain(){ inti=1,j; do { j=1; do { cout<<i<<"*"<<j<<"="<<i*j<<"\t"; j++; }while(j<=i); cout<<endl; i++; }while(i<=9); return0;}13、求正整数n的阶乘n!,其中1<=n<=13#include<iostream>usingnamespacestd;intmain(){ intnum; cin>>num; longfac=1; for(inti=1;i<=num;i++) fac*=i; cout<<num<<"!="<<fac;return0;}14、使用循环语句,对cos(x)多项式求和。#include<iostream>#include<cmath>usingnamespacestd;intmain(){ inti=1; floatx,t,value; cout<<"请输入x的值"; cin>>x; value=1;t=1; while(fabs(t)>=1e-9) { t=t*(-1)*x*x/((2*i)*(2*i-1));//通项的值 value=value+t; i++; } cout<<"cos("<<x<<")="<<value<<endl; return0;}15、一个整数如果是另一个整数的完全平方,那么就称该数为完全平方数,如0、1、4、9、16、……。要求不允许使用开方函数sqrt(),计算输出100以内的所有完全平方数。#include<iostream>usingnamespacestd;intmain(){ intn,m,h; cin>>n; for(m=1;m<=n/2;m++){ h=m*m; if(h==n){ cout<<"TRUE\n"; return0; } } cout<<"False\n"; return0;}16、回文数的概念:即是给定一个数,这个数顺读和逆读都是一样的。例如:121,1221是回文数,123,1231不是回文数。编程实现回文整数的判断。#include<iostream>usingnamespacestd;intmain(){ inti=1,j; intx,newed,t,n; cin>>x; newed=0; n=x; do{ newed=newed*10+x%10; x/=10; }while(x>0); if(n==newed) cout<<"Yes\n"; else cout<<"No\n"; return0;}17、输出所有的“水仙花数”。所谓“水仙花数”是指一个3位数,其各位数字的立方之和等于该数本身。例如,153是一个水仙花数,因为。#include<iostream>usingnamespacestd;intmain(){ inti,j,k,n; cout<<"narcissusnumbersare:"<<endl; for(n=100;n<1000;n++) {i=n/100;//百位数 j=n/10-i*10;//十位数 k=n%10;//个位数 if(n==i*i*i+j*j*j+k*k*k) cout<<n<<""; }cout<<endl; return0;}18、求1000之内所有“完数”。所谓的“完数”是指一个数恰好等于它的所有因子之和。例如6是完数,因为6=1+2+3。#include<iostream>usingnamespacestd;intmain(){ intm,s,i; for(m=2;m<1000;m++){ s=0; for(i=1;i<m;i++) if((m%i)==0)s=s+i; if(s==m){ cout<<m<<"是一个完数"<<endl; cout<<"itsfactorsare:"; for(i=1;i<m;i++) if(m%i==0)cout<<i<<""; cout<<endl; }} return0;}19、猴子吃桃问题。猴子第1天摘了若干个桃子,当即吃了一半,还不解馋,又多吃了一个;第2天,吃剩下的桃子的一半,还不过瘾,又多吃了一个;以后每天都吃前一天剩下的一半多一个,到第10天想再吃时,只剩下一个桃子了。问第一天共摘了多少个桃子?#include<iostream>usingnamespacestd;intmain(){ intday,x1,x2; day=9; x2=1; while(day>0){ x1=(x2+1)*2;//前天的桃子数是后天桃子数加后的倍 x2=x1; day--;} cout<<"total="<<x1<<endl; return0;}20、盒子中放有12个球,其中3个红球,3个白球,6个黑球,从中任取6个球,问其中至少有一个球是红球的取法有多少种?输出每一种具体的取法。#include<iostream>usingnamespacestd;intmain(){ inti,j,k; intnumber=0; for(i=0;i<=3;i++) for(j=0;j<=3;j++) for(k=0;k<=6;k++) if(i+j+k==8) { cout<<"红球"<<i<<"个,白球"<<j<<"个,黑球"<<k<<"个。\n"; number++; } cout<<"Totalnumber:"<<number; return0; }21、*张三说李四说谎,李四说王五说谎,王五说张三和李四都说谎。判断3人中到底谁真谁假。#include<iostream>usingnamespacestd;#defineZHANGSAN(L==0)#defineLISI(W==0)#defineWANGWU(Z==0&&L==0)intmain(){ intZ=0,L=0,W=0; for(Z=0;Z<=1;Z++) for(L=0;L<=1;L++) for(W=0;W<=1;W++) if(ZHANGSAN==Z&&LISI==L&&WANGWU==W){ Z?cout<<"张三说的是真话\n":cout<<"张三说的是假话\n"; L?cout<<"李四说的是真话\n":cout<<"李四说的是假话\n"; W?cout<<"王五说的是真话\n":cout<<"王五说的是假话\n"; } return0;}22、*两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。#include<iostream>usingnamespacestd;intmain(){ chari,j,k;//i是A的对手;j是B的对手;k是C的对手 for(i='X';i<='Z';i++) for(j='X';j<='Z';j++) if(i!=j) for(k='X';k<='Z';k++) if(i!=k&&j!=k) if(i!='X'&&k!='X'&&k!='Z') cout<<"A--"<<i<<"B--"<<j<<"C--"<<k<<endl; return0;}
第4章 函数一、选择题(1)D(2)C(3)A(4)B(5)A二、编程题1、编写函数把华氏温度转换成摄氏温度,公式为。输入输出在主函数中完成。#include<iostream>usingnamespacestd;doubleconvertToF(double);intmain(){ doubletemper; cout<<"输入要转换的华氏温度值:"; cin>>temper; cout<<"转换后的摄氏温度为:"<<convertToF(temper)<<endl; return0;}doubleconvertToF(doubleF){ return(F-32)*5/9;}2、已知y=sh(1+sh(x))sh(2x)+sh(3#include<iostream>usingnamespacestd;#include<cmath>doublesh(doublet){ return(exp(t)-exp(-t))/2;}doubley(doublex){ returnsh(1+sh(x))/(sh(2*x)+sh(3*x));}intmain(){ doublex; cout<<"Pleaseinputx:\n"; cin>>x; cout<<y(x); return0;}3、求400之内的“亲密对数”。所谓“亲密对数”,即整数A的所有因子之和等于整数B,而B的所有因子之和等于A(说明:一个整数的因子是指除了本身之外的所有因子,包含1)。#include<iostream>#include<cmath>usingnamespacestd;voidmain(){intFactorSum(intfac); intanotherNum; for(inti=1;i<=400;i++){ anotherNum=FactorSum(i); if(FactorSum(anotherNum)==i&&i<anotherNum) { cout<<"("<<i<<","<<anotherNum<<")"; } }}intFactorSum(intfac){//亲密对数计算 intsum=1; for(inti=2;i<fac;i++){ if(0==fac%i){ sum+=i; } } returnsum;}4、有些回文数同时还是一个数的平方。比如676是回文数,同时也是26的平方,称为平方回文。编程找出100000以内的平方回文。#include<iostream>usingnamespacestd;#include<cmath>boolpalindrome(intx){ intm,newed=0; m=x; do{ newed=newed*10+m%10; m/=10; }while(m>0); if(x==newed)returntrue; returnfalse;}intmain(){ for(intn=1;n<=100000;n++){ if(palindrome(n)&&((int)sqrt(n))*((int)sqrt(n))==n) cout<<n<<""; } return0;}5、设计函数intdigit(longn,intk),返回整数n从右边开始第k个数字的值,若不存在第k个数字则返回-1。例如:digit(123456,2)=5digit(3456,6)=-1//位数不够,返回-1#include<iostream>#include<cmath>usingnamespacestd;voidmain(){ intnum,k; cout<<"请输入待测整数:"; cin>>num; cout<<"请输入待测位数(从右边开始):"; cin>>k; intdigit(longint,int); cout<<num<<"从右边数第"<<k<<"位数字是"<<digit(num,k)<<endl;}intdigit(longintn,intk){ if(k<=0)return-1;//简单的异常处理 if(n==0&&k==1)return0; unsignedlongi=1; n=(n<0?-n:n);//这行可以用n=abs(n)替换 for(k=k-1;k>0;k--) { n=n/10; } if(n>=1)returnn%10; elsereturn-1;}6、编写两个函数,分别计算两个整数的最大公约数和最小公倍数。#include<iostream>usingnamespacestd;intmain(){ inthcf(int,int);//函数声明 intlcd(int,int,int); intu,v,h,l; cin>>u>>v; h=hcf(u,v);//求最大公约数 cout<<"H.C.F="<<h<<endl; l=lcd(u,v,h);//求最小公倍数 cout<<"L.C.D="<<l<<endl; return0;}inthcf(intu,intv){ intt,r; if(u<v){//交换 t=u;u=v;v=t; } while((r=u%v)!=0){ u=v; v=r; } return(v);}intlcd(intu,intv,inth){ return(u*v/h);}7、求出200~1000所有这样的整数,它们的各位数字之和等于5,其中判断一个数的各位数字之和是否为5的功能封装为一个函数。#include<iostream>usingnamespacestd;intmain(){ intcount=0,s,k,i; for(i=200;i<=1000;i++){ s=0; k=i; while(k>0){ s=s+k%10; k=k/10; } if(s!=5)continue; else{ count++; cout<<i<<""; if(count%10==0)cout<<endl; } } return0;}8、写一个函数验证哥德巴赫猜想:一个不小于6的偶数可以表示为两个素数之和,如6=3+3,8=3+5,,10=3+7……在主函数中输入一个不小于6的偶数n,然后调用函数gotbaha,在gotbaha函数中再调用prime函数,prime函数的作用是判别一个数是否为素数。在gotbaha函数中输出以下形式的结果:34=3+31#include<iostream>#include<cmath>usingnamespacestd;voidgotbaha(inta);boolIsPrime(inta);intmain(){ inta; cin>>a; gotbaha(a); return0;}voidgotbaha(inta){ inti; for(i=3;i<=a/2;i+=2){ if(IsPrime(i)&&IsPrime(a-i)) cout<<a<<"="<<i<<"+"<<a-i<<endl; }}boolIsPrime(inta){ inti; for(i=2;i<=int(sqrt(a));i++){ if(a%i==0)returnfalse; } if(i>=sqrt(a))returntrue; elsereturnfalse; }9、组合数公式为Cmn=m!n!mintfabricate(intm,intn);//返回Cfabricate函数内部调用multiplicate函数intmultiplicate(intp,intq);//返回p×程序由4个文件组成。头文件用于存放函数原型,作为调用接口;其它3个源文件分别是main,fabricate和multiplicate函数定义。#header.hintfabricate(intm,intn)
;intmultiplicate(intp,intq)
;//main.cpp#include<iostream>usingnamespacestd;#include"header.h"intmain(){ intm,n; cout<<"Pleaseinputm,n:\n"; cin>>m>>n; cout<<fabricate(m,n); return0;}#fabricate.cpp#include"header.h"intfabricate(intm,intn){ returnmultiplicate(m,1)/(multiplicate(m-n,1)*multiplicate(n,1));}#multiplicate.cppintmultiplicate(intp,intq){ intt=1; for(inti=p;i>=q;i--) t*=i; returnt;}10、编写函数sumSeries,它的功能是:计算下列级数的和。S=1+x+x22!+x33!#include<iostream>usingnamespacestd;intmain(){ intn; floata,sum,x; cin>>n>>x; sum=1,a=x; for(inti=1;i<=n;){ sum+=a; ++i; a*=x/i; } cout<<sum; return0;}11、编写函数toOcr(intn),将十进制数n转换为对应的八进制数。#include<iostream>#include<cmath>usingnamespacestd;voidmain(){ inttoOcr(intn); intnum; cout<<"请输入一个十进制整数:"; cin>>num; cout<<"对应的八进制数是:"; cout<<toOcr(num);}inttoOcr(intn){ intremainder; if(n<=7)returnn; else { remainder=n%8; returnremainder+10*toOcr(n/8); }}12、用递归方法求n阶勒让德多项式的值,递归公式为#include<iostream>#include<cmath>usingnamespacestd;voidmain(){ floatp(int,double); intn; doublex; cout<<"请输入n和x的值:"; cin>>n>>x; cout<<"P"<<n<<"("<<x<<")="<<p(n,x);}floatp(intn,doublex){ if(n==0) return(1); elseif(n==1) return(x); else return(((2*n-1)*x*p((n-1),x)-(n-1)*p((n-2),x))/n);}13、用递归法将一个整数n转换成字符串。例如,输入483,应输出字符串“483”。n的位数不确定,可以是任意位数的整数。#include<iostream>usingnamespacestd;intmain(){ voidconvert(intn); intnumber; cout<<"inputaninteger:"; cin>>number; cout<<"output:"<<endl; if(number<0) { cout<<"-"; number=-number; } convert(number); cout<<endl; return0;}voidconvert(intn){ inti; charc; if((i=n/10)!=0) convert(i); c=n%10+'0'; cout<<""<<c;}14、编写一个递归函数,将整数的每个位上的数字按相反的顺序输出。例如,输入1234,输出4321。#include<iostream>usingnamespacestd;intmain(){ voidconvert(intn); intnumber; cout<<"inputaninteger:"; cin>>number; cout<<"output:"<<endl; if(number<0){ cout<<"-"; number=-number; } convert(number); return0;}voidconvert(intn){ if(n<10)cout<<n; else{ cout<<n%10; convert(n/10); } }15、用牛顿迭代法求根。方程为。系数a、b、c、d的值依次为1、2、3、4由主函数输入。求出根后由主函数输出。设方程为f(x)=0,则牛顿迭代公式为:xn+#include<iostream>#include<cmath>usingnamespacestd;intmain(){ doublevalue(double,double,double,double); doublea,b,c,d; cout<<"inputa,b,c,d:"; cin>>a>>b>>c>>d; cout<<"x="<<value(a,b,c,d)<<endl; return0;}doublevalue(doublea,doubleb,doublec,doubled){ doublex=1,x0,f,f1; do{ x0=x; f=((a*x0+b)*x0+c)*x0+d; f1=(3*a*x0+2*b)*x0+c;//导数求值 x=x0-f/f1;}//为什么这样写? while(fabs(x-x0)>=1e-6); returnx;}16、*使用梯形法计算定积分abfxdx的值,其中a=提示:将积分区间分成n等份,每份的宽度为h=(b-a)na=h(fa这就是数值积分的梯形求积公式。n越大或h越小,积分就越精确。本题n可以取1000。#include<iostream>usingnamespacestd;#include<cmath>doubleintegrate(floata,floatb,intn=1000){ doubleh=(b-a)/n; doubleresult=(sin(a)+sin(b))/2; for(inti=1;i<=n-1;i++) result+=sin(a+i*h); result*=h; returnresult; }intmain(){ doublea,b; cin>>a>>b; intn; cout<<integrate(0,1,1000); return0;}17、使用重载函数编写程序分别把两个数和三个数从大到小排列。#include<iostream>usingnamespacestd;voidsort(inta,intb){ inttemp; if(a>b){ temp=a; a=b; b=temp; } cout<<a<<","<<b<<endl;}voidsort(floatx,floaty,floatz){ floattemp; if(x>y){ temp=x; x=y; y=temp; } if(z<x)cout<<z<<","<<x<<","<<y<<endl; elseif(z<y)cout<<x<<","<<z<<","<<y<<endl; elsecout<<x<<","<<y<<","<<z<<endl;}intmain(){ voidsort(inta,intb); voidsort(floatx,floaty,floatz); floatx,y,z; inta,b; cout<<"请输入两个整数:"<<endl; cin>>a>>b; cout<<"排序从小到大为:"<<endl; sort(a,b); cout<<"请输入三个浮点数:"<<endl; cin>>x>>y>>z; cout<<"排序从小到大为:"<<endl; sort(x,y,z); return0;}18、三角形的面积为area=s(s-a)(s-b)(s-c),其中,s=0.5(a+b+c),其中a,b,c为三角形得三边,定义两个参数的宏,一个用来求s,另一个用来求area。编写程序,在程序中用带参数的宏名来求面积area。#include<iostream>#include<cmath>usingnamespacestd;#defineS(a,b,c)(a+b+c)/2#defineAREA(a,b,c)sqrt(S(a,b,c)*(S(a,b,c)-a)*(S(a,b,c)-b)*(S(a,b,c)-c))intmain(){ floata,b,c; cout<<"inputa,b,c:"; cin>>a>>b>>c; if(a+b>c&&a+c>b&&b+c>a) cout<<"area="<<AREA(a,b,c)<<endl; else cout<<"Itisnotatriangle!"<<endl; return0;}
第5章 数组一、编程题1.输入10个学生的成绩,利用三个函数分别求出平均分、最高分和最低分,在主函数内输出结论。#include<iostream>usingnamespacestd;floatavg(floats[]){ inti; floatsum=0; for(i=0;i<10;i++) sum=sum+s[i]; returnsum/10;}floatmax(floats[]){ inti; floatmax; max=s[0]; for(i=1;i<10;i++) if(max<s[i]) max=s[i]; returnmax;}floatmin(floats[]){ inti; floatmin; min=s[0]; for(i=1;i<10;i++) if(min>s[i]) min=s[i]; returnmin;}intmain(){ floatscore[10]; inti; cout<<"input10scores:"; for(i=0;i<10;i++) cin>>score[i]; cout<<"平均分:"<<avg(score)<<endl; cout<<"最高分:"<<max(score)<<endl; cout<<"最低分:"<<min(score)<<endl; return0;}2.输入字符串s,编程统计出s中共出现了多少个数字字符。进一步考虑,如何统计出10个数字字符各自出现的次数。#include<iostream>usingnamespacestd;intmain(){ chars[50]; intcount=0,i=0; cout<<"inputastring:"; cin>>s; while(s[i]){ if(s[i]>='0'&&s[i]<='9')count++; i++; } cout<<"Number'samountis:"<<count<<endl; return0;}3.有一个已经排好序的数组。编程实现输入一个数,将其按原来的规律插入数组中。#include<iostream>usingnamespacestd;intmain(){ inta[50],n; intnum,i,place; boolflag=true;//假设数组是由小到大排列 cout<<"请输入数组的大小:"; cin>>n; cout<<"请按顺序输入数组元素:"; for(i=0;i<n;i++) cin>>a[i]; if(a[1]<a[0])flag=false; cout<<"请输入需要插入的数:"; cin>>num; if(flag) { for(i=0;i<n;i++) if(num<=a[i])break; } else { for(i=0;i<n;i++) if(num>=a[i])break; } place=i; for(i=n-1;i>=place;i--) a[i+1]=a[i]; a[place]=num; n++; cout<<"插入后数组里的元素为:"; for(i=0;i<n;i++) cout<<a[i]<<""; cout<<endl; return0;}4.编写一个函数,输入一行字符串,将此字符串中最长的单词输出。(提示:可以使用string类型,实现字符拼接时直接用+运算符)#include<iostream>#include<string>usingnamespacestd;intmain(){ charbuf[500]; stringword,maxword;word=maxword="";inti=0;cout<<"Inputwords:"<<endl;cin.getline(buf,500);boolflag=true;while(buf[i]){if(buf[i]!='') word=word+buf[i];else{ if(maxword.length()<word.length()) maxword=word; word=""; } i++; }cout<<"Thelongestwordis:"<<maxword<<endl; return0;}5.输入20个数,每个数都在1-10之间,求1-10中的众数(众数就是出现次数最多的数,如果存在一样多次数的众数,则输出权值较小的那一个)。#include<iostream>#include<string>usingnamespacestd;intmain(){ intnum[20],i,n,maxc; intr[21]={0}; cout<<"Input20numbers:";for(i=0;i<20;i++){ cin>>num[i]; r[num[i]]++; } maxc=r[0]; for(i=1;i<21;i++) if(maxc<r[i]) { maxc=r[i]; n=i; } elseif(maxc==r[i]) if(n>i) n=i;cout<<"Themodenumberis:"<<n<<endl; return0;}6.编写一个函数,实现输入一个十六进制整数,输出相应的十进制数的功能。要求:输入只有一行,包含一个十六进制正整数。保证输入格式中所有英文字母部分(’a’至’f’)均为小写字母,且换算出的十进制整数在0至1000000范围之内。#include<iostream>#include<cstring>#include<cmath>#defineBASE16usingnamespacestd;intmain(){ charnum[10]; inti=0,sum=0,length; cout<<"Inputahexadecimalnumber:"; cin>>num; length=strlen(num); while(num[i]) { if(num[i]>=48&&num[i]<=57) sum=sum+(num[i]-'0')*pow(BASE,length-1); else sum=sum+(num[i]-'a'+10)*pow(BASE,length-1); length--; i++; }cout<<"Thedecimalvalueis:"<<sum<<endl; return0;}7.编程实现3×3矩阵的转置(矩阵转置是将矩阵行和列上的元素对换,即第一行变为第一列,第二行变为第二列,以此类推)。#include<iostream>#include<iomanip>usingnamespacestd;intmain(){ inta[3][3];inti,j,t; cout<<"请输入一个3×3的矩阵:"<<endl;for(i=0;i<3;i++) for(j=0;j<3;j++) cin>>a[i][j]; for(i=0;i<3;i++) for(j=i;j<3;j++) { t=a[i][j]; a[i][j]=a[j][i]; a[j][i]=t; } cout<<"转置后的矩阵:"<<endl; for(i=0;i<3;i++) { for(j=0;j<3;j++) cout<<setw(5)<<a[i][j]<<""; cout<<endl; } return0;}8.找出一个二维数组中的鞍点,即该位置上的元素在该行上值最大,在该列上值最小(也可能没有鞍点)。#include<iostream>#include<iomanip>#definen3#definem4usingnamespacestd;intmain(){inta[n][m]; inti,j,max,maxj; boolflag; cout<<"请输入数组元素:"<<endl; for(i=0;i<n;i++) for(j=0;j<m;j++)cin>>a[i][j]; for(i=0;i<n;i++) { max=a[i][0];maxj=0; for(j=0;j<m;j++) { if(max<a[i][j]) { max=a[i][j]; maxj=j; } } flag=true; for(intk=0;k<n;k++) { if(max>a[k][maxj]) { flag=false; continue; } } if(flag) { cout<<"["<<i<<"]["<<maxj<<"]="<<max<<"isSaddlePoint"; break; } } if(!flag) cout<<"NoSaddlePoint"; cout<<endl; return0;}9.定义数组存储5位学生的姓名和4科考试的成绩,计算并输出每个同学的总成绩和平均分,找出平均成绩最高的学生姓名。#include<iostream>#include<string>#include<iomanip>usingnamespacestd;intmain(){ inti,j,b,max=0,score[5][6]; stringname[5]; cout<<"请输入学生的姓名和四门课成绩:"<<endl; for(i=0;i<5;i++) {cin>>name[i]; for(j=0;j<4;j++) cin>>score[i][j]; } for(i=0;i<5;i++) {score[i][4]=0;for(j=0;j<4;j++) score[i][4]=score[i][4]+score[i][j]; score[i][5]=score[i][4]/4; } max=0; for(i=0;i<5;i++) if(max<score[i][5]) {max=score[i][5]; b=i; } cout<<"姓名总成绩平均成绩"<<endl; for(i=0;i<5;i++) cout<<setiosflags(ios::left)<<setw(12)<<name[i] <<setw(9)<<score[i][4]<<score[i][5]<<endl; //将姓名和成绩排成整齐的列表 cout<<"平均成绩最高的学生是"<<name[b]<<",其平均成绩为"<<score[b][5]<<"分。"<<endl; return0; }10.计算两个矩阵的乘积,第一个是2*3矩阵,第二个是3*2矩阵,结果为一个2*2矩阵。#include<iostream>usingnamespacestd;intmain(){ intmatrix1[2][3],matrix2[3][2],matrix3[2][2]; intk,i,j,s=0; cout<<"input2*3matrix:"<<endl; for(i=0;i<2;i++) for(j=0;j<3;j++) cin>>matrix1[i][j]; cout<<"input3*2matrix:"<<endl; for(i=0;i<3;i++) for(j=0;j<2;j++) cin>>matrix2[i][j]; for(i=0;i<2;i++) for(j=0;j<2;j++) { for(k=0;k<3;k++) s+=matrix1[i][k]*matrix2[k][i]; matrix3[i][j]=s; s=0; } cout<<"result2*2matrix:"<<endl; for(i=0;i<2;i++) { for(j=0;j<2;j++) cout<<matrix3[i][j]<<'\t'; cout<<endl; } return0;}
第6章 指针与引用一、编程题1.编写函数replace将用户输入的字符串中的字符t(T)都替换为e(E),并返回替换字符的个数。#include<iostream>usingnamespacestd;intreplace(char*p){ intnum=0; while(*p) { if(*p=='t'){*p='e';num++;} elseif(*p=='T'){*p='E';num++;} elsep++; }returnnum;}intmain(){ chars[50]; intn; cout<<"inputastring:"; gets(s); n=replace(s); cout<<"afterreplace:"<<s<<endl; cout<<"replacingnumber:"<<n<<endl; return0;}2.编程实现:从键盘输入一个字符串,并在串中的最大元素后边插入字符串”ab”。#include<iostream>usingnamespacestd;intmain(){ chars[50],*p; intlen=0,i,max; cout<<"inputastring:"; gets(s); p=s; len=strlen(s); max=0; for(i=0;i<len;i++) if(*(p+i)>*(p+max))max=i; for(i=len;i>max;i--) *(p+i+2)=*(p+i); s[max+1]='a'; s[max+2]='b'; cout<<"afterdealing:"<<s<<endl;return0;}3.将字符串str1里的内容复制到字符串str2中,要求不使用库函数strcpy()。#include<iostream>usingnamespacestd;intmain(){ charstr1[50],str2[50]; inti=0; cout<<"inputstr1:"; cin.getline(str1,50); if(sizeof(str2)<sizeof(str1)) { cout<<"Thespaceofstr2isn'tenough!"; return0; } while(str1[i]) { str2[i]=str1[i]; i++; } str2[i]='\0'; cout<<"str2is:"<<str2<<endl; return0;}4.编写一个程序,输入星期,输出该星期的英文名。用指针数组处理。#include<iostream>usingnamespacestd;intmain(){ char*month[]={"January","February","March","April","May","June","July","August","September","October","November","December"}; inti; cout<<"请输入月份数:"; cin>>i; cout<<month[i-1]<<endl; return0;}5.有5个字符串,首先将它们按照字符串中字符个数由小到大排序,再分别取出每个字符串的第三个字母合并成一个新的字符串输出(若少于三个字符的输出空格)。要求:利用字符串指针和指针数组实现。#include<iostream>#include<string.h>usingnamespacestd;intmain(){ charstr[5][50]; char*pstr[5],*ptemp; intlen[5],temp; inti,j; for(i=0;i<5;i++) pstr[i]=str[i]; cout<<"inputfivestrings:"; for(i=0;i<5;i++) cin>>pstr[i]; for(i=0;i<5;i++) len[i]=strlen(pstr[i]); for(i=0;i<4;i++) for(j=0;j<4-i;j++) if(len[j]>len[j+1]) { temp=len[j]; len[j]=len[j+1]; len[j+1]=temp; ptemp=pstr[j]; pstr[j]=pstr[j+1]; pstr[j+1]=ptemp; } cout<<"aftersort:"; for(i=0;i<5;i++) cout<<pstr[i]<<""; cout<<endl; cout<<"concatenatestring:"; for(i=0;i<5;i++) if(*(pstr[i]+2))cout<<*(pstr[i]+2); elsecout<<''; cout<<endl; return0;}6.编制具有如下原型的函数int*findMax(int*a,intn,int&idx);负责在数组a的n个元素中找出最大值,并返回该最大值数组元素的内存地址(指针值),而且再通过引用变量idx返回具有最大值的元素在数组中的下标。编制主函数,调用findMax,以验证其正确性。#include<iostream>usingnamespacestd;int*findMax(int*a,intn,int&idx){ idx=0;//idx代表具有最大值的数组元素下标值 for(inti=1;i<n;i++) if(*(a+i)>*(a+idx)) idx=i;//找到更大者时,改变idx值 return(a+idx);//返回最大值元素所在内存地址 } intmain(){ intb[10]={34,7,23,89,11,-2,100,11,5,66}; int*maxAddr,maxIdx; maxAddr=findMax(b,10,maxIdx); cout<<"Maxvalueindex:"<<maxIdx<<endl; cout<<"Maxvalueaddress:"<<maxAddr<<endl; cout<<"Maxvalue:"<<*(b+maxIdx)<<endl; return0;}7.利用指向行的指针变量求5×3数组各行元素之和。#include<iostream>usingnamespacestd;intmain(){ inta[5][3]; int(*p)[3]; inti,j,sum; cout<<"inputdata(5×3):"; for(i=0;i<5;i++) for(j=0;j<3;j++) cin>>a[i][j]; p=a; for(i=0;i<5;i++) { sum=0; for(j=0;j<3;j++) sum=sum+*(*(p+i)+j); cout<<i+1<<"row:sum="<<sum<<endl; } return0;}8.输入一串单词(仅为大写),末尾以英文符号’.’作为结束。假设字母A的价值为1,字母B的价值为2,.....字母Z的价值为26。试编写函数voidvalue(char*str,int*num);求得每个单词的价值。单词的价值就是组成一个单词的所有字母的价值之和,比如,单词ACM的价值是1+3+14=18,单词HDU的价值是8+4+21=33。结论在主函数内输出。#include<iostream>usingnamespacestd;voidvalue(char*str,int*num){ inti=0,j=0,sum=0; while(str[i]!='.') { if(str[i]!='') sum+=str[i]-'A'+1; else { num[j]=sum; sum=0; j++; } i++; } if(sum)num[j]=sum;}intmain(){ charwords[100]; intval[100]={0}; cout<<"inputwords:"; cin.getline(words,100); value(words,val); inti=0; while(val[i]) { cout<<val[i]<<""; i++; } return0;}9.编写函数intfrequency(char*substr,char*str);求子串在源串中出现的次数,结论在主函数内输出。要求:不使用查找子串的库函数。#include<iostream>#include<cstring>usingnamespaces
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年高端保温施工合同补充协议及售后服务
- 二零二五年度建材行业产业园区投资合作协议
- 2025版二手车贷款贷款合同信息备份与安全保密合同
- 二零二五年供应商保密协议承诺书(含内部信息)范本
- 二零二五年智能机房安全监控与维护合同
- 二零二五年度标志设计知识产权许可与版权登记协议
- 二零二五年度二次供水工程应急响应合同范本
- 2025年度生态园林景观绿化养护工程劳务承包协议
- 2025版交通基础设施项目合同管理及监督规范
- 2025年滑雪教练职业技能测试卷:滑雪教练教学安全与风险防范模拟试题
- 小学英语-三年级升四年级英语阅读理解专项(附答案)
- 农田水利工程监理环保监理实施方案和措施
- 2025年资阳市税务系统遴选面试真题附带题目详解含答案
- 股骨粗隆间骨折术后的护理
- 肿瘤科质控汇报
- 口腔科发展汇报
- 浙江省杭州市名校2025届七年级英语第二学期期末达标测试试题含答案
- 品牌年轻化创新-洞察及研究
- 潍坊银行笔试题库及答案
- 护理学科研创新试题及答案
- 广告标识牌、宣传品、物料设计、制作方案投标文件(技术方案)
评论
0/150
提交评论