资源描述
C语言程序设计复习题
题型:填空、选择、读程序写结果(参看实验教程)、编程题
编程题如下:
1.输出100~1000以内的所有3位水仙花数。所谓水仙花数是指所有位的数字的立方和等于该数。例如153=1³+5³+3³(实验教程P25)
解:#include<stdio.h>
void main()
{
int i;
int w1,w2,w3;
for(i=100;i<999;i++)
{
w1=i%10;
w2=i/10%10;
w1=i/100%10;
if(i==w1*w1*w1+w2*w2*w2+w3*w3*w3) /*判断是否是水仙花数*/
printf(“%d”,i);
}
}
2.使用冒泡法对从键盘上输入的10个数进行排序(由大到小)。(实验教程P33)
解:#include<stdio.h>
void main()
{
int i,j,temp;
int a[10];
printf(“Input 10 numbers:\n”);
for(j=0;j<10;i++)
scanf(“%d”,&a[j]);
printf(“\n”);
for(i=1;i<10;i++)
for(j=0;j<10-I;j++)
if(a[j]<a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
Printf(“The sorted numbers is:\n”);
for(j=0;j<10;j++)
printf(“%5d”,a[j]);
printf(“\n”);
}
3.设计一个实用程序,为比赛选手评分。要求:从十名评委的评分中扣除一个最高分,扣除一个最低分,然后统计总分,并除以8,最后得到这个选手的最后得分(打分采用百分制)。(实验教程P37)
解:分析:定义一个一维数组用来存放10名评委为选手所给的成绩,从键盘上输入10名评委所给的成绩,计算成绩的总和,然后减掉最高分和最低分,再除以8,就可以得到选手的最后得分。
程序清单:
#include<stdio.h>
void main()
{
int score[10]; /*定义数组存放10个评委的成绩*/
float mark;
int i;
int max=0; /*最高分*/
int min=0; /*最低分*/
int sum=0; /*10评委的总和*/
for(i=0;i<10;i++) /*输入10个评委的成绩*/
{
printf(“Please Enter the Score of No.%d:”,i+1);
scanf(“%d”,&score[i]);
sum=sum+score[i]; /*将10个成绩求和*/
}
for(i=0;i<10;i++) /*查找最高分*/
{
if(scanf[i]>max)
max=score[i];
}
for(i=0;i<10;i++) /*查找最低分*/
{
if(score[i]<min)
min=score[i];
}
mark=(sum-max-min)/8.0; /*计算平均成绩*/
printf(“The mark of the player is %.2f\n”,mark);
}
4.在主函数中输2~100之间的整数,调用函数判断其是否为素数,在主函数中输出这些素数。(实验教程P60)
提示:在第四章中的4.4.5中第2题给出了判断素数的方法。还有一种方法就是:如果一个整数能被小于它的某一个整数出尽,该数一定不是素数。
解:#include<stdio.h>
void main()
{
int i;
for(i=2;i<a;i++)
if(a% i ==0)
return(0);
return(1);
}
void main()
{
int j;
for(j=2;j<100;j++)
if(is_ prime(j))
printf(“\n”);
}
5.使用递归方法,利用碾转相除法,求两个正整数的最大公约数,并在主函数调用该函数,输出计算结果。(实验教程P64)
解:#include<stdio.h>
Int gcd(int a,int b)
{
if(a% b==0)
return b;
else
return gcd(b,a% b); /*递归调用*/
}
void main()
{
int x,y,t;
printf(“Please input 2 number(x,y):\n”);
scanf(“%d%d”,&x,&y);
while(x<0||y<0) /*如果是负数重新输入*/
{
printf(“ERROR!Please input 2 number(x,y):\n”);
scanf(“%d%d” ,&x,&y);
}
t=gcd(x,y); /*函数调用*/
printf(“G,C,D(%d,%d)=%d\n”,x,y,t);
}
6.使用递归调用的方法计算n阶勒让德多项式的值。(实验教程P66)
提示:n阶勒让德多项式的递推公式为:
=
{
1 (n=0)
fn(x)
X (n=1)
((2n-1)xfn-1(x)-(n-1)fn-2(x)/n (n>1)
解:#include<stdio.h>
float fun(int n,int x); /*定义递归函数*/
{
int t;
if(n==0) /*如果n=0返回1*/
return(1);
else if(n==1) /*如果n=1返回x*/
return(x);
else /*否则递归计算*/
return(((2*n-1)*x*fun((n-1),x)-(n-1)*fun((n-2),x))/n;
}
void main()
{
int x,n;
printf(“Please input n and x:\n”);
scanf(“%d%d”,&n,&x);
printf(“The result is:%f\n”,fun(n,x));
}
7.编写程序,利用子函数实现计算字符串的长度。(实验教程P92)
解:程序代码如下:
#include<stdio.h>
int length(char*s);
void main()
{
char a[100];
int i;
printf(“Please input the string:\n”);
gets(a);
i=length(a);
printf(“\nThe length of string is %d”,i);
}
int length(char*s)
{
char*p=s;
while(*p)
p++;
return(p-s);
}
8.编写程序,利用字符串实现两个字符串的合并。(实验教程P93)
解:程序代码如下:
#include“stdio.h”
char *link(char*p1,char*p2);
void main()
{
char str1[100],str2[100];
printf(“Please input the first string:\n”);
gets(str1);
printf(“nPlease input the second string:\n”);
gets(str2);
link(str1,str2);
printf(“\nThe linked result is:\n”);
puts(str1);
}
char*link(char*p1,char*p2)
{
char*p;
p=p1;
while(*p1)
pl++;
while(*p2)
{
*p1=*p2;
P1++;
P2++;
}
*p1=’\0’;
return(p);
}
9.将一个整数字符串转换为一个整数,如“-1234”转换为-1234。(实验教程P98)
解:#include<stdio.h>
#include<string.h>
int chnum(char*p);
void main()
{
char s[6];
int n;
gets(s);
if(*s==’-’)
n= -chnum(s+1);
printf(“%d\n”,n);
}
chnum(char*p)
{
int num=0,k,len,j;
len=strlen(p);
for(;*p!=’\0’;p++)
{
k=*p-‘0’;
j=(- -len);
while(j-->0)
k=k*10;
num=num+k;
}
Return(num);
}
10.编写计算个人所得税的程序输入一个纳税人的个人月收入,计算应纳的个人所得税。(程序设计教程P65)
纳税是每个公民的义务。我国的个人所得税税率表如下表所示:
级数
应纳税金额(月收入-1600)
税率%
1
不超过500元
5
2
500元~2000元
10
3
2001~5000元
15
4
5001~20000元
20
5
20001~40000元
25
6
40001元~60000元
30
7
60001元~80000元
35
8
80001元~100000元
40
9
超过100000元
45
解:源程序清单如下:
#include”stdio.h”
void main()
{
double salary,s,tax;
printf(“please input your salary one month:”);
scanf(“%lf”,&salary);
s=salary-1600;
if(s<=500)
tax=s*0.05;
else if(s<=2000)
tax=(s-500)*0.1+500*0.05;
else if(s<=5000)
tax=(s-2000)*0.15+1500*0.1+500*0.05;
else if(s<=20000)
tax=(s-5000)*0.2+3000*0.15+1500*0.1+500*0.05;
else if(s<=40000)
tax=(s-20000)*0.25+15000*0.2+3000*0.15+1500*0.1+500*0.\05;
else if(s<=60000)
tax=(s-40000)*0.3+20000*0.25+15000*0.2+3000*0.15+1500*\0.1+500*0.05;
else if(s<=80000)
tax=(s-60000)*0.35+20000*0.3+20000*0.25+15000*0.2+3000\*0.15+1500*0.1+500*0.05;
else if(s<=100000)
tax=(s-80000)*0.4+20000*0.35+20000*0.3+20000*0.25+1500\0*0.2+3000*0.15+1500*0.1+500*0.05;
else if(s<=100000)
tax=(s-100000)*0.45+20000*0.4+20000*0.35+20000*0.3+200\00*0.25+15000*0.2+3000*0.15+1500*0.1+500*0.05;
printf(“tax is %10.2f\n”,tax);
}
程序说明:1)变量salary中存放的是月收入;s存放月收入中应纳税的金额,月收入减去减免税金额,即月收入减去1600元;
tax是计算出来的纳税额。2)公式中的“\”是换行符,由于写不下,用“\”符号标识下一行是本行的续行。3)本例要处理多种情况,最适合使用else if形式。因为很难找到月收入中应纳税的金额与一个常量之间的关系,因此不适合使用switch语句。
11.求出斐波那契数列的前20项,存在数组中,并将他们输出。(程序设计教程P73){说明:【斐波那契数列是一递推数列,满足下面关系:fib(0)=1,fib(1)=1,fib(n)=fib(n-1)+fib(n-2)(n≧2)】 对于这个问题,可以定义一个整形数组,用于存放20个整数,先将fib(0)和fib(1)赋初值,然后建立一个循环,每次取出两个数进行递推求值,并将其存入数组中,每输出5项数据换行,直到前20项都被计算出来为止。}
解:源程序清单如下:
#include<stdio.h>
void main()
{
int i,fib[20]={1,1}; /*初始化*/
printf(”\n”);
for(i=2;i<20;i++) /*计算后18项斐波那契数列中的数据并存入数组*/
fib[i]=fib[i-2]+fib[i-1];
for(i=0;i<20;i++) /*输出数组*/
{
if(i%5==0) /*每输出5个数据换行*/
printf(“\n”);
printf(“%10d”,fib[i]);
}
printf(“\n”)
}
{注:数组fib采用部分初始化法,将fib(0)和fib(1)初始化为1,其他各元素默认为0,用于存储后18项结果。使用for循环语句从数组的第3个元素开始递推计算后18项数据,并存储在数组fib中(从数组的第3位开始)。接下来又使用循环语句输出数据的全部元素,每输出5个数据就换行}
12.编写一函数,求x的m次方的值,其中m是整数。(程序设计教程P102)
{求任意m个x的乘积,可把x和m作为函数的参数,数据从主调函数里传递,增强了函数的灵活性。使用循环结构设计该算法,最后将计算所得的值返回}
解:#include<stdio.h>
double mul(double x,int m)
{
int i=0;
double p=1.0;
for(;i<m;i++)
p=-p*x;
return(p);
}
void main()
{
double x,y;
int m;
printf(“Input the numbers(x,m):\n”);
scanf(“%lf%d”,&x,&m);
y=mul(x,m); /*函数调用*/
printf(“The result is:%6.5lf\n”,y);
}
说明:在程序中定义了mul()函数,其类型为double型,形参表中有两个形参x、m。由于函数定义在主调函数之前,在主调函数中就可以不对其进行函数声明。使用用户自定义函数时,要分清形参如何设定,包括其类型、个数及顺序,以便在发生函数调用时,准确地将实参值传递给实参,这样才不会出项错误。x、y定义为double类型,它的格式控制符为%lf,不能写成%f,以免出错。函数调用结束后,将计算结果输出。
13.在主调函数调用函数计算5!的值。(程序设计教程P120)
解:源程序清单如下:
#include<stdio.h>
int fun(int n) /*定义函数计算阶乘值*/
{
int i;
static int f=1; /*定义静态局部变量*/
for(i=1;i<=n;i++) /*循环计算n!乘值*/
f=f*i;
return(f); /*返回函数值*/
}
void main()
{
int n;
printf(“Input the number:\n”); /*输入数据*/
scanf(“%d”,&n);
printf(“%d!=%d\n”,n,fun(n)); /*调用函数*/
}
说明:在自定义函数fun()中,程序定义了静态局部变量f,用来存放每一次调用此函数计算后的值,该值在每次调用后保留其值并在下一次调用时继续使用,所以输出值为累乘的结果。
14.求一个数组中所有元素的最大值和最小值,并将其放入数组的最前面的两个元素的位置。(程序设计教程P143)
解:#include<stdio.h>
void maxmin(int *p,int length);
void main()
{
int a[10]={2,5,7,1,10,4,6,33,20,9};
maxmin(a,10);
printf(“max=%d,min%d”,a[0],a[1]);
}
void maxmin(int *p,int length)
{
int k,max=0,min=0;
for(k=1;k<length;k++)
{
if(p[k]>p[max])
max=k;
else if(p[k]<p[min])
min=k;
}
p[0]=p[max];
p[1]=p[min];
}
说明:在子函数中实现了对数组中元素的最大值和最小值的求值,并把最大值和最小值放到了数组的最前面的两个元素中。因为函数传递的参数是数组的首地址,因此在子函数中对数组的全部操作,就是对主函数中数组的操作。
15.编写一个程序,将一个字符串写入文件“E:\test.txt”后,再从该文件中读出该字符串。(程序设计教程P198)
解:#include “stdio.h”
void main()
{
FILE*fp;
char ch[]=”C language”,*str;
int x;
fp=fopen(“E:\\test.txt”,”w”);
if(fp==NULL)
{
printf(“\n Can’t open the file!”);
return;
}
x=fputs(ch,fp); /*测试函数的返回值*/
printf(”x=%d”,x);
printf(“\n Character input finished!\n”);
fclose(fp);
fp=fopen(“E:\\test.txt”,”r”);
if(fp==NULL)
{
printf(“\n Can’t open the file!”);
return;
}
puts(fgets(str,20,fp));
fclose(fp);
}
程序说明:首先,程序以只写的方式打开E盘根下的文本文件test.txt,向文件中一次性写入字符串“C Lauguage”后,返回最后一个字符的ASCII值。最后一个字符是“e”,因此返回“e”的ASCII值,“x=101”。显示写入完成,并关闭文件。重新以只读的方式打开该文件,从文件中读出刚才写入的内容,最后关闭文件。
展开阅读全文