C语言选择与循环

目录

  • 选择
    • 1.if语句
      • 1.1语法形式
      • 1.2语法规则
      • 1.3例子
      • 1.4嵌套if
      • 1.5例子
      • 1.6悬空else问题
    • 2.switch语句
      • 2.1语法形式
      • 2.2语法规则
      • 2.3switch和if之间的区别
      • 2.4switch语句中的break
      • 2.5switch语句中的default
  • 循环
    • 1.while循环
      • 1.1语法形式
      • 1.2语法规则
      • 1.3例子
    • 2.for循环
      • 2.1语法形式
      • 2.2语法规则
      • 2.3例子
      • 2.4while循环和for循环的比较
    • 3.do-while循环
      • 3.1语法形式
      • 3.2语法规则
      • 3.3例子
  • break语句和continue语句
    • 1.while循环中的break语句和continue语句
      • 1.1break举例
      • 1.2continue举例
    • 2.for循环的break语句和continue语句
      • 2.1for循环的break举例
      • 2.1for循环的continue举例
    • 3.do-while循环的break和continue
  • 循环的嵌套

C语言时结构化的程序设计语言,这里的结构是:顺序结构,选择结构(if语句,switch语句),循环结构(while循环,for循环,do-while循环)

选择

1.if语句

1.1语法形式

if (表达式)
{
语句;
}

1.2语法规则

表达式为真,则执行语句,表达式为假,则不执行语句
在C语言中0表示假,非0表示真。
执行流程图:
C语言选择与循环_第1张图片

1.3例子

判断一个数是奇数还是偶数

#include
int main() {
	int num = 0;
	scanf("%d", &num);
	if (num % 2 != 0) {
		printf("%d是奇数", num);
	}
	else {
		printf("%d是偶数", num);
	}
	return 0;
}

C语言选择与循环_第2张图片
if和else之间都只能执行一条语句,所以只有在大括号中才能执行多条语句。

1.4嵌套if

在if-else语句中,else可以与另一个if语句相结合,这样可以实现多重判断。

1.5例子

输入年龄,判断是少年(0-15),青年(15-25),中年(25-55),老年(55以上)

int main() {
	int old = 0;
	printf("输入年龄:>");
	scanf("%d", &old);
	if (old <= 15) {
		printf("\n少年\n");
	}
	else if (old > 15 && old <= 25) {
		printf("\n青年\n");
	}
	else if (old > 25 && old <= 55) {
		printf("\n中年\n");
	}
	else {
		printf("\n老年\n");
	}
	return 0;
}

C语言选择与循环_第3张图片
这里的if和else之间就构成了嵌套的if语句,以实现多重循环

1.6悬空else问题

如果有多条if和else语句,规则是:else总是和最接近的if匹配

C语言选择与循环_第4张图片

这里执行代码,当a=0时,if(a==1)不成立进入else语句,打印haha。可是当运行代码时啥都不打印,这因为else与最近的if语句相匹配,所以当判断if( a ==1)不成立就没有执行了。所以,当上述代码写为如下代码,就好理解了。

int main() {
	int a = 0;
	int b = 1;
	if (a == 1) {
		if (b == 1)
			printf("hehe\n");
		else
			printf("haha\n");
	}
	return 0;//
}

2.switch语句

switch语句是区别于if语句的实现选择结构的语法

2.1语法形式

switch(expression)
{
	case value1:
		语句;
		break;
	case value2:
		语句;
		break;
	default:
		语句;
		break;
}

2.2语法规则

  • 根据表达式expression的不同来执行相应的case分支。如果找不到,就执行default分支
  • switch语句后面的表达式必须是整型表达式(字符型char也行,因为字符是以ASCII编码的形式进行存储的,ASCII为整数,所以字符也相当于整数)
  • case后面的值必须是常量表达式

2.3switch和if之间的区别

输入任意一个整数值,计算%3之后的余数

if语句实现

int main() {
	int num = 0;
	printf("请输入一个整数:>");
	scanf("%d", &num);
	if (num % 3 == 0) {
		printf("\n%d被3整除\n", num);
	}
	else if (num % 3 == 1) {
		printf("\n%d除以3余1\n",num);
	}
	else {
		printf("\n%d除以3余2\n",num);
	}
	return 0;
}

switch语句实现

int main() {
	int num = 0;
	printf("请输入一个整数:>");
	scanf("%d", &num);
	switch (num%3) {
	case 1:
		printf("\n%d除以3余1\n", num);
		break;
	case 2:
		printf("\n%d除以3余2\n", num);
		break;
	default:
		printf("\n%d被3整除\n", num);
		break;
	}
	return 0;
}

上述两段代码实现的作用是一样的,我们需要注意的点是:

  • case和后面的数字之间必须要有空格
  • 每一个case语句结束后,必须要有一个break,才能跳出这个switch语句

2.4switch语句中的break

如果去掉上述代码中的break语句会出现什么结果呢?

int main() {
	int num = 0;
	printf("请输入一个整数:>");
	scanf("%d", &num);
	switch (num%3) {
	case 1:
		printf("\n%d除以3余1\n", num);
		//break;
	case 2:
		printf("\n%d除以3余2\n", num);
		//break;
	default:
		printf("\n%d被3整除\n", num);
		//break;
	}
	return 0;
}

C语言选择与循环_第5张图片
可以看出,如果去掉break语句就会让代码一直执行下去,直到遇到break才能跳出switch语句。
只有switch中有break语句才能真正实现分支效果,当然,也不是每个case语句都要有break语句,比如下面代码:

输入1-7之间的数字,判断是工作日还是休息日

int main() {
	int day = 0;
	printf("输入1-7之间的数字,判断是工作日还是休息日:>");
	scanf("%d", &day);
	switch (day) {
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("\n工作日\n");
		break;
	case 6:
	case 7:
		printf("\n休息日\n");
	}
	return 0;
}

2.5switch语句中的default

当我们使用switch语句时可能遇到输入的值与所有case后面的值不匹配的情况,这时就需要使用default语句,它的作用是在输入的值与所有case后面的值不匹配的时候执行default后面的语句。
在switch语句中case语句和default语句没有顺序的要求

循环

1.while循环

C语言提供了3种循环语句,while语句就是其中的一种
while语句的语法结构和if语句的语法结构非常相似

1.1语法形式

while(表达式){
语句;
}

1.2语法规则

先进行判断表达式,如果表达式的值为0,则循环直接结束,如果表达式的值不为0,则执行循环语句,语句执行完再继续判断,是否进行下一次判断。
执行流程图:
C语言选择与循环_第6张图片

1.3例子

在屏幕上打印1-10的值

int main() {
	int i = 1;
	while (i <= 10) {
		printf("%d ", i);
		i++;
	}
	return 0;//打印:1 2 3 4 5 6 7 8 9 10
}

2.for循环

2.1语法形式

for循环时所有循环之中使用最多的,语法形式如下:

for(表达式1;表达式2;表达式3)
	语句;

2.2语法规则

  • 表达式1用于循环变量的初始化
  • 表达式2用于循环结束的条件的判断
  • 表达式3用于循环变量的调整
    执行流程图:
    C语言选择与循环_第7张图片

2.3例子

在屏幕上打印1-10的值

int main() {
	for (int i = 1; i <= 10; i++) {
		printf("%d ", i);
	}
	return 0;
}

2.4while循环和for循环的比较

C语言选择与循环_第8张图片
可以看出while循环和for循环大体上是相同的,都具有3个相同的条件,而for循环比while循环更有优越的地方是:for循环的条件比while更加集中

3.do-while循环

3.1语法形式

在3种循环中,do-while循环使用率最小,语法形式如下:

do{
语句;
}while(判断条件);

3.2语法规则

while和for循环都是先判断,再循环,而do-while循环是先循环,后判断。
当while语句的判断条件为真时,再次执行循环语句,为假时,终止循环。
注意:while();后面有一个分号
执行流程图:
C语言选择与循环_第9张图片

3.3例子

在屏幕上打印1-10的值

int main() {
	int i = 1;
	do {
		printf("%d ", i);
		i++;
	} while (i <= 10);
	return 0;
}

do-while循环必须被执行一次,所以该语句适合必须执行一次循环的场景
比如:

输入一个正整数,判断这个数是几位数

int main() {
	int num1= 0;
	int count = 0;
	printf("请输入一个数:>");
	scanf("%d", &num1);
	int num2 = num1;
	do {
		num1 /= 10;
		count++;
	} while (num1 != 0);
	printf("%d是%d位数",num2,count);
	return 0;
}

C语言选择与循环_第10张图片
这个代码充分体现了do-while循环处理特殊问题的优越性,当然这个问题其他循环也可以做,但是相较于do-while循环更为复杂,比如用for循环处理这个问题:

int main() {
	int num = 0;
	scanf("%d", &num);
	int count = 0;
	if (num == 0) {
		printf("1位数");
	}
	else {
		for (int i = 1; num; i++) {
			num /= 10;
			count++;
		}
		printf("%d位数", count);

	}
	return 0;
}

所以这个问题可以用许多方法解决,这两个代码的区别在于do-while循环可以自动判断0也是一位数,而其他循环需要将0作为特殊值处理。

break语句和continue语句

在循环过程中,有些情况要提前终止循环或者跳过本次循环,所以留有break语句和continue语句。

  • break:break语句的作用是永久的终止循环,只要break被执行,那么就跳出循环
  • continue:continue语句的作用是跳过continue后面的代码,继续下一次循环

1.while循环中的break语句和continue语句

1.1break举例

输入一个数字,打印1到该数字,如果打印到5,则终止循环

int main() {
	int num = 0;
	scanf("%d", &num);
	int i = 1;
	while (i <= num) {
		if (i == 5) {//当i=5时,跳出循环,输入num>5,则只输出1 2 3 4
			break;
		}
		printf("%d ", i);
		i++;
	}
	return 0;
}

C语言选择与循环_第11张图片
可以看出,break的作用是跳出循环

1.2continue举例

将break换成continue会怎么样呢

C语言选择与循环_第12张图片
可以看出程序进入死循环,这是因为continue会跳过后面的语句,而i的值又得不到更新,所以要将调整语句放在continue前面。

2.for循环的break语句和continue语句

2.1for循环的break举例

还是一样的问题:输入一个数字,打印1到该数字,如果打印到5,则终止循环

int main() {
	int num = 0;
	scanf("%d", &num);
	int i = 1;
	for (i; i <= num; i++) {
		if (i == 5) {
			break;
		}
		printf("%d ", i);
	}
	return 0;
}

C语言选择与循环_第13张图片

2.1for循环的continue举例

将break换成continue会怎么样呢

int main() {
	int num = 0;
	scanf("%d", &num);
	int i = 1;
	for (i; i <= num; i++) {
		if (i == 5) {
			continue;
			// break;
		}
		printf("%d ", i);
	}
	return 0;
}

C语言选择与循环_第14张图片
可以看出continue的作用是跳过打印5,而while循环的continue语句和for循环的continue语句不同点在于:for循环的调整语句在continue的前面。

3.do-while循环的break和continue

do-while循环的break和continue和while循环的break和continue几乎一模一样。

循环的嵌套

在有些问题当中不知需要一个循环,可能需要多个循环嵌套使用。
比如:

找出1~100之间的素数并打印

int main() {
	for (int i = 1; i <=100; i++) {//打印出1-100的数
		int tmpe = 1;//假设这个数是素数
		for (int j = 2; j <i; j++) {//用2-(i-1)之间的数来依次对它取余
			if (i % j == 0) {
				tmpe = 0;//如果这个数可以被取余,说明它不是素数
				break;//跳出这个循环,那么就不要再用后面的数来对它取余了
			}
		}
		if (tmpe == 1) {//如果执行上面的筛选后还是素数,那么打印它
			printf("%d ", i);
		}
	}
	return 0;
}

可以优化代码:

#include
int main() {
	for (int i = 1; i <=100; i+=2) {//打印出1-100的数
		int tmpe = 1;//假设这个数是素数
		for (int j = 2; j <=sqrt(i); j++) {//用2-(i-1)之间的数来依次对它取余
			if (i % j == 0) {
				tmpe = 0;//如果这个数可以被取余,说明它不是素数
				break;//跳出这个循环,那么就不要再用后面的数来对它取余了
			}
		}
		if (tmpe == 1) {//如果执行上面的筛选后还是素数,那么打印它
			printf("%d ", i);
		}
	}
	return 0;
}

在这里插入图片描述
第一处有优化:

for (int i = 1; i <=100; i+=2) 

这条语句可以理解为一个素数只能是奇数,因为偶数都是2的倍数

第二处优化:

for (int j = 2; j <=sqrt(i); j++) 

这条语句可以理解为一个数都可以分解为a * b的模式,比如说6=2*3,a和b当中至少有一个数是小于它本身的,所以,可以对该数求平方根,让他的平方根作为筛选条件。
关于选择与循环这个知识点,还可以写一个猜数字小游戏,当中涉及到rand随机数的知识,可以看看。这儿
C语言选择与循环_第15张图片

/考研势在必行/

你可能感兴趣的:(C语言,c语言,开发语言,考研)