一、概述
1.为什么需要函数
避免了重复性操作
有利于程序的模块化
2.什么是函数
逻辑上:能够完成特定功能的独立的代码单元
物理上:
能够接受数据[当然也可以不接受数据]
能够对接受的数据进行处理
能够将数据处理的结果过返回[当然也可以不返回任何值]
总结:
函数是个工具,它是为了解决大量类似问题而设计的
函数可以当做一个黑匣子
3.如何定义函数
函数的返回值 函数的名字(函数的形参列表)
{
函数的执行体
}
1. 函数定义的本质是详细描述函数之所以能够实现某个特定功能的具体方法
2. return 表达式:的含义
1〉终止被调函数,向主调函数返回表达式的值
2〉如果表达式为空,只终止函数,不向被调函数返回任何值
3〉break是用来终止循环和switch的,return是用来终止函数的
3. 函数返回至的类型也称为函数的类型,因为如果 函数名前的返回值类型
和 函数执行体中的 return 表达式: 中的类型不同的话,则最终函数返
回值的类型以函数名前的返回值类型为准。
4. 函数的分类
有参函数 和 无参函数
有返回值函数 和 无返回值函数
库函数 和 用户自定函数
值传递函数 和 地址传递函数
普通函数 和 主函数(main函数)
一个程序必须且只能有一个主函数
主函数可以调用普通函数 普通函数不能调用主函数
普通函数可以相互调用
主函数是程序的入口,也是程序的出口
5. 注意问题
函数调用的函数定义的顺序
如果函数调用写在了函数定义的前面,则必须加函数前置声明
函数前置声明:
1. 告诉编译器即将可能出现的若干个字母代表的是一个函数
2. 告诉编译器即将可能出现的若干字母所代表的函数的形参
和返回值的具体情况
3. 函数声明是一个语句,末尾必须加分号
4. 对库函数的声明是通过 #include<库函数所在文件的名字.h〉来实现的
6. 形参和实参
个数相同 位置一一对应 数据类型必须相互兼容
如何在软件开发中合理的设计函数解决实际问题
一个函数的功能尽量独立,单一
多学习,多模仿牛人的代码
函数是C语言的基本单位,类是java,C#,C++的基本单位
7. 常用的系统函数
double sqrt(double x); 求的x的平方根
int abs(int x); 求x的绝对值
double fabs(double x); 求x的绝对值
8. 变量的作用域和存储方式:
按作用域分:
全局变量
在所有函数外部定义的变量叫全局变量
全局变量使用范围: 从定义位置开始到整个程序结束
局部变量
在一个函数内部定义的变量或者函数的形参 都统称为局部变量
void f (int j)
{
int j = 20;
}
i和j都属于局部变量
局部变量的使用范围是:只能在本函数内部使用
注意的问题:
全局变量和局部变了命名冲突的问题
在一个函数内部如果定义的局部变量的名字和全局变量名一样时,局部变量会屏蔽掉全局变量
二、使用函数
1 #include <stdio.h> 2 #include <stdlib.h> 3 int f(void) //括号中的void表示该函数不能接受数据 int表示函数返回值是int类型数据 4 { 5 return 10; //想主调函数返回10 6 }; 7 8 void g(void) //函数名前面的void表示该函数没有返回值 9 { 10 // return 10; //error 与8行行首的void相矛盾 11 } 12 int main(void) 13 { 14 int j = 88; 15 16 j = f(); 17 printf("%d ",j); 18 19 // j = g(); //因为g函数没有返回值 20 // printf("%d ",j); 21 system("pause"); 22 return 0; 23 }
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int f(void) 5 { 6 return 10.5; //因为函数的返回值类型是int 所以最终返回的是10而不是10.5 7 } 8 9 int main(void) 10 { 11 double j = 55.6; 12 13 j = f(); 14 15 printf("%lf ",j); 16 17 18 system("pause"); 19 return 0; 20 }
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <stdbool.h> 4 5 bool IsPrime(int val) 6 { 7 int i; 8 9 for(i=2; i<val; ++i) 10 { 11 if(val%i == 0); 12 break; 13 } 14 if(i == val) 15 return true; 16 else 17 return false; 18 } 19 int main(void) 20 { 21 int m; 22 int i; 23 24 scanf("%d",&m); 25 26 if(IsPrime(m)) 27 printf("Yes! "); 28 else 29 printf("No! "); 30 system("pause"); 31 return 0; 32 }
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 void f(void); //函数声明, 分号不能丢 5 6 int main() 7 { 8 f(); 9 system("pause"); 10 return 0; 11 } 12 13 void f(void) 14 { 15 printf("哈哈! "); 16 }
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <stdbool.h> 4 5 //本函数的功能是: 判断m是否是素数,是返回true,不是返回false 6 7 bool IsPrime(int m) 8 { 9 int i; 10 11 for(i=2; i<m; ++i) 12 { 13 if(0 == m%i) 14 break; 15 } 16 if(i == m) 17 return true; 18 else 19 return false; 20 21 } 22 //本函数的功能是判断1到n之间所有的素数在显示器上输出 23 void TraverseVal(int n) 24 { 25 int f; 26 for(f=2; f<n; ++f) 27 { 28 if(IsPrime(f)) 29 printf("%d ",f); 30 31 32 } 33 } 34 int main(void) 35 { 36 int val; 37 scanf("%d",&val); 38 TraverseVal(val); 39 system("pause"); 40 return 0; 41 }