5.1程序流程控制介绍
在程序中,程序运行的流程控制决定程序是如何执行的,其中主要有三大流程控制语句顺序控制、分支控制和循环控制
5.2顺序控制
5.2.1顺序控制介绍
程序从上到下逐行地执行,中间没有任何判断和跳转
5.2.2顺序控制注意事项
C中定义变量时采用合法的前向引用的原则,即在使用变量前应该申明
#include<stdio.h> void main() { int a = 97; int b = a + 7; printf("b = %d", b); }
5.3分支控制
5.3.1if-else
5.3.1.1单分支
if (条件表达式){ 执行代码块; }
当条件表达式为真(非0)时,执行代码块;为假时,不会执行代码块
#include<stdio.h> void main() { int a1 = 9; int b1 = 7; if (a1 > b1) { printf("ok!!\n");//a1 > b1为真,执行printf("ok!!\n") } int a2 = 9; int b2 = 7; if (a2 < b2) { printf("ok??\n");//a2 < b2为假,不执行printf("ok??\n"); } }
5.3.1.2双分支
当条件表达式成立(为真),执行代码块1,否则执行代码块2
if(条件表达式){ 执行代码块1; } else{ 执行代码块2; }
#include<stdio.h> void main() { int age; printf("请输入你的年龄"); scanf_s("%d", &age); if (age > 18) { printf("你大于18岁了"); } else { printf("你还小"); } }
5.3.1.3练习
- 定义两个变量int,判断二者的和,是否既能被3又能被5整除
#include<stdio.h> void main() { int num1, num2, sum; printf("请输入两个数字:"); scanf_s("%d%d", &num1, &num2); sum = num1 + num2; if ((sum % 3 == 0) && (sum % 5 == 0) ) { printf("%d和%d的和既能被三整除,也能被五整除", num1, num2); } }
2.判断一个年份是否是闰年,闰年的条件是符合下面二者之一:(1)年份能被4整除, 但不能被100整除;(2)能被400整除
#include<stdio.h> void main() { int year; printf("请输入年份:"); scanf_s("%d", &year); if (((year % 4 == 0) && (year % 100 != 0)) || year % 400 == 0) { printf("%d是闰年", year); } else { printf("%d不是闰年", year); } }
5.3.1.4多分支
if(条件表达式1){ 执行代码块1; } else if (条件表达式2){ 执行代码块2; } …… else{ 执行代码块n; }
- 当条件表达式1成立时,即执行代码块1
- 如果表达式1不成立,才去判断表达式2是否成立
- 如果表达式2成立,就执行代码块2
- 以此类推如果所有的表达式都不成立 ,则执行 else 的代码块,注意, 只能有一个执行入口
//岳小鹏参加C二级考试,他和父亲岳不群达成承诺: //如果: 成绩为100分时,奖励一辆BMW; 成绩为(80,99]时,奖励一台iphone7plus; //当成绩为[60,80]时,奖励一个 iPad; 其它时,什么奖励也没有。 //请从键盘输入岳小鹏的C二级考试,并加以判断, 输出提示 #include<stdio.h> void main() { double score; printf("请输入成绩:"); scanf_s("%lf", &score); if (score == 100) { printf("奖励一辆BMW"); } else if (score > 80 && score <= 99) { printf("奖励一台iphone7plus"); } else if (score >= 60 && score <= 80) { printf("奖励一个ipad"); } else { printf("什么奖励也没有"); } }
5.3.1.5 嵌套分支
if(){ if(){ //被包含的可以是单分支,双分支,多分支 }else{ } }
在一个分支结构中又完整的嵌套了另一个完整的分支结构,里面的分支的结构称为内层分支外面的分支结构称为外层分支。嵌套分支不适合过多,最多不要超过3层
- 参加百米运动会,如果用时8秒以内进入决赛,否则提示淘汰。并且根据性别提示进入 男子组或女子组。 输入成绩和性别,进行判断。
#include<stdio.h> void main() { char gender; double score; printf("请输入成绩\n"); scanf_s("%lf", &score); printf("请输入性别m/f\n"); scanf_s("%c", &gender, sizeof(gender)); scanf_s("%c", &gender, sizeof(gender)); if (score < 8) { if (gender == 'm') { printf("你进入男子组决赛"); } else { printf("你进入女子组决赛"); } } else { printf("你未能进入决赛"); } }
2,。出票系统:根据淡旺季的月份和年龄, 打印票价
4-10月
旺季:成人(18 - 60):60 儿童( < 18):半价 老人(>60):1 / 3
其他
淡季:成人:40 其他:20
#include<stdio.h> void main() { int mouth, age; printf("请输入月份和年龄\n"); scanf_s("%d%d", &mouth, &age); if (mouth >= 4 && mouth <= 10) {//判断是否在4-10月内,即旺季 if (age < 18) { printf("票价为30");//小于18岁的票价 } else if (age>=18 && age < 60){ printf("票价为60");//成年人的票价 } else { printf("票价为20");//老人的票价 } } else {//非旺季 if (age >= 18 && age < 60) {//成人票价 printf("票价为40"); } else {//其余人的票价 printf("票价为20"); } } }
5.3.1.6 switch分支结构
switch(表达式){ case 常量1: //当表达式值等于常量1 语句块1; break; //退出switch case 常量2; // 含义一样 语句块2; break; ... case 常量n; 语句块n; break; default: //如果之前的常量都不相等,则执行default语句块 default语句块; break; }
请编写一个程序,该程序可以接收一个字符,比如: a,b,c,d,e,f,g a表示星期一,b表示星期 二… 根据用户的输入显示相依的信息.要求使用 switch 语句完成
#include<stdio.h> void main() { char day; printf("请输入a,b,c,d,e,f,g其中之一的字符\n"); scanf_s("%c", &day, sizeof(day)); switch (day) { case 'a'://如果输入的字符与a相等,则printf("星期一"),然后break printf("星期一"); break; case 'b'://如果输入的字符不是a,则判断是否与b相等 printf("星期二"); break; case 'c': printf("星期三"); break; case 'd': printf("星期四"); break; case 'e': printf("星期五"); break; case 'f': printf("星期六"); break; case 'g': printf("星期天"); break; default://如果a,b,c,d,e,f,g都没有匹配成功,则执行default里的语句 printf("没有匹配到"); } }
1.switch 语句中的 expression 是一个常量表达式,必须是一个整型(char、short, int, long 等) 或枚举类型
#include<stdio.h> void main() { char num = 'a'; switch (num) { case 97://等价于case'a' printf("ok2"); break; } }
2.case 子句中的值必须是常量,而不能是变量
#include<stdio.h> void main() { char num = 'a'; char num1 = 97; switch (num) { case num1://case的值不能是变量 printf("ok2"); break; } }
3.default 子句是可选的,当没有匹配的 case 时,执行 default
4.break 语句用来在执行完一个 case 分支后使程序跳出 switch 语句块;如果没有写 break,会执行下一个 case 语句块,直到遇到 break 或者执行到 switch 结尾,这个现象称为穿透
#include<stdio.h> void main() { char day; printf("请输入a,b,c,d,e,f,g其中之一的字符\n"); scanf_s("%c", &day, sizeof(day)); switch (day) { case 'a': printf("星期一\n"); break; case 'b': printf("星期二\n"); break; case 'c': printf("星期三\n"); break; case 'd': printf("星期四\n"); break; case 'e': printf("星期五\n"); //break; case 'f': printf("星期六\n"); break; case 'g': printf("星期天\n"); break; default: printf("没有匹配到"); } }
5.3.1.7 switch练习
- 使用 switch 把小写类型的 char 型转为大写(键盘输入)。只转换 a, b, c, d, e. 其它的输出 “other”
#include<stdio.h> void main() { char letter; printf("请输入字符:"); scanf_s("%c", &letter, sizeof(letter)); switch (letter) { case 'a': printf("A\n"); break; case 'b': printf("B\n"); break; case 'c': printf("C\n"); break; case 'd': printf("D\n"); break; case 'e': printf("E\n"); break; default: printf("other"); } }
2.对学生成绩大于 60 分的,输出“合格”。低于 60 分的,输出“不合格”。(注:输入的成绩不能大于 100)
#include<stdio.h> void main() { double score; printf("请输入成绩:\n"); scanf_s("%lf", &score); switch ((int)(score/60)) { case 1: printf("合格"); break; case 0: printf("不合格"); break; default: printf("成绩有误"); } }
3.根据用于指定月份,打印该月份所属的季节。3,4,5 春季 6,7,8 夏季 9,10,11 秋季 12, 1, 2 冬季
//根据用于指定月份,打印该月份所属的季节。3, 4, 5 春季 6, 7, 8 夏季 9, 10, 11 秋季 12, 1, 2 冬季 #include<stdio.h> void main() { int mouth; printf("请输入月份:\n"); scanf_s("%d", &mouth); if (mouth > 0 && mouth < 13){ switch (mouth / 3) { case 0: printf("冬季\n"); break; case 1: printf("春季\n"); break; case 2: printf("夏季\n"); break; case 3: printf("秋季\n"); break; case 4: printf("冬季 \n"); } } else{ printf("输入错误"); } }
#include<stdio.h> void main() { int mouth; printf("请输入月份:\n"); scanf_s("%d", &mouth); switch (mouth) { case 3: case 4: case 5: printf("春季\n"); break; case 6: case 7: case 8: printf("夏季\n"); break; case 9: case 10: case 11: printf("秋季\n"); break; case 12: case 1: case 2: printf("冬季\n"); break; default: printf("输入错误"); } }