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;
}
结果如下:
执行顺序如下: