以下程序教材基于 谭浩强C程序设计(第四版)
第1题 设计函数sum,求指定范围内整数连续相加的和,并在main函数中进行调用。
# include<stdio.h>
int sum(int a, int b)
{
int i,z=0;
for(i=a;i<=b;i++)
z=z+i;
return z;
}
int main(void)
{
int x,y,z;
printf("请输入整数的范围:");
scanf("%d,%d",&x,&y);
z=sum(x,y);
printf("两整数范围内和为%d\n",z);
return 0;
}
第2题 设计一个判断素数的函数prime,在main函数中输出100~200之间的素数。
# include<stdio.h>
# include<math.h>
int main(void)
{
void prime();
prime();
}
void prime()
{
int i=100,n,k;
for(i;i<=200;i++)
{
k=sqrt(i);
for(n=2;n<=k;n++)
{
if(i%n==0)
break;
}
if(n>k)
printf("%d\t",i);
}
printf("\n");
}
第3题 设计求阶乘的函数fac,并在main函数中用于计算组合数。组合数公式为C(n,m)=n!/(m!(n-m)!),n>=m。
# include<stdio.h>
int main(void)
{
int fac(int n);
int n,y,x,c,z,t,m;
printf("请输入要求组合数下标和上标,中间以逗号隔开,要求下标大于上标:\n");
scanf("%d,%d",&n,&m);
y=fac(n);
x=fac(m);
z=fac(n-m);
if(n>=m)
c=y/(x*z);
printf("C(%d,%d)=%d\n",n,m,c);
return 0;
}
int fac(int n)
{
int f;
if(n<0)
printf("n<0,错误!");
else if(n==0||n==1)
f=1;
else
f=fac(n-1)*n;
return f;
}
第4题 设计函数gcd,求两个自然数的最大公约数,在main函数中调用它。
# include<stdio.h>
int main(void)
{
int gcd(int,int);
int n,m,x;
printf("请输入两个正整数n,m:");
scanf("%d,%d",&n,&m);
x=gcd(n,m);
printf("它们的最大公约数为:%d\n",x);
return 0;
}
int gcd(int n,int m)
{
int y,t;
if(m>n)
{
t=n;
n=m;
m=t;
}
while((y=n%m)!=0)
{
n=m;
m=y;
}
return m;
}
第5题 输入并调试PPT中例题(交换两个数),分析main函数中x、y交换失败的原因。
# include<stdio.h>
void swap(int a,int b);
void main()
{
int x=7,y=11;
printf("x=%d,\ty=%d\n",x,y);
printf("swapped:\n");
swap(x,y);
printf("x=%d,\ty=%d\n",x,y);
}
void swap(int a,int b)
{
int temp;
temp=a;
a=b;
b=temp;
}
/*错误原因:数据传输错误,形参不能传递给实参,两者之间为单向传递*/
# include<stdio.h>
void swap(int*p1,int*p2)
{
int p;
p=*p1;
*p1=*p2;
*p2=p;
}
void main()
{
int a,b;
scanf("%d,%d",&a,&b);
printf("a=%d,b=%d\n",a,b);
printf("swapped:\n");
swap(&a,&b);
printf("a=%d,b=%d\n",a,b);
}
第6题 调用第2题中的prime函数,编写函数fun1,验证任意一个大于2的偶数为两个素数之和,并输出这两个素数。
# include<stdio.h>
# include<math.h>
bool prime(int n)
{
if (n==2)
return true;
if (n%2==0)
return false;
int temp=(int)sqrt((double)n);
for (int i=3;i<=temp;i+=2)
{
if (n%i==0)
return false;
}
return true;
}
int main(void)
{
int test,i;
scanf("%d",&test);
for (i=2;i<=test/2;i++)
{
if (prime(i)&&prime(test-i))
{
printf("%d=%d+%d\n",test,i,test-i);
}
}
return 0;
}
第7题 教材P.218习题1。规定最大公约数函数名为gcd,最小公倍数函数名为lcm。(在第4题基础上,熟悉函数的嵌套调用)
# include<stdio.h>
int main(void)
{
int gcd(int n,int m);
int lcm(int u,int v,int w);
int n,m,x,y;
printf("请输入两个正整数n,m:");
scanf("%d,%d",&n,&m);
x=gcd(n,m);
printf("它们的最大公约数为:%d\n",x);
y=lcm(n,m,x);
printf("它们的最小公倍数为:%d\n",y);
return 0;
}
int gcd(int n,int m)
{
int y,t;
if(m>n)
{
t=n;
n=m;
m=t;
}
while((y=n%m)!=0)
{
n=m;
m=y;
}
return m;
}
int lcm(int u,int v,int w)
{
return u*v/w;
}
第8题 输入并调试例7.7,结合功能键F10、F11分析函数递归调用的执行流程。
# include<stdio.h>
int main(void)
{
int fac(int n);
int n,y;
printf("input an integer number:");
scanf("%d",&n);
y=fac(n);
printf("%d!=%d\n",n,y);
return 0;
}
int fac(int n)
{
int f;
if(n<0)
printf("n<0,data error!");
else if(n==0||n==1)
f=1;
else
f=fac(n-1)*n;
return f;
}
第9题 设计递归函数Fib,求Fibonacci数列,在main函数中调用它。(Fibonacci数列的定义详见教材P.133例5.8。)
# include<stdio.h>
int main(void)
{
int x;
int fib(int n);
printf("请输入需要的第n个fib数列数值:");
scanf("%d",&x);
printf("%d\n",fib(x));
return 0;
}
int fib(int n)
{
if(n==1)
return 0;
if(n==2)
return 1;
if(n>=3)
return fib(n-1)+fib(n-2);
}