资源描述
C语言程序设计(第三版)习题库
1、设圆半径r=1.5,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。用scanf输入数据,输出计算成果,输出时规定文字阐明,取小数点后两位数字。请编程序。
#include <stdio.h>
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 <stdio.h>
main(){
float F,c;
scanf("%f",&F);
____c=5*(F-32)/9______;
printf("c=%.2f",c);
}
3、有一函数: 写一程序,输入x值,输出y值。
#include <stdio.h>
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 <stdio.h>
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<stdio.h>
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 <stdio.h>
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<stdio.h>
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 <stdio.h>
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<stdio.h>
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<stdio.h>
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;
while((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 <stdio.h>
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<stdio.h>
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<stdio.h>
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 <stdio.h>
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、运用:p/4=1-1/3+1/5-1/7+….级数求p值,直到最后一项绝对值不大于10-6为止。求绝对值函数为fabs()。
#__include<stdio.h>__
#include<math.h>
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<stdio.h>
#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 <stdio.h>
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 <stdio.h>
#define N 10
main(){
int i=1,sum=1;
while(i++<N)
sum=__(sum+1)*2__;
printf("sum=%d\n",sum);
}
14、用迭代法求 。求平方根迭代公式为:
规定先后两次求出得差绝对值少于0.00001。
#include <stdio.h>
#include <math.h>
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、用牛顿迭代法求方程在1.5附近根。
#include <stdio.h>
#include __<math.h>__
#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、用二分法求方程在(-10,10)之间根
#include <stdio.h>
#include <math.h>
#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<stdio.h>
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 <stdio.h>
#include <math.h>
#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<f(x)) max=f(x)__;
printf("%f\n",max);
}
19、程序功能:输入整数a和b值,若a2+b2不不大于100,则输出a2+b2百位以上数字,否则输出两数之和。
#include<stdio.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
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<stdio.h>
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 <stdio.h>
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 <stdio.h>
main(){
int year ;
scanf(“%d”,&year);
if (__year%400==0||year%4==0&&year%100!=0__) printf(“yes”);
else printf(“No”);
}
29、如下程序运用冒泡排序法对输入10个数进行排序。
#include <stdio.h>
#define N 10
void main() {
int a[N];
int i,j,t;
printf(″input 10 numbers :\n″);
for (i=0;i<N;i++)
scanf("%d",__&a[i]__);
printf("\n");
for(j=0;j<N-1;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<N;i++)
printf(″%d ″,a[i]);
printf(″\n″);
}
30、用筛法求100之内素数。筛法素数思想是:1、取最小数2,并声明它是素数,同步筛去它及它倍数。2、取未筛去数中最小数,并声明它是素数,同步筛去它及它倍数。3、重复环节2至筛中无数,得到所有素数。
#include <stdio.h>
#define M 100 // 范畴
#define N ((M+1)/2) // 奇数个数
void main( ) {
int i,j,a[N];
a[0] = 2;
for(i=1;i<N-1;i++) /* 初始数组实现第一步筛选 */
a[i] = 2*i+1;
for(i=1;i<N-1;i++) /* 第二步筛选 */
if(__a[i]!=0__)
for(j=i+1;j<N;j++)
if(__a[j]%a[i]==0__) /* 倍数时置零筛去 */
a[j]=0;
printf("\nThe primer are [2-%d]:\n",M);
for(i=0,j=0;i<N;i++) { /* 显示得到素数 */
if(__a[i]!=0__) {
printf("%5d",a[i]);
if((++j)%10==0) /* 十个数换行 */
printf("\n");
}
}
getch();
}
31、用选取法对10个整数从小到大排序。
#include <stdio.h>
#define N 10
main(){
int a[N],i,j,k,t;
for (i=0;i<N;i++) scanf(“%d”,&a[i]);
for (i=0;i<N-1;i++){
k=__i__;
for(j=i+1;j<N;j++)
if(a[j]<a[k]) k=__j__;
if (__a[i]>a[k]__){
t=a[k];a[k]=a[i];a[i]=t;}
}
for(i=0;i<N;i++) printf(“%d”,a[i]);
}
32、求一种N×N矩阵主对角线元素、次对角线之和。
#define N 3
#include <stdio.h>
main() {
int i=0,j=0,a[N][N],s1=0,s2=0;
for(i=0;i<N;i++)
for(j=0;j<N;j++)
scanf("%d",&a[i][j]);
for(i=0;i<N;i++)
for(j=0;j<N;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 <stdio.h>
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--){
if(t<a[i]) __a[i]=a[i-1]__;
else break;
a[i+1]= __t__;
for(i=0;i<10;i++)
printf("%5d",a[i]);
}
34、将一种数组值按逆序重新存储,例如,本来顺序为:8,6,5,4,1。规定改为:1,4,5,6,8。
#include <stdio.h>
#define N 11
main(){
int i,a[N],tmp;
for(i=0;i<N;i++)
scanf("%d",&a[i]);
for(i=0;__i<N/2__;i++) {
tmp=a[i];
a[i]= __a[N-i-1]__;
__a[N-i-1]__=tmp;}
for(i=0;i<N;i++)
printf("%5d",a[i]);
}
35、打印“魔方阵”,所谓魔方阵是指这样方阵,它每一行、每一列和对角线之和均相等。例如,三阶魔方阵为
8 1 6
3 5 7
4 9 2
规定打印出由1~n2自然数构成魔方阵。
#define N 3
#include <stdio.h>
main( ) {
int i,j,k,a[N][N];
/* 初始化魔方阵——置为0,作为有无数字判断*/
for(i=0;i<N;i++)
for(j=0;j<N;j++)
a[i][j]= __0__;
j=N/2;
a[0][j]=1;/* 存储第一种数字 */
/* 存储2——n*n */
for(k=2;k<=N*N;k++) {
i--; // 数存储前一数行数减1、列数加1
__j+=1__;
if (i < 0 && j > N-1) {//到达右上角位置
i=i+2; j--;
} else {
if(i<0)
i=__n-1__; //上一数行数为0,下一数行数为n-1
if(j>N-1)
j=0; //上一数列数为n-1时,下一数列数为0
}
if(__a[i][j]!=0__){ //若下一数位置上已有数字,
//则下一数存到上一种数行数加1位置
i=(i+2)%N;
j=(j -1 + N)%N;
}
a[i][j]= __k__; // 填数
}
for(i=0;i<N;i++) { //输出魔方阵
printf(" ");
for(j=0;j<N;j++)
printf("%4d",a[i][j]);
printf("\n\n");
}
}
36、找出一种二位数组中鞍点,即该位置上元素在该行上最大,在该列上最小,也也许没有鞍点。
#include <stdio.h>
#define M 5
#define N 4
main(){
int a[M][N],i,j,x,y,k,max,min;//x,y分别是用来记录鞍点位置
int flag=0; //用于批示与否存在鞍点
for(i=0;i<M;i++)
for(j=0;j<N;j++)
scanf("%d",&a[i][j]);
for(i=0;i<M;i++) {
max=a[i][0];y=0;//先默认第一种数是最大值
for(k=1;k<N;k++)
if(max<a[i][k]) {y=k; __max=a[i][k]__;}
min=a[i][y];x=i;//先默认第一种数是最小值
for(k=0;k<5;k++)
if(min>a[k][y]) {x=k; __min=a[k][y]__;}
if(__i==k__) {
printf("a[%d][%d]=%d 是鞍点\n",x,y,a[x][y]);
flag=1;
}
}
if (flag ==0) printf(“不存在鞍点\n”);
}
37、有个15数按由小到大顺序存储在一种数组中,输入一种数,规定用折半查找法找出该数组中第几种元素值。如果该数不在数组中,则打印出"无此数"
#include <stdio.h>
#define N 15
main(){
int low,high,mid,x;
int a[N]={1,4,9,13,21,34,55,89,144,233,377,570,671,703,812};
low=0,high=N-1;
scanf("%d",&x);
do{
mid=__(low+high)/2__;
if(a[mid]==x) break;
else if(a[mid]<x) low=__mid+1__;
else high=__mid-1__;
}while(low<=high);
if(low<=high) printf("x is the %dth number\n",mid+1);
else printf("x not exist in the array\n");
}
38、输入一行字符,记录其中有多少个单词,单词之间用空格分隔开。
#include <stdio.h>
void main() {
char string[81];
int i,num=0,word=0;
char c;
gets(string);
for (i=0;(c=string[i]) __!=’\0’__;i++)
if(c==′ ′) word=0;
else if(word==0) {
word=__1__;
num++;
}
printf(″There are %d words in the line.\n″,num);
}
39、输出10行杨辉三角形。
1
1 1
1 2 1
1 3 3 1
……
#include <stdio.h>
#define N 10
main(){
int i,n,k,a[N]={1};
printf(“%5d\n”,a[0]);
for(i=1;i<N;i++){
for(j=i;j>=1;j--) a[j]= __a[j]+a[j-1]__;
for(j=0;__j<=i__;j++) printf(“%5d”,a[j]);
printf(“\n”);
}
}
40、如下程序功能是:从键盘输入一种整数n(n≤10)和n个整数,存入数组a中,先依次输出各个数组元素值,然后找出最大值,并输出。
#include<stdio.h>
main(){
int a[10],n,i,j,__max__ ;
printf("输入 n=");
scanf("%d",&n);
printf("输入各数组元素:");
for(i=0;i<n;i++)
scanf("%d",__&a[i]__);
printf("输出各数组元素:");
for(__i=0;i<n;i++__ )
printf("%d ",__a[i]__ );
printf("\n");
max=__a[0]__ ;
for(j=1;j<n;j++)
展开阅读全文