皮德常c++全套答案
5、计算一个人一段时期的薪水,第1天1分钱,第2天2分钱,每天翻倍。要求用户输入天数(输入检验),列表显示每天的薪水,及薪水总和(输出人民币的单位:“元”)。#includeusing namespace std;void main(){int daynum;float daypay, paysum=0;do{cout<<\"请输入天数(>1整数):\";cin>>daynum;}while(daynum<=1);//有效性检验for(int i=1; i<=daynum; i++){daypay=i/
100、0;cout<<\"第\"<\\";if(i%2==0)cout<7、用for循环计算1/30+2/29+3/28+…+30/1。#includeusing namespace std;void main(){int i;float sum=0;for(i=1;i<=30;i++)sum+=i/float(31-i);cout<<\"sum=\"<8、用循环语句输出如下图形。AAAAAAA AAAAA AAA A AAA AAAAAAAAAAAA#includeusingnamespace
std;void
main(){int
i,j,k;for(i=0;i<=3;i++)//控制行{for(j=0;ji;k--)//
控
制
每
行
输
出
的
'A'
的
数
目
cout<<'A';cout<i;j--)cout<<' ';//控制每行输出的第 1 页 共 14 页
' '的数目for(k=0;k<2*i+1;k++)//控制每行输出的'A'的数目
cout<<'A';cout<9、采用循环结构计算公式s的前30项和。s=2/1+3/2+5/3+…#includeusing namespace std;#define N30void main(){int
i;float
a1,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<<\"\\nsum is : \"<10、求sum=a+aa+…+aa…a,a和n由键盘输入。#includeusing namespace std;void main(){int i,a,n;long sum,temp;sum=temp=0;cout<<\"\\nEnter aand
n:
\";cin>>a>>n;for(i=1;i<=n;i++){temp=a+temp*10;sum+=temp;}cout<<\"the result is : \"<11、输入一行字符,以回车结束,分别统计其中出现的大写英文字母、小写英文字母、数字字符、空格和其他字符出现的次数。#includeusing namespace std;voidmain(){char
c;
enter
int the
lletters=0,uletters=0,spaces=0,digits=0,others=0;cout<<\"Please characters:\\n\";while((c=cinif(c>='A'&&c<='Z')
、
get())!='\\n'){if(c>='a'&&c<='z')lletters++;else
uletters++; else if(c==' ')
第 2 页 共 14 页
spaces++; else if(c>='0'&&c<='9')
digits++; else others++; } cout<<\"the number of lower case letters: \"<numberof
upper
case
letters:
\"<1、编写求阶乘及组合的函数,在主函数调用求组合的函数。#includeusing namespace std;long fac(int n){long fac=1;for(int i=2;i<=n;i++)fac*=i;return fac;}long comb(int n, int k){return fac(n)/(fac(k)*fac(n-k));}voidmain(){int
n,k;cout<<\"Please
input
the
n
and
the
k:
\";cin>>n>>k;cout<<\"the combination number of n and k: \"<2、编写函数计算ex的近似值,在主函数中输入x及精度10-9(要求最后一项小于10-9)。#include#includeusing namespace std;double ex(double x,double eps){ int i=1;double e=1,t=1;while(fabs(t)>eps)
{t=t*x/i;e=e+t;i++;} return(e);} void main(){double x,eps;cout<<\"Please inout x and eps:\\n\"; cin>>x>>eps; cout<<\"e**x:\\n\"<3、编写被调函数,求出1000以内 素数,在主函数中调用函数并输出素数,每行输第 3 页 共 14 页
出5个素数。#include#include#includeusing namespacestd;void
PrimeNum(int
n=1000){
int
i,
j,
k,
flg=1,
num=0;for(i=2;iif(i%j==0)flg=0;
if(flg==1){cout<4、输出1000以内的所有完数。#include#includeusing namespace std;void print(int n)//输出因子{int i;for(i=1;i<=n/2;i++)if(n%i==0)cout<wanshu(int n){int i;ints+=i;if(s==n){cout<5、编写函数(递归和非递归)求两个整数的最大公约数和最小公倍数。#includeusing namespace std;int (int x,int y){int r;r=x%y;while (r!=0){x=y; y=r; r=x%y;}return(y);}//int (int a, int b)//{if(a%b==0)// return b;//else // return (b, a%b);//}int gbs(int x,int y){int
第 4 页 共 14 页
bs,ys;ys=(x,y);bs=x*y/ys;return bs;}void main(){int x,y,g,bs;cout<<\"Enter two number:
\\n
\";cin>>x>>y;g=(x,y);bs=gbs(x,y);cout<<\"the
:
\"<6、递归函数反序输出数位。#includeusing namespace std;void rev(int x)/*反向输出*/{if(x>0){cout<>x;cout<<\"reverse:\";if(x<0){cout<<\"-\";x=-x;}rev(x); }3-
8、递归函数实现进制到二进制转换。#includeusing namespace std;void fun(int i){if(i >1)
fun(i/2);cout<{int n; cout<<\"Please input the decimal number: \";cin>>n; cout<<\"the binary number: \";fun(n); }3-
9、编写函数输出图形。(略)3-
第 5 页 共 14 页
10、编写min函数模板和max函数模板。#include using namespace std;template T min(T &var1,T &var2){if(var1return(var1);else &var2){if(var1return(var2);}template T max(T &var1,Treturn(var2);else return(var1);}void main(void){int userInt1,userInt2;float
userFloat1,userFloat2;char userChar1,userChar2;cout<<\"Please input two integar numbers:
\";cin>>userInt1>>userInt2;cout<<\"the
max
min
is: is:
\"<\"<>userFloat1>>userFloat2;cout<<\"the \"<min maxis: is:
\"<>userChar1>>userChar2;cout<<\"the \"<min maxis: is:
11、绝对值函数模板。#include using namespace std;template T Abs(const T var){if(var<0)return(-var);else return(var);}void main(void){//测试整型量求绝对值int test1=12,test2=-34;cout<<\"
测
试
整
型
量
:
第 6 页 共 14 页
\"<\"<的绝对值为:12、67f,test4=-
34、43f;cout<<\"测试浮点型量:\"<1、编程实现由用户输入10个数据到数组,输出数组中的最大值和最小值及其相应的下标。#include using namespace std;#define N10void main(){int i,array[N],max,maxid,min,minid;for(i=0;i>array[i];max=min=array[0];maxid=minid=0;for(i=1;imax){max=array[i];maxid=i;}if(array[i]maxof
the
array
is
\"<2、编写函数实现将字符串中每个单词的首字母大写。#include using namespace std;void Words( char str[ ]){int i;char ch=' '; // 存放前一字符for (i=0; str[i]!='\\0'; i++ ){if ( ch == ' ' && str[i] != ' ')第 7 页 共 14 页
// 单词数首字母{if(str[i]>='a'&&str[i]<='z')str[i]-=32; }ch = str[i];}}void main(){char
str[100];cout<<\"Please
input
a
string:\";cin
、
getline(str,100);Words(str);cout<4、编程实现线性查找账号,账号由用户输入,若找到,则输出合法信息,否则输出非法信息。#includeusing namespace std;#define arrSize5int searchList(int list[ ], int numElems, int value){for(int i=0; i < numElems; i++ )if( value == list[i] )return i;return1 )cout << x<< \"为非法账号。\"<< endl;elsecout << x<< \"为合法账号。\";}4-
5、采用二分查找实现上述程序。#include #include using namespace std;#define arrSize5void selectionSort(int a[ ], int n)// 选择排序{int i, j, t, minIndex;for(i=0; iminIndex=j;if( minIndex != i ){t=a[minIndex]; a[minIndex]=a[i]; a[i]=t;}}}//二分查找函数,在a数组中查找valueint binarySearch(int a[ ], int numElems, int value){int low=0, mid, hight=numElems-1;while (low<=hight){mid=(low+hight)/2;if( value == a[mid] )// 查找成功return mid; else if( value < a[mid] )
//位于数组的前一半hight=mid-1;else low=mid+1; //位于数组的后一
第 8 页 共 14 页
半}return1 )cout << x<< \"为非法账号。\"<< endl;elsecout << x<< \"为合法账号。\";}4-
6、 寻找二维数组中的鞍点(该位置的元素是该行上的最大元素,同时是该列上的最小元素)。#include #include using namespace std;#define M3#define N4 int q1=0, q2=0; //鞍点位置下标int andian(int a[M][N], int p1, int p2){int i, j, k, m, f, w, max;w=0;for(i=0; imax){k=j;max=a[i][j];}//第i行第k列为第i行的最大元素for(m=0, f=1; mf=0;//第i行第k列不是鞍点if(f){w=1;q1=i;q2=k;}}return w;} void main( ){int a[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};*/int w;w=andian(a,M,N);if(w)
{cout<<\"该二维数组存在鞍点:\"<7、编写函数求一个4×4二维数组中周边元素的和。#include using namespacestd;int
arrSum(int
arr[][4]){int
i,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];}sum-=arr[0][0]+arr[3][0]+arr[0][3]+arr[3][3];return sum;}void main(){int a[4][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};cout<<\"该二维
第 9 页 共 14 页
数组的周边元素之和为:\"<8、编写函数求二维数组两条对角线元素之和。#include using namespacestd;#define
N4int
sum(int
main( 素
:
a[][N]){int
){int \\n\";for
i,s=0;for(i=0;i输入
二
维
数
组
元
(i=0;i>a[i][j];}cout<<\"两条对角线元素之和:\"<9、见例题。4-10、合并数组,合并前后的数组元素均按升序排列。#include#includeusing namespace std;int merge(int a[],int b[],intc[],int
m,int
n){int
i=0,
j=0,
k=0;while(ic[k++]=b[j++];return k;}void main( ){int a[]={1,4,7,9},b[]={3,5,7,8,12},c[20],i,k;k=merge(a,b,c,4,5);cout<<\"array a:\\n\";for(i=0;i<4;i++)cout<array第 10 页 共 14 页
1、同4-2,形参换成指针即可。5-
3、求一组整数的中值。#include#includeusing namespace std;void selectionSort(int *a, int n)// 选择排序{int i, j, t, minIndex;for(i=0; iminIndex=j;if( minIndex != i ){t=a[minIndex]; a[minIndex]=a[i]; a[i]=t;}}}int mean(int*a,int
n){int
mean,tmp;selectionSort(a,n);tmp=n/2;if(n%2==0)mean=a[tmp]+a[tmp-1];else mean=a[tmp];return mean;}void main(){int a[100],num,i;cout<<\"输入整数个数(
<100
)
:
\";cin>>num;cout<<\"
输
入
\"<个整
数
:
\\n\";for(i=0;i>a[i];cout<<\"这组整数的中值是:\"<4、编写一个程序求一组正整数的模。在统计学中,模代表一组值中出现最频繁的数,编写一个函数接受如下两个参数。1)整型数组。2)代表该数组元素个数的一个整数。该函数应当返回这组数的模,即返回该数组中出现最频繁的那个数。如果数组中没有模,即没有最频繁的数,那么就返回-1。#include#include#include#includeusing namespace std;const int value=10;int Mol(int a[],int value);int main(){ int a[value];srand(time(0));for(inti=0;i<10;i++){a[i]=rand()%10;cout<f=Mol(a,value);if(f==-1)cout<<\"没有模!\"<第 11 页 共 14 页\"<{ for(int j=i+1,m=0;j{ if(*(p+i)==*(p+j))m++; } *(b+i)=m; } for(int l=0;l{ if(*(q+l)>*(q+c))c=l; } for(int m=0;mif(*(q+m)==*(q+c)&&m!=c)return
5、在主函数中首先输入一个整数到变量n中,然后输入n个整数到数组中,调用函数exchange(),完成将数组中的最小值与第0个元素对调,将数组中的最大值与最后一个元素对调,在主函数中调用函数print()输出调换前和调换后的数组。要求被调函数exchange和print的参数均为1)数组名2)数组元素的个数。#include#includeusing namespace std;void exchange(int a[],int value);void print(int a[],int value);int main(){int n;cin>>n; int a[100];for(int i=0;i>a[i];cout<<\"调换前为:\"; print(a,n);exchange(a,n);cout<<\"调换后第 12 页 共 14 页
为:\"; print(a,n);return 0;}void print(int a[],int value){int
*p=a,i;for(i=0;i(a[m]for(i=0,m=0;ia[i])?m=m:m=i; 1);*(j+value-1)=t;}5-t=*(p+m);*(p+m)=*p;*p=t; t=*(j+m);*(j+m)=*(j+value-
6、在主函数中输入个整数到数组中,调用函数move()完成将数组元素循环移动k位(要求函数参数为
1、数组名
2、数组元素个数
3、循环移动的位数k)。当k>0时,实现循环右移;当k<0时,实现循环左移。循环右移一位的意义是:将数组全体元素向右移动一个元素的位置,原数组最后一个元素移动到数组的最前面,即第0个元素位置。提示:当k<0时,转换成等价的循环右移。调用函数
print()输出移动前和移动后的全体数组元素。
#include#includeusing namespace std;void move(int x[],int value,intk);void
print(int
x[],int 移
动
value);int 前
数
组
main(){int 为
:
\";
x[10],i;for(i=0;i<10;i++)cin>>x[i];cout<<\"
print(x,10);move(x,10,3);cout<<\"移动后数组为:\"; print(x,10);return 0;}void print(int
第 13 页 共 14 页
x[],int value){{for(int i=0;i7、在主函数中输入一个字符串到字符数组str1中,调用函数将str1中的下标为奇数的字符取出,构成一个新的字符串放入字符数组str2中(要求被调函数参数为str1和str2),在主函数中输出结果字符串str2、#includeusing namespace std;void newstr(char str1[],char str2[]);static int m=0;void main(){char str1[100];char str2[100];cout<<\"请输入一个字符串:\"<{ char *p,*q; q=str1; p=str2; int i=0; for(i=0;i<100;i++){ if(*(q+i)=='\\0')
第 14 页 共 14 页