【C语言跬步积累】——分支和循环总汇

目录

一.if语句(分支语句)

1.语法

2.例析

例1:(初级)

 例2:(初级)

例3:(初级)

例4:(实例运用)

例5:(实例运用)

例6:(进阶)

3.练习

(1)判断一个数的奇偶

(2)输出1-100之间的奇数

二.switch语句(分支语句)

1.语法

2.什么是语句项

3.例析:

 例1:(初级)

 例2:(初级)

 例3:(进阶)

 4.练习

三.while循环(循环语句)

1.语法

 2.例析

例1:(初级)

例2.(while循环中break作用)

例3:(while循环中continue的作用)

例4:(while循环中getchar和putchar用法)

例5:(while循环中getchar和putchar的用法)

四.for循环

1.语法

2.例析

 例1:(打印1-10,和while循环做对比)

 例2.(for循环中break作用)

 例3.(for循环中continue的作用)

3.for语句的循环控制变量的一些建议

 例1:

 例2:


一.if语句(分支语句)

1.语法

(1)

if(表达式)

               语句;

(2)

if(表达式)

               语句1;

         else

               语句2;

(3)

if(表达式1)

               语句1;

         else if(表达式2)

               语句2;

               ……

         else

               语句n;

2.例析

例1:(初级)

#include<stdio.h>
int main()
{
int a=6;
if(a<10)
printf("%d\n",a);
return 0;
}

输出结果

分析

if后面的是条件语句只有符合()内的内容才会进入下一步———打印出a的值,如果不符合则会跳过该语句,该段代码中如果a取值为11,则会跳过printf("%d\n",a);直接到return 0;

如下图所示: 

例2:(初级)

#include<stdio.h>
int main()
{
int a=6;
int b=10;
if(a>b)
printf("%d\n",a);
else
printf("%d\n",b);
return 0;
}

输出结果

分析

 该段代码可以用来判断两个数的大小,if后面的条件句如果成立,则会打印出a,即当a>b时会打印出a,当a<b时,则if后面的条件不成立了,则会跳过if后面的语句,进入else,打印出b,即a<b时会打印出b。if……else……语句用来判断两个条件,当遇到多个条件需要判断时,则需要用到例3的语句。

例3:(初级)

#include<stdio.h>
int main()
{
int a=0;
int b=6;
int c=8;
scanf("%d",&a);
if(a<b)
printf("得一分\n");
else if(a>c)
printf("得两分\n");
else
printf("失败\n");
return 0;
}

 输出结果

 

 分析:

当涉及到多个数据判断时就可以使用if……else if……else(中间的else if可以有很多个但后面需要加上条件句,最后一个else则看需求加。

例4:(实例运用)

#include<stdio.h>
int main()
{
int a=0;
int b=0;
int c=0;
scanf("%d%d%d",&a,&b,&c);
if(a>b>c && a>c>b)
printf("最大的数为:%d\n",a);
else if(b>a>c && b>c>a)
printf("最大的数为:%d\n",b);
else
printf("最大的数为:%d\n",c);
return 0;
}

输出结果

 分析

用if语句来判断最大值和最小值最重要的是判断句的设置,当数据较多时不太建议用if语句来判断大小,当然if语句还有其他很多作用,具体如下

例5:(实例运用)

#include<stdio.h>
int main()
{
int age=0;
printf("请输入您的年龄:");
scanf("%d",&age);
if(age<18)
printf("未成年禁止入内!\n");
else
printf("您已成年,可以开始学c了!\n");
return 0;
}

输出结果

 分析

首先先通过printf打印出“请输入您的年龄:”来增强互动性

 然后使用scanf来实现输入数字,进一步提高了互动性

之后就是通过if……else……语句来进行判断

例6:(进阶)

#include<stdio.h>
struct student
{
long number;//学号
char name[20];//姓名
char class[20];//班级
int score;//成绩
}student1,student2;
int main()
{
scanf("%ld %s %s %d",&student1.number,student1.name,student1.class,&student1.score);
scanf("%ld %s %s %d",&student2.number,student2.name,student2.class,&student2.score);
if(student1.score>student2.score)
printf("优秀学生为:%ld %s %s %d",student1.number,student1.name,student1.class,student1.score);
else
printf("优秀学生为:%ld %s %s %d",student2.number,student2.name,student2.class,student2.score);
return 0;
}

输出结果

分析

  1. 框架:结构体(struct)+  if语句
  2. 在这里介绍一种新的方法定义结构体类型:(以代码形式来展现)      第一个是在声明类型的同时定义变量                                                                             第二种是先声明结构体类型,在定义该类型的变量                                                          具体的结构体可以看这位博主的文章,写的很详细实用http://t.csdn.cn/TZxS5        
  3. 思路:通过结构体创建出学生的基本信息(number,name,class,score),再通过if语句进行判断,这里使用scanf可以自己输入学生信息,方便修改,也可以使用printf将数据输入好直接判断,从而选出优秀学生

3.练习

(1)判断一个数的奇偶

#include<stdio.h>
int main()
{
int a=0;
scanf("%d",&a);
if(a%2==1)
printf("奇数");
else
printf("偶数");
return 0;
}

输出结果

 思路

  1. 审题:判断一个数的奇偶
  2. 问:如何判断,如何输出奇偶
  3. 答:用if语句进行判断,思考奇数和偶数之间的差异:奇数除以2余数为1,偶数除以2余数为0

(2)输出1-100之间的奇数

#include<stdio.h>
int main()
{
int a=1;
while(a<101)
{
if(a%2==1)
printf(" %d",a);
a++;
}
return 0;
}

输出结果

 思路:

  1. 审题:输出1-100奇数
  2. 问:如何输出1-100,如何输出奇数
  3. 答:运用while循环输出1-100,通过if判断语句输出奇数
  4. 细节:printf(" %d",a);红色填充部位有一个空格,这样输出的数不会紧靠在一起,看起来更舒服,当然也可以使用\n进行换行

二.switch语句(分支语句)

1.语法

switch(整型表达式)

{

语句项;

}

2.什么是语句项

语句项是一些case语句

case 整型常量表达式

         语句;

3.例析:

如果用过输入1、2、3、4、5、6、7来输出星期几,很多人可能会想到用if语句,如下:

例1:(初级)

#include<stdio.h>
int main()
{
int day=0;
scanf("%d",&day);
if(1==day)//这里使用1==day可以避免当==误写成=而导致程序可以运行但结果错误的现象,因为当你误写成1=day时程序会报错,你就可以通过报错的内容来找到原因
printf("星期一\n");
else if(2==day)
printf("星期二\n");
else if(3==day)
printf("星期三\n");
else if(4==day)
printf("星期四\n");
else if(5==day)
printf("星期五\n");
else if(6==day)
printf("星期六\n");
else if(7==day)
printf("星期日\n");
return 0;
}

输出结果

 以上是使用if语句实现的,这种多分支的情况也可以使用switch语句,例如:

#include<stdio.h>
int main()
{
int day=0;
scanf("%d",&day);
switch(day)//进入的入口
{
case 1:
printf("星期一\n");
break;//break是出去的出口,如果没有break那么代码执行时就不会停止,会继续往下执行,也就是说当你输入5时,输出的结果不仅会有星期五,还会有星期六和星期日
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;
}
return 0;
}

输出结果

 分析

  • switch会判断后面()内的内容是几,判断之后会从case的表达式中选一个对应的进去,遇到break之后就会跳出switch语句
  • 在switch语句中,我们没法直接实现分支,搭配break使用才能实现真正的分支

注意点:

  1. switch后面()内的必须是整型表达式,即需要是int来定义
  2. case后面也必须是整型,且是常量表达式,即需要是1、2、3……

错误示例1

#include<stdio.h>
int main()
{
float day=0.1;//这里将int换成float,其他不变
scanf("%d",&day);
switch(day)
{
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;
}
return 0;
}

报错结果

 错误示例2

#include<stdio.h>
int main()
{
int day=0;
int n=1;//定义一个整型变量n
scanf("%d",&day);
switch(day)
{
case n://用整型变量n代替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;
}
return 0;
}

报错结果

 例2:(初级)

当我们想输入1、2、3、4、5时输出工作日,输入6、7时输出休息日时,也可以使用switch语句,只需要将上面的代码稍微改一下

#include<stdio.h>
int main()
{
int day=0;
scanf("%d",&day);
switch(day)
{
case 1://此时后面不需要加break
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
}
return 0;
}

输出结果

 分析

当case语句中有内容重复时,我们将其合并

 例3:(进阶)

#include<stdio.h>
int main()
{
int day=0;
scanf("%d",&day);
switch(day)
{
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("输入错误");
break;
}
return 0;
}

输出结果

分析

这里加上defoult可以避免输入者输入的数字超出case语句范围时,输出没有反应的状况,加上defoult之后,当你输入的数字超出范围时会有对应的输出提示你 ,当然defoult并不是必须每个switch语句都需要用到,使用情况看个人需求,并且break放置的位置是任意的,可以放在最前面。个人建议每个switch语句中都放一条defoult子句,并且后面加上一个break,这是个好习惯,有利于之后的编程学习

 注意

在使用switch语句时,很多人会因为怕麻烦,在最后一个case语句后面不加break,这是个坏习惯,因为当你写了一个程序,最后一个case后面没有加上break,然后有一天另一个程序员需要在这段代码后面加上一个case语句,很可能会没有注意上一个case语句没有加上break,导致这两个case语句会发生逻辑上的重叠,如下:

#include<stdio.h>
int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
	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
	case 8://当新添加另一个case语句时就会发生逻辑上的错乱,即当你输入7时会输出case 7和case 8的内容
		printf("星期八\n");
		break;
	}
	return 0;
}

输出结果

 4.练习

#include<stdio.h>
int main()
{
int n=1;
int m=2;
switch(n)
{
case 1:
m++;
case 2:
n++;
case 3:
switch(n)//switch允许嵌套使用
{
case 1:
n++;
case 2:
m++;
n++;
break;
}
case 4:
m++;
break;
defoult:
break;
}
printf("m=%d,n=%d\n",m,n);
return 0;
}

请问输出的结果是什么?

答案

 分析

  1. 首先进入switch语句的判断,因为定义n=1,所以进入case 1,并执行m++,m变成3
  2. 因为case 1后面没有加break,所以进入case 2,执行n++,n变成2
  3. 用样的,case 2后面也没有加break,继续进入case 3,case 3当中又是一个switch语句,此时n=2,所以进入case 2,执行m++,n++,m变成4,n变成3
  4. case 2后面的break是结束第二个switch语句中case 2的,而不是第一个switch语句中的case 3,从第二个switch语句中出来,因为第一个switch语句中case 3后面并没有break,所以继续进入case 4,执行m++,m变成5,然后遇到break,跳出switch语句
  5. 跳出switch语句后遇到printf 进行打印,所以输出的内容为m=5,n=3

三.while循环(循环语句)

1.语法

while(表达式)//表达式为真时执行循环语句

         {

           语句;

         }

 while语句执行流程:

 2.例析

例1:(初级)

#include<stdio.h>
int main()
{
int a=1;
while(a<11)
{
printf("%d\n",a);
a++;
}
return 0;
}

输出结果

 使用while循环可以很方便的打印出1-10以内的数

分析

  1. while后面括号内的内容即表达式,当表达式成立时会进入while循环,不成立时会跳出while循环
  2. 在这里a定义的是1,符合a<11这一表达式,进入while循环
  3. 进入之后执行相关语句,首先遇到printf打印出a的值,即打印1
  4. 继续往下执行遇到a++,a变成2,此时语句以全部执行完,这时会重新回到while循环的开头重新判断表达式是否成立,a仍然小于11,继续执行
  5. 直到a=11时,不再满足表达式,就不会进入while执行相关语句,即while循环结束

例2.(while循环中break作用)

#include<stdio.h>
int main()
{
int a=1;
while(a<=10)
{
if(5==a)
break;
printf("%d ",a);
a++;
}
return 0;
}

输出结果

 分析

  1. 首先a=1,符合while循环条件,进入循环,但不满足if语句的条件,跳过if语句,即不执行break,
  2. 跳过break之后遇到printf,打印1
  3. 然后继续执行,a++,a变成2,再返回while循环重新判断表达式是否成立,然后继续上述操作
  4. 当a=5时,符合表达式,进入while循环,同时符合if语句,执行break,执行break之后会跳出while循环,执行return 0

小结

当我们之后循环需要在遇到哪个值停止时,就可以使用break

例3:(while循环中continue的作用)

#include<stdio.h>
int main()
{
int a=1;
while(a<=10)
{
if(5==a)
continue;
printf("%d ",a);
a++;
}
return 0;
}

输出结果

 分析

很多人看到输出结果会认为continue和break的作用一样,毕竟都是输出的1,2,3,4。

但你仔细对比观察会发现两者的区别:continue的输出界面并没有按任意键关闭此窗口,这能够说明什么呢?说明程序并没有终止,而是死循环了。

原先遇到break时会跳出while循环,直接到return 0;那里,但continue则不是跳出循环,当执行到continue时,程序会回到while(a<=10);那里,此时a=5,进入while循环,然后又遇到if语句,符合if语句的判断条件,执行continue,再次返回到while循环开头,a=5,进入循环,又遇到if,符合if语句判断条件,执行continue,再次返回while,一次往复,所以输出界面只会输出1,2,3,4,并且程序没有结束

continue和break的区别

  • continue是结束本次循环,也就是说后面的代码不会再执行,而是直接跳转到while语句的判断部分,进行下一个循环的入口判断
  • break是结束所有循环,用于永久终止循环

为了方便大家理解,我将代码稍微改动一下

#include<stdio.h>
int main()
{
int a=0;
while(a<=10)
{
a++;
if(5==a)
continue;
printf("%d ",a);
}
return 0;
}

输出结果

 分析

前面1-4的输出过程我就不再赘述了,当a=4时,符合while循环,进入循环,遇到a++,a变成了5,再遇到if语句,此时正好满足if语句的条件,执行continue,跳过本次循环(即不执行后面的printf,所以不会输出5),直接进入下一个循环,a=5符合循环条件,进入循环,a++,a变成了6,不满足if语句的条件,跳过continue,执行printf,打印出6,之后的过程就和打印1、2、3、4一样

例4:(while循环中getchar和putchar用法)

#include<stdio.h>
int main()
{
int a=0;
while((a=getchar())!=EOF)
{
putchar(a);
}
return 0;
}

输出结果

 分析

  • while 括号内的内容表示当a=EOF时循环结束,getchar是输入,putchar是输出,putchar可以接受getchar的内容
  • a=getchar()是输入一个值给a
  • (a=getchar())!=EOF是判断a的值是否为EOF,如果是则结束循环,如果不是则进入循环,执行putchar,将a的值打印出来
  • 细心的人发现输入EOF时,仍会打印出EOF,并不会结束。因为EOF是三个字符,getchar会读取三次,读取E打印E,读取O打印O,读取F打印F,所以并不会停止
  • 想要停止时,按住键盘中的Ctrl+z,再按回车就可以停止了
  • EOF是end of file的缩写,对应的值是-1

例5:(while循环中getchar和putchar的用法)

#include<stdio.h>
int main()
{
while((a=getchar())!=EOF)
{
if(a<'0'||a>'9')
continue;
putchar(a);
}
return 0;
}

输出结果

 分析

getchar和putchar的用法在例4已经讲过了,这里给大家介绍一下if里面的判断句这个是之前没什么介绍过的。

a<'0'||a>'9';:'0'和'9'表示字符0和字符9,即ASCII中的数字0~9

 ||是或的意思

结合起来这段代码的意思就是a小于字符0或者大于字符9,即当a等于0~9时if语句不成立,执行putchar,这也就是为什么输入a时不会打印而输入1时会打印的原因

四.for循环

1.语法

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

       循环语句;

表达式1初始化部分,用于初始化循环变量的。表达式2条件判断部分,用于判断循环什么终止。表达式3调整部分,用于循环条件的调整。可以用过下面的代码来理解其中的意思

#include<stdio.h>
int main()
{
int a=0;//初始化
while(a<10)//判断
{
printf("%d\n",a);
a++;//调整
}
return 0;
}

其实每一个循环语句都可以解决所有的循环问题,那为什么还要介绍for循环,while循环,do……while循环呢?在我们之后写代码的过程中用的最多的循环是for循环,其次是while循环,do……while循环是用的比较少的,但每个循环都有各自的格式,不同情况下可以选择不同的语句。

我们现在写的代码比较短,所以他们之间的利弊并不能很好的体现,当我们之后写循环时初始化、判断和调整的部分代码特别多时for循环就能够发挥它的优势,因为我们之后写循环无非是在初始化、判断和调整的部分进行改动,所以当代码特别长时,while循环就特别难找到相应的位置,而for循环就可以很好的解决这一点。

2.例析

例1:(打印1-10,和while循环做对比)

#include<stdio.h>
int main()
{
int a=0;//仍然需要定义变量,只有先定义了变量,后面的初始化才能够使用这个变量
for(a=1;a<=10;a++)//初始化、判断、调整放在了一起
{
printf("%d\n",a);
}
return 0;
}

输出结果

 分析

if循环和while循环最大的区别就在于if循环将初始化、判断和调整部分放在了一起,方便我们之后改动,其他方面和while循环没有太大的区别

首先先初始化(a=1;),初始化之后进行判断(a<=10;),如果条件为真进入{ }内执行(printf(“%d\n",a);),执行之后进行调整(a++),调整之后再回到判断那里进行判断以此往复,直到条件为假,结束循环

 for循环流程

 例2.(for循环中break作用)

#include<stdio.h>
int main()
{
int a=0;
for(a=1;a<=10;a++)
{
if(5==a)
break;
printf("%d\n",a);
}
return 0;
}

输出结果

分析

break的作用在for循环和while循环中的作用相同,都是直接终止循环

 例3.(for循环中continue的作用)

#include<stdio.h>
int main()
{
int a=0;
for(a=1;a<=10;a++)
{
if(5==a)
continue;
printf("%d\n",a);
}
return 0;
}

输出结果

分析

 continue在while循环时,如果代码没处理好会出现死循环,而for循环就不会出现这样的情况,原因如下:

当a=5时,continue会回到④,而不会像while循环是回到②,所以不会出现死循环 

3.for语句的循环控制变量的一些建议

  1. 不可在for循环体内修改循环变量,防止for循环失去控制。
  2. 建议for语句的循环循环控制变量的取值采用“前闭后开区间”写法。

例1:

#include<stdio.h>
int main()
{
int a=0;
for(a=0;a<10;a++)
{
if(a=5)//这里不是a判断等于5,而是a赋值等于5,这样就相当于在循环体内修改循环变量
printf("haha\n");
printf("hehe\n");
}
return 0;
}

输出结果

 分析

在循环体内修改循环变量就会导致出现这样的死循环,一直打印hehe和haha

 例2:

#include<stdio.h>
int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,10};//整型数组
int a=0;
for(a=0;a<10;a++)//左闭是指a=0,右开是指a<10,如果是a<=9那么就不是右开,而是右闭
{
printf("%d\n",arr[a]);
}
}

输出结果

 分析

  • 这里用到了整型数组,目的是让大家再回忆一下怎么使用,具体的看这篇文章http://t.csdn.cn/SwCLi,这里就旨在唤醒记忆,不再过多赘述
  • 其中的开闭可以理解成是否有=,有=则为闭,没有则为开
  • 好处:右开之后那个数字就会有一定的意义
  • 如a<10中的10可理解成10次循环,10次打印,10个元素

 练习:

请问循环要循环多少次?

#include<stdio.h>
int main()
{
int a=0;
int b=0;
for(a=0,b=0;b=0;a++,b++)
    b++;
return 0;
}

答案:0次

 分析

  1. 首先先a赋值为0,b赋值为0
  2. 然后进行判断,但是b=0并不是判断,而是赋值,b赋值之后为0,0为假,所以不会再往下运行,直接跳出循环

五.do…while()循环

1.语法

do

      循环语句;

while(表达式);

2.例析

例1:

#include<stdio.h>
int main()
{
int a=0;
do
{
printf("%d ",a);
a++;
}
while(a<=10);
return 0;
}

输出结果

分析

首先定义a=0,进入do语句 ,打印0,然后a++,a变成了1,a<=10成立,返回do语句,打印1,然后a++,符合a<=10,继续返回do,一直到a=10时,打印10,a++,a变成了11,条件为假,跳出循环

 例2:

#include<stdio.h>
int main()
{
int a=1;
do
{
if(a==5)
continue;
printf("%d ",a);
a++;
}
while(a<=10);
return 0;
}

输出结果

 分析

这个和之前一个代码一样,会陷入死循环,原因时当a=5时跳出do语句,来到while语句判断,判断为真,再进入do语句然后if的判断语句又为真,执行continue,以此往复

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PH_modest

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值