C——分支和循环

C语言是结构化的程序设计语言,结构化指的是顺序结构、选择结构、循环结构。

那么分支和循环又是什么呢?

分支和循环主要依附于控制语句,什么是控制语句呢?

控制语句是用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成。

 C 语言有九种控制语句,可分成以下三类:
(1)条件判断语句(分支结构): if 语句、 switch 语句;
(2)循环执行语句: do while 语句、 while 语句、 for 语句;
(3) 转向语句: break 语句、 goto 语句、 continue 语句、 return 语句。

分支和循环是两种结构,我们可以使用if语句、switch语句实现分支结构;使用for语句、while语句、do while语句实现循环结构。

一、分支结构

好,那现在跟我一起来看一下分支结构吧!

讲分支结构就要先说说if语句了

1.1if语句

语法结构:

if(表达式)
   语句

表达式为真,则执行语句;表达式不成立语句则不执行。

if语句中的“表达式”可以是关系表达式、逻辑表达式,甚至是数值表达式。关系表达式就是两个数值进行比较的式子。

那么什么是真什么是假呢?

在C语言中,0为假,非0则真。

eg:输入两个数,a>b,则输出a,否则就不输出

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

(1)输入a=3,b=7 ,显然3<7,表达式(a>b)为假,则不执行语句,结果如下

(2)输入a=3,b=1,3>1,表达式(a>b)为真,则执行语句,结果如下:

1.2 if …else…语句

语法结构

if(表达式)
  语句1;
else
  语句2;

如果表达式的结果为真,则执行语句1,为假则执行语句2. 

eg:输入两个数,a>b,则输出a,否则输出b

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

(1)输入a=3,b=7 ,显然3<7,表达式(a>b)为假,不执行语句1,执行语句2,结果如下:

(2)输入a=3,b=1,3>1,表达式(a>b)为真,则执行语句1,结果如下:

 1.3分支中包含多条语句

你会发现以上分支中只有一条语句,那如果有两条或者多条语句,我们又该怎么办,结果又是怎样的呢?

我们现在先来试一下包含两条语句的分支,eg:

#include<stdio.h>
int main()
{
	int grade = 0;
	scanf("%d", &grade);
	if ( grade> 60)
		printf("及格\n");
	    printf("不用补考了\n");
		return 0;
}

好,现在让我们来看一下结果如何

誒,这是怎么回事?怎么不及格也不用补考了呀? 这不符合常理啊!

好,其实是这样子的,C语言默认在 if 和 else 语句中默认都只控制一条语句。就是printf("及格\n");if 语句为真,则打印 及格 了,if 语句为假,则不打印,对于语句 printf("不用补考了\n");是独立存在的,无论if语句表达式的真假,都会被执行。我现在,要 if 语句同时控制2条语句怎么办呢?那就要用{ } 把语句括起来,当然 else 语句后也可以跟上{ }

现在来跟着我一起来要不及格补考吧!

#include<stdio.h>
int main()
{
	int grade = 0;
	scanf("%d", &grade);
	if (grade > 60)
	{
		printf("及格\n");
		printf("不用补考了\n");
	}
	else
	{
		printf("不及格\n");
		printf("补考\n");
	}

		return 0;
}

(1)输入 98 ;输出 及格 不用补考了

(2)输入 45 ;输出 不及格 补考

1.4 嵌套 if 语句

在 if…else…语句中 else 与另一个 if 语句连用,构成嵌套的 if 语句

eg:输入一个整数,判断输入的整数是0,还是正数或者是负数。代码如下:

#include<stdio.h>
int main()
{
	int a = 0;
	scanf("%d", &a);
	if (a == 0)
		printf("输入的数字是0\n");
	else if (a > 0)
		printf("输入的数字是正数\n");
	else
		printf("输入的数字是负数\n");

	return 0;
}

       这个是在 else 语句中的嵌套,那么在 if 语句中同样也可以嵌套

eg:输入一个整数,如果是正数,在判断是奇数还是偶数,否则就输出非正数

#include<stdio.h>
int main()
{
	int a = 0;
	scanf("%d", &a);
	if (a > 0)
	{
		if (a % 2 == 0)
			printf("输入的数字是偶数\n");
		else
			printf("输入的数字是奇数\n");
	}
	else
		printf("输入的数字是非正数\n");

	return 0;
}

来一个更复杂的吧

eg:1.输入一个人的成绩;

      2.如果成绩小于60,打印"不及格";

      3.如果成绩在60-70之间,打印"及格";

      4.如果成绩在70-80之间,打印"良好";

      5.如果成绩在80-90之间,打印"优秀";

      6.如果成绩大于90,打印"特优";

代码如下:

int main()
{
	int grade = 0;
	scanf("%d", &grade);
	if (grade < 60)
		printf("不及格\n");
	else if (grade <70)
		printf("及格\n");
	else if(grade < 80)
		printf("良好\n");
	else if (grade < 90)
		printf("优秀\n");
	else 
		printf("特优\n");
	return 0;

}

当然可以把{ } 加上,代码如下:

#include<stdio.h>
int main()
{
	int grade = 0;
	scanf("%d", &grade);
	if (grade < 60)
	{
	    printf("不及格\n");
    }    
	else
	{
		if (grade < 70)
		{
			printf("及格\n");
		}
		else
			if (grade < 80)
			{
				printf("良好\n");
			}
			else
			{
				if (grade <90)
				{
					printf("优秀\n");
				}
				else
				{
					printf("特优\n");
				}
			}
	}
	return 0;

}

1.5  else 悬空的问题

先看一段代码

#include<stdio.h>
int main()
{
	int a = 3;
	int b = 2;
	if (a == b)
		if (b == 2)
			printf("haha\n");
	else
			printf("heiehi\n");

	return 0;
}

 这段代码运行的结果是什么呢?你是否是这样想的:3!=2,直接执行else 语句打印"heihei"吗?结果如下:

咦 什么也没打印出来 这是怎么回事?

这就是else 的悬空问题,因为  else 语句总是跟最接近的 if 语句 相匹配的,而不是说else与哪个if对齐就与哪个if匹配。

所以说这个代码为什么什么也没有打印出来呢?else 语句与第二个if语句匹配,一起嵌套在第一个if 语句中的,判断(a==b)为假,程序就不执了。

要想实现 else 语句与第一个if语句匹配,可以这样写代码:

#include<stdio.h>
int main()
{
	int a = 3;
	int b = 2;
	if (a == b)
	{
	   if (b == 2)
		  printf("haha\n");
    }
    else
		printf("heiehi\n");

	return 0;
}

这样就可以打印出来 heihei 了。

2.switch 语句

2.1 语法结构

switch(expression)
{
   case value1:statement
   case value2:statement
   case value3:statement
   default:statement
}

注意:根据expression 不同的值,执行相应的case分支,如果找不到就执行default分支;

           expression必须为整形表达式;

           case 后的值必须为整形常量表达式;

           case 和后面的数字必须有空格;

           每一个case语句中的代码执行后,需要加上 break,才能跳出switch 语句。

eg :输入一个整数,打印对应的星期几。

比如:输入:1  输出:星期一  以此类推 到 输入:7 输出:星期日

#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;
	}
	return 0;
}

好 ,这个代码如果没有break结果怎样呢?

#include<stdio.h>
int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
	case 1:
		printf("星期一\n");
	case 2:
		printf("星期二\n");
	case 3:
		printf("星期三\n");
	case 4:
		printf("星期四\n");
	case 5:
		printf("星期五\n");
	case 6:
		printf("星期六\n");
	case 7:
		printf("星期日\n");
	}
	return 0;
}

 结果如下:

这是为什么呢?

只有在switch语句中使用break才能跳出switch语句,如果哪个case语句的后面没有break语句,代码会接着往下执行,直到遇到break才会结束或者switch 语句结束。

eg:  输入 1-5,输出"工作日";

       输入 6-7,输出"休息日".代码如下:

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

好了,现在问题来了,如果输入的整数大于7,无法匹配到case  语句的时候怎么办呢?这时候就需要在switch语句中加入default 语句了。default 语句在switch语句中是没有顺序要求的哦!

#include<stdio.h>
int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)
   {
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
        printf("工作日\n");
		break;
	case 6:
	case 7:
		printf("休息日\n");
		break;
    default:
    printf("输入错误\n");
    break;
	}
	return 0;
}

二、循环

1.while循环

1.1语法结构

while(表达式)
  语句

表达式为真则执行语句,反之不执行

#include<stdio.h>
int main()
{
   while(1)
      printf("hello\n");
 return 0;
}

 这个代码运行的结果是什么呢?

 这时候我们想到 if 语句,他们的语法结构很相似,用 if语句在这个代码是怎样的结果呢?

#include<stdio.h>
int main()
{
   if(1)
      printf("hello\n");
 return 0;
}

结果如下:

 ok 用while语句死循环的打印hello ,用if语句只打印一次,这就是他们之间的区别,while 可以实现循环的效果。

2.for 循环

2.1 语法结构

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

表达式1:循环变量的初始化

表达式2:判断循环结束条件

表达式3:调整循环变量

举个例子,打印1-10的值

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

结果如下:

那for循环是怎样执行的呢?

3.do while 循环

3.1 语法结构

do
   语句;
while(表达式);

while 和 for 循环都是先判断条件,条件为真则进入循环,执行语句,否则就跳出循环,而 do while 循环是先进入循环体,执行语句,然后再执行while 的表达式,表达式为真则进行下一次循环,为假则不继续循环。

eg:用do while 循环打印1-10的值

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

	return 0;
}

结果如下:

执行顺序如下:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值