在这篇文章中,杰哥将带大家 “开公司”。
主干内容部分(你将收获):👉
- 为什么要有函数?
- 函数有哪些?
- 怎么自定义函数以及获得函数的使用权?
- 怎么对函数进行传参?
- 函数中变量的作用域与生命周期
- return 的作用
- 开公司 ---- 猜数字股份有限公司(总公司、菜单分工厂、游戏运营分工厂)
附加认知内容(穿插在主干内容中):👉
- .c 文件(源文件)和.h文件(头文件)各自的作用是什么?
- #include <>和#include “”的区别是什么?
- 小小地认识一下指针
一、 为什么要有函数?
函数 --- “模块化工厂”!!!
当你的手机公司越做越大时,你希望有个工厂车间专门给公司生产手机的某些零件。
进行功能的分组与专门化,来提高效率、使得便于管理。
同理,当你设计成千上万行代码时,实现功能的分区(加、交换数值······)尤其重要。
二、函数有那些?
- 库函数(C语言标准库提供)
如:scanf 、printf ---- 使用时需要包含头文件(头文件中有函数的声明)
- 自定义函数
提示1:
- #include <>和#include “”的区别是什么?
include < >:用于包含标准库头文件。编译器会在系统预设的标准库头文件路径中查找。
如:C语言标准库的头文件优先查找。
include "":用于包含自定义头文件。编译器先在当前源文件所在目录查找,若找不到才会去系统预设路径查找。如:自定义的add.h等等优先
提示2:
- .c 文件(源文件)和.h文件(头文件)各自的作用是什么?
源文件 --- 函数的定义
头文件 ---- 函数的声明 、变量的创建······
这样的优点:大家可以分工写代码,如小王写add.c,小李写swap.c,而不是都在test.c中写
三、怎么自定义函数以及获得函数的使用权?
1、怎么自定义函数?
返回值类型 函数名(形参1,形参2,······)
{
函数体
}
1.1 返回值类型
返回值类型 就是你希望你的 “工厂 ”所生产的产品的型号 、尺码类型 ,如:int 、char 、int*(整型的地址)······ 如果没有返回值 ,就写void
1.2函数名
可以取有意义的名字!!!!!
比如:add、swap 、pai_xu
意思分别是加、交换、排序
2、怎么获得函数的使用权?(定义 + 声明 + 调用)
声明 --- 告诉电脑函数的存在
调用 --- 格式如下
- 无返回值
如:swap(实参1,实参2,······);
- 有返回值
如:int sum = add(实参1,实参2,······);
如果函数放在main函数(main为程序的入口)前面👉 --- 定义函数的同时就是在声明
#include <stdio.h>
int sum(int a, int b) //在main前面定义函数,默认已经电脑函数的存在,相当于同时也声明了
{
return a + b;
}
int main()
{
int c = sum(1, 4); // 调用
return 0;
}
如果函数放在main函数(main为程序的入口)后面👉 --- 需要单独声明
#include <stdio.h>
int sum(int a, int b) ;//声明
int main()
{
int c = sum(1, 4); // 调用
return 0;
}
//定义
int sum(int a, int b)
{
return a + b;
}
四、怎么对函数进行传参?
1、传值
代码示例: 👉
#include <stdio.h>
int sum(int a, int b)
{
return a + b;
}
int main()
{
int c = sum(1, 4);
return 0;
}
注意事项:👉
传值方式:
将实参的值拷贝给函数或方法,在函数内对形参进行操作,操作的对象是实参的拷贝,对实参本身没有影响,在函数结束返回后,形参被丢弃释放,实参的内容不会被改变。
示例如下:
得不到预期结果!!!!!!!!!那么,接下来我们要用”传地址“来解决这个问题。
2、传地址
传址方式:将实参的地址传递给函数,在函数内对形参进行操作等同于对实参进行相同的操作,在函数调用结束返回后,形参被释放,实参的内容是对形参进行操作后的结果。
改进后的代码示例:👉
其中,x,y为指针变量,先简单知道说x,y可以用来存放地址即可。
*为解引用操作符 --- 用来取出存放在该地址的数值。
五、函数中变量的作用域与生命周期
以下图片来自(详情👉链接)
https://blog.csdn.net/2401_87025655/article/details/142599960
说明生命周期的又一个例子
*p的值为任意值,如:-837298272``````
至于原理👉
B站-->黑马程序员 -->视频(如下)-->P116 指针-03-第一个作用的细节
六、return的作用
tip:return 后面可以是数、变量,也可以 3 + 5 ,a + b ,(a > b ? a : b)······
1、作用一:(类似与if - else的作用)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int max(int x, int y)
{
if (x > y)
return x;
return y;
}
int main()
{
int a = 10;
int b = 20;
int c = max(a,b);
printf("%d", c);
return 0;
}
如果return x执行,那么return y没有机会执行。(每次调用函数只能由一个return被执行)
2、作用二:“ return;”可以起提前终止函数的作用
如:
自定义一个函数判断一个正数与5的大小关系,而如果输入0、-3等等不符合要求的数据,可以提前终止函数。
代码示例👉
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> void judge(int x) { if (x <= 0) return; else { if (x > 5) printf("比5大\n"); if (x < 5) printf("比5小\n"); if (x == 5) printf("等于5\n"); } } int main() { int a = 0; scanf("%d", &a); judge(a); return 0; }
七、开公司 ---- 猜数字股份有限公司(总公司、菜单分工厂、游戏运营分工厂)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu() //1、菜单分工厂
{
printf("******************\n");
printf("**** 1.play ******\n");
printf("**** 0.exit ******\n");
printf("******************\n");
}
void game() //2、游戏运营分工厂
{
int r = rand() % 100 + 1;
int guess = 0;
int count = 5;
while (count)
{
printf("你还有%d次机会\n", count);
printf("请猜数字:");
scanf("%d", &guess);
if (guess < r)
{
printf("猜小了");
}
else if (guess > r)
{
printf("猜大了");
}
else
{
printf("恭喜你,猜对了!!!\n");
break;
}
count--;
}
if (count == 0)
{
printf("你失败了,正确答案是%d", r);
}
}
int main() //3、总公司
{
int input = 0;
srand((unsigned)time(NULL));
do
{
menu();
printf("请选择");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("游戏结束");
break;
default:
printf("选择错误,请重新选择!!!!\n");
break;
}
} while (input);
return 0;
}
游戏的底层原理(另一位作者写的,他写的很好,我就不赘述了。)👉
https://blog.csdn.net/cz382487322/article/details/134166634?ops_request_misc=%257B%2522request%255Fid%2522%253A%25229CFCBA20-F1C4-4B8A-BF5F-D3F7ABA1AFA8%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=9CFCBA20-F1C4-4B8A-BF5F-D3F7ABA1AFA8&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-134166634-null-null.142^v100^pc_search_result_base9&utm_term=%E7%8C%9C%E6%95%B0%E5%AD%97&spm=1018.2226.3001.4187