C语言----函数(基础篇七)
好久没有撸博客了,落下好多东西。近期回来老家了,换了个工作,有点时间正好系统性的学习完C吧。今天是比较重要的函数。
库函数
我们平时使用的printf和scanf都是库函数,除此之外还有常用的求平方根函数sqrt,做游戏用的rand等等也是库函数。使用库函数时要使用#include宏命令来包含有库函数的文件。
程序1
求2的平方根。
1 /* 7_1: 求2的平方根 */ 2 #include <stdio.h> 3 #include <math.h> 4 5 /* 主函数(父函数) */ 6 main() 7 { 8 double a; 9 a = sqrt(4); /*调用库函数求平方根*/ 10 printf("%lf\n", a); 11 }
程序2
“随机”表示没有规律,随机函数就表示一种没有规律的函数,这种函数可以模拟很多现实的事务,比如洗扑克牌,摸奖,很多MP3播放器的随机播放模式等等。
要在C语言中使用随机函数,需要调用srand和rand这两个函数。srand是随机种子,rand表示在0~32767之间产生一个随机整数。
1 #include <stdio.h> 2 #include <math.h> 3 #include <time.h> //time 函数头文件 4 #include <stdlib.h> //rand 函数头文件 5 6 main() 7 { 8 int i, n, m; //循环变量,用户猜的面,电脑随机产生的面 9 srand(time(0)); 10 for ( i = 0; i < 5; i++) 11 { 12 printf("\n你猜这次是正面还是反面?(0:正面,1:反面)\n"); 13 scanf_s("%d", &n); 14 m = rand() % 2; //硬币只需要0和1数字表示两个面,这里除以2的余数即可 15 16 //数字转化成文字显示在屏幕上 17 if (m == 0)printf("答案是:正面\n"); 18 else printf("答案是:反面\n"); 19 20 //判断用户是否猜对啦 21 if (n == m) printf("你猜对了\n"); 22 else printf("你猜错了\n"); 23 } 24 }
函数的作用
1、减少重复代码的编写。
2、将一个大项目按功能分解成函数,让多个程序员分别设计。也就是分工合作,增加效率。
自定义函数
自定义函数的格式:
返回值的类型 函数名(类型名 形式参数1,类型名 形式参数2,…)
{
若干语句
…
return 表达式;
}
程序3
1 // 7-3 简单的自定义函数 2 #include <stdio.h> 3 /* 4 1,初学者最好将自定义函数放在前面 5 2,v1 和 v2 在这里叫“形式参数”,fun 前面的int 表示会返回一个整数 6 */ 7 8 9 double fun(double v1, double v2) 10 { 11 double d = v1 - v2; 12 return d; 13 } 14 15 16 17 //主函数 18 main() 19 { 20 double a = 7.5, b = 4.7, c; 21 c = fun(a, b); //调用函数时,1和2叫实际参数 22 printf("%lf\n", c); 23 }
程序4
求 的和 ? 题意: 求1 + 100 的和 500 + 501 + ...... +600 的和 300 + 301 + ......+350 的和。
1 //求 1加到 100, 500加到600,300加到350的和。 2 #include <stdio.h> 3 4 int add(int begin,int end) 5 { 6 int sum = 0; //总和初始化为0. 7 for (; begin<=end; begin++) 8 sum = sum + begin; 9 return sum; //返回值 10 } 11 12 //主函数(父函数) 13 main() 14 { 15 int a1, a2, a3,num; 16 a1 = add(1, 100); 17 a2 = add(500, 600); 18 a3 = add(300, 350); 19 num = a1 + a2 + a3; 20 printf("%d\n",num); 21 }
※函数形参的定义与普通变量定义不同的是:同时定义2个普通变量可以用int a,b; 而函数形参只能用int a,int b
※父函数在调用子函数后,会在调用点等待子函数返回,子函数永远不返回,父函数就永远不会往下执行。
※不能调用main函数
函数声明
※如果子函数在父函数之后定义,就要对子函数先进行“声明”,否则父函数会认不到子函数。
※函数声明的格式就是自定义函数的首部加上分号。
※如果函数返回值为整型,不需要声明也可编译通过,但是不提倡使用这种方式。
数据传递
※父函数调用子函数时,通过“实际参数”将数据传给子函数的“形式参数”。
※父函数将数据传给子函数加工时,子函数不会改变父函数中的数据,它加工的只是实际参数的副本。
※子函数通过return将加工好的数据传回父函数,这时子函数中所有的数据寿终正寝。
※父子函数中如果有变量重名,这两个变量之间不会互相影响
程序5
父子函数变量重名示例
1 // 7 -5 父子函数变量重名示例 2 #include <stdio.h> 3 4 int fun(int a, int b) //与父函数变量重名 5 { 6 a = 2; 7 b = 2; 8 } 9 10 11 main() 12 { 13 int a, b; 14 a = 1; 15 b = 1; 16 fun(a, b); 17 18 printf("a= %d,b=%d\n", a, b); 19 20 }
函数返回值
格式:
return 表达式; 或 return (表达式);
※表达式最后的运算结果要与函数定义时的类型相同。如上面的代码,fun定义为double类型,return m中的m也必须是double类型。
※每个函数只能通过return返回一个值。
※如果函数头部没有返回类型标识,默认返回类型为int
※函数中无论有多少个return,只有一个return会执行,return一旦执行,函数马上就会跳出,后面的代码不再执行。
无返回值的函数:
※无返回值的函数,类型定义为void。函数体中若没有return语句,或是有单独一个return;后面不带表达式,均符合void函数的条件。这时的return功能有点类似break语句。
※无返回值函数也称“功能函数”,主函数不需要它返回什么结果,只需要它做完某件事。
1 // 7-6 无返回值函数 2 #include <stdio.h> 3 4 5 //子函数功能,输出两数中的大数 6 void fun(int a , int b) 7 { 8 if (a > b)printf("%d\n", a); 9 else printf("%d\n", b); 10 } 11 12 void main() 13 { 14 int i1, i2; 15 scanf_s("%d%d", &i1, &i2); 16 fun(i1, i2); 17 }