完整版皮德常c++全套答案.docx
《完整版皮德常c++全套答案.docx》由会员分享,可在线阅读,更多相关《完整版皮德常c++全套答案.docx(104页珍藏版)》请在冰豆网上搜索。
完整版皮德常c++全套答案
第2章习题
2-5、计算一个人一段时期的薪水,第1天1分钱,第2天2分钱,每天翻倍。
要求用户输入天数(输入检验),列表显示每天的薪水,及薪水总和(输出人民币的单位:
“元”)。
#include
usingnamespacestd;
voidmain()
{
intdaynum;
floatdaypay,paysum=0;
do{
cout<<"请输入天数(>1整数):
";
cin>>daynum;
}while(daynum<=1);//有效性检验
for(inti=1;i<=daynum;i++)
{daypay=i/100.0;
cout<<"第"<
"<if(i%2==0)
cout<paysum+=daypay;//列表输出每天薪水,计算总薪水
}
cout<cout<<"薪水总和:
"<}
2-7、用for循环计算1/30+2/29+3/28+…+30/1。
#include
usingnamespacestd;
voidmain()
{
inti;
floatsum=0;
for(i=1;i<=30;i++)
sum+=i/float(31-i);
cout<<"sum="<}
2-8、用循环语句输出如下图形。
AAAAAAA
AAAAA
AAA
A
AAA
AAAAA
AAAAAAA
#include
usingnamespacestd;
voidmain()
{
inti,j,k;
for(i=0;i<=3;i++)//控制行
{for(j=0;j
cout<<'';//控制每行输出的''的数目
for(k=7-i;k>i;k--)//控制每行输出的'A'的数目
cout<<'A';
cout<}
for(i=1;i<=3;i++)
{for(j=3;j>i;j--)
cout<<'';//控制每行输出的''的数目
for(k=0;k<2*i+1;k++)//控制每行输出的'A'的数目
cout<<'A';
cout<}
}
2-9、采用循环结构计算公式s的前30项和。
s=2/1+3/2+5/3+…
#include
usingnamespacestd;
#defineN30
voidmain()
{inti;
floata1,a2,sum=0,temp;//a1分子,a2分母
for(a1=2,a2=1,sum=0,i=1;i<=N;i++){
sum+=a1/a2;
temp=a1;a1=a1+a2;a2=temp;//为下一次求和做准备
}
cout<<"\nsumis:
"<}
2-10、求sum=a+aa+…+aa…a,a和n由键盘输入。
#include
usingnamespacestd;
voidmain()
{
inti,a,n;
longsum,temp;
sum=temp=0;
cout<<"\nEnteraandn:
";
cin>>a>>n;
for(i=1;i<=n;i++)
{temp=a+temp*10;
sum+=temp;
}
cout<<"theresultis:
"<}
2-11、输入一行字符,以回车结束,分别统计其中出现的大写英文字母、小写英文字母、数字字符、空格和其他字符出现的次数。
#include
usingnamespacestd;
voidmain()
{charc;
intlletters=0,uletters=0,spaces=0,digits=0,others=0;
cout<<"Pleaseenterthecharacters:
\n";
while((c=cin.get())!
='\n')
{if(c>='a'&&c<='z')
lletters++;
elseif(c>='A'&&c<='Z')
uletters++;
elseif(c=='')
spaces++;
elseif(c>='0'&&c<='9')
digits++;
else
others++;
}
cout<<"thenumberoflowercaseletters:
"<cout<<"thenumberofuppercaseletters:
"<cout<<"thenumberofdigits:
"<cout<<"thenumberofspaces:
"<cout<<"thenumberofothers:
"<}
第3章习题:
3-1、编写求阶乘及组合的函数,在主函数调用求组合的函数。
#include
usingnamespacestd;
longfac(intn)
{
longfac=1;
for(inti=2;i<=n;i++)
fac*=i;
returnfac;
}
longcomb(intn,intk)
{
returnfac(n)/(fac(k)*fac(n-k));
}
voidmain()
{intn,k;
cout<<"Pleaseinputthenandthek:
";
cin>>n>>k;
cout<<"thecombinationnumberofnandk:
"<}
3-2、编写函数计算ex的近似值,在主函数中输入x及精度10-9(要求最后一项小于10-9)。
#include
#include
usingnamespacestd;
doubleex(doublex,doubleeps)
{
inti=1;
doublee=1,t=1;
while(fabs(t)>eps)
{t=t*x/i;
e=e+t;
i++;
}
return(e);
}
voidmain()
{doublex,eps;
cout<<"Pleaseinoutxandeps:
\n";
cin>>x>>eps;
cout<<"e**x:
\n"<}
3-3、编写被调函数,求出1000以内素数,在主函数中调用函数并输出素数,每行输出5个素数。
#include
#include
#include
usingnamespacestd;
voidPrimeNum(intn=1000)
{inti,j,k,flg=1,num=0;
for(i=2;i{
k=sqrt(i);
for(j=2;j<=k;j++)
if(i%j==0)
flg=0;
if(flg==1)
{cout<num++;
if(num%5==0)
cout<}
flg=1;
}
}
voidmain()
{PrimeNum();
}
3-4、输出1000以内的所有完数。
#include
#include
usingnamespacestd;
voidprint(intn)//输出因子
{inti;
for(i=1;i<=n/2;i++)
if(n%i==0)cout<cout<}
voidwanshu(intn)
{inti;
inta,s=0;
a=n/2;
for(i=1;i<=a;i++)
if(n%i==0)s+=i;
if(s==n)
{cout<";
print(n);
}
}
voidmain()
{inti;
for(i=1;i<=1000;i++)
wanshu(i);
}
3-5、编写函数(递归和非递归)求两个整数的最大公约数和最小公倍数。
#include
usingnamespacestd;
intgcd(intx,inty)
{intr;
r=x%y;
while(r!
=0)
{x=y;y=r;r=x%y;}
return(y);
}
//intgcd(inta,intb)
//{if(a%b==0)
//returnb;
//else
//returngcd(b,a%b);
//}
intgbs(intx,inty)
{intbs,ys;
ys=gcd(x,y);
bs=x*y/ys;
returnbs;
}
voidmain()
{intx,y,g,bs;
cout<<"Entertwonumber:
\n";
cin>>x>>y;
g=gcd(x,y);
bs=gbs(x,y);
cout<<"thegcd:
"<cout<<"thegbs:
"<}
3-6、递归函数反序输出数位。
#include
usingnamespacestd;
voidrev(intx)/*反向输出*/
{if(x>0)
{cout<rev(x/10);
}
}
voidmain()
{intx;
cout<<"Pleaseinputaninteger:
\n";
cin>>x;
cout<<"reverse:
";
if(x<0)
{cout<<"-";
x=-x;
}
rev(x);
}
3-8、递归函数实现十进制到二进制转换。
#include
usingnamespacestd;
voidfun(inti)
{
if(i>1)
fun(i/2);
cout<
}
voidmain()
{intn;
cout<<"Pleaseinputthedecimalnumber:
";
cin>>n;
cout<<"thebinarynumber:
";
fun(n);
}
3-9、编写函数输出图形。
(略)
3-10、编写min函数模板和max函数模板。
#include
usingnamespacestd;
template
Tmin(T&var1,T&var2)
{if(var1return(var1);
else
return(var2);
}
template
Tmax(T&var1,T&var2)
{if(var1return(var2);
else
return(var1);
}
voidmain(void)
{intuserInt1,userInt2;
floatuserFloat1,userFloat2;
charuserChar1,userChar2;
cout<<"Pleaseinputtwointegarnumbers:
";
cin>>userInt1>>userInt2;
cout<<"theminis:
"<cout<<"themaxis:
"<cout<<"Pleaseinputtwofloatnumbers:
";
cin>>userFloat1>>userFloat2;
cout<<"theminis:
"<cout<<"themaxis:
"<cout<<"Pleaseinputtwocharnumbers:
";
cin>>userChar1>>userChar2;
cout<<"theminis:
"<cout<<"themaxis:
"<}
3-11、绝对值函数模板。
#include
usingnamespacestd;
template
TAbs(constTvar)
{if(var<0)
return(-var);
else
return(var);
}
voidmain(void)
{//测试整型量求绝对值
inttest1=12,test2=-34;
cout<<"测试整型量:
"<cout<<"test1="<"<cout<<"test2="<"<//测试浮点型量求绝对值
floattest3=12.67f,test4=-34.43f;
cout<<"测试浮点型量:
"<cout<<"test3="<"<cout<<"test4="<"<}
第4章习题:
4-1、编程实现由用户输入10个数据到数组,输出数组中的最大值和最小值及其相应的下标。
#include
usingnamespacestd;
#defineN10
voidmain()
{inti,array[N],max,maxid,min,minid;
for(i=0;icin>>array[i];
max=min=array[0];
maxid=minid=0;
for(i=1;i{
if(array[i]>max)
{max=array[i];maxid=i;}
if(array[i]{min=array[i];minid=i;}
}
cout<<"themaxofthearrayis"<cout<<"theindexofthemaxis"<cout<<"theminofthearrayis"<cout<<"theindexoftheminis"<}
4-2、编写函数实现将字符串中每个单词的首字母大写。
#include
usingnamespacestd;
voidWords(charstr[])
{inti;
charch='';//存放前一字符
for(i=0;str[i]!
='\0';i++)
{
if(ch==''&&str[i]!
='')//单词数首字母
{if(str[i]>='a'&&str[i]<='z')
str[i]-=32;
}
ch=str[i];
}
}
voidmain()
{charstr[100];
cout<<"Pleaseinputastring:
";
cin.getline(str,100);
Words(str);
cout<}
4-4、编程实现线性查找账号,账号由用户输入,若找到,则输出合法信息,否则输出非法信息。
#include
usingnamespacestd;
#definearrSize5
intsearchList(intlist[],intnumElems,intvalue)
{for(inti=0;iif(value==list[i])
returni;
return-1;
}
voidmain()
{inttests[arrSize]={5658845,4562555,3852085,4520125,5552012};
intresult,x;
cout<<"请输入账号:
";
cin>>x;
result=searchList(tests,arrSize,x);
if(result==-1)
cout<"<else
cout<";
}
4-5、采用二分查找实现上述程序。
#include
#include
usingnamespacestd;
#definearrSize5
voidselectionSort(inta[],intn)//选择排序
{inti,j,t,minIndex;
for(i=0;i{
minIndex=i;
for(j=i+1;jif(a[j]minIndex=j;
if(minIndex!
=i)
{t=a[minIndex];
a[minIndex]=a[i];
a[i]=t;
}
}
}
//二分查找函数,在a数组中查找value
intbinarySearch(inta[],intnumElems,intvalue)
{intlow=0,mid,hight=numElems-1;
while(low<=hight)
{
mid=(low+hight)/2;
if(value==a[mid])//查找成功
returnmid;
elseif(valuehight=mid-1;
else
low=mid+1;//位于数组的后一半
}
return-1;
}
voidmain()
{inttests[arrSize]={5658845,4562555,3852085,4520125,5552012};
intresult,x;
cout<<"请输入账号:
";
cin>>x;
selectionSort(tests,arrSize);
result=binarySearch(tests,arrSize,x);
if(result==-1)
cout<"<else
cout<";
}
4-6、寻找二维数组中的鞍点(该位置的元素是该行上的最大元素,同时是该列上的最小元素)。
#include
#include
usingnamespacestd;
#defineM3
#defineN4
intq1=0,q2=0;//鞍点位置下标
intandian(inta[M][N],intp1,intp2)
{inti,j,k,m,f,w,max;
w=0;
for(i=0;i{
k=0;
max=a[i][0];
for(j=0;jif(a[i][j]>max)
{k=j;
max=a[i][j];}//第i行第k列为第i行的最大元素
for(m=0,f=1;mif(a[m][k]if(f)
{w=1;
q1=i;
q2=k;}
}
returnw;
}
voidmain()
{
inta[M][N]={1,2,3,4,4,5,3,6,3,5,6,7};/*{2,4,10,6,3,4,5,8,9,1,2,3};*/
intw;
w=andian(a,M,N);
if(w)
{cout<<"该二维数组存在鞍点:
"<cout<<"其行标为:
"<"<}
elsecout<<"该二维数组没有鞍点。
";
}
4-7、编写函数求一个4×4二维数组中周边元素的和。
#include
usingnamespacestd;
intarrSum(intarr[][4])
{
inti,j,sum=0;
for(i=0;i<4;i++)
{
sum+=arr[i][0];
sum+=arr[i][3];
}
for(j=0;j<4;j++)
{
sum+=arr[0][j];
sum+=arr[3][j];
}