day4---函数
函数
1 #include <stdio.h> 2 //max是函数的名字,i和j是形式参数 简称形参,void表示函数没有返回值 3 void max(int i,int j) 4 { 5 if(i>j) 6 printf("%d\n",i); 7 else 8 printf("%d\n",j); 9 10 } 11 int main(void) 12 { 13 int a,b,c,d,e,f; 14 a=1,b=4,c=100,d=85,e=66,f=65; 15 max(a,b); 16 max(c,d); 17 max(e,f); 18 19 return 0; 20 }
为什么需要函数?
避免了重复性操作
有利于程序的模块化
什么叫函数?
逻辑上:能够完成特定功能的独立的代码单元
物理上:1,能够接收数据(当然也可以不接受数据)
2,能够对接收的数据进行处理
3.能够将数据处理的结果返回(当然也可以不返回任何值)
1 #include <stdio.h> 2 int f(void) //括号中的void表示函数不能接受数据 int表示函数返回值是int类型 3 { 4 return 10; //向主调函数返回值 5 } 6 7 void g(void) // 8行,函数前面的void表示该函数没有返回值 8 { 9 // return 10;//error与8行的void相矛盾 10 } 11 int main(void) 12 { 13 int j=88; 14 j=f(); 15 printf("%d\n",j); 16 17 //j=g();// error ,因为g函数没有返回值 18 return 0; 19 }
总结:函数是个工具,他是为了解决大量类似问题而设计的
函数可以当做一个黑匣子
如何定义一个函数
函数的返回值 函数的名字(函数的形参列表)
{
函数的执行体
}
1.函数定义的本质是详细描述函数之所以能够实现某个特定功能的具体实现方法
2.return 表达式;的含义
一.终止被掉函数,像主调函数返回表达式的值
二.如果表达式的值为空,则只终止函数,不向被掉函数返回任何值
三.break是用来终止循环和switch的,return是用来终止函数的
例子:
1 void f() 2 { 3 return; //return只用来终止函数,不向被掉函数返回任何值 4 } 5 6 int f() 7 { 8 return 10; //第一:终止函数 第二:向主调函数返回10 9 }
3.函数返回值的类型也称为函数的类型,因为如果函数名前的返回值类型和函数执行体中的return表达式;中的类型不同的话,则最终函数返回值的类型 以函数名前的返回值类型为准
例子:
1 #include <stdio.h> 2 int f() 3 { 4 return 10.5; //因为函数的返回值类型是int,所以最终f返回的是10而不是10.5 5 } 6 int main(void) 7 { 8 int i=88; 9 double x=6.6; 10 x=f(); 11 i=f(); 12 printf("%lf\n",x); 13 14 15 return 0; 16 }
函数的分类
有参函数和无参函数
有返回值函数和无返回值函数
库函数和用户自定义
值传递函数和递质传递函数
普通函数和主函数(main函数)
一个程序必须有且只能有一个主函数
主函数可以调用普通函数,普通函数不能调用主函数
普通函数可以相互调用
主函数是程序的入口,也是程序的出口
实例:判断一个数是否为素数
1 #include <stdio.h> 2 int lsPrime(int val) 3 { 4 int i; 5 for(i=2;i<val;i++) 6 { 7 if(val%i==0) 8 break; 9 } 10 if(i == val) 11 return 1; 12 else 13 return 0; 14 15 } 16 int main(void) 17 { 18 int m; 19 printf("请输入一个自然数:"); 20 scanf("%d",&m); 21 if( lsPrime(m)) 22 printf("yes\n"); 23 else 24 printf("no\n"); 25 return 0; 26 27 }
注意的问题
函数调用和函数调用的顺序
如果函数调用写在了定义的签名,则必须加函数前置声明
函数前置声明的作用
1.告诉编译器即将可能出现的若干个字母代表的是一个函数
2.告诉编译器即将可能出现的若干个字母所代表的形参和返回值的具体情况
3.函数声明是一个语句,末尾加分号
4.对库函数的声明是通过#include <库函数所在的文件的名字.h>来实现的
实例:
1 #include <stdio.h> 2 void f(void);// 函数的声明,分号不能丢 3 int main(void) 4 { 5 f(); 6 return 0; 7 } 8 void f(void) 9 { 10 printf("hahah "); 11 }
形参和实参
个数相同 位置一一对应 数据类型必须相互兼容
1 1 //形参和实参 2 2 #include <stdio.h> 3 3 void f(int i)//i为形参 4 4 { 5 5 printf("%d",i); 6 6 } 7 7 int main(void) 8 8 { 9 9 f(5);//5为实参 10 10 return 0; 11 11 }
如何在软件开发中合理的设计函数来解决实际问题
一个函数的功能尽量单一,独立
1 /*判断一个数字是否为素数 2 用单独的函数来实现,代码的可重用性提高 3 */ 4 #include <stdio.h> 5 6 int a(int val) 7 { 8 int i; 9 for(i=2;i<val;i++) 10 { 11 if(0==val%i) 12 break; 13 } 14 if(i==val) 15 return 1; 16 else 17 return 0; 18 19 } 20 int main(void) 21 { 22 int val; 23 scanf("%d",&val); 24 if( a(val)) 25 printf("yes\n"); 26 else 27 printf("no\n"); 28 return 0; 29 }
代码的优化 -1
1 /* 2 求一到某个数字之间所有的素数,并将其输出 3 只用main函数实现有局限性 4 1.代码的重用性不高 5 2.代码不容易理解 6 */ 7 #include <stdio.h> 8 int main(void) 9 { 10 int val; 11 int i; 12 int j; 13 scanf("%d",&val); 14 for(i=2;i<val;i++) 15 { 16 for (j=2;j<i;++j) 17 { 18 if(0==i%j) 19 break; 20 } 21 if(i==j) 22 printf("%d\n",i); 23 24 } 25 return 0; 26 }
代码的优化 -2
1 /* 2 求一到某个数字之间所有的素数,并将其输出 3 用一个函数来判断一个数字是否是素数 4 优点:代码的可读性和可重用性比较高 5 缺点:可重用性仍然不是非常高,比如求1000个数字,他们每个数字从1到他们本身的素数 6 */ 7 8 #include <stdio.h> 9 int a(int m) 10 { 11 int i; 12 for(i=2;i<m;i++) 13 { 14 if(0==m%i) 15 break; 16 } 17 if(i==m) 18 return 1; 19 else 20 return 0; 21 } 22 int main(void) 23 { 24 int i; 25 int val; 26 27 scanf("%d",&val); 28 for(i=2;i<val;i++) 29 { 30 if(a(i)) 31 printf("%d\n",i); 32 } 33 return 0; 34 }
代码的优化 -3
1 /* 2 求一到某个数字之间所有的素数,并将其输出 3 用两个函数来实现 4 */ 5 6 #include <stdio.h> 7 8 int a(int m)//本函数的功能是判断m是否是素数 9 { 10 int i; 11 for(i=2;i<m;i++) 12 { 13 if(0==m%i) 14 break; 15 } 16 if(i==m) 17 return 1; 18 else 19 return 0; 20 } 21 void b(int n)//本函数的功能是把1到n多有的素数在显示器上输出 22 { 23 int i; 24 for(i=2;i<n;i++) 25 { 26 if(a(i)) 27 printf("%d\n",i); 28 } 29 30 } 31 int main(void) 32 { 33 // int val; 34 // scanf("%d",&val); 35 // b(val); 36 b(100); 37 printf("hello"); 38 b(1000); 39 return 0; 40 }
常用的系统函数------turbo c 2.0实用大全
double sqrt(double x); //求x的平方根
int abs(int x); //求x的绝对值
double fabs(double x); //求x的绝对值
递归
变量的作用域和存储方式:
按作用域分:全局变量:在所有函数外部定义的变量叫全局变量
全局变量的使用范围:从定义位置开始到整个程序结束
局部变量:在一个函数内部定义的变量或者函数的形参 都统称为局部变量
局部变量的使用范围:只能在本函数内部使用
注意的问题
全局变量和局部变量的命名冲突的问题
在一个函数内部,如果定义的局部变量的名字和局部变量的名字一样时,局部变量会屏蔽全局变量。
1 #include <stdio.h> 2 int k=1000; //全局变量 3 void g() 4 { 5 printf("k=%d\n",k); 6 } 7 8 void f(void) 9 { 10 g(); 11 printf("k=%d\n",k); 12 } 13 int main(void) 14 { 15 f(); 16 return 0; 17 }
1 void f(int i) 2 { 3 int j =20; //i和j都属于局部变量 4 }
按变量的存储方式
静态变量
自动变量
寄存器变量