文章目录
分支与循环(上)
if语句
if
- 常用格式:
if(表达式)
语句
注意:在c语言中,0–>结果为假—>语句不执行;非0–>结果为真–>语句执行
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num % 2 == 0)
printf("%d是偶数\n",num);
return 0;
}
要点:
- c语言规定,一个分号就是一条语句,而if是控制语句,它默认只能控制接下来的第一条语句,所以如果在if语句后面加了分号,则无论表达式是真是假,if语句都不执行任何命令。
else 语句
- 语法形式:
if(表达式)
语句1
else
语句2
示例1:num如果不是偶数就是奇数。
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num % 2 == 0)
printf("%d是偶数\n", num);
else
printf("%d是奇数\n", num);
return 0;
}
示例2:年龄>=18–>成年;<18–>未成年
#include<stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age>=18)
printf("成年\n");
else
printf("未成年\n");
return 0;
}
分支中包含多个语句
示例2拓展:
#include<stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age>=18)
printf("成年\n");
printf("可以谈恋爱了");
else
printf("未成年\n");
return 0;
}
报错:C2181–>没有匹配if的非法else。
原因:默认情况下,if和else的后边只能跟一条语句。如果要跟多条语句,可以放入花括号里。
正确代码:
#include<stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age >= 18)
{
printf("成年\n");
printf("可以谈恋爱了\n");
}
else
{
printf("未成年\n");
printf("禁止谈恋爱\n");
}
return 0;
}
注意:if后面使用的花括号,控制多条语句的这个块,也叫做程序块或者复合语句。
嵌套if语句
示例3:若num=0–>0,num<0–>负数,num>0–>正数
嵌套1:
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num == 0)
printf("输入的值为0\n");
else
{
if (num > 0)
printf("输入的值为正数\n");
else
printf("输入的值为负数\n");
}
return 0;
}
嵌套2:
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num == 0)
printf("输入值为0\n");
else if (num > 0)
printf("输入值为正数\n");
else
printf("输入值为负数\n");
return 0;
}
嵌套3:
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num >= 0)
{
if (num > 0)
printf("输入值为正数\n");
else
printf("输入值为0\n");
}
else
printf("输入值为负数\n");
return 0;
}
悬空else 问题
注意:如果有多个if和else—>else总是与最接近的if匹配
示例4: a = 1,b = 2 —>hehe , a = 1 , b不等于2 —>haha
#include<stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)
{
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
}
return 0;
}
示例5:a =1,b=2—>hehe , a不等于1—>haha
#include<stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
printf("hehe\n");
}
else
printf("haha\n");
return 0;
}
关系操作符
- 关系表达式:用于比较的表达式,通常返回0/1,表示真假(c语言中,0表示假,所有非0值表示真)
- 关系运算符:关系表达式中使用的运算符。
- 分类 : > 、 <、>=、 <= 、 == (相等运算符)、!=(不相等运算符) 、
- 相等运算符是"==“,不是”=“(”="表示赋值),写代码时:if(a = 15)—>if(15 = a)
- 注意:
- 多个关系符不要连用
+举例 : a < b < c—> a <b && b<c(此处的”&&“时逻辑操作符)
- 多个关系符不要连用
条件操作符
- 条件操作符:也叫三元运算符(三元–>有3个操作数)
- 形式:
表达式1 ? 表达式2 : 表达式3
- 计算逻辑:先计算–》表达式1
- 表达式1 —>真,表达式2 —>计算 , 表达式3—>不计算(表达式2的结果–》整个表达式的结果)
- 表达式1 —>假,表达式2—> 不计算 ,表达式3—>计算(表达式3的结果—》整个表达式的结果)
- 举例:m = n < 8 ? 6 : -6 (分析:n的值<8,输出6;n的值>=8,输出 -6,最后将n的值赋给m)。
逻辑操作符
- 逻辑操作符:提供逻辑判断的功能。
- 分类:
-
! :逻辑取反运算符(改变单个表达式的真假)。
-
&& :逻辑与运算符(并且)–》两侧表达式都真,则真,有一个为假,都为假。
-
|| :逻辑或运算符(或者)–》两侧至少有一个表达式为真,则为真
switch语句
- 常用格式
switch (表达式){
case 常量表达式 :语句
....
case 常量表达式 :语句
default : 语句
}
- 格式分析:
- 表达式(控制表达式):整型表达式。注意:字符类型也归类到了整型家族中,因为字符的本质就是ASCII值,这个值是整数。
- 分支标号:case 常量表达式 :
- 常量表达式:必须是整数/字符(比如:5是常量表达式,5+10也是常量表达式)
- 语句:
- 每个分支标号的后面可以跟任意数量的语句,且不需要花括号,每组语句的最后一条通常是break语句。
- 分支标号不允许重复,分支顺序无要求,多个分支标号可放在同一组语句的前面。
- 举例 :输⼊1-7的数字,打印对应的年级
#include<stdio.h>
int main()
{
int grade = 0;
scanf("%d", &grade);
switch (grade)
{
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("7年级\n");
//break;
}
return 0;
}
结构分析:
- 控制表达式(整型表达式) --》grade
- 分支标号–》case 1:/case 2:/case 3 :(注意冒号不要丢)
- 打印–》题目所要求的数字对应的班级号"一年级“/二年级”…/”七年级“
输入输出分析:(将break语句注释掉)
- 输入2–》二年级(换行),三年级(换行),四年级(换行),…,七年级(换行)。
- 输入3–》三年级(换行),四年级(换行),…,七年级(换行)。
- 思考:为什么输入的年级是2,却将后面的3-7年级都显示出来了?
原因 :break 语句–》switch语句具有分支效果,我们的分支标号只是一个说明switch内部位置的标记,如果没有break语句,控制会从一个分支继续到下一个分支,也就是我们上面演示的那样。为语句添加break语句就会得到一一对应的答案。
改进:输入1-5,输出低年级;6-7,输出高年级。
#include<stdio.h>
int main()
{
int grade = 0;
scanf("%d", &grade);
switch (grade)
{
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;
}
上例体现了分支标号可以放置再同一组语句下面。
思考:如果我们输出一个其他值,但是有想要屏幕上打印除”输入错误“的内容,则可以添加default语句,用大白话来讲它的作用就是解决case解决不了的问题。注意此处的default 的位置可以不固定,只是我们通常放在最后。
总结:
(1).switch语句是一种特殊的if…else结构,switch(表达式)中,表达式必须是整型表达式(包含字母)。
(2).switch语句具有分支效果,如果不想让代码执行下去,需要添加break语句。
(3).break语句:执行break语句会导致程序”跳出“switch语句,继续执行switch后面的语句。
(4).default语句:解决分支标号(case语句)解决不了的问题。
(5).case语句(分支标号):不可重复,不限语句数量(无需花括号),多个case语句可以放置在同一组语句下面。
循环语句
while 循环
- 语法形式:
while(条件表达式)
语句;
表达式是控制语句,语句是循环体;while循环中,当条件表达式成立时,才会执行循环体中的语句,故while循环条件会比循环体多执行一次。(参考执行流程举例,其中m=m+2为循环体,m<6为条件表达式,m=m+2的次数少于m<6)
2. 执行流程举例
比如说:我们设定m>6,m=m+3,则体现的语法形式为
while(m<6)//控制(条件)表达式
m = m + 2;//循环体(若需要多条语句,需要添加花括号构成复合语句)
分析:m<6为真,值不为0;m > 6为假,值为0。当值为假的时候,循环才会终止。我们m的现在值都<6,故为真,参与循环;若当m的现在值等于7的时候,故为假,终止循环。
跟踪执行情况:(注意:此处的m=m+2可以写成m++ = 2)
- m = 1 ; —> m现在值为1
- m < 6成立吗?–> 成立,继续。
- m = m + 2 ; —>m现在值为3
- m < 6成立吗?—> 成立,继续。
- m = m + 2 ; —> m现在值为 5。
- m < 6成立吗? —>成立,继续。
- m = m + 2; —> m现在值为7 。
- m < 6 成立吗? —> 不成立,退出循环。
- 详解示例:在屏幕上打印1~10的值。
代码1:给变量赋值为0的情况–》int i = 0
#include<stdio.h>
int main()
{
int i = 0;
while (i < 10)
{
i++;//123456789 10 (位置1)
printf("%d\n", i);
//i++;//0123456789 (位置2)
}
return 0;
}
位置1 :给变量赋值为0:int i = 0–》先 i++ ,则i++ = 1,打印值为1
位置2:给变量赋值为0:int i = 0 --》先打印,再i++ = 1,打印值为0(不符合条件)
思考:如何让位置2满足题目要求。可修改为
代码2:给变量赋值为1的情况
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d\n", i);
i++;
}
return 0;
}
总结规律:打印( i>=1 && i<=n)
int i = 0 ,i<n,–>先i++,在打印;–》给变量赋值为0,无等于号
int = 1 ,i <=n,–>先打印,再i++;–》给变量赋值为1,有等于号
- 无限循环:除非循环体中含有跳出循环控制的语句(break,goto,return),否则while语句将永远执行下去。
形式:
while(1)...
do while循环
- 格式:
do
语句
while (表达式)//此行括号右面没有分号
- 执行方法:先执行循环体,再根据表达式进行判定,表达式为真,执行循环体;表达式为假,循环终止。
- do while循环与while 循环的区别:do… while 的循环体至少执行一次,而while 循环在控制表达式初始为0时,会完全跳过循环体。
- 示例:使用 do while 在屏幕上打印1~10的数字
#include<stdio.h>
int main()
{
int i = 1;
do
{
printf("%d\n", i);
i++;
} while (i <= 10);
return 0;
}
for循环
- 格式
for(表达式1;表达式2;表达式3)
语句;//若循环体想包含更多的语句,可以加上大括号。
格式分析:
- 表达式1 :用于循环变量进行初始化(只执行1次)
- 表达式2 : 用于循环结束条件的判断(控制循环的终止)(表达式2的值不为0,循环持续进行)。
- 表达式3 用于循环变量的调整
- 示例:在屏幕上打印1-10数字
#include<stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
printf("%d\n", i);
}
return 0;
}
- for语句中的惯用法(此结论可迁移到while 循环中)
- 从0向上加到n-1: for(i = 0 ;i < n ; i++)…
- 从1向上加到n: for(i = 1 ; i < = n ; i --)…
- 注意:for ()后面不要加分号!!!
退出循环
break 语句和continue语句
1.break语句 作用: 永久终止循环,只要break被执行,直接就会跳出循环,继续往后执行。
2.continue语句作用: 跳出本次循环中continue后边的代码,在for循环和while循环中有所差异。
3.while循环中的break和continue
- break语句:
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 8)
{
if (i == 6)
break;
printf("%d", i);//12345
i++;
}
return 0;
}
(1)解释代码:
-
我们首先初始化值为1,当i = 1时,满足控制表达式 i<=8,则进入循环。因为 i=1,不等于6,所以直接打印i的值为1;再i++得到i=2,重新进入循环,分别打印出2345;当i= 6时,终止整个循环。
(2)结果为12345 -
continue语句:
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 8)
{
if (i == 6)
continue;
printf("%d", i);//12345
i++;
}
return 0;
}
(1)结果显示:12345(5的后面有光点闪烁,此时程序已经死循环了)
(2)解释代码:当i = 1–>满足i<=8–>i 不等于6–>打印1–>i ++ -->i = 2—>满足i< = 8 —>i 不等于6–>打印2–>i++ -->i = 3–>…当i = 6 时,无法打印,因为continue已经跳出本次循环,打印和i++这两个语句被跳过,不再执行,又回到了6<=8,重复以上过程,我们会发现,i 是没有机会变成7的,它一直都是6。
(3) 思考:如何才能让程序出现1234578。
(4) 修改:第一步,将i++位置转移到continue语句的上面。—》得到结果2345789。第二步,int i = 0,这样就会从1开始打印。—》得到结果12345789。第三步,修改表达式的范围i<=8–》i < 8。
代码:
#include<stdio.h>
int main()
{
int i = 0;
while (i < 8)
{
i++;
if (i == 6)
continue;
printf("%d", i);//1234578
}
return 0;
}
(5)总结:continue语句并不是彻底的终止循环,而是仅仅跳过i==6这一次continue后面的代码,不再执行,直接判断部分,进行下一次判断。
4.for 循环中的break和continue对比:
5.do while 循环中的break和continue对比:
注:continue–>12345(5循环)
goto 语句
- 什么是goto语句?
goto语句可以让我们的代码跳转到我们设计的标号里面(跳转代码)。
2.goto语句的缺点:若使用不当,在函数内部乱转,打乱程序的执行流程。
3.goto语句的优点:相对于break 语句,在多层循环代码中,可以迅速跳出。
4.代码示例:
goto语句的位置可以放在开头,中间,结尾。
示例1:
#include<stdio.h>
int main()
{
printf("hello\n");
if (1) //条件成立
goto end;
//hello classmate
printf(" Mr white\n");
end:
printf("classmate\n");//hello classmate
return 0;
}
示例2:
#include<stdio.h>
int main()
{
goto again;
printf("天气晴朗\n");
again:
printf("天气阴\n");//天气阴
return 0;
}
示例3:
#include<stdio.h>
int main()
{
again:
printf("you are great!\n");//死循环打印you are great!
goto again;
return 0;
}
.goto语句的优点:相对于break 语句,在多层循环代码中,可以迅速跳出。
4.代码示例:
goto语句的位置可以放在开头,中间,结尾。
示例1:
#include<stdio.h>
int main()
{
printf("hello\n");
if (1) //条件成立
goto end;
//hello classmate
printf(" Mr white\n");
end:
printf("classmate\n");//hello classmate
return 0;
}
示例2:
#include<stdio.h>
int main()
{
goto again;
printf("天气晴朗\n");
again:
printf("天气阴\n");//天气阴
return 0;
}
示例3:
#include<stdio.h>
int main()
{
again:
printf("you are great!\n");//死循环打印you are great!
goto again;
return 0;
}