C语言流程控制

C++学习之路【1】:标C数据结构和算法
流程控制指程序执行的顺序,包括三大结构:顺序结构、分支结构、循环结构。
图灵提出流程控制的概念,认为所有的程序可以通过三大结构设计出来。

顺序结构

从上到下,顺序执行各条语句在这里插入图片描述

分支结构

有些代码可执行不执行,有选择的执行某些代码

if 分支结构

满足条件执行,不满足条件不执行
在这里插入图片描述

if(逻辑表达式){
	语句1}

如果逻辑表达式为真,就执行语句1;如果逻辑表达式为假就不执行语句1。
逻辑表达式:布尔值,可以作为布尔值的数据都可以放到圆括号中
通过判断逻辑表达式的真假,决定是否执行某一语句块

if(逻辑表达式){
	语句1}else{
	语句2;
}

如果逻辑表达式为真,就执行语句1;如果逻辑表达式为假就执行语句2。
逻辑表达式:布尔值,可以作为布尔值的数据都可以放到圆括号中
通过判断逻辑表达式的真假,从两个语句块中选择一个语句块来执行

#include<stdio.h>
int main(void){
	printf("请输入一个整数a:");
	int a;
	scanf("%d\n", &a);
	if(a > 5){
		printf("a的值大于5\n");
	}
	
	if(a < 10){
		printf("a的值小于10\n");
	}else{
		printf("a的值大于等于10\n");
	}
	 
	return 0;
}

if - else if - else if - … - else 结构

// 具有多个判断条件
// 具有可能多个条件都为假,所有代码都不执行
int a = 10;
if(a > 50){
	printf("a大于50\n");
}else if(a > 30){
	printf("a大于50\n");
}else if(a > 20){
	printf("a大于20\n");
}

// 加上else,前面所有条件都不成立时,执行else内容
if(a > 50){
	printf("a大于50\n");
}else if(a > 30){
	printf("a大于50\n");
}else if(a > 20){
	printf("a大于20\n");
}else{
	printf("a小于等于20\n");
}

判断闰年:
从键盘输入年份,闰年/平年
年份可以被4整除但是不能被100整除
或者可以被400整除

#include<stdio.h>
int main(void){
	pintf("请输入需要查询的年份:");
	int year;
	scanf("%d\n", &year);
	if(year % 4 == 0 && year % 100 != 0){
		printf("你查询的年份是闰年");
	}else if(year % 400 == 0){
		printf("你查询的年份是闰年");
	}else{
		printf("你查询的年份是平年");
	}
	return 0;
}

switch分支

switch只能是整数匹配
匹配成功,从当前语句向下执行,直到遇到break语句结束分支
在这里插入图片描述

#include<stdio>
int main(void){
	
	printf("请输入季节编号(1/2/3/4):")int season;
	scanf("%d", &season);
	switch(season){
		case 1:
			printf("spring(春天)\n");
			break;
		case 2:
			printf("summer(夏天)\n");
			break;
		case 3:
			printf("autumn(秋天)\n");
			break;
		case 4:
			printf("winter(冬天)\n");
			break;
		default:
			printf("输入不合规,请重新输入\n");
			break;	
	}
	return 0;
}
//100 S; 90-99 A; 80-89 B; 70-79 C; 60-69 D; <60 E
//安全检查,如果分数不在0-100之间 —— 结束
#include<stdio.h>
int main(void){
	printf("请输入你的成绩:\n");
	int score;
	scanf("%d\n", &score);
	if(score < 0 || score > 100){
		printf("你输入的分数有误,请重新输入分数(0-100)\n");
		break;
	}
	switch(score / 10){
		case 10:
			printf("你的成绩为S\n"); 
			break;
		case 9:
			printf("你的成绩为A\n"); 
			break;
		case 8:
			printf("你的成绩为B\n"); 
			break;
		case 7:
			printf("你的成绩为C\n"); 
			break;
		case 6:
			printf("你的成绩为D\n"); 
			break;
		defaulf:
			printf("你的成绩为E\n"); 
			break;
	}
	return 0;
}

循环结构

循环语句可以让一组语句反复多次执行

for循环

for(表达式1;表达式2;表达式3){
循环体4;
}
在这里插入图片描述

执行顺序,先执行表达式1,该语句只会执行一次,
然后执行表达式2,表达式2为逻辑表达式,运算结果为布尔值,为真或为假
表达式2为假的时候,结束for循环
表达式2为真的时候,执行循环体4,然后执行表达式3
[1][2 4 3][2 4 3][2 4 3][2 4 3][2 4 3]…
表达式1 - 把开始数字赋值给循环变量的语句 - 循环变量初始化
逻辑表达式2 - 描述循环变量和结束数字间关系的逻辑表达式 - 循环条件
表达式3 - 把循环变量从前一个数字变成后一个数字 - 变化过程

int i = 0;
for(i = 0; i < 5; i++){
	printf("i = %d\n", i);
}
/*
[1] i = 0;
[2] i = 0 -> i < 5 -真
[4] printf(0);
[3] i++; -> i = 1
------
[1] i = 1;
[2] i = 1 -> i < 5 -真
[4] printf(1);
[3] i++; -> i = 2
...
最终的结果为输出:0 1 2 3 4
将重复的代码执行了5次
在循环的过程中,随着循环发生变化的变量叫做循环变量
*/

for循环小括号里的每条语句都可以省略(分号不能少)
如果省略小括号中间的逻辑表达式就表示逻辑表达式永远为真,这种for循环不能正常结束,它叫做死循环
在C99规范里可以在循环小括号里临时声明循环变量
这种循环变量只能在循环里使用,循环一旦结束就不能使用了
如果循环只有一条语句,可以省略花括号

#include<stdio.h>
int main(void){
	//形式1
	int i = 0;
	for(i = 0; i < 5; i++){
		printf("i = %d", i);
	}
	
	//省略表达式1 - 形式2
	int j = 0;
	for( ; j < 5; j++){
		printf("j = %d", j);
	}
	
	//省略表达式3 - 形式3
	int k = 0;
	for( ; k < 5; ){
		printf("k = %d", k);
		k++; //将循环变量的变化过程放到循环体中
	}
	
	//省略表达式2 - 形式4
	for( ; ; ){
		printf("今天很开心\n");
	} //死循环
	
	//形式5 - break
	int h = 0;
	for(;;){
		printf("h = %d", h);
		h++;
		if(h > 5)
			break
	}

	//形式6 - C99 - 可以在表达式1定义初始化循环变量
	for(int m = 0; m < 5; m++){
		print("m = %d", m);
	}

	//形式7 - contunue关键字 - 结束本次循环,继续下次循环
	int z = 0;
	for(z = 0; z < 5; z++){
		if(z == 3){
			continue;  //执行该语句后,直接跳转到表达式3执行 - z++
			printf("hello,continue\n"); // 不执行
		}
		print("z = %d", z); //0 1 2 4,无3和hello continue
	}
	return 0;
}

可以在循环中使用break;语句随时终止循环的执行
一旦执行break;语句之后循环里的一切语句都不再执行,包括循环变量也不再变化
死循环都必须使用break;语句结束
循环中可以使用continue,语句直接跳转到循环大括号的末尾,中间的语句这次循环就不执行了
goto也是流程控制语句,它可以跳转到对应语句去执行,尽量不要使用goto语句(见文末详解)
循环的嵌套:

//打印10行20列*
#include<stdio.h>
int main(void){
	int i, j;
	for(i = 0; i < 10; i++){	//0-9,循环10次
		//printf("********************");
		//替换
		for(j = 0; j < 20; j++){	//0-19,循环20次
			print("*");
		}
		print("\n");
	}
	return 0;
}
//输出0-100之间的所有奇数
#include<stdio.h>
int main(void){
	int i;
	for(i = 1; i < 100; i++){	
		if(i%2){		//i对2取余后为非零则输出i
			print("%d ", i);
		}
	}
	return 0;
}

while循环

while循环 - 简单/简易版本的for循环(理解)
while (条件表达式){
循环体;
}
条件表达式,运算的结果为布尔值;如果条件为真,则运行循环体代码。
在这里插入图片描述

#include<stdio.h>
int main(void){
	int i = 0;	//1.循环变量初始化
	while(i < 5){	//2.循环条件
		printf("i = %d\n", i);	//4.循环体
		i++;	//3.循环变量变化过程
	}
	return 0;
}

求1-100相加的和:

//求1-100相加的和
#include<stdio.h>
int main(void){
	int i = 1;
	int sum = 0;
	while(i <= 100){
		sum = sum + i;
		i++;
	}
	printf("sum = %d\n", sum)
	return 0;
}

do-while循环

do {
循环体;
} while (条件表达式);
条件表达式的运算为布尔值,即真和假
在这里插入图片描述

#include<stdio.h>
int main(void){
	while(0){	//不会执行hello world
		printf("hello world\n");
	}
	int i = 0;
	// do-while循环是至少执行一次的while循环
	do{
		printf("i = %d", i);	//0,1,2,3,4
		i++;
	}while(i < 5);
	return 0;
}

【goto - 到标号处运行】

#include<stdio.h>
int main(void){
	printf("1\n");
	goto label;		//直接跳转至label的位置上运行
	printf("2\n");
	printf("2\n");
	printf("2\n");
label:
	printf("3\n");
	printf("3\n");
	printf("3\n");		
	// 输出1、3、3、3
	return 0;
}

【空语句( ; )】

#include<stdio.h>
int main(void){
	;	//空语句 - 表示一条语句 - 执行一个分号
	//分号起到了结束语句的作用
	
	//延时
	printf("1\n");
	int i = 90000000;
	while(i--);	// i--,非0,真;0,假;
				// 执行语句为空语句,do nothing - 消耗时间
	printf("2\n");	

	//避免
	int j = 0;
	for(j = 0; j < 5; j++);	//省略花括号,执行语句为空语句
		printf("j = %d\n", j);	// j = 5
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值