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