7、两个正整数的最大公约数,并在主函数调用该函数,输出计算结果。(实验教程P64)
解:#include
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) /*如果是负数重新
8、输入*/
{
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
9、 (n=1)
((2n-1)xfn-1(x)-(n-1)fn-2(x)/n (n>1)
解:#include
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
10、 /*否则递归计算*/
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
int length(char*s);
void main()
{
11、
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 m
12、ain()
{
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(*
13、p2)
{
*p1=*p2;
P1++;
P2++;
}
*p1=’\0’;
return(p);
}
9.将一个整数字符串转换为一个整数,如“-1234”转换为-1234。(实验教程P98)
解:#include
#include
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,
14、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~
15、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;
e
16、lse 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
17、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
18、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.求出斐波那契数列
19、的前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
void main()
{
int i,fib[20]={1,1}; /*初始化
20、/
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项结果。使用
21、for循环语句从数组的第3个元素开始递推计算后18项数据,并存储在数组fib中(从数组的第3位开始)。接下来又使用循环语句输出数据的全部元素,每输出5个数据就换行}
12.编写一函数,求x的m次方的值,其中m是整数。(程序设计教程P102)
{求任意m个x的乘积,可把x和m作为函数的参数,数据从主调函数里传递,增强了函数的灵活性。使用循环结构设计该算法,最后将计算所得的值返回}
解:#include
double mul(double x,int m)
{
int i=0;
double p=1.0;
for(;i22、eturn(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。由于函数定义在主调函数之前,在主调函数中就可以不对其进行函数声明。使用用户自定义函数时,要分清形参如何设定,包括其类型、个数及顺
23、序,以便在发生函数调用时,准确地将实参值传递给实参,这样才不会出项错误。x、y定义为double类型,它的格式控制符为%lf,不能写成%f,以免出错。函数调用结束后,将计算结果输出。
13.在主调函数调用函数计算5!的值。(程序设计教程P120)
解:源程序清单如下:
#include
int fun(int n) /*定义函数计算阶乘值*/
{
int i;
static int f=1; /*定义静态局部变量*/
for(i=1;i<=n;i++) /*
24、循环计算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.求一个数组中所有元素的最大值
25、和最小值,并将其放入数组的最前面的两个元素的位置。(程序设计教程P143)
解:#include
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;kp[max])
26、
max=k;
else if(p[k]
27、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”。显示写入完成,并关闭文件。重新以只读的方式打开该文件,从文件中读出刚才写入的内容,最后关闭文件。