我是靠谱客的博主 合适芒果,最近开发中收集的这篇文章主要介绍选择和循环结构,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

一、选择(判断)结构

       1.if...else...

       2.switch case语句

       3.条件运算符

二、循环结构

       1.while循环

       2.for循环

       3.break和continue

三、选择结构循环结构总结

       1.选择结构

       2.循环结构


        C语言中有三大结构,分别是顺序结构、选择结构(判断)和循环结构(分支结构):

  • C语言顺序结构就是让程序按照从头到尾的顺序依次执行每一条C语言代码,不重复执行任何代码,也不跳过任何代码。
  • C语言选择结构也称分支结构,就是让程序有选择性的执行代码;换句话说,可以跳过没用的代码,只执行有用的代码。
  • C语言循环结构就是让程序“杀个回马枪”,不断地重复执行同一段代码。

       前面我们看到的代码都是顺序执行的,也就是先执行第一条语句,然后是第二条、第三条……一直到最后一条语句,这称为顺序结构。但是对于很多情况,顺序结构的代码是远远不够的,还需要选择结构循环结构。由于顺序结构相对简单,所以本篇我们将重点学习选择结构与循环结构。

一、选择(判断)结构

       1.if...else...

       C 语言提供了以下类型的判断语句:

语句描述
if 语句一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。
if...else语句一个 if 语句 后可跟一个可选的 else 语句,else 语句在布尔表达式为假时执行。
嵌套 if 语句一个 if 或 else if 语句内使用另一个 if 或 else if 语句。
switch 语句一个 switch 语句允许测试一个变量等于多个值时的情况。
嵌套 switch 语句一个 switch 语句内使用另一个 switch 语句。
//多个if...else...
#include <stdio.h>
int main()
{
	char c;
	printf("请输入一个字符:");
	c = getchar();
	if (c < 32)
		printf("这是一个控制字符n");
	else if (c >= '0' && c <= '9')
		printf("这是一个数字n");
	else if (c >= 'A' && c <= 'Z')
		printf("这是一个大写字母n");
	else if (c >= 'a' && c <= 'z')
		printf("这是一个小写字母n");
	else
		printf("这是一个其他字符n");
	
	return 0;
}
//运行结果:
请输入一个字符:d
这是一个小写字母
//if语句嵌套
#include <stdio.h>
int main()
{
	int a, b;
	printf("请输入两个数字:");
	scanf("%d %d",&a,&b);
	if (a != b){
		if (a > b)
			printf("a>bn");
		else
			printf("a<bn");
	}
	else
	{
		printf("a=bn");
	}
	return 0;
}
//运行结果:
请输入两个数字:12 13
a<b

 总结:a、语句块就是由{ }包围的一个或多个语句的集合。如果语句块中只有一个语句,也可以省略{ }。

            b、一旦遇到能够成立的判断条件,则不再执行其他的语句块,最终只能有一个语句块被执行

            c、在 if 语句中,判断条件必须用括号括起来。接下来的语句块由{ }包围,但要注意的是在}之后不需要再加分号;(当然加上也没错)。

           d、if 语句嵌套时,要注意 if 和 else 的配对问题。C语言规定,else 总是与它前面最近的 if 配对。

           e、关系运算符的优先级低于算术运算符高于赋值运算符。在六个关系运算符中,<、<=、>、>=的优先级相同,高于==和!=,==和!=的优先级相同。赋值运算符(=) < &&和|| < 关系运算符 < 算术运算符 < 非(!)

           f、if 语句的判断条件中不是必须要包含关系运算符,它可以是赋值表达式,甚至也可以是一个变量,例如:if(b){//TODO:};if(b=3){//TODO:}都是允许的。这里根据变量 b 的最终值来判断的,如果 b 的值为非0,那么条件成立,否则不成立。

       2.switch case语句

       C语言虽然没有限制if...else...能够处理的分支数量,但当分支过多时,用 if else 处理会不太方便,而且容易出现 if else 配对出错的情况。对于这种情况,实际开发中一般使用 switch 语句代替,基本格式如下:

switch(表达式){
    case 整型数值1: 语句 1;
    case 整型数值2: 语句 2;
    ......
    case 整型数值n: 语句 n;
    default: 语句 n+1;
}
它的执行过程是:
1) 首先计算“表达式”的值,假设为 m。
2) 从第一个 case 开始,比较“整型数值1”和 m,如果它们相等,就执行冒号后面的所有语句,也就是从“语句1”一直执行到“语句n+1”,而不管后面的 case 是否匹配成功。
3) 如果“整型数值1”和 m 不相等,就跳过冒号后面的“语句1”,继续比较第二个 case、第三个 case……一旦发现和某个整型数值相等了,就会执行后面所有的语句。假设 m 和“整型数值5”相等,那么就会从“语句5”一直执行到“语句n+1”。
4) 如果直到最后一个“整型数值n”都没有找到相等的值,那么就执行 default 后的“语句 n+1”。
需要重点强调的是,当和某个整型数值匹配成功后,会执行该分支以及后面所有分支的语句!!!但实际中我们希望只执行某个分支,而跳过后面的其他分支。为了达到这个目标,必须要在每个分支最后添加break;语句。
//switch case语句
#include <stdio.h>
int main()
{
	int a;
	printf("请输入一个整数:");
	scanf("%d",&a);
	switch (a){
		case 1:printf("星期一n"); break;
		case 2:printf("星期二n"); break;
		case 3:printf("星期三n"); break;
		case 4:printf("星期四n"); break;
		case 5:printf("星期五n"); break;
		case 6:printf("星期六n"); break;
		case 7:printf("星期日n"); break;
		default:printf("errorsn"); break;
	}
	return 0;
}
//运行结果:
请输入一个整数:5
星期五

总结:a、break 是C语言中的一个关键字,专门用于跳出 switch 语句。所谓“跳出”,是指一旦遇到 break,就不再执行 switch 中的任何语句,包括当前分支中的语句和其他分支中的语句;也就是说,整个 switch 执行结束了,接着会执行整个 switch 后面的代码。

           b、 case 后面必须是一个整数,或者是结果为整数的表达式,但不能包含任何变量,也不能为小数。

           c、default 不是必须的。当没有 default 时,如果所有 case 都匹配失败,那么就什么都不执行。

       3.条件运算符

       C语言中条件运算符语法格式为:

表达式1?表达式2:表达式3

       条件运算符是C语言中唯一的一个三目运算符,其求值规则为:如果表达式1的值为真,则以表达式2 的值作为整个条件表达式的值,否则以表达式3的值作为整个条件表达式的值。条件表达式通常用于赋值语句之中。

#include <stdio.h>
int main()
{
	int a, b, max;
	printf("请输入两个整数:");
	scanf("%d %d",&a,&b);
	/*if (a > b) {
		max = a;
	}
	else{
		max = b;
	}
	printf("max=%dn",max);*/

	printf("max=%dn",a>b?a:b);//与注释部分等价
	return 0;
}
//运行结果
请输入两个整数:23 45
max=45

       使用条件表达式时,还应注意以下几点:
       1) 条件运算符的优先级低于关系运算符和算术运算符,但高于赋值符。

       2) 条件运算符?和:是一对运算符,不能分开单独使用。

       3) 条件运算符的结合方向是自右至左。例如:a>b ? a : c>d ? c : d;应理解为:a>b ? a : ( c>d ? c : d );

二、循环结构

       1.while循环

       while循环

       while循环的一般形式为:

while(表达式){
    语句块
}
先计算“表达式”的值,当值为真(非0)时, 执行“语句块”;执行完“语句块”,再次计算表达式的值,如果为真,继续执行“语句块”……这个过程会一直重复,直到表达式的值为假(0),就退出循环,执行 while 后面的代码。
我们通常将“表达式”称为循环条件,把“语句块”称为循环体,整个循环的过程就是不停判断循环条件、并执行循环体代码的过程。
//1~100之和
#include <stdio.h>
int main()
{
	int i = 1, sum = 0;
	while (i <= 100){
		sum += i;
		i++;
	}
	printf("1+2+3+...+99+100=%dn",sum);
	return 0;
}
//运行结果:1+2+3+...+99+100=5050
代码分析:
1) 程序运行到 while 时,因为 i=1,i<=100 成立,所以会执行循环体;执行结束后 i 的值变为 2,sum 的值变为 1。
2) 接下来会继续判断 i<=100是否成立,因为此时 i=2,i<=100 成立,所以继续执行循环体;执行结束后 i 的值变为 3,sum 的值变为3。
3) 重复执行步骤 2)。
4) 当循环进行到第100次,i 的值变为 101,sum 的值变为5050;因为此时 i<=100 不再成立,所以就退出循环,不再执行循环体,转而执行while循环后面的代码。

       while 循环的整体思路是这样的:设置一个带有变量的循环条件,也即一个带有变量的表达式;在循环体中额外添加一条语句,让它能够改变循环条件中变量的值。这样,随着循环的不断执行,循环条件中变量的值也会不断变化,终有一个时刻,循环条件不再成立,整个循环就结束了。

       如果循环条件中不包含变量,分为两种情况:1) 循环条件永远为真,while 循环会一直执行下去,永不结束,成为“死循环”。2)循环条件永远为假,while 循环一次也不会执行。

       do-while循环

       除了while循环,在C语言中还有一种 do-while 循环,do-while循环的一般形式为:

do{
    语句块
}while(表达式);//注意最后的分号;,这个必须要有。
//do-while计算1~100之和
#include <stdio.h>
int main()
{
	int i = 1, sum = 0;
	do{
		sum += i;
		i++;
	} while (i <= 100);//注意最后的分号;,这个必须要有。
	printf("1+2+3+...+99+100=%dn",sum);
	return 0;
}
//运行结果:1+2+3+...+99+100=5050

        do-while循环与while循环的不同在于:它会先执行“语句块”,然后再判断表达式是否为真,如果为真则继续循环;如果为假,则终止循环。因此,do-while 循环至少要执行一次“语句块”。

       2.for循环

       for 循环的一般形式为:

for(表达式1; 表达式2; 表达式3){
    语句块
}
它的运行过程为:
1) 先执行“表达式1”。
2) 再执行“表达式2”,如果它的值为真(非0),则执行循环体,否则结束循环。
3) 执行完循环体后再执行“表达式3”。
4) 重复执行步骤 2) 和 3),直到“表达式2”的值为假,就结束循环。
上面的步骤中,2) 和 3) 是一次循环,会重复执行,for 语句的主要作用就是不断执行步骤 2) 和 3)。

       “表达式1”仅在第一次循环时执行,以后都不会再执行,可以认为这是一个初始化语句“表达式2”一般是一个关系表达式,决定了是否还要继续下次循环,称为“循环条件”“表达式3”很多情况下是一个带有自增或自减操作的表达式,以使循环条件逐渐变得“不成立”。由此我们可以总结出for循环的一般形式:

for(初始化语句; 循环条件; 自增或自减){
    语句块
}
//for循环计算1~100之和
#include <stdio.h>
int main()
{
	int i , sum = 0;
	for (i = 1; i <= 100; i++){
		sum += i;
	}
	printf("1+2+3+...+99+100=%dn",sum);
	return 0;
}
//运行结果:1+2+3+...+99+100=5050
代码分析:
1) 执行到 for 语句时,先给 i 赋初值1,判断 i<=100 是否成立;因为此时 i=1,i<=100 成立,所以执行循环体。循环体执行结束后(sum的值为1),再计算 i++。
2) 第二次循环时,i 的值为2,i<=100 成立,继续执行循环体。循环体执行结束后(sum的值为3),再计算 i++。
3) 重复执行步骤 2),直到第101次循环,此时 i 的值为101,i<=100 不成立,所以结束循环。

       for 循环中的“表达式1(初始化条件)”、“表达式2(循环条件)”和“表达式3(自增或自减)”都是可选项,都可以省略(但分号;必须保留)。

       1) 修改“从1加到100的和”的代码,省略“表达式1(初始化条件)”:,可以看到,将i=1移到了 for 循环的外面。

int i = 1, sum = 0;
	for (; i <= 100; i++){
		sum += i;
	}

       2) 省略了“表达式2(循环条件)”,如果不做其它处理就会成为死循环:,循环条件永远成立,循环会一直进行下去,永不结束。死循环对程序的危害很大,一定要避免!!!

int i, sum = 0;
	for (i=1; ; i++){
		sum += i;
	}
等价于
i=1;
while(1){
    sum=sum+i;
    i++;
}

       3) 省略了“表达式3(自增或自减)”,就不会修改“表达式2(循环条件)”中的变量,这时可在循环体中加入修改变量的语句:

for (i=1; i <= 100; ){
		sum += i;
		i++;
	}

       4) 省略了“表达式1(初始化语句)”“表达式3(自增或自减)”

int i=1, sum = 0;
	for (; i <= 100; ){
		sum += i;
		i++;
	}
等价于
while(i<=100){
    sum=sum+i;
    i++;
}

       5) 3个表达式可以同时省略

for( ; ; )  语句 <=> while(1)  语句

       6) “表达式1”可以是初始化语句,也可以是其他语句:

int i=1, sum ;
	for (sum = 0; i <= 100; i++){
		sum += i;
	}

       7) “表达式1”和“表达式3”可以是一个简单表达式也可以是逗号表达式

for( sum=0,i=1; i<=100; i++ )  sum=sum+i;
或
for( i=0,j=100; i<=100; i++,j-- )  k=i+j;

       8) “表达式2”一般是关系表达式或逻辑表达式,但也可是数值或字符,只要其值非零,就执行循环体:

for( i=0; (c=getchar())!='n'; i+=c );
又如:
for( ; (c=getchar())!='n' ; )
    printf("%c",c);

       3.break和continue

       使用while或for循环时,如果想提前结束循环(在不满足结束条件的情况下结束循环),可以使用breakcontinue关键字。

       当 break 关键字用于 while、for循环时,会终止循环而执行整个循环语句后面的代码。break 关键字通常和 if 语句一起使用,即满足条件时便跳出循环。在多层循环中,一个 break 语句只向外跳一层。

//输出m*n的整数矩阵
#include <stdio.h>
int main()
{
	int i = 1, j;
	while (1){
		j = 1;
		while (1){
			printf("%d*%d=%-4d",i,j,i*j);
			j++;
			if (j > 9) break;
		}
		printf("n");
		i++;
		if (i > 5) break;
	}
	return 0;
}
//运行结果
1*1=1   1*2=2   1*3=3   1*4=4   1*5=5   1*6=6   1*7=7   1*8=8   1*9=9
2*1=2   2*2=4   2*3=6   2*4=8   2*5=10  2*6=12  2*7=14  2*8=16  2*9=18
3*1=3   3*2=6   3*3=9   3*4=12  3*5=15  3*6=18  3*7=21  3*8=24  3*9=27
4*1=4   4*2=8   4*3=12  4*4=16  4*5=20  4*6=24  4*7=28  4*8=32  4*9=36
5*1=5   5*2=10  5*3=15  5*4=20  5*5=25  5*6=30  5*7=35  5*8=40  5*9=45
//解析:当 j>9 成立时,执行break;,跳出内层循环;外层循环依然执行,直到 i>5 成立,跳出外层循环。内层循环共执行了9次,外层循环共执行了5次。

       continue 语句的作用是跳过循环体中剩余的语句而强制进入下一次循环。continue语句只用在 while、for 循环中,常与 if 条件语句一起使用,判断条件是否成立。

#include <stdio.h>
int main()
{
	char c = 0;
	while (c != 'n'){  //回车键结束循环
		c = getchar();
		if (c == '4' || c == '5'){  //按下的是数字键4或5
			continue;   //跳过当次循环,进入下次循环
		}
		putchar(c);
	}
	return 0;
}
//运行结果:
123456789
1236789
//解析:本例我们输入的是123456789,当读取到4或5时,if 的条件c=='4'||c=='5'成立,就执行 continue 语句,结束当前循环,直接进入下一次循环,也就是说putchar(c);不会被执行到。而读取到其他数字时,if 的条件不成立,continue 语句不会被执行到,putchar(c);就会输出读取到的字符。

       总结:break与continue的对比:break 用来结束所有循环,循环语句不再有执行的机会;continue 用来结束本次循环,直接跳到下一次循环,如果循环条件成立,还会继续循环。

三、选择结构循环结构总结

       1.选择结构

       1.选择结构(分支结构)涉及到的关键字包括 if、else、switch、case、break,还有一个条件运算符表达式1?表达式2:表达式3(这是C语言中唯一的一个三目运算符)。其中,if...else 是最基本的结构,switch...case 和表达式1?表达式2:表达式3都是由 if...else 演化而来,它们都是为了让程序员书写更加方便。
       2.可以只使用 if,也可以 if...else(if...else if...else if...) 配对使用。另外要善于使用 switch...case 和? :,有时候它们看起来更加清爽。
       3.if...else 可以嵌套使用,原则上嵌套的层次(深度)没有限制,但是过多的嵌套层次会让代码结构混乱。

       2.循环结构

       C语言中常用的循环结构有while 循环for 循环,它们都可以用来处理同一个问题,一般可以互相代替。
       1.对于 while 和 do-while 循环,循环体中应包括使循环趋于结束的语句。对于 while 和 do-while 循环,循环变量的初始化操作应该在 while 和 do-while 语句之前完成,而 for 循环可以在内部实现循环变量的初始化。
       2.for 循环是最常用的循环,它的功能强大,一般都可以代替其他循环。
       3.要注意 break 和 continue 关键字用于循环结构时的区别:

          ①break 用来跳出所有循环,循环语句不再有执行的机会;

          ②continue 用来结束本次循环,直接跳到下一次循环,如果循环条件成立,还会继续循环。

       此外,break 关键字还可以用于跳出 switch...case 语句。所谓“跳出”,是指一旦遇到 break,就不再执行 switch 中的任何语句,包括当前分支中的语句和其他分支中的语句;也就是说,整个 switch 执行结束了,接着会执行整个 switch 后面的代码。

 

 

参考文献:C语言中文网

最后

以上就是合适芒果为你收集整理的选择和循环结构的全部内容,希望文章能够帮你解决选择和循环结构所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部