C语言学习笔记(二)

目录

第一章 程序流程控制

一、顺序控制

二、分支控制之if-else

1.单分支

2.双分支

3.多分支

4.嵌套分支

三、分支控制之switch

注意事项

使用建议

四、循环控制

1.for循环

2.while循环

3.do...while循环

4.多重循环控制

五、跳转语句

1.跳转控制语句之break

2.跳转控制语句之continue

3.跳转控制语句之goto

4.跳转控制语句之return

第二章 枚举

注意事项

第三章 函数

一、函数的定义

1.形参列表

2.函数体

3.返回值

二、头文件

注意事项

三、函数调用机制

四、函数的递归调用

注意事项

五、函数的注意事项

可变参数的函数

六、函数参数的传递方式

关于取值符*和取地址符&

七、变量作用域(scope)

1.初始化局部变量和全局变量

2.注意事项

八、static关键字

1.局部变量使用static修饰

2.全局变量使用static修饰

3.函数使用static修饰

九、常用的库函数

1.字符串中常用的库函数

2.与时间和日期相关的库函数

3.数学相关库函数

4.基本数据类型和字符串类型的转换


第一章 程序流程控制

决定程序如何执行,主要有三大流程控制语句:顺序控制、分支控制、循环控制

一、顺序控制

程序自顶向下逐行执行,中间没有任何判断和跳转

Java、C中,定义变量时,采用合法的向前引用原则

二、分支控制之if-else

让程序有选择的执行

1.单分支

当条件表达式为真(非0)时,执行{}中的代码,否则不执行

if(条件表达式)
{
    执行代码块;
}

2.双分支

当条件表达式为真(非0)时,执行代码块1,否则执行代码块2

if(条件表达式)
{ 
    执行代码块1; 
}else
{ 
    执行代码块2; 
}

如果if-else的代码块中只有一条语句,可以省略{}

3.多分支

可以有多个else if语句

if(条件表达式1)
{ 
    执行代码块1; 
}else if(条件表达式2)
{ 
    执行代码块2; 
}
……
else
{ 
    执行代码块n; 
}

从上至下,判断条件是否满足:满足则执行对应的代码块,且执行后直接跳出分支控制 --- 只能有一个执行入口 

4.嵌套分支

⭐在一个分支结构中,嵌套了另一个完整的分支结构

⭐里面的分支结构称为内层分支,外面的分支结构称为外层分支

⭐嵌套分支最好不要嵌套过多,最多不要超过3层,容易出错,不利于阅读

三、分支控制之switch

switch(表达式)
{
case 常量1: 
    语句块1;    //[break;] 
case 常量2: 
    语句块2;    //[break;] 
default:
    default语句块;
    break;
}

表达式中的值与case的常量进行匹配判断,相等则执行语句块;执行后,如果没有switch,不会再进行判断并继续执行下一个语句块,直到遇到break语句退出switch语句【这种现象叫做穿透】

    //范例
    //输入月份,打印该月份所属季节:3.4.5春季;6.7.8夏季;9.10.11秋季;12.1.2冬季
	int month;

	printf("输入月份:");
	scanf_s("%d", &month);
	getchar();

	switch (month/3)
	{
	case 1:
		printf("春季\n"); break;
	case 2:
		printf("夏季\n"); break;
	case 3:
		printf("秋季\n"); break;
	default:
		printf("冬季\n");
		break;
	}

⭐[]中的break并非必要代码,用于退出switch语句

⭐default语句的作用是:switch中所有语句都不成立时,执行的语句

⭐default语句可以放在switch代码块中的任意部分,但强烈建议放在末尾

注意事项

1.switch语句的表达式是一个常量表达式,必须是一个整型或枚举类型
2.case后面要带一个常量,而不能是变量

使用建议

1.若判断的具体数值不多,且符合整型、枚举类型,建议使用switch
2.对区间的判断及结果的真假判断,建议使用if

四、循环控制

让代码可以循环执行

1.for循环

for(①循环变量初始化; ②循环条件; ④循环变量迭代)
{ 
    ③循环操作语句块; 
}

范例:

	//3个班,每班5名学生,统计各班平均分及所有班级平均分
	int classNum = 0, stuNum = 0;
	double score, avgClass, avgAll, sumClass = 0, sumAll = 0;	
    //如果一个值在程序中使用多次(大于三次),可以使用一个变量来保存它,避免重复计算

	for (; classNum < 3; classNum++)
	{
		for (; stuNum < 5; stuNum++) 
		{
			printf("输入%d班第%d个学生的成绩:", classNum + 1, stuNum + 1);
			scanf_s("%lf", &score);
			getchar();
			sumClass += score;	//班级总成绩
		}
		avgClass = sumClass / stuNum;	//班级的平均成绩
		printf("%d班的平均成绩是:%.2f\n", classNum + 1, avgClass);
		sumAll += avgClass;		//学校总成绩
		sumClass = 0;	
		stuNum = 0;		//清零与初始化
	}
	avgAll = sumAll / classNum;	//学校平均成绩
	printf("学生的平均成绩是:%.2f", avgAll);

1.循环条件是一个返回值为真(非0)或假(0)的表达式
2.for(; 循环条件;)的变量初始化和变量迭代可以省略不写(写到其他地方),但两边的分号不能省略
3.变量初始化可以有多条语句,但要求数据类型必须一致,语句间用逗号隔开
4.变量迭代也可以有多条语句,语句间用逗号隔开
5.要注意的是,在判断并退出for循环之前,会进行最后一次变量迭代
6.① -> ② -> ③ -> ④ -> ② -> ③ -> ④ -> ② -> …… -> ③ -> ④ -> ②

2.while循环

①循环变量初始化; 
while(②循环条件)
{ 
    ③循环语句块; 
    ④循环变量迭代; 
}

范例:

	//输入姓名,直到输入exit为止
	char name[10] = "";

	while (strcmp(name, "exit") != 0)
	{
		printf("输入用户的姓名(输入exit结束):");
		scanf_s("%s", name, 10);//数组的名称即为该数组的首地址
		getchar();
		printf("%s\n", name); 
	}

 1.循环条件是一个返回值为真(非0)或假(0)的表达式
2.while循环是先判断再执行【与do……while相比】
3.① -> ② -> ③ -> ④ -> ② -> ③ -> ④ -> ② -> …… -> ③ -> ④ -> ②

3.do...while循环

①循环变量初始化; 
do{ 
    ③循环语句块; 
    ④循环变量迭代; 
}while(②循环条件);

1.do...while后面有一个分号,不可省略
2.循环条件是一个返回值为真(非0)或假(0)的表达式
3.do...while循环是先执行再判断【与while相比】
4.-> ③ -> ④ -> ② -> ③ -> ④ -> ② -> …… -> ③ -> ④ -> ② 

4.多重循环控制

将一个循环内嵌在另一个循环体内,形成嵌套循环

范例

    //打印空心金字塔,没事可以打印一个菱形的金字塔
	int heightTri = 0;
	printf("请输入金字塔的高度:");		
	scanf_s("%d", &heightTri);
	getchar();
	for (int i = 0; i < heightTri * 2; i++)
	{
		for (int j = 0; j < heightTri * 2; j++)
		{
			if (i == 0)						//金字塔第一行
			{
				if (j == heightTri)
				{
					printf("* ");
				}
				else
				{
					printf("  ");
	

你可能感兴趣的:(C语言学习笔记,学习,c语言)