四、顺序结构、选择结构和循环结构
C语言支持最基本的三种程序运行结构:顺序结构、选择结构、循环结构。
4.1 选择结构
4.1.1 if语句
4.1.2 if…else语句
4.1.3 if…else if…else语句
#include <stdio.h>
#pragma warning(disable:4996)
int main(){
unsigned int score;
printf("score=\n");
scanf("%u", &score);
if(score > 700){
printf("school:Qinghua University\n");
if(score > 710){
printf("major:computer\n");
}else{
printf("major:other\n");
}
}else if(score > 650){
printf("school:Beijing University\n");
}else{
if(score < 200){
printf("Fail\n");
}
}
return 0;
}
4.1.4 三目运算符
#include <stdio.h>
#pragma warning(disable:4996)
//#define MAX(a,b) (a)>(b)?(a):(b) //可以宏定义常量、表达式、函数
int main(){
unsigned int score1, score2, score3;
printf("please input three score(devide by space):");
scanf("%u %u %u", &score1, &score2, &score3);
printf("the most score is %d\n", score1 > score2 ? (score1 > score3 ? score1 : score3) : (score2 > score3 ? score2 : score3));//三目运算符不适用于嵌套(复杂),适用于简单
//printf("the most score is %d\n", MAX(MAX(score1, score2), score3));
return 0;
}
4.1.5 switch语句
#include<stdio.h>
#pragma warning(disable:4996)
int main(){
unsigned int CET4;
printf("CET4=");
scanf("%u", &CET4);
switch (CET4 >= 425){//仅仅适用于两个选择
case 1: printf("及格\n"); break; //假如输入大于等于425,真
case 0: printf("不及格\n"); break; //假如输入小于425,假
}
printf("switch执行效率比if高,从F5调试得知,if要进行判断(尤其是嵌套if),而switch只进行选择即可\n");
unsigned int score;
printf("score=");
scanf("%u", &score);
//假如score>90,100-90都是优秀,要列11个case
switch (score / 10){//适用于多个选择
case 10: printf("满分\n"); break;//结束switch语句
case 9: printf("优秀\n"); break;
case 8: printf("良\n"); break;
case 7: printf("中\n"); break;
case 6: printf("及格\n"); break;
default: printf("不及格\n"); break;
}//switch语句适用离散型(ATM机器),而if语句适用连续型和嵌套
return 0;
}
4.2 循环结构
4.2.1 while语句
#include<stdio.h>
int main(){
int b = 1;
//游戏:1-50内数字为7的倍数或者个位是7的人不能喊出来,只是拍桌子;其他数的人只能喊出来,不能拍桌子
while (b<50){// while循环是先进行判断,再执行语句
if (b%7 == 0 || b%10 == 7) { printf("拍桌子\n"); }
else { printf("b = %d\t", b); }
b++; //如果没有b++,就会出现死循环,死循环会导致程序崩溃
return 0;
}
4.2.2 do…while语句
#include<stdio.h>
#include<math.h>
int main(){
printf("do while循环\n");
char a = 0;
do{
printf("%6d", a);
a++;
if (a % 16 == 0) { printf("\n"); }
} while (a); //结合数据溢出,一直到while(0)才结束循环
putchar('\n');
printf("while循环\n");
char b = 0;
printf("%6d", b);
b++;
while (b){//while(0)是条件为假,不执行循环语句
if (b % 16 == 0) { putchar('\n'); }
printf("%6d", b);
b++;
}
printf("\n\n");
int i = 100;
do{
int x = i % 10;
int y = i / 10 % 10;
int z = i / 100;
if (pow(x, 3) + pow(y, 3) + pow(z, 3) == i){
printf("水仙花数有%d\n", i);
}
i++;
} while (i < 1000);
return 0;
}
4.2.3 for语句
for(初值表达式;条件表达式;步长表达式){循环体语句}
初值表达式:对循环的变量赋初值,指定循环的起点,只有初值表达式不参与循环;
条件表达式:循环的条件;若表达式为真(假),则(结束)继续循环;
步长表达式:改变循环的步长,改变循环变量的值,从而改变条件表达式的结果;
循环体语句:重复执行{}内的句子;
死循环语句:while(1)、for( ; ; )、flag:语句 goto flag。
初值表达式、条件表达式、步长表达式之间用分号隔开,每个表达式内都可以有多条语句,也可以空语句,语句和语句之间用逗号隔开。
#include<stdio.h>
int main(){
int a;
for (a = 0; a < 5; a++);//以;结尾,仅仅循环for语句的a
printf("a=%d", a); //未参与循环,只打印a=5
printf("\n"); //未参与循环,换行1次
int b;
for (b = 0; b < 5; b++) //无符号结尾,仅仅循环for语句的b和下一句
printf("%d", b); //参与5次循环,打印b=01234
printf("\n"); //未参与循环,换行1次
int c;
for (c = 0; c < 5; c++){//正确写法
printf("c = %d", c);//参与5次循环
printf("\n"); //参与5次循环
}
int d = 0; //当作for语句的初值表达式
for (; ; ){ //全为空语句
if (d >= 5){ //当作for语句的条件表达式
break; //跳出循环
}
printf("d = %d", d);//参与5次循环
d++; //当作for语句的步长表达式
printf("\n"); //参与5次循环
} //代码同c执行的完全一样,写法不同
int e, f;
for(e = 0, f = 0; e < 10, f < 10; e++, f += 2){
printf("e = %d", e);//参与5次循环
printf("\n");//参与5次循环
}
return 0;
}
4.2.4 嵌套循环
#include <stdio.h>
int main(){ //九九乘法表
for (int i = 1; i < 10; i++){ //首先根据变化(内层)跟不变(外层)判断内外层
for (int j = 1; j <= i; j++){ //内层跟外层一样,就停止内层循环
printf("%d*%d=%2d\t", j, i, j*i);
}
printf("\n");
}
return 0;
}
#include <stdio.h>
#include <stdlib.h> //调用system函数
#include <Windows.h> //导入window的API
int main(){ //时钟
int hour, minute, second = 0;
for (hour = 0 ; hour < 24; hour++){ //外层执行一次
for (minute = 0; minute < 60; minute++){//内层执行一周
for (second = 0; second < 60; second++){
system("cls"); //清屏操作
printf("%02d:%02d:%02d\n", hour, minute, second);
Sleep(950); //睡眠950毫秒
}
}
}
return 0;
}
4.3 跳转语句break、continue、goto
4.3.1 break语句
在switch条件语句和循环语句中都可以使用break语句。
当它出现在嵌套循环语句中,跳出最近的内循环语句,执行后面的代码。
#include <stdio.h>
int main(){
for (int a = 0; a < 10; a++){
for (int b = 0; b < 10; b++){
if (b == 5) { break; }//结束内层循环,执行50次
printf("a=%d,b=%d\n", a, b);
}
}
for (int c = 0; c < 10; c++){
if (c == 5){ break; } //结束外层循环,一共执行50次
for (int d = 0; d < 10; d++) { printf("c=%d,d=%d\n", c, d); }
}
return 0;
}
4.3.2 continue语句
结束本次循环,进行下一次循环。
#include <stdio.h>
int main(){
for (int i = 0; i <= 100; i++){
if (i % 2 == 0) { continue; }
printf("%d是奇数\n", i);
}
return 0;
}
4.3.3 goto语句(无条件跳转,尽量少用)
#include <stdio.h>
int main(){
int i = 0, j = 0;
for (; i < 10; i++){
if (i == 5){
goto flag; //设置跳转的位置
}
printf("i%d = %d\n",i, i);
}
for (; j < 10; j++){//这种写法就是避免图1的错误(没有赋值j直接跳转运行)
flag:
if (j == 5){
goto end;
}
printf("j%d = %d\n", j, j);
}
return 0;
end: //还可以跳转到return后面的语句
printf("end");
return 0;
}
码字不易,如果大家觉得有用,请高抬贵手给一个赞让文章上推荐让更多的人看到吧,也可以评论提出意见让后面的文章内容越来越生动丰富。