《算法笔记》总结及练习

第1章 如何使用本书

1.1 基本内容

第2章部分c++特性
第3~5章:入门第3章最基本的编程能力(很少时间)
第4章基本算法思想(非常重要)
第5章数学问题(5.7 5.8选择性阅读)
第6章:STL标准库常用容器 和 algorithm头文件下常用函数
第7~12章:进阶第7章栈,队列和链表
第8章深度优先搜索 和 广度优先搜索
第9,10章树和图(非常重要)
第11章动态规划算法的几个典型模型
第12章字符串hash 和 KMP算法
第13章额外

1.2 在线评测系统

PAT乙级

PAT甲级

codeup

POJ

HDOJ

ZOJ

CodeForces

UVa

ACdream

1.3 如何高效地做题

  • 按照算法专题
  • 如果在做一道题时暂时没有想法,那么可以先放着,跳过去做其他题目,过一段时间再回来重新做,或许就柳暗花明了
  • 设置一个未解决题目的队列,每次有题目暂时不会做时就扔到队列里,然后隔三岔五取出里面的题目再想一下,想不出来就再扔回队列里

 

第2章 C/C++快速入门

ps:

  • cin cout 方便但是耗时
  • 程序 = 头文件 + 主函数
  • #include<stdio.h> 头文件。stdio = standard input output ; h就是head的缩写
  • 头文件列列举
stdio.h = cstdio输入输出
math.h = cmath数学函数
string.h = cstring字符串相关函数
  •  一个程序最多只能有一个主函数
#include <stdio.h>
int main() {
	int a, b;
	scanf("%d%d", &a, &b);
	printf("%d", a + b);
	return 0;
}

2.1 函数的基本类型

2.1.1 变量定义

变量名:

  1. 不能有C语言标识符,取有实际意义的变量名
  2. 第一个字符必须是:字母 or 下划线‘
  3. 区分大小写

2.1.2 整型 浮点型

整型int
long long
浮点型float
double
字符型char
bool

 

int32bit4Byte取值在10^9以内
long long64bit8Byte取值超过2147483647
float32bit符号位:1bit;指数位:8bit;尾数位:23bit
double64bit符号位:1bit;指数位:11bit;尾数位:52bit

ps:

  • 如果long long型赋值大于 2^31-1的初值,则需要在初值后面加上:LL(否则会出现编译错误)
  • 遇到浮点数就用:double

2.1.3 字符型 (包括转义字符)

(1)字符变量和字符常量
char c;
char c = 'e';

字符常量必须用单引号标注

(2)转义字符控制字符不可显示
(3)字符串常量字符串常量可以 作为初值 赋给字符数组
  • 小写字母比大写字母的ASCII码值大32
  • 字符常量(必须是单个字符)必须用单引号标注
#include <stdio.h>
int main() {
	char c1 = 'z', c2 = 'j', c3 = 117;
	printf("%c%c%c", c1, c2, c3);
	return 0;
}

  • 转义字符
#include <stdio.h>
int main() {
	int num1 = 1, num2 = 2;
	printf("%d\n\n%d", num1, num2);
	printf("%c", 7);
	return 0;
}

第2个printf没有显示任何输出,因为ASCII为7的字符是控制字符,并且是控制响铃功能的控制字符,不出意外的话,计算机会响一下。

  • 字符串常量
#include <stdio.h>
int main() {
	char str1[25] = "wo ai de ren bu ai wo";
	char str2[25] = "so sad a story it is.";
	printf("%s, %s", str1, str2);
	return 0;
}

2.1.3 布尔型

  • 在C++中可以直接使用,但是在C语言中需要添加头文件 stdbool.h
  • 整型常量在赋值给布尔型变量时会自动转换为 true(非零)或者false(零)
  • 1 和 -1都会转换为 true
#include <stdio.h>
int main() {
	bool flag1 = 0, flag2 = true;
	int a = 1, b = 1;
	printf("%d %d %d\n", flag1, flag2, a==b);
	return 0;
}

2.1.4 强制类型转换

#include <stdio.h>
int main() {
	double r = 12.56;
	int a = 3, b = 5;
	printf("%d\n", (int)r);
	printf("%d\n", a / b);
	printf("%.1f", (double)a / (double)b);
	return 0;
}

2.1.5 符号常量和const常量

两者都可,但是推荐const方法

#define 标识符 常量

#include <stdio.h>
#define pi 3.14

int main() {
	double r = 3;
	printf("%.2f\n", pi * r * r);
	return 0;
}

对于#define 宏定义是直接将对应的部分替换,然后才进行编译运行,所以一定要加括号

#include <stdio.h>
#define CAL(x) (x * 2 + 1)

int main() {
	int a = 1;
	printf("%d\n", CAL(a + 1));
	return 0;
}

const 数据类型 变量名 = 常量;

#include <stdio.h>
const double pi = 3.14;

int main() {
	double r = 3;
	printf("%f\n", 2 * pi * r);
	return 0;
}

2.1.6 运算符 及 自增自减

  • 除数如果是0,会导致程序异常退出或是得到错误输出 “1.#INF00”
#include <stdio.h>

int main() {
	int a = 3, b = 4;
	double c = 1.23, d = 0.24;
	printf("%d %d\n", a + b, a - b);
	printf("%f\n", c * d);
	return 0;
}

  • i++是先使用i再将i加1, ++i则是先将i加1再使用i
#include <stdio.h>

int main() {
	int a = 1, b = 1, n1, n2;
	n1 = a++;
	n2 = ++b;
	printf("%d %d\n", n1, a);
	printf("%d %d\n", n2, b);
	return 0;
}

2.1.7 条件运算(3目)

A√ B

A× C

A ? B : C

#include <stdio.h>

int main() {
	int a = 3, b = 5;
	int c = a > b ? 7 : 11;
	printf("%d\n", c);
	return 0;
}

2.1.8 位运算符

无穷大的数 INF可以设置成 (1 << 30) - 1 (注意必须加括号,因为位运算符的优先级没有算术运算符高)

const int INF = (1 << 30) - 1;

const int INF = 0x3fffffff;

 

2.2 顺序结构

2.2.1 scanf 和 printf 输入 输出

scanf("格式控制", 变量地址);

scanf("%d", &n);

printf("格式控制", 变量名称);

printf("%d", n); 

scanf格式符
数据类型格式符举例
int%dscanf("%d", &n);
long long%lldscanf("%lld", &n);
float%fscanf("%f", &fl);
double%lfscanf("%lf", &db);
char%cscanf("%c", &c);
字符串(char数组)%sscanf("%s", str);
printf格式符
数据类型格式符举例
int%dprintf("%d", n);
long long%lldprintf("%lld", n);
float%fprintf("%f", fl);
double%fprintf("%f", db);
char%cprintf("%c", c)
字符串(char数组)%sprintf("%s", str)
  • 特:除了char数组整个输入的情况不加&(数组本身就代表阿这个数组第一个元素的地址)
  • scanf对其他格式符(如%d)的输入是以空格符(即空格,TAB)为结束判断标志的;
  • 字符数组使用%s读入的时候以空格跟换行为读入结束的标志(如下)
#include <stdio.h>

int main() {
	char str[10];
	scanf("%s", str);
	printf("%s", str);
	return 0;
}

  • scanf的%c格式是可以读入空格跟换行的
#include <stdio.h>

int main() {
	int a;
	char c, str[10];
	scanf("%d%c%s", &a, &c, str);
	printf("a=%d, c=%c, str=%s", a, c, str);
	return 0;
}

  • 对于小数相乘,建议使用double,否则不准确
#include <stdio.h>

int main() {
	float f1 = 8765.4, f2 = 8765.4;
	double d1 = 8765.4, d2 = 8765.4;
	printf("%f\n%f\n", f1 * f2, d1 * d1);
	return 0;
}

 

2.2.2 输出格式

1)%xd : 高位空格补齐

#include <stdio.h>

int main() {
	int a = 123, b = 1234567;
	printf("%5d\n", a);
	printf("%5d\n", b); 
	return 0;
}

2)%0xd:用0来补齐高位

#include <stdio.h>

int main() {
	int a = 123, b = 1234567;
	printf("%05d\n", a);
	printf("%05d\n", b); 
	return 0;
}

3)%.xf:保留x位小数“四舍六入五成双” (四舍五入:round函数)

#include <stdio.h>

int main() {
	double d1 = 12.3456;
	printf("%.0f\n", d1);
	printf("%.1f\n", d1);
	printf("%.2f\n", d1);
	printf("%.3f\n", d1);
	printf("%.4f\n", d1);
	return 0; 
}

2.2.3 getchar 和 putchar 输入/输出字符

getchar 输入单个字符

putchar 输出单个字符

#include <stdio.h>

int main() {
	char c1, c2, c3;
	c1 = getchar();
	getchar();
	c2 = getchar();
	c3 = getchar();
	putchar(c1);
	putchar(c2);
	putchar(c3);
	return 0; 
}

2.2.4 注释

1)多行注释:/**/

2)单行注释://

2.2.5 typedef

给复杂的数据类型起别名

#include <stdio.h>
//给long long 起个别名 LL 
typedef long long LL;

int main() {
	LL a = 123456789012345, b = 234567890123456;
	printf("%lld\n", a + b); 
	return 0; 
}

2.2.6 常用的math函数

1)取绝对值:fabs(double x)

#include <stdio.h>
#include <math.h> 

int main() {
	double db = -12.56;
	printf("%.2f\n", fabs(db));
	return 0; 
}

2)取整函数:floor(double x) 和 ceil(double x)

#include <stdio.h>
#include <math.h> 

int main() {
	double db1 = -5.2, db2 = 5.2;
	printf("%.0f %.0f\n", floor(db1), ceil(db1));
	printf("%.0f %.0f\n", floor(db2), ceil(db2));
	return 0; 
}

3)pow(double r, double p)

返回r^p, rp都是double

#include <stdio.h>
#include <math.h> 

int main() {
	double db = pow(2.0, 3.0);
	printf("%f\n", db);
	return 0; 
}

4)sqrt(double x)

算数平方根

#include <stdio.h>
#include <math.h> 

int main() {
	double db = sqrt(16);
	printf("%f\n", db);
	return 0; 
}

5)log(double x)

以自然对数为底的对数

#include <stdio.h>
#include <math.h> 

int main() {
	double db = log(1.0);
	printf("%f\n", db);
	return 0; 
}

6)sin(double x), cos(double x) 和 tan(double x)

参数要求是:弧度制

 

#include <stdio.h>
#include <math.h> 
const double pi = acos(-1.0);

int main() {
	double db1 = sin(pi * 30 / 180);
	double db2 = cos(pi * 60 / 180);
	double db3 = tan(pi * 45 / 180);
	printf("%f, %f, %f\n", db1, db2, db3);
	return 0; 
}

7)asin(double x), acos(double x) 和 atan(double x)

反正弦值,反余弦值和反正切值

#include <stdio.h>
#include <math.h> 
const double pi = acos(-1.0);

int main() {
	double db1 = asin(1);
	double db2 = acos(-1.0);
	double db3 = atan(0);
	printf("%f, %f, %f\n", db1, db2, db3);
	return 0; 
}

8)round(double x)

四舍五入

#include <stdio.h>
#include <math.h> 
const double pi = acos(-1.0);

int main() {
	double db1 = round(3.40);
	double db2 = round(3.45);
	double db3 = round(3.50);
	double db4 = round(3.55);
	double db5 = round(3.60);
	printf("%d, %d, %d, %d, %d\n", (int)db1, (int)db2, (int)db3, (int)db4, (int)db5);
	return 0;
	
}

 

2.3 选择结构

2.3.1 if语句

#include <stdio.h>
 
int main() {
	int n = 2;
	if (n > 3) {
		n = 9;
		printf("%d\n", n);
	} else if (n > 2) {
		printf("%d\n", n + 1);
	} else {
		printf("%d\n", n);
	}
	return 0;
}

  • 若if中表达式为 :“! = 0” 等价于f(n)
#include <stdio.h>
 
int main() {
	int n = 0, m = 5;
	if (n) {
		printf("n is not zero!\n");
	} else {
		printf("n is zero!\n");
	}
	if (m) {
		printf("m is not zero!\n");
	} else {
		printf("m is zero!\n");
	}
	return 0;
}

  • 若if中表达式为 :“= = 0” 等价于f(!n)
#include <stdio.h>
 
int main() {
	int n = 0, m = 5;
	if (!n) {
		printf("n is zero!\n");
	} else {
		printf("n is not zero!\n");
	}
	if (!m) {
		printf("m is zero!\n");
	} else {
		printf("m is not zero!\n");
	}
	return 0;
}

2.3.2 switch语句

#include <stdio.h>
 
int main() {
	int a = 1, b = 2;
	switch (a + b) {
		case 2:
			printf("%d\n", a);
			break;
		case 3:
			printf("%d\n", b);
			break;
		case 4:
			printf("%d\n", a + b);
			break;
		default:
			printf("sad story\n");
			break;
	}
}

  • 若删去 break 则3以后的句子都会输出
  • break的作用在于可以结束当前switch语句
  • 若删去则只得到其下所有语句都执行完毕之后才会退出
#include <stdio.h>
 
int main() {
	int a = 1, b = 2;
	switch (a + b) {
		case 2:
			printf("%d\n", a);
		case 3:
			printf("%d\n", b);
		case 4:
			printf("%d\n", a + b);
		default:
			printf("sad story\n");
	}
}

2.4 循环结构

2.4.1 while语句

#include <stdio.h>

int main() {
	int n = 1, sum = 0;
	while(n <= 100) {
		sum = sum + n;
		n++;
	}
	printf("sum = %d\n", sum);
	return 0;
} 

  • "!=0" 可以省略"!=0"
  • "==0" 可以省略"==0", 添加"!"
#include <stdio.h>

int main() {
	int n = 12345, count = 0;
	while(n) {
		count = count + n % 10;
		n = n / 10;
	}
	printf("%d\n", count);
	return 0;
} 

2.4.2 do...while

do...while会先执行循环体一次,然后才会去判断循环条件是否为真,所以使得do...while的实用性远不如while

2.4.3 for语句

for(int i = 0; i <= 100; i++) {
		sum = sum + i;
	}
int i = 1, sum = 0;
	while(i <= 100) {
		sum = sum + i;
		i++;
	}

2.4.4 break 和 continue语句

#include <stdio.h>

int main() {
	int n, sum = 0;
	for(int i = 1; i <= 100; i++) {
		sum = sum + i;
		if(sum >= 2000) break;
	} 
	printf("sum = %d\n", sum);
	return 0;
} 

  • 当满足 i 为奇数时, 执行for语句内容
#include <stdio.h>

int main() {
	int sum = 0;
	for(int i = 1; i <= 5; i++) {
		if(i % 2 == 1) continue;
		sum = sum + i;
	}
	printf("sum = %d\n", sum);
	return 0;
} 

2.5 数组

2.5.1 一维数组

数组大小必须是整数常量,不可以是变量,初值一般情况默认是0

#include <stdio.h>

int main() {
	int a[10] = {5, 3, 2, 6, 8, 4};
	for(int i = 0; i < 10; i++) {
		printf("a[%d] = %d\n", i, a[i]);
	}
	return 0;
} 

#include <stdio.h>

int main() {
	int a[10];
	scanf("%d", &a[0]);
	for(int i = 1; i < 10; i++) {
		a[i] = a[i - 1] * 2;
	}
	for(int i = 0; i < 10; i++) {
		printf("a[%d] = %d\n", i, a[i]);
	}
	return 0;
}

2.5.1 冒泡排序

#include <stdio.h>

int main() {
	int a[10] = {3, 1, 4, 5, 2};

	for(int i = 1; i <= 4; i++) {
		for(int j = 0; j < 5 - i; j++) {
			if(a[j] > a[j + 1]) {
				int temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
			}
		}
	}
	for(int i = 0; i < 5; i++) {
		printf("a[%d] = %d\n", i, a[i]);
	}
	return 0;
}

2.5.3 二维数组

#include <stdio.h>

int main() {
	int a[5][6] = {{3, 1, 2}, {8, 4}, {}, {1, 2, 3, 4, 5}};
	for(int i = 0; i < 5; i++) {
		for(int j = 0; j < 6; j++) {
			printf("%d ", a[i][j]); 
		}
		printf("\n");
	}
	return 0;
}

#include <stdio.h>

int main() {
	int a[3][3], b[3][3];
	for(int i = 0; i < 3; i++) {
		for(int j = 0; j < 3; j++) {
			scanf("%d", &a[i][j]);
		}
	}
	for(int i = 0; i < 3; i++) {
		for(int j = 0; j < 3; j++) {
			scanf("%d", &b[i][j]);
		}
	}
	int c[3][3];
	for(int i = 0; i < 3; i++) {
		for(int j = 0; j < 3; j++) {
			c[i][j] = a[i][j] + b[i][j];
		}
	}
	for(int i = 0; i < 3; i++) {
		for(int j = 0; j < 3; j++) {
			printf("%d ", c[i][j]);
		}
		printf("\n");
	}
	return 0;
}

如果数组大小较大(大概10^6级别),则需要将其定义在主函数外面,否则会使程序异常退出,原因是函数内部申请的局部变量来自系统栈,允许申请的空间较小;而函数外部申请的局部变量来自静态存储区,允许申请的空间较大。

#include <stdio.h>

int a[1000000];
int main() {
	for(int i = 0; i < 1000000; i++) {
		a[i] = i;
		printf("%d ", a[i]);
	}
	return 0;
}

2.5.4 memset——对数组中每一个元素赋相同的值

memset赋0或-1, memset使用的是按字节赋值

如果要对数组赋其他数字(例如1),那么请使用fill函数

#include <stdio.h>
#include <string.h>

int main() {
	int a[5] = {1, 2, 3, 4, 5};
	memset(a, 0, sizeof(a));
	for(int i = 0; i < 5; i++) {
		printf("%d ", a[i]);
	} 
	printf("\n");
	memset(a, -1, sizeof(a));
	for(int i = 0; i < 5; i++) {
		printf("%d ", a[i]);
	} 
	printf("\n");
	return 0;	
}

2.5.5 字符数组

1.字符数组的初始化

#include <stdio.h>

int main() {
	char str[15] = {'G', 'o', 'o', 'd', ' ', 's', 't', 'o', 'r', 'y', '!'};
	for(int i = 0; i < 11; i++) {
		printf("%c", str[i]);
	}
	return 0;
} 

直接赋值

字符数组也可以通过直接赋值字符串来初始化(仅限于初始化,程序其他位置不允许这样直接赋值整个字符串)

#include <stdio.h>

int main() {
	char str[15] = "Good Stroy!";
	for(int i = 0; i < 11; i++) {
		printf("%c", str[i]);
	}
	return 0;
}

2.字符数组的输入输出

(1)scanf输入,printf输出

%s通过空格或换行来识别一个字符串的结束

#include <stdio.h>

int main() {
	char str[10];
	scanf("%s", str);
	printf("%s", str);
	return 0;
} 

(2)getchar输入,putchar输出:单个字符

#include <stdio.h>

int main() {
	char str[5][5];
	for(int i = 0; i < 3; i++) {
		for(int j = 0; j < 3; j++) {
			str[i][j] = getchar();
		}
//		吸收末尾的换行符 
		getchar();
	}
	for(int i = 0; i < 3; i++) {
		for(int j = 0; j < 3; j++) {
			putchar(str[i][j]);
		}
		putchar('\n');
	} 
	return 0;
}

(3)gets输入, puts输出:一行字符串

#include <stdio.h>

int main() {
	char str1[20];
	char str2[5][10];
	gets(str1);
	for(int i = 0; i < 3; i++) {
		gets(str2[i]); 
	}
	puts(str1);
	for(int i = 0; i < 3; i++) {
		puts(str2[i]);
	}
	return 0;
}

3.字符数组的存放方式

  • 一维字符数组的末尾都有一个空字符\0:以表示存放的字符串的结尾
  • 空字符\0在使用gets和scanf输入字符串时辉自动添加在输入的字符串后面,并占用一个字符位
  • puts与printf就是同识别\0作为字符串的结尾来输出的
  • 结束符\0的ASCII码为0,即空字符MULL,占用一个字符位,因此字符数组的长度要比实际存储字符串的长度至少多1
  • int型数组的末尾不需要加\0,只有char型数组需要
  • \0和空格不是一个东西,空格的ASCII码是32
  • 如果不是使用scanf函数的%s格式或gets函数输入字符串(例如getchar)一定要在输入的每个字符串后面加入\0
#include <stdio.h>

int main() {
	char str[15];
	for(int i = 0; i < 3; i++) {
		str[i] = getchar();
	}
	puts(str);
	return 0;
}

2.5.6 string.h头文件

1.strlen():可以得到字符数组中第一个\0前的字符的个数

#include <stdio.h>
#include <string.h>

int main() {
	char str[10];
	gets(str);
	int len = strlen(str);
	printf("%d\n", len);
	return 0;
}

2.strcmp():返回两个字符串大小的比较结果,比较原则是按字典序

字典序就是字符串在字典中的顺序

①字符数组1  < 字符数组2,则返回一个负整数

②字符数组1 == 字符数组2, 则返回0

③字符数组1 >  字符数组2, 则返回一个正整数

#include <stdio.h>
#include <string.h>
int main() {
	char str1[50], str2[50];
	gets(str1);
	gets(str2);
	int cmp = strcmp(str1, str2);
	if(cmp < 0) {
		printf("str1 < str2\n");
	} else if(cmp > 0) {
		printf("str1 > str2\n");
	} else {
		printf("str1 == str2\n");
	}
	return 0;
}

3.strcpy():把一个字符串复制给另一个字符串

#include <stdio.h>
#include <string.h>

int main() {
	char str1[50], str2[50];
	gets(str1);
	gets(str2);
	strcpy(str1, str2);
	puts(str1);
	return 0;
}

4.strcat():把一个字符串接到另一个字符串后面

 

#include <stdio.h>
#include <string.h>

int main() {
	char str1[50], str2[50];
	gets(str1);
	gets(str2);
	strcat(str1, str2);
	puts(str1);
	return 0;
}

2.5.7 sscanf 和 sprintf

sscanf:把字符数组str中内容,以“%d”的格式写道n中

sprintf:把n以“%d”的格式写道str字符数组中

scanf("%d", &n);
scanf(screen, "%d", &n);

printf("%d", n);
printf(screen, "%d", n);
sscanf(str, "%d", &n);
sprintf(str, "%d", n);
#include <stdio.h>
#include <string.h>

int main() {
	int n;
	char str[100] = "123";
	sscanf(str, "%d", &n);
	printf("%d\n", n);
	return 0;
}

#include <stdio.h>
int main() {
	int n = 233;
	char str[100];
	sprintf(str, "%d", n);
	printf("%s\n", str);
	return 0;
}

sscanf:把字符数组str中内容,按“%d:%lf,%s”的格式写道int型变量n, double型变量db,char型数组str2中

sprintf:将int型变量n、double型变量db、char型数组str2按“%d:%.2f,%s”的格式写到字符数组str中

#include <stdio.h>
int main() {
	int n;
	double db;
	char str[100] = "2048:3.14,hello", str2[100];
	sscanf(str, "%d:%lf,%s", &n, &db, str2);
	printf("n = %d, db = %.2f, str2 = %s\n", n, db, str2);
	return 0;
}

#include <stdio.h>

int main() {
	int n = 12;
	double db = 3.14;
	char str[100], str2[100] = "good";
	sprintf(str, "%d:%.2f,%s", n, db, str2);
	printf("str = %s\n", str);
	return 0;
}

2.6 函数

2.6.1 定义

#include <stdio.h>

void print1() {
	printf("Haha,\n");
	printf("Good idea!\n");
}

void print2() {
	printf("Ohno, \n");
	printf("Bad idea!\n");
}

int main() {
	print1();
	print2();
	return 0;
}

有参函数

#include <stdio.h>

int judge(int x) {
	if(x > 0) {
		return 1;
	} else if(x == 0) {
		return 0;
	} else {
		return -1;
	}
}

int main() {
	int a, ans;
	scanf("%d", &a);
	ans = judge(a);
	printf("%d\n", ans);
	return 0;
}

(1)局部变量

值传递:调用函数,并在里面传递值

形式参数(形参):函数括号内的参数

实际参数(实参):实际调用时小括号内的参数

#include <stdio.h>
int x;
void change() {
	x = x + 1;
}

int main() {
	x = 10;
	change();
	printf("%d\n", x);
	return 0;
}

#include <stdio.h>
void change(int x) {
	x = x + 1;
}

int main() {
	int x = 10;
	change(x);
	printf("%d\n", x);
	return 0;
}

多个传入参数需要用逗号隔开

 

#include <stdio.h>

int MAX(int a, int b, int c) {
	int M;
	if(a >= b && a >= c) {
		M = a;
	} else if(b >= a && b >= c) {
		M = b;
	} else {
		M = c;
	}
	return M;
}

int main() {
	int a, b, c;
	scanf("%d%d%d", &a, &b, &c);
	printf("%d\n", MAX(a, b, c));
	return 0;
}

2.6.2 main函数

  • 主函数对一个程序来说只有一个,并且无论主函数写在哪个位置,整个程序一定是从主函数的第一个语句开始执行的
  • 主函数的结构
int main() {
    ...
    return 0;
}
  • main函数返回0表示:告知系统程序正常终止

2.6.3 以数组作为函数参数

  • 参数中数组的一维不需要填写长度(如果是二维数组,那么第二维需要填写长度)
  • 数组作为参数时,在函数中对数组元素的修改就等同于是对元素组元素的修改
#include <stdio.h>

void change(int a[], int b[][5]) {
	a[0] = 1;
	a[1] = 3;
	a[2] = 5;
	b[0][0] = 1;
}

int main() {
	int a[3] = {0};
	int b[5][5] = {0};
	change(a, b);
	for(int i = 0; i < 3; i++) {
		printf("%d\n", a[i]);
	}
	return 0;
}

2.6.4 函数的嵌套调用

#include <stdio.h>

int max_2(int a, int b) {
	if(a > b) {
		return a;
	} else {
		return b;
	}
}

int max_3(int a, int b, int c) {
	int temp = max_2(a, b);
	temp = max_2(temp, c);
	return temp;
}

int main() {
	int a, b, c;
	scanf("%d%d%d", &a, &b, &c);
	printf("%d\n", max_3(a, b, c));
	return 0;
}

2.6.5 函数的递归调用

递归是函数调用自己的过程

#include <stdio.h>

int F(int n) {
	if(n == 0) {
		return 1;
	} else {
		return F(n - 1) * n;
	}
}

int main() {
	int n;
	scanf("%d", &n);
	printf("%d\n", F(n));
	return 0;
}

 

 

 

 

 

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页