5.【函数】

【函数】【c语言的第二个重点】
	1.为什么需要函数
		避免了重复性操作
		有利于程序的模块化
		函数的第一个例子:
		------------------------求两个数字的最大值------------------------------------------------
		#include <stdio.h>
		void max(int i,int j)  //max是函数的名字,i和j是形式参数,简称形参,void表示函数没有返回值
		{                      //每使用一次完成之后,变量i和变量j的内存就会自动释放掉,以便进行下次调用
			if (i>j)
				printf("%d\n",i);
			else
				printf("%d\n",j);
		}
		int main(void)
		{
			int a,b,c,d,e,f;    //这里定义的整型变量,在上面定义的函数void max中也需要为整型变量即int i和int j
			a=1, b=2; c=3, d=9; e=-5, f=100;
			max(a,b);          //带入实际参数进行运算,而max就是上面定义的函数
			max(c,d);
			max(e,f);
			return 0;
		}
		-----------------------------------------
	2.什么叫函数
		逻辑上:能够完成特定功能的独立的代码块
		物理上:
				能够接收数据[当然也可以不接收数据]
				能够对接收的数据进行处理
				能够将数据处理的结果返回[当然也可以不返回任何值]
				--------------------------------
				#include <stdio.h>
				int f(void)   //括号中的void表示不接收数据  int表示函数返回值是int类型
				{
					return 10; //向主调函数返回10
				}

				void g(void)   //第7行  函数名前面的void表示该函数没有返回值
				{
			//		return 10;     //error 与第7行行首的void相矛盾
				}

				int main(void)
				{
					int j=88;
					j = f();
					printf("%d\n",j);
			//		j = g();   //error 因为g函数没有返回值
					return 0;
				}
				-------结果为10----------------------------------
		总结:
				函数是个工具,它是为了解决大量类似问题而设计的
				函数可以当做一个黑匣子

	3.如何定义函数
		函数的返回值 函数的名字(函数的形参列表)
		{
			函数的执行体
		}

		1.函数定义的本质是详细描述函数之所以能够实现某个特定功能的具体实现方法
		2.return 表达式; 的含义:
			1>终止被调函数,向主调函数返回表达式的值
			2>如果表达式为空,则只终止函数,不向被调函数返回任何值
			3>break是用来终止循环和switch的,return是用来终止函数的
			例子:
				void f()
				{
					return;   //return 只用来终止函数,不向被调函数返回任何值
				}
				int f()
				{
					return 10;  //第一:终止函数,第二,向被调函数返回10
				}
		-----------------------------------------------------------------------
		#include <stdio.h>
		void f(void)
		{
			int i;
			for(i=0;i<5;++i)
			{
				printf("how are you!\n");
				return;   //如果在这里将return修改为break那么最终整个函数输出的结果为how are you!和hello!
			}			  //如果依然使用return,那么最终整个函数输出的结果为:how are you!
				//注意这里的return后面不能带值,因为在开始已经定义了这是个没有返回值的函数							
			printf("hello!\n");
		}
		int main(void)
		{
			f();
			return 0;
		}
		------------------------------------
		3.函数返回值的类型也称为函数的类型,因为如果函数名前的返回值类型和函数执行体中的return表达式; 
		  的类型不同的话,则最终函数返回值的类型以函数名前的返回值类型为准。
		 --------------------------------------------------------------------
		 #include <stdio.h>
		 int f()
		 {
		 	return 10.5;  //因为函数的返回值类型是int 所以最终f返回的是10而不是10.5
		 }

		 int main(void)
		 {
		 	int i=99;
		 	double x=6.6;
		 	x=f();
		 	printf("%lf\n",x);
		 	return 0;
		 }
		 -----------函数结果为10.000000------------
	4.函数的分类
		有参函数 和 无参函数 即:
			 void f(int x,int y)为有参函数        void f(void) 为无参函数
		有返回值函数 和 无返回值函数
		库函数 和 用户自定义函数
		值传递函数 和 地址传递函数
		普通函数 和 主函数(main函数)
			一个程序必须有且只能有一个主函数
			主函数可以调用普通函数 普通函数不能调用主函数
			普通函数可以相互调用
			主函数是程序的入口,也是程序的出口

	5.注意的问题
		--------------------------------------------
		#include <stdio.h>
		void max1(int i,int j)
		{
        		if(i>j)
                		printf("%d\n",i);
        		else
                		printf("%d\n",j);
		}

		int max2(int i, int j)
		{
        		if(i>j)
                		return i;
        		else
                		return j;
		}
		int main()
		{
        		int a,b,c,d,e,f;    //这里定义的整型变量,在上面定义的函数void max中也需要为整型变量即int i和int j
        		a=1, b=2; c=3, d=9; e=-5, f=100;
        		printf("%d\n",max2(a,b));
        		printf("%d\n",max2(c,d));
        		printf("%d\n",max2(e,f));
        		max2(a,b);          //带入实际参数进行运算,而max2就是上面定义的函数
        		max2(c,d);
        		max2(e,f);
        		return 0;
		}
		------------------------------无论最后是调用max1还是max2其结果都为2 9 100--------------------------------------
		当用户输入任意数,判断是否为素数:
		#include <stdio.h>         
		int IsPrime(int val)          //之所以使用int类型,是因为在编译的时候有可能会出现bool未定义情况
		/*bool IsPrime(int val)  */  //bool类型是判断真假的类型,配合返回值true和false来实现
		{
			int i;
			for (i=2;i<val;++i)  //这里是判断val是否是素数的函数执行体
			{
				if(val%i==0)
					break;
			}
			if (i == val)
		/*		return true;   */
				return 10;		//这里用作数值10来作为返回值给int val
			else
		/*		return false;  */
				return 11;     /这里用作数值11来作为返回值给int val,(相当于默认的10位真,11为假)
		}
		int main(void)
		{
			int m;
	
			scanf("%d",&m);
		/*	if(IsPrime(m))     */
			if(10==IsPrime(m))
				printf("YES!\n");
			else if(11==IsPrime(m))
				printf("NO!\n");
			return 0;
		}	
        ---------当用户输入任意数,判断是否为素数(只能被1或者自己本身整除的数)-------------------------
	6.函数的声明
		最简单的函数体
		----------------------------------
		#include <stdio.h>
		void f(void)
		{
			printf("hello!\n");
		}
		int main(void)
		{
			f();
			return 0;
		}
	    ---------输出结果为hello!------------
		如果将声明的部分放在下面程序就会报错,因为找不到f()
		除非在开始部分进行函数的声明,如下所示:
		-------------------------------------------
		#include <stdio.h>
		void f(void);  //函数声明部分的分号不能丢掉
		int main(void)
		{
			f();
			return 0;
		}
		void f(void)  
		{
			printf("hello!\n");
		}
	    --------连环调用输出结果为hello!------------
		连环调用也是一样的道理:
	    ------------------------------
		#include <stdio.h>
		void f(void);  
		{
			printf("hello!\n");
		}
		void g(void)
		{
			f();
		}
		int main(void)
		{
			g();
			return 0;
		}
	    ----输出结果为hello!-------
		如果是这样:(如果不进行函数声明依然会报错,所以前面必须加上函数声明。)
	    ----------------------------
		#include <stdio.h>

		void f(void);  //这里必须声明

		void g(void)
		{
        		f();  //因为函数f的定义放在了调用f语句的后面,所有语法出错
		}
		void f(void)
		{
        		printf("hello!\n");
		}
		int main(void)
		{
        		g();
        		return 0;
		}
	    ----输出结果为hello!------------
	注意的问题:
		函数调用和函数定义的顺序
			如果函数调用卸载了函数定义的前面,则必须加函数前置声明
			函数前置声明:
				1.告诉编译器即将可能出现的若干个字母代表的是一个函数
				2.告诉编译器即将可能出现的若干个字母所代表的函数的形参和返回值的具体情况
				3.函数声明是一个语句,末尾必须加分号
				4.对库函数的声明是通过 #include <库函数所在的文件的名字.h> 来实现的
		形参和实参
			形参和实参的个数一定要相同,位置要一一对应,数据类型必须相互兼容
			-----------------------------
			#include <stdio.h>
			void f(int i, float j)    //这里的i,j表示形参
			{
				printf("%d\n%lf\n",i,j);
			}
			int main(void)
			{
				f(5,6.6);      //这里的5,6表示实参
				return 0;
			}
			-------输出的结果为5---------
		如何在软件开发中合理的设计函数来解决实际问题:
			用单独的函数来实现,代码的可重用性提高
			一个函数的功能尽量独立,单一
			多学习,多模仿牛人的代码
			函数是c语言的基本单位,类似Java,C#,C++的基本单位

			只用main函数实现,有局限性:
				1.代码的可重用性不高
				2.代码不容易理解
				----------------------------------------------
				/*输入任意一个数字,列出这个数以内的所有素数*/
				#include <stdio.h>

				int isprime(int val)   //这是一个单独判断数字是否为素数的模块
				{
        			int i;
        			for (i=2; i<val; ++i)  
        			{
                		if(0==val%i)
                        break;
        			}
        			if (i==val)    //如果为素数,返回10,否则返回11
                		return 10;
        			else
                		return 11;
				}

				int main(void)
				{
        			int m;
        			int j;
        			printf("请输入一个数字以列出这个数以内的所有素数:\n");
        			scanf("%d",&m);
        			for (j=2; j<=m; ++j)
                	{
                        if (10==isprime(j))
                                printf("%d\n",j);
                	}
				}
				---------------------------------------------------------------------
	7.常用的系统函数
		求x的平方根 double sqrt(double x);
		求x的绝对值	int abs(int x);
		求x的绝对值 double fabs(double x);
		《机械工业》
		《turbo c 2.0 实用大全》
	8.专题:
		递归
			所有可以实现先进后出的这种存储结构都叫做 栈
【变量的作用域和存储方式】
    按作用域分:
        全局变量
            在所有的函数外部定义的变量
            全局变量使用范围:从定义位置开始到整个程序结束
        局部变量
            在一个函数内部定义的变量或者函数的形参 都统称为局部变量
            void f(int i)
                {
                    int j=20;
                }
            i和j都属于局部变量
            局部变量使用范围:只能再本函数内部使用
        全局变量和局部变量命名冲突的问题
            在一个函数内部如果定义的局部变量的名字和全局变量名一样时,局部变量会屏蔽掉全局变量
-------------------------------
#include <stdio.h>
int i = 99;
int f(int i)
{
    printf("i = %d\n",i);
}
int main()
{
    f(8);
    return 0;
}
---------输出结果为i = 8-----------
        按变量的存储方式:
            静态变量
            自动变量
            寄存器变量

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值