一,函数是什么?

1,函数概练的引入

引入时,函数的英文名为function,中文翻译是:功能,作用。
在数学中都听过这个名称,两者只在名称上相同。
C语言中函数的作用是实现某种功能。
一个程序最基本的单位是函数,可以这麽说程序就是由函数组成的(稍后附加的扫雷游戏,两百多行代码就是有一个个函数组成的。)
例如:

#include<stdio.h>
int main()
{
printf("你好,C。");
return 0;
}

运行结果
在这里插入图片描述
这是一个最基本的程序,其中包含一个主函数:main函数
还有库函数:printf


为了更直观的理解这些,会附上两百多行的代码。

二.两个文件

1.源文件

书写函数的内容,定义

2.头文件

书写函数的申明

三,函数的分类

1.主函数

主函数:main
这是程序的入口,它可以出现在任何位置,但程序必须从main函数进入,一个C语言程序没有main函数,就是错误的,哪怕是最简单的程序。

#include<stdio.h>
int main()
{
printf("你好,C。");
return 0;
}

2.库函数

概念:库函数其实就是C语言的开发者把一些常用的功能,设计成函数,这样做是为了提升开发效率。
例如:输入-----scanf
输出-------printf
这些无需程序员自己设计。
注意:库函数的使用必须包含对应的头文件

#include<stdio.h>
int main()
{
printf("你好,C。");
return 0;
}

#include<stdio.h>就是头文件

3.自定义函数

自定义函数理解起来很简单,即手搓函数。
根据自己的需求,想要什么函数自己写出来

①函数的申明

函数的申明就是表明我们要用这个函数。
下面会写一个最简单的函数:加法函数

#include<stdio.h>
int add(int x,int y);
int main()
{
	int a,b;
	printf("请输入数值\n");
	scanf("%d %d", &a, &b);
	int c = add(a, b);
	printf("%d", c);
	return 0;
}
int add(int x, int y) {
	return x + y;
}

在这里插入图片描述

②函数的定义

书写函数的内容

#include<stdio.h>
//函数的定义
int add(int x, int y) {
	return x + y;
}
int main()
{
	int a,b;
	printf("请输入数值\n");
	scanf("%d %d", &a, &b);
	int c = add(a, b);//函数的调用
	printf("%d", c);
	return 0;
}

函数的定义其实就包含了函数的申明,在写简单程序时可以直接写在源文件中。
运行结果:
在这里插入图片描述

四.函数的调用

函数的调用就是使用函数
以加法函数为例斜体样式

#include<stdio.h>
//函数的定义
int add(int x, int y) {
	return x + y;
}
int main()
{
	int a,b;
	printf("请输入数值\n");
	scanf("%d %d", &a, &b);
	int c = add(a, b);//函数的调用,使用函数
	printf("%d", c);
	return 0;

1.函数的形参与实参

在函数调用中必然会涉及到传参
我们把调用中传过去的参数叫做实参

int c = add(a, b);//函数的调用,使用函数

add里面要传过去的参叫做实参

函数定义或申明中接收实参的叫做形参

//函数的定义
//add函数里面的x,y是形参
int add(int x, int y) {
	return x + y;
	}

2.函数的返回值

函数是有返回值的,只不过一般情况不咋用。链式访问会用到
return语句,就是返回语句
函数的返回值有很多类型
例如:整型,浮点型,布尔类型以及无符号返回
下面有代表性的例子:
①整型返回

int add(int x, int y) {
	return x + y;
	}

在函数之前加上要返回类型即可

②无返回,用到void符号

#include<stdio.h>
void print(void)
{
	printf("哈哈哈\n");
	printf("哈哈哈\n");
	printf("哈哈哈\n");
	printf("哈哈哈\n");
}
int main()
{
	print();
	return 0}

运行结果:
在这里插入图片描述

五,函数的链式访问

这属于一个小知识点,比较简单,重点在理解
先思考:

#include<stdio.h>
int main()
{
	printf("%d", printf("%d", printf("%d", 32)));
	return 0;
}

打印的结果是啥?
在这里插入图片描述
分析:首先这是个链式访问,要从里到外分析,打印32,这是肯定的

 printf("%d", 32);

函数是有返回值的,用代码接收下

#include<stdio.h>
int main()
{
	int r  = printf("%d", 32);
	printf("\n");
	printf("r = %d", r);

	return 0;
}

运行结果
在这里插入图片描述
接收的r=2,是因为32在ascll码表里是两个字符,被接收打印整数2.
在拆分

#include<stdio.h>
int main()
{
	int r = printf("%d", 2);
	printf("\n");
	printf("r = %d", r);

	return 0;
}

运行结果
在这里插入图片描述

最后得出结果3211
在举几个例题

#include<stdio.h>
int main()
{
	printf("%d", printf("%d", printf("%d", 32)));
	printf("%d", printf("%d", printf("%d",printf("%d", 32))));
	printf("%d", printf("%d", printf("%d", printf("%d", printf("%d", 32)))));
	return 0;
}

六函数递归

1.递归是什么?

函数递归就是函数自己调用自己,也是一种特殊的函数
理解递归就是递推和回归两个过程,先递推再回归

例子:斐波那

1,斐波那
函数递归
#include<stdio.h>
int Fib(int n) {
	if (n <= 2) {
		return 1;
	}
	else
		return Fib(n - 1) + Fib(n - 2);
}
int main()
{
	int n = 0;
	printf("请输入斐波那\n");
	scanf("%d", &n);
	int r = Fib(n);
	printf("%d", r);
	return 0;
}

可以看到在函数fib里面又包含fib就这样一步步递推出去
最后来到n<=2时得到了返回值,有开始回归,最后得出结果

2.递归的好坏

递归如果面对数据过于庞大,那么·就会发生栈溢出
所以可用但不要过多依赖
上面代码试验一下
在这里插入图片描述
在输入59时一直没有结果,不是说代码有错,而是递推的数太多太大

//循环迭代
#include<stdio.h>
int Fib(int n) {
	int a = 1;
	int b = 1;
	int c = 1;
	while (n > 2) {
		c = a + b;
		a = b;
		b = c;
		n--;
	}
	return c;
}
int main()
{
	int n = 0;
		printf("请输入斐波那\n");
		scanf("%d", &n);
		int r = Fib(n);
		printf("%d", r);
	
	return 0;

}

运行结果

在这里插入图片描述
这是对的,只是int类型存不了这么大的数。

七.扫雷游戏

由于所学内容有限,无法做界面交互(就是大家点一点那种),所以只能在控制台用输入输出来实现代码。
下次写思路
完整代码:
test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"game.h"
void menu() {
	printf("************************\n");
	printf("*********1.play*********\n");
	printf("*********0.exit*********\n");
}
void game() {
	char mine[Rows][Cols];//初始化为0
	char show[Rows][Cols];//初始化为*
	Initboard(mine, Rows, Cols, '0');
	Initboard(show, Rows, Cols, '*');
	
	DisPlay(show, Row, Col);
	srand((unsigned int)time(NULL));
	setmine(mine, Row, Col);
	//DisPlay(mine, Row, Col);
	Findmine(show,mine, Row, Col);
}
int main()
{
	int input = 0;
	menu();//游戏菜单
	do {
		printf("请输入数字:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
		{
			printf("欢迎进入游戏.\n");
			game();
			break;
		}
		case 0:
		{
			printf("退出游戏.");
			break;
		}
		default:
		{
			printf("输入数据异常,请重新输入:");
			break;
		}
		}
	} while (input);
	return 0;
}

game.h

#pragma once
#define Row 9//宏定义行
#define Col 9//宏定义列
#define Rows Row+2
#define Cols Col+2
#include<stdlib.h>
#include<time.h>

//初始化雷盘
void Initboard(char arr[Rows][Cols], int r, int c, char start);
//展示雷盘
void DisPlay(char arr[Rows][Cols], int r,int c);
//安装雷盘
void setmine(char mine[Rows][Cols], int r, int c);
//排雷
void Findmine(char show[Rows][Cols],char mine[Rows][Cols],int r, int c);


game.c

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"game.h"

#define EASY_COUNT 10//雷的个数
void Initboard(char arr[Rows][Cols], int r, int c,char start) {
	for (int i = 0; i < r; i++) {
		for (int j = 0; j < c; j++) {
			arr[i][j] = start;
		}
	}
}
void DisPlay(char arr[Rows][Cols], int r, int c) {
	int i = 0;
		int j = 0;
		for (int j = 0; j <= c; j++) {
			printf("%d ", j);
		}
		printf("\n");
	for (int i = 1; i <= r; i++) {
		printf("%d ", i);
		for (int j = 1; j <= c; j++) {
			printf("%c ", arr[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}
void setmine(char mine[Rows][Cols], int r, int c) {
	int count = EASY_COUNT;//雷的个数;
	while (count) {
		while (count) {
			int x = rand() % r + 1;
			int y = rand() % c + 1;
			if (mine[x][y] = '0') {
				mine[x][y] = '1';
				count--;
			}
			else {
				break;
			}
		}
	}
}
//static int COUNTminecount(char mine[Rows][Cols],int x,int y) {
//	return (mine[x - 1][y] + mine[x - 1][y - 1] + mine[x][y - 1] + mine[x + 1][y -
//		1] + mine[x + 1][y] +
//		mine[x + 1][y + 1] + mine[x][y + 1] + mine[x - 1][y + 1] - 8 * '0');
//}
static int COUNTminecount(char mine[Rows][Cols], int x, int y) {
	int sum = 0;
	for (int i = -1; i <= 1; i++) {
		for (int j = 0; j <= 1; j++) {
			sum+=(mine[x+i][x+j] - '0');
		}
	}
	return sum;
}

void Findmine(char show[Rows][Cols], char mine[Rows][Cols], int r, int c) {
	int x = 0;
	int y = 0;
	int win = 0;
	int count = EASY_COUNT;//雷的个数;
	while (win < (r * c - count)) {
		printf("请输入你的坐标:");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= 9 && y >= 1 && y <= 9) {
			if (mine[x][y] == '1') {
				DisPlay(mine, Row, Col);
				break;
			}
			else {
				//统计周围雷的个数
				int count = COUNTminecount(mine, x, y);
				show[x][y] = count + '0';
				/*DisPlay();*/
				DisPlay(show, Row, Col);
				win++;
			}
		}
		else {
			printf("数据异常");
		}

	}
	if (win == (r * c - count)) {
	printf("恭喜挑战成功");
}
	else
		printf("抱歉,你被炸死了.");
	}
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐