C程序举例:利用函数实现模块化程序设计

1,一个简单的调用函数举例

#include"stdio.h"
int main()
{
	void xingxing();//声明xingxing函数
	void hua();//声明hua函数
	xingxing();//调用xingxing函数
	hua();//调用hua函数
	xingxing();//调用xingxing函数
	return 0; 
}
void xingxing()//定义xingxing函数
{
	printf("************\n");
}
void hua()//定义hua函数
{
	printf("hello world!\n");
}

运行结果:

************
hello world!
************

2,用函数找到两个整数之间的较大者

#include"stdio.h"
int max(int x,int y)
{
	int z;
	z=x>y?x:y;//将x与y之间的较大者赋值给z
	return(z);
}
int main()
{
	int max(int x,int y);
	int a,b,c;
	printf("输入两整数:"); 
	scanf("%d%d",&a,&b);
	c=max(a,b);
	printf("较大者为%d",c);
	return 0;	 
 } 

运行结果:

输入两整数:99 999
较大者为999

3,用函数求出两个实数之和。

#include"stdio.h"
float add(float x,float y)
{
	float z;
	z=x+y;
	return(z);
}
int main()
{
	float add(float x,float y);
	float a,b,c;
	printf("输入两数:");
	scanf("%f%f",&a,&b);
	c=add(a,b);
	printf("和为%f",c);
	return 0; 
}

运行结果:

输入两数:3 4
和为7.000000

4,输入四个整数,用函数的嵌套找出其中最大的数。

#include"stdio.h"
int max2(int a,int b)
{
	return (a>=b?a:b);
}
int max4(int a,int b,int c,int d)
{
	int max2(int a,int b);
	return max2(max2(max2(a,b),c),d);//函数调用作为函数参数
}
int main()
{
	int max4(int a,int b,int c,int d);
	int a,b,c,d,m;
	printf("输入四整数:");
	scanf("%d%d%d%d",&a,&b,&c,&d);
	m=max4(a,b,c,d);
	printf("最大数为%d",m) ;
	return 0;
}

运行结果:

输入四整数:1 6 9 18
最大数为18

5,用递归法求n!

#include"stdio.h"
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);
 } 
 int main() 
 {
 	int fac(int n);
 	int y,n;
 	printf("输入整数:");
	scanf("%d",&n);
	y=fac(n);
	printf("%d!=%d",n,y);
	return 0; 
 }

运行结果:

输入整数:3
3!=6

6,汉诺塔问题

#include"stdio.h"
int main()
{
	void jh(int n,char o,char t,char th);
	int m;
	printf("输入盘子数:");
	scanf("%d",&m);
	printf("%d个盘子的移动步骤:\n",m);
	jh(m,'A','B','C');
	return 0;
}
void jh(int n,char o,char t,char th)
{
	void move(char x,char y);
	if(n==1)
	    move(o,th);
	else
	{
		jh(n-1,o,th,t);
		move(o,th);
		jh(n-1,t,o,th);
	}
 } 
 void move(char x,char y)
 {
 	printf("%c-->%c\n",x,y);
 }

运行结果:

输入盘子数:4
4个盘子的移动步骤:
A-->B
A-->C
B-->C
A-->B
C-->A
C-->B
A-->B
A-->C
B-->C
B-->A
C-->A
B-->C
A-->B
A-->C
B-->C

7,输入10个数,要求输出其中值最大的元素和该数是第几个数(不为数组排序规则)

#include"stdio.h"
 int main()
 {
 	int max(int x,int y);
 	int a[10],m,n,i;
 	printf("输入十个整数:\n");
	for(i=0;i<10;i++)
	{
		scanf("%d",&a[i]);
	} 
	for(i=1,m=a[0],n=0;i<10;i++)
	{
		if(max(m,a[i])>m) 
		{
			m=max(m,a[i]);
			n=i;
		}
	}
	printf("最大数为%d,在其中第%d个",m,n+1);
	return 0;
 }
 int max(int x,int y)
 {
 	return(x>y?x:y);
 }

运行结果:

输入十个整数:
9 10 20 25 61 42 32 11 2 7
最大数为61,在其中第5个

8,有一个一维数组score,内放10个学生成绩,利用函数求平均成绩。

#include"stdio.h"

#define n 10 //n最大为100 
//改动n的值,即改动学生人数
float average(float array[100])
{
	int i;
	float aver,sum=array[0];
	for(i=1;i<n;i++)
	{
		sum=sum+array[i];
	}
	aver=sum/n;
	return(aver);
}
int main()
{
	float average(float array[100]);
	float score[100],aver;
	int i;
	printf("输入n人成绩:\n");
	for(i=0;i<n;i++) 
	{
		scanf("%f",&score[i]);
	}
	aver=average(score);
	printf("平均成绩为 %5.2f\n",aver);
	return 0;
}

运行结果:

输入n人成绩:
10 12 13 16 15 41 90 10 10 52
平均成绩为 26.90

9,有一个一维数组score,内放10个学生成绩,利用函数求平均成绩,最大,最小。

#include"stdio.h"

#define n 10 //n最大为100 
//改动n的值,即改动学生人数
float max=0,min=0;
float average(float array[100])
{
	int i;
	float aver,sum=array[0];
	max=min=array[0];
	for(i=1;i<n;i++)
	{
		if(array[i]>max)
		max=array[i];
		if(array[i]<min)
		min=array[i];
	    sum=sum+array[i];
	}
	aver=sum/n;
	return(aver);
}
int main()
{
	float average(float array[100]);
	float score[100],aver;
	int i;
	printf("输入n人成绩:\n");
	for(i=0;i<n;i++) 
	{
		scanf("%f",&score[i]);
	}
	aver=average(score);
	printf("平均成绩为%5.2f\n最大为%5.2f\n最小为%5.2f",aver,max,min);
	return 0;
}

运行结果:

输入n人成绩:
10 15 16 90 91 99 10 100 60 30
平均成绩为52.10
最大为100.00
最小为10.00

10,用函数表现静态变量与自动变量的区别

#include"stdio.h"
int d(int a)
{
	auto int i=0;;
	
	i=i+1;
	return(i); 
 } 
int j(int n)
{
	static int b=0;
	
	b=b+1;
	return(b);
 } 
 int main()
 {
 	int d(int i);
 	int j(int b);
 	int a;
 	int b;
 	int i;
 	for(i=0;i<3;i++)
 	{
 		printf("静态:%d   ",j(a));
 		printf("自动:%d\n",d(b));
	 }
	 return 0;
 }

运行结果:

静态:1   自动:1
静态:2   自动:1
静态:3   自动:1

静态变量与自动变量的区别主要表现在:

Ⅰ )静态存储类型的局部变量是在静态存储区内分配内存单元,在程序的整个运行期间内都不释放空间。而自动类型的局部变量属于动态存储类型,是在动态存储区内分配存储单元的,函数调用结束后存储单元即被释放。

Ⅱ)静态局部变量是在编译时赋初始值,并且只赋一次初值,在以后每次调用函数时,只是使用上一次函数被调用结束时变量的值。而自动局部变量的初值不是在编译时赋予的,而是在函数调用时赋予的,每调用一次函数都会对变量重新赋一次初值。

Ⅲ)如果调用的静态局部变量没有对其进行赋值,则该变量的默认值为0后者为空字符串。而对于自动局部变量来说,如果不赋值,则变量的值是一个不确定的值,这是因为在函数被调用时,会为该变量分配一个存储空间,在函数结束时,存储空间被释放,这两次分配的存储空间是不一样的,存储空间中的值也是不确定的。

11,输出1到n的阶乘值

#include"stdio.h"
int f(int a)
{
	static int f=1;//保留上次调用结束时的值
	f=f*a;//在上次的f值的基础上再乘以n
	return(f);//返回的f时n!的值
}
int main()
{
	int f(int a);
	int b,i;
	printf("输入需要输出的阶乘数:"); 
	scanf("%d",&b);
	for(i=1;i<=b;i++)
	{
		printf("%d!=%d\n",i,f(i));
	}
	return 0;
}

运行结果:

输入需要输出的阶乘数:9
1!=1
2!=2
3!=6
4!=24
5!=120
6!=720
7!=5040
8!=40320
9!=362880

12,给定b的值,输入a和m,求a*b的值和a^m的值

//文件1
#include"stdio.h"

int A;
int main()
{
	int power(int n);
	int b=3,c,d,m;
	printf("输入一个数a以及它的指数m:\n");
	scanf("%d%d",&A,&m);
	c=A*b;
	printf("%d*%d=%d\n",A,b,c);
	d=power(m);
	printf("%d^%d=%d\n",A,m,d);
	return 0;
}
//文件2
extern  int A;
int power(int n)
{
	int i,y=1;
	for(i=1;i<=n;i++)
	y=A*y;
	return(y);
}

运行结果:

输入一个数a以及它的指数m:
3 5
3*3=9
3^5=24

13,写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。

#include"stdio.h"
int gy(int u,int v)//求最大公约数
{
	int t,r;
	if(v>u)//使较大者为被除数
	{
		t=u;
		u=v;
		v=t;
	}
	while((r=u%v)!=0)
	{
		u=v;
		v=r;
	}
	return(v);
}

int gb(int u,int v,int h)//最小公倍数=u*v/最大公约数
{
	return(u*v/h);
}

int main()
{
	int gy(int u,int v);
	int gb(int u,int v,int h);
	int u,v;
	scanf("%d%d",&u,&v);
	printf("最大公约数为:%d\n",gy(u,v));
	printf("最小公倍数为:%d\n",gb(u,v,gy(u,v)));
	return 0;
 } 

运行结果:

24
188
最大公约数为:4
最小公倍数为:1128

14,从主函数输入a,b,c的值,求方程ax2+bx+c=0的根,用3个函数分别求当b2-4ac>0,=0,<0时的根,并输出结果。

#include"stdio.h"
#include"math.h"
float x1,x2,p,q,disc;
int main()
{
	void da(float a,float b);
	void deng(float a,float b);
	void xiao(float a,float b);
	float a,b,c;
	printf("input a:"); 
	scanf("%f",&a);
	getchar();
	printf("input b:");
	scanf("%f",&b);
	getchar();
	printf("input c:");
	scanf("%f",&c);
	printf("方程:%5.2fx^2+%5.2fx+%5.2f=0\n",a,b,c);
	disc=b*b-4*a*c;
	printf("解:\n");
	if(disc>0)
	{
		da(a,b);
		printf("x1=%f\t\tx2=%f\n",x1,x2);
	}
	else if(disc==0)
	{
		deng(a,b);
		printf("x1=%f\t\tx2=%f\n",x1,x2);
	}
	else
	{
		xiao(a,b);
		printf("x1=%f+%fi\t\tx2=%f-%fi\n",p,q,p,q);
	}
	return 0;
 } 
 void da(float a,float b)
 {
 	x1=(-b+sqrt(disc))/(2*a);
 	x2=(-b-sqrt(disc))/(2*a);
 }
 void deng(float a,float b)
 {
 	x1=x2=(-b)/(2*a);
 }
 void xiao(float a,float b)
 {
 	p=-b/(2*a);
	q=sqrt(-disc)/(2*a); 
 }

运行结果:

  1. 相等的实根
input a:1
input b:2
input c:1
方程: 1.00x^2+ 2.00x+ 1.00=0
解:
x1=-1.000000            x2=-1.000000
  1. 不等的实根
input a:2
input b:4
input c:1
方程: 2.00x^2+ 4.00x+ 1.00=0
解:
x1=-0.292893            x2=-1.707107
  1. 共轭的复根
input a:2
input b:4
input c:3
方程: 2.00x^2+ 4.00x+ 3.00=0
解:
x1=-1.000000+0.707107i          x2=-1.000000-0.707107i

15,写一个判断素数的函数,在主函数输入一个整数,输出是否为素数的信息。

#include "stdio.h"
int main()
{
	int prime(int);
	int n;
	printf("输入一个整数:"); 
	scanf("%d",&n);
	if(prime(n))
	    printf(" %d 是素数",n);
	else
	    printf(" %d 不是素数",n);
	return 0;
}
int prime(int n)
{
	int flag=1,i;
	for (i=2;i<n/2&&flag==1;i++)
	{
		if(n%i==0)
		flag=0;
		return(flag);
	}
}

运行结果:

  1. 情况1
输入一个整数:17
 17 是素数
  1. 情况2
输入一个整数:10
 10 不是素数

16,写一个函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串

#include"stdio.h"
#include"string.h"
int main()
{
	void inverse(char str[]);
	char str[100];
	printf("输入字符串: ");
	scanf("%s",str);
	inverse(str);
	printf("倒序字符串: %s",str);
	return 0;
 } 
 void inverse(char str[])
 {
 	char t;
 	int i,j;
 	for(i=0,j=strlen(str);i<(strlen(str)/2);i++,j--)
 	{
 		t=str[i];
 		str[i]=str[j-1];
 		str[j-1]=t;
	}
 }

运行结果:

输入字符串: serious
倒序字符串: suoires
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值