c语言函数与模块化程序设计知识大全

本文介绍了C语言中的函数概念,包括函数的定义、分类,如标准库函数和自定义函数。详细阐述了如何向函数传递值、从函数返回值,以及函数调用的不同方式。通过示例展示了递归函数的实现,讨论了变量的作用域和生存期。对比了C语言函数与Java方法的异同,强调了C语言在逻辑清晰和分块处理上的优势。
摘要由CSDN通过智能技术生成


前言

c语言的函数类似java的方法。作用是把较大的任务分解成若干个较小,较简单的任务,并提炼出公共任务的方法。称为分而治之

一、函数的定义

函数的分类

标准库函数:标准库函数如我们熟知的printf(),scanf()等,只需要在程序开头把函数所在的头文件包含进来即可。

自定义函数:自行编写函数来解决问题。开发环境内部可以采取“拿来吧你”,使得别人可以用自己的函数

函数的定义

函数名: 函数的唯一标识用来说明函数的功能。

函数体: 函数体用一堆花括号包围,这里的花括号{}是函数体的定界符。函数体内部的定义变量只能在函数体内访问,称为内部变量

形式参数:函数头部参数表里的变量称,简称为形参

若函数没有函数返回值,则需用void定义返回值得类型,

二、向函数传递值和从函数返回值

函数调用

假设有一个函数Fact(),我们用main来调用,则需要提供一个实际参数。(简称实参)的表达式给被调用的函数。那么吧实参的值赋值给形参的过程称为参数传递

#include<stdio.h>
 long Fact(int n){
 	int i;
 	long result=1;
 	for(i=2;i<=n;i++){
 		result=result*i;
	 }
	 return result;
 }//实际上就是把result传给了ret 
int main(void)
{
	int m;
	long ret;
	printf("input m:");
	scanf("%d",&m);
	ret=Fact(m);
	printf("%d!=%ld",m,ret);
	return 0; 
 } 

上述Fact(int n)实际上是我们实现定义好的函数,n实际上就是所谓的形参,上述的Fact(m)中的m实际上就是实参。就是实际上要用的参数。

==函数的返回值只有一个,函数的返回值只有一个,函数返回值类型除了数组都可以

函数的写法

上述函数如果把上面一部分拿下去:

#include<stdio.h>
int main(void)
{
	int m;
	long ret;
	printf("input m:");
	scanf("%d",&m);
	ret=Fact(m);
	printf("%d!=%ld",m,ret);
	return 0; 
 } 
 long Fact(int n){
 	int i;
 	long result=1;
 	for(i=2;i<=n;i++){
 		result=result*i;
	 }
	 return result;
 }//实际上就是把result传给了ret 
 

结果为:
在这里插入图片描述

合并后的另一种写法

上述代码只能把先写分块函数再写主函数。
而另一种写法需要函数原型声明
上述程序改动如下

#include<stdio.h>
long Fact(int n);//函数原型声明
int main(void) 
 
{
	int m;
	long ret;
	printf("input m:");
	scanf("%d",&m);
	ret=Fact(m);
	printf("%d!=%ld",m,ret);
	return 0; 
 } 
 long Fact(int n){
 	int i;
 	long result=1;
 	for(i=2;i<=n;i++){
 		result=result*i;
	 }
	 return result;
 }//实际上就是把result传给了ret 

即可正常编译

函数的递归调用和递归函数

递归:一个对象部分地由它自己组成或按它自己定义。
下面用递归算法计算整数n的阶乘n!

#include<stdio.h>
long Fact(int n);
int main(void)
{
	int n;
	long result;
	printf("Input n:");
	scanf("%d",&n);
	result=Fact(n);
	if(result==-1)
	    printf("n<0,data error!\n"); 
	else
	    printf("%d!=%d\n",n,result);
    return 0;
}
//函数功能:用递归算法计算n!,当n>=0时返回n!,否则返回-1
long Fact(int n)
{
	if(n<0)
	    return -1;
	else if(n==0||n==1)
	    return 1;
	else
	    return(n*Fact(n-1));
 } 

一般情况:由自身定义的与原始问题类似的更小规模的子问题

极限情况:能够用来结束递归调用过程的条件

递归函数:==在函数内直接或间接地自己调用自己

变量的作用域和生存期

语句块:程序块中被花括号括起来的区域,变量的作用域规则是每个变量仅在定义它的语句块内有效,并且拥有自己的存储空间

全局变量:不再语句块内定义的变量

局部变量:在除整个程序以外的其他语句块内定义的变量,在全局变量中已经定义好了,就不需要在作用域中定义了

三,与java方法的对比

java的方法在java的main中即可定义,且java的方法引用只需要使用点运算符。
相对于c来说相对简洁。但是c语言更加底层,逻辑也会更加清晰。且分块处理也可以更好的去分配项目。
关于c和java的面向过程与面向对象将在之后的博客中陆续更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值