C 语言程序设计(第三版)习题库
1、设圆半径r=1.5,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。用scanf 输入数据,输出计算结果,输出时要求文字说明,取小数点后两位数字。请编程序。
#include
main(){
float r,h,C1,Sa,Sb,Va,Vb;
scanf(__”%f ”__,&r);
scanf(”%d ”,__&h _);;
C1=2*3.14*r;
Sa=3.14*r*r;
Sb=4*Sa;
Va=4*3.14*r*r*r/3;
Vb=Sa*h;
printf(___”Cl=%.2fSa=%.2fSb=%.2fVa=%.2fVb=%.2f ”,Cl,Sa,Sb,Va,Vb ); }
2、输入一个华氏温度,要求输出摄氏温度。公式为 c=5(F-32)/9
输出要求有文字说明,取位2小数。
#include
main(){
float F,c;
scanf("%f",&F);
____c=5*(F-32)/9______;
printf("c=%.2f",c);
}
3、有一函数:??
???≥-<≤-<=10113101121x x x x x x y 写一程序,输入x 值,输出y 值。
#include
main(){
int x,y;
printf("输入x :");
scanf("%d",&x);
if(x<1) { /* x<1 */
y=x;
printf("x=%3d, y=x=%d\n",x,y);
} else if (____x<10_______){ /* 1≤x-10 */ _____y=2*x-1_______;
printf("x=%3d, y=2*x-1=%d\n",x,y);
} else{ /* x≥10 */
y=3*x-11;
printf("x=%3d, y=3*x-11=%d\n",x# include "stdio.h"
main()
{
int x,y;
scanf("%d",&x);
if(x<1)
{ y=x;}
else if(x>=1 && x<10)
{ y=2*x-1;}
else
{ y=3*x-11;}
printf("%d",y);
}# include "stdio.h"
main()
{
int x,y;
scanf("%d",&x);
if(x<1)
{ y=x;}
else if(x>=1 && x<10)
{ y=2*x-1;}
else
{ y=3*x-11;}
printf("%d\n",y);
}# include "stdio.h"
main()
{
int x,y;
scanf("%d",&x);
if(x<1)
{ y=x;}
else if(x>=1 && x<10)
{ y=2*x-1;}
else
{ y=3*x-11;}
printf("%d",y);
}scanf("%d",&x);
if(x<1)
{ y=x;}
else if(x>=1 && x<10)
{ y=2*x-1;}
else
{ y=3*x-11;}# include "stdio.h"
main()
{
int x,y;
scanf("%d",&x);
if(x<1)
y=x;
else if(x>=1 && x<10)
y=2*x-1;
else
y=3*x-11;
printf("%d",y);
},y);
}
}
4、给定一个不多于5位的正整数,要求:①求它是几位数;②按逆序打印出各位数字。例如原数为321,应输出123。
#include
main(){
long int num,m=0;
int i=0;
scanf("%ld",&num);
while(num>0){
i++; /*统计长度*/
m=m*10+num%10;
num =num/10;
}
printf("数字长度为:%d",i);
printf("逆序数字为:%d\n",m);
}
5、以下程序实现的功能:求三个数的最大值
#include
main(){
int a,b,c,max;
scanf("%d %d %d",&a,&b,&c);
if(a>b){
if(a>c) max=a;
else max=c;
} else{
if(b>c) max=b;
else
max=c;
}
printf("max= %d",max);
}
#include
main(){
int x,y,z,t=0;
scanf("%d %d %d",&x,&y,&z);
if(x>y)
{t=y;y=x;x=t;}
if(x>z)
{t=z;z=x;x=t;}
if(y>z)
{t=z;z=y;y=t;}
printf("%d\n",z);
}
6、输入两个正整数m和n,求其最大公约数和最小公倍数。/*枚举法*/
#include
main(){
long m,n,i=1,j,s;
scanf("%ld,%ld",&m,&n);
for(;i<=m&&i<=n;i++){
if(m%i==0&&n%i==0) s=i;
}
if(m>=n)j=m;
else j=n;
for(;!(j%m==0&&j%n==0);j++);
printf("s=%ld,j=%ld\n",s,j);
}
#include
main(){
int a,b,k,temp,i,p;
scanf("%d,%d",&a,&b);
if(a>b)
temp=b;
else
temp=a;
for(i=2;i<=temp;i++)
{ if(a%i==0 && b%i==0) k=i;
}
printf("%d\n",k);
p=a*b/k;
printf("%d\n",p);
}
/*辗转相除*/
#include
main(){
int m,n,k,j,p,r=1;
scanf("%d,%d",&m,&n);
k= m>n?m:n;
j= m>n? n:m;
do{
r=k%j;
k=j;
j=r;
}while(r!=0);
printf("%d,%d",k,m*n/k); }
/*反复减法*/
#include
main(){
int m,n,k,j,p,r=1;
scanf("%d,%d",&m,&n);
k= m>n? m:n;
j= m>n?n:m;
do{
p=k-j;
if(j>p){ k=j; j=p;}
else k=p;
}while(p!=0);
printf("%d,%d",k,m*n/k);
}
7、输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。#include"stdio.h"
main(){
char c;int i=0,j=0,k=0,l=0;
wh ile((c=getchar())!=’\n’) {
if(c>=’A’&&c<=’Z’||c>=’a’&&c<=’z’)
i++; //英文字母统计
else if(c>=’0’&&c<=’9’)
j++; //数字统计
else if(c==’’)
k++; //空格统计
else l++;
}
printf("i=%d,j=%d,k=%d,l=%d\n",i,j,k,l);
}
8、求Sn=a+aa+aaa+…+aa…aaa(有n个a)之值,其中a是一个数字。例如:2+22+222+2222+22222(n=5),n由键盘输入。
#include
main(){
int a,n;
long b=0,sum=0;
scanf(“%d %d”,&a,&n);
for (i=1;i<=n;i++){
b = b*10+a;
sum =sum+b;
}
printf (“%ld”,sum);
}
9、打印出所有"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该本身。例如:153是一个水仙花数,因为153=13+53+33。
【程序1】
#include
main(){
int i,m,n,k;
for(i=100;i<1000;i++){
m=__i%10__;
n=_ i/10%10__;
k=i/100;
if(__m*m*m+n*n*n+k*k*k==i__)
printf("%5d",i);
}
}
【程序2】
#include
main(){
int i,a,n,s;
for (i=100;i<=999;i++){
n=i;s=0;
while(n>0) {
a=__n%10__;
s+=a*a*a;
n /=__10__;
}
if (__s==i__) printf(“%d”,i);
}
10、一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如,6的因子为1、2、3,而6=1+2+3,因此6是"完数"。编程序找出1000之内的所有完数,并按下面格式输出其因子: 6 its factors are 1、2、3
#include
main() {
int a,i,m;
for (a =1; a<=1000;a++) {
for (__i=1,m=0__; i <= a/2;i++)
if (!(a%i)) __m+=i__;
if (m==a) printf(“%4d”,a);
}
}
11、利用:?/4=1-1/3+1/5-1/7+….级数求?的值,直到最后一项的绝对值小于10-6为止。求绝对值的函数为fabs()。
#__include
#include
main(){
int i=1,flag=1;
double sum=0.0,s;
do{
s=__1.0/(2*i-1)__;
sum+=s*flag;
i++;
__flag=-flag__;
}while(__fabs(s)>1e-6__);/**/
printf("pi=%f",__4*sum__);
}
11、有一分数序列:2/1,3/2,5/3, 求出这个数列的前20项之和。
#include
#define N 20
main(){
int i=1;
double x=1,y=2, sum=0;
while(__i<=20__) {
sum=sum+__y/x__;
y = ___x+y__;
x = __y-x__;
i++;
}
printf("%f\n",sum);
}
12、一球从100米高度自由下落,每次落地后返回原高度的一半,再落下。求它在第10次落地时共经过多少米?第10次反弹多高?
#include
main(){
int i,n=10;
double h=100,s=100;
for(i=2;i<=n;i++){
h*=__0.5__;
s=__s+h*2__;
}
printf("s=%f,h=%f\n",s,h);
}
13、猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少桃子。
#include
#define N 10
main(){
int i=1,sum=1;
while(i++ sum=__(sum+1)*2__; printf("sum=%d\n",sum); } 14、用迭代法求。求平方根的迭代公式为: 要求前后两次求出的得差的绝对值少于0.00001。 #include #include main(){ float x0,x1,a; scanf("%f",&a); x1=a/2; do{ x0=x1; x1=__(x0+a/x0)/2__; } while(__x1>1e-5__); printf("%g\n",x1); } 15、用牛顿迭代法求方程0634223=-+-x x x 在1.5附近的根。 #include #include __ #define f(x) 2*x*x*x-4*x*x+3*x-6 main(){ double x,y;x=__1.5__; do{ y = f(x); x = x - y/(6*x*x-8*x+3); } while(fabs(y)>1e-6); printf("x=%.3f\n",x); } 16、用二分法求方程0634223=-+-x x x 在(-10,10)之间的根 #include #include #define f(x) 2x*x*x-4*x*x+3*x-6 main(){ double x1=-10,x2=10,x,y; do{ x=(x1+x2)/2; y=f(x); if(y<0) x1=x; else x2=x; }while(fabs(y)>1e-6); printf("x=%g\n",x); } 17、以下程序的功能是:输入一个百分制成绩,输出一个五级制成绩等级。例如 输 入75,输出 C。请完成填空 #include main(){ int score; scanf("__%d__",&score); switch(__score/10__){ case 1:case 2:case 3:case 4:case 5: printf(“grade E\n”); ___break__; case 6: printf(“grade D\n”);break; case 7: printf(“grade C\n”);break; case 8: printf(“grade B\n”);break; case 9: printf(“grade A\n”);break; __default__:printf("Error input!\n"); } } 18、该程序功能:对x=1,2,...,10,求f(x)=x*x-5*x+sin(x)的最大值。 #include #include #define f(x) x*x-5*x+sin(x) void main(){ int x; float max; __max=f(1)__; for(x=2;x<=10;x++) __if(max printf("%f\n",max); } 19、程序功能:输入整数a和b的值,若a2+b2大于100,则输出a2+b2百位以上的数字,否则输出两数之和。 #include main(){ int a,b,s; scanf("%d%d",&a,&b); s=__a*a+b*b__; if(s>100) printf("%d",__s/100__); else printf("%d",___a+b__); } 20、有1020个西瓜,第一天卖一半多两个,以后每天卖剩下的一半多两个,以下程序统计卖完所需的天数。 #include main(){ int day,x1,x2; day=0;x1=1020; while(__x1>0__){ x2=__x1/2-2__; x1=x2; day++} printf(“day=%d”,day); } 21、找出整数的所有因子 #include main(){ int i,x; scanf(“%d”,&x); i=1; for ( ; __i<=x/2__;){ if (x%i==0) printf(%d”,i); i++; } } 22、统计用数字0-9可以组成多少个各位上的数字没有重复的3位偶数。 #include main(){ int n=0,i,j,k; for (i = 1;i <= 9;i++) for (k = 0;k <= 8; __k+=2__) if (k != i) for (j = 0;j <= 9;j++) if (__j!=i&&j!=k__) n++; printf(“n=%d\n”,n); } 23、用100元换成1、2、5元的所有兑换方案。 #include main() { int i,j,k,l=0; for (i = 0; i<=20;i++) for (j =0; j<=50; j++) { k= __(100-i-2*j)/5__; if (__i+j*2+k*5==100__){ printf(“%2d %2d %2d”,i,j,k); l = l + 1; if (l%5==0) printf(“\n”); } } } 24、输出1-100之间满足每位数的乘积大于每位数的和的数#include main() { int n,k=1,s=0,m; for (n=1; n<=100; n++) { k=1; s=0; __m=n__; while (__m>0__) { k *=m%10; s+=m%10; ___m/=10__; } if (k>s) printf(“%d”,n); } 25、从3个红球、5个白球、6个黑球中任意取出8个球,且其中必须有白球,输出所有可能的方案。 #include main() { int i,j,k; for (i=0;i<=3;i++) for (__j=1__; j<=5;j++) { k = 8 – i – j; if (__k>=0__) printf(“%3d %3d %3d\n”,i,j,k); } } 26、以下程序的功能是:判断一个四位数是否满足这样的条件:它的9倍刚好是它的反序数。反序数是指整数各个位上的数字逆序所形成的整数。请完成程序的填空。 #include main(){ int i,a,b,c,d,m; for(i=1000;;i++){ a=__i%10__; b=i/10%10; c=i/100%10; d=i/1000; m=__a*1000+b*100+c*10+d__; if(___m==i*9__) __break__; } printf("i=%d",i); } 27、以下程序完成两整数的交换。 #include main(){ int a,b; printf(“请依次输入a,b的值:”); scanf(“%d,%d”, __&a,&b__); a=a+b; __b=a-b__; __a=a-b__; printf(“交换后:a=%d,b=%d”,a,b); } 28、以下程序的功能是判断输入的年份是否为闰年,若是则输出”yes”,否则输出”No”。 #include main(){ int year?; scanf(“%d”,&year); if (__year%400==0||year%4==0&&year%100!=0__) printf(“yes”); else printf(“No”); } 29、以下程序利用冒泡排序法对输入的10个数进行排序。 #include #define N 10 void main() { int a[N]; int i,j,t; printf(″input 10 numbers :\n″); for (i=0;i scanf("%d",__&a[i]__); printf("\n"); for(j=0;j for(i=0;i<__N-j-1__;i++) if (__a[i]>a[i+1]__) { t=a[i]; a[i]=a[i+1]; a[i+1]=t; } printf(″the sorted numbers :\n″); for(i=0;i printf(″%d ″,a[i]); printf(″\n″); } 30、用筛法求100之内的素数。筛法素数的思想是:1、取最小的数2,并声明它是素数,同时筛去它及它的倍数。2、取未筛去数中最小的数,并声明它是素数,同时筛去它及它的倍数。3、重复步骤2至筛中无数,得到所有的素数。 #include #define M 100 // 范围 #define N ((M+1)/2) // 奇数的个数 void main( ) { int i,j,a[N]; a[0] = 2; for(i=1;i a[i] = 2*i+1; for(i=1;i if(__a[i]!=0__) for(j=i+1;j if(__a[j]%a[i]==0__) /* 倍数时置零筛去 */ a[j]=0; printf("\nThe primer are [2-%d]:\n",M); for(i=0,j=0;i if(__a[i]!=0__) { printf("%5d",a[i]); if((++j)%10==0) /* 十个数换行 */ printf("\n"); } } getch(); } 31、用选择法对10个整数从小到大排序。 #include #define N 10 main(){ int a[N],i,j,k,t; for (i=0;i for (i=0;i k=__i__; for(j=i+1;j if(a[j] if (__a[i]>a[k]__){ t=a[k]; a[k]=a[i];a[i]=t; } } for(i=0;i } 32、求一个N×N矩阵主对角线元素、次对角线之和。 #define N 3 #include main() { int i=0,j=0,a[N][N],s1=0,s2=0; for(i=0;i for(j=0;j scanf("%d",&a[i][j]); for(i=0;i for(j=0;j if(__i==j__) s1+=a[i][j]; //主对角线 if(__i+j==N-1__) s2+=a[i][j]; //次对角线 } printf("s1=%d,s2=%d\n",s1,s2); } 33、已有一个已排好的数组今输入一个数要求按原来排序的规律将它插入数组中。#define N 10 #include main() { int i,t,a[N]={1,7,8,17,23,24,59,62,101}; scanf("%d",&t); for(i=N-2;i>0;i--){