当前位置: 首页 > news >正文

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


http://www.mrgr.cn/news/44704.html

相关文章:

  • 第三届图像处理、计算机视觉与机器学习国际学术会议(ICICML 2024)
  • 分治算法(2)_快速排序_排序数组
  • 不同jdk版本间的替换
  • 原神5.1前瞻网页HTML+CSS+JS
  • WPF 手撸插件 八 操作数据库一
  • 【C++】入门基础介绍(下)输入输出,函数重载,缺省与引用
  • wxPython中wx.ListCtrl用法(样式和事件)
  • 杭电2041-2050
  • VBA学习(77):Excel表格拆分通用版终极神器
  • 牛客:小红的字符移动,小红的数轴移动,小红的圆移动
  • S7-200 SMAR Modbus RTU主站
  • ubuntu下vscode插件arm keil studio pack遇到的问题
  • 利士策分享,旅游是否要舟车劳顿才能尽兴?
  • 【查找算法概念】与【线性表的相关查找算法】
  • WPF|依赖属性SetCurrentValue方法不会使绑定失效, SetValue方法会使绑定失效?是真的吗?
  • Vue2电商平台(五)、加入购物车,购物车页面
  • 黑马头条(10-1开始学习)
  • 【计算机网络 - 基础问题】每日 3 题(二十九)
  • 数据结构与算法笔记:概念与leetcode练习题
  • 手术器械检测系统源码分享