C(十五)函数综合(一)--- 开公司吗?

在这篇文章中,杰哥将带大家 “开公司”。

主干内容部分(你将收获):👉

  • 为什么要有函数?
  • 函数有哪些?
  • 怎么自定义函数以及获得函数的使用权?
  • 怎么对函数进行传参?
  • 函数中变量的作用域与生命周期
  • 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gdut杰哥

小弟本科在读,可以给点早餐钱吗

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值