目录
第一章 程序流程控制
决定程序如何执行,主要有三大流程控制语句:顺序控制、分支控制、循环控制
一、顺序控制
程序自顶向下逐行执行,中间没有任何判断和跳转
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(" ");