7.1 写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。
两个整数由键盘输入。
参考程序如下:
#include<stdio.h>
int aa(int m,int n) //求最大公约数
{ int k;
if(m<n) //使得大数存在m中
{k=m;m=n;n=k;}
k=m%n;
while(k) //辗转求余法
{ m=n;
n=k;
k=m%n;
}
return(n); //n即为最大公约数
}
int bb(int m,int n) //求最小公倍数
{
int k;
k=aa(m,n); //调用aa函数,返回两数的最大公约数
return(m*n/k);
}
main()
{
int m, n,yy,kk;
printf("Input m and n:");
scanf("%d%d",&m,&n);
yy=aa(m,n);
kk=bb(m,n);
printf("最小公倍数=%d\n",kk);
printf("最大公约数=%d\n",yy);
}
7.3 写一个判素数的函数,在主函数输入一个整数,输出是否素数的信息。
参考程序如下:
#include<math.h>
int aa(int n)
{
int i;
int flag; // flag标志
for(i=2;i<=sqrt(n);i++)
{ if(n%i==0) break;
}
if(i>sqrt(n)) flag=1;
else flag=0;
return(flag);
}
main()
{ int n,flag; // flag标志
printf("\nInput n:");
scanf("%d",&n);
flag=aa(n);
if(flag==1) printf("%d is a prime number.\n",n);
else printf("%d is not a prime number.\n",n);
}
7.4 写一个函数,使给定的一个3*3的二维整型数组转置,即行列互换。
参考程序如下:
#include <stdio.h>
main()
{ int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
int b[3][3],i,j;
printf("array a:\n");
for(i=0;i<3;i++)
{ for(j=0;j<3;j++)
printf("%5d",a[i][j]);
printf("\n");
}
printf("After switch:\n");
aa(a,b);
for(i=0;i<3;i++)
{ for(j=0;j<3;j++)
printf("%5d",b[i][j]);
printf("\n");
}
}
void aa(int a[3][3],int b[3][3])
{ int i,j;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
b[j][i]=a[i][j];
}
说明:当数组名作函数参数时,形参也必须是同类型的数组名,形参数组名的实质是一个指针变量,存放的第0行第0列的元素的地址;这样,子函数中a[i][j]就是主函数中的a[i][j];
7.11写一个函数,用“起泡法”对输入的10个字符按由小到大的顺序排列
参考程序如下:
main()
{
char s[10];
int i;
void sort(char ss[],int n);
printf("\nInput 10 character:\n");
for(i=0;i<10;i++)
scanf("%c",&s[i]);
printf("\nbefore sort:");
for(i=0;i<10;i++)
printf("%c ",s[i]);
printf("\nAfter sort:");
sort(s,10);
for(i=0;i<10;i++)
printf("%c ",s[i]);
}
void sort(char a[],int n) //起泡法
{
int i,j;
char t;
for(i=1;i<=9;i++)
for(j=0;j<n-i;j++)
if(a[j]>a[j+1])
{ t=a[j];a[j]=a[j+1];a[j+1]=t;}
}
7.17用递归法将一个整数n转换成字符串。
例如,输入483,应输出字符串“483”。
n的位数不确定,可以是任意位数的整数。
参考程序如下:
#include <stdio.h>
main()
{
int n;
void aa(int n);
printf("Input a integar:");
scanf("%d",&n);
printf("The result is:");
if(n<0) {printf("-"); n=-n;} //如果是负数,先输出符号
printf("The result is:");
aa(n);
}
void aa(int n)
{
int i;
i=n/10; //丢掉n的个位
if(i!=0) aa(i); //一直递归调用aa函数,直到i=0,即n是一位数时putchar(n%10+'0'); //把n的个位数字转换成字符
}
补充题:用函数调用的方式编写程序,在主函数中提示输入自然数n,调用函数fun,并输出结果。
函数fun用递归的方法求1+2+3+…n的值。
参考程序如下:
#include <stdio.h>
int fac(int n)
{ int f;
if(n<0) {printf("n<0,data error!"); }
else if(n==0) f=0;
else f=fac(n-1)+n;
return(f);
}
main()
{ int n, y;
printf("Input a integer number:");
scanf("%d",&n);
y=fac(n);
printf("1+2+...+%d=%d",n,y);
}。