当前位置:网站首页>分支与循环语句
分支与循环语句
2022-04-23 05:21:00 【yanghuagai2311】
分支语句
一.if语句
1.单分支语句
(1)表达式:表达式是决定选择方向的条件,当表达式结果为真时执行下面的语句,为假时进入其他位置执行下面的语句。
(2)C语言对真假的判断:在C语言中,0表示假,非零表示真。
(3)语句:表示上面表达式为真时所执行的代码。
(4)注意加上空格以保证代码的可读性。
if(表达式)
语句;
#include<stdio.h>
int main()
{
int year = 0;
scanf("%d", &year);
if (year < 18)
printf("未成年\n");
printf("不能饮酒\n");
return 0;
}
(5)当需要执行的语句多于一条时,注意要加上代码块——{}。
#include<stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
{
printf("未成年\n");
printf("不能饮酒\n");
}
return 0;
}
`
2.双分支语句
if(表达式)
语句;
else
语句;
#include<stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
{
printf("未成年\n");
}
else
{
printf("成年\n");
}
return 0;
}
3.多分支语句
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
(6)添加更多的分支时使用else if ()语句
#include<stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
{
printf("青少年\n");
}
else if(age>=18&&age<28)
{
printf("青年\n");
}
else if (age >= 28 && age < 40)
{
printf("中年\n");
}
else if (age >= 40 && age < 60)
{
printf("壮年\n");
}
else
{
printf("老年");
}
return 0;
}
在多分支语句中判断表达式(age >= 28 && age < 40)但是不能用28<=age<=40
。拿80来举例子,28<=age正确为1,1<=40正确,那么会输出中年但实际是老年。
4.if语句常见易错点及良好的代码规范
请看以下代码:
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)//a不等于1
if(b == 2)
printf("hehe\n");
else//这个else会对应离他最近的if,也就是if(b == 2)
printf("haha\n");
return 0;
}
如果后面不加注释,则有些人就可能会认为这个if…else语句的else对应的是if(a==1)的那个if 可实际上输出的却是无打印
所以我们尽量要添加{}对分支语句进行优化
#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;
}
//输出还是不打印
如果想打印出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;
}
//输出:打印haha
(1)else语句会对应离它最近的那个if语句
(2)选择语句if在使用时,如果我们对else的范围没有操作,else可以省去
(3)对于优化代码 不管是一条还是多条语句都加上{},这样保证了代码的可读性。
下面来给大家再来看一个不规范的代码
//代码1
if (condition)
{
return x;
}
return y;
//代码2
if(condition)
{
return x;
}
else
{
return y;
}
//这两段代码的实际作用是一样的,当表达式的值为真时返回x,否则返回y
//但是相比而言,第二个代码的表达更加清晰,多写一个else也并不费力
我们再写代码的初期常会遇到一个问题,我们经常会把‘==’符号写作‘=’
#include<stdio.h>
int main()
{
int a = 0;
if (a = 1)//这个表达式表示把1赋值给a,表达式的值为1,为真,打印hehe
{
printf("hehe\n");
}
if (a = 0)//这个表达式表示把0赋值给a,表达式的值为0,为假,不打印haha
{
printf("haha\n");
}
return 0;
}
//只要一个等于号符的值不为0,程序就可以正常运行
为了规避这种错误,我们可以这样
//代码3
int num = 1;
if(num == 5) //只是单纯判断num是不是等于5,少写一个等于号依旧正常运行
{
printf("hehe\n");
}
//代码4
int num = 1;
if(5 == num)
//有判断作用,但少写一个等于号时(5 = num)
//5是一个常量,而num是一个变量,变量的值不能赋给常量,编译器报错
{
printf("hehe\n");
}
if (num%2 == 1)//表达式不需要颠倒,因为表达式本来就不能赋值
{
printf("hehe\n");
}
代码4是老司机的写法,极力推荐这种写法——当我们需要的条件是判断一个变量是否等于某个常量时,通过将变量和常量颠倒的方法就有效避免了这样的低级错误。表达式不需要颠倒。(只适用于判断a == 1这样的条件)
5.例题
(1)判断一个数是否为奇数
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d",num);
if (num%2)
{
printf("是奇数\n");
}
else
{
printf("不是奇数\n");
}
return 0;
}
(2)输出1-100之间的奇数
#include<stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 100; i++)
{
if (i % 2 == 1)
{
printf("%d ", i);
}
}
return 0;
}
二.switch语句
1.基本使用方法
switch语句常常用于多分支的情况。
比如:
输入1,输出星期一
输入2,输出星期二
输入3,输出星期三
输入4,输出星期四
输入5,输出星期五
输入6,输出星期六
输入7,输出星期日
我们使用if语句就太麻烦了,而switch语句更适合这样的程序。
switch的用法如下:
switch(整型或字符型表达式)
{
case 整型或字符型常量表达式:
语句;
case 整型或字符型常量表达式:
语句;
case 整型或字符型常量表达式:
语句;
......
}
2.case与break语句在switch语句中的应用
(1)在switch语句中,case语句只表示程序的入口,当输入的值符合case后的常量表达式时,程序会进入这个入口,从上向下执行。加上break就可以跳出switch语句以达到分支的目的。
#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;
}
(2)switch语句中几个常量表达式也可以对应一条语句
比如:
输入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("weekdey\n");
break;
case 6:
case 7:printf("weekend\n");
break;
}
return 0;
}
#include <stdio.h>
int main ()
{
/* 局部变量定义 */
char grade = 'B';
switch(grade)
{
case 'A' :
printf("很棒!\n" );
break;
case 'B' :
case 'C' :
printf("做得好\n" );
break;
case 'D' :
printf("您通过了\n" );
break;
case 'F' :
printf("最好再试一下\n" );
break;
default :
printf("无效的成绩\n" );
}
printf("您的成绩是 %c\n", grade );
return 0;
}
切记:字符型变量用于switch语句的时候记得打单引号
3.default语句
当表达式的值与每一个case语句都不匹配时,你也想执行一些代码处理数据时,就可以加上default语句(类似于if…else语句中的else)
(1)每个switch语句中只能出现一条default子句。
(2)default语句可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。
#include<stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:printf("weekdey\n");
break;
case 6:
case 7:printf("weekend\n");
break;
default:printf("输入数据错误\n");
}
return 0;
}
4.例题
请问下面程序输出结果(switch允许嵌套使用)
#include <stdio.h>
int main()
{
int n = 1;
int m = 2;
switch (n)//此时n为1
{
case 1:m++;//进入,m变为3
case 2:n++;//继续,n在case 2中递增,所以n在case 3中直接进入case 2
case 3:
switch (n)
{
case 1: n++;
case 2: m++; n++;
break;
}
case 4:
m++;
break;
default:
break;
}
printf("m = %d, n = %d\n", m, n);
return 0;
}
结果是 m=5, n=3
循环语句
一、while循环
1.基本使用方法
while(表达式)
循环语句;
括号中的表达式是判断循环是否进行的依据。
表达式结果为真时,循环继续进行;为假时,跳出循环。
打印1-10的数字
#include<stdio.h>
int main()
{
int i = 0;
while (i < 10)
{
i++;
printf("%d ", i);
}
return 0;
}
2.while循环中break与continue的使用方法
(1)break
在循环中只要遇到break,就停止后期的所有操作,直接终止循环。而如果存在嵌套循环,只跳出它所在的那个循环。
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (5 == i)
break;
printf("%d ", i);
i++;
}
return 0;
}
(2)continue
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
i +=1;//先将i加1
if(i == 5)//循环3次后,第4次进入循环时,满足条件
continue;//跳过下面的语句并继续循环,就不会打印5
printf("%d ", i);
}
return 0;
}
//输出:2 3 4 6 7 8 9 10 11
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)//循环4次后,第5次进入循环时,满足条件
continue;//跳过下面的语句并继续循环
//跳过i+=1;语句后,i=5的值不会被改变,这就变成了一个死循环
printf("%d ", i);
i +=1;
}
return 0;
}
//输出:1 2 3 4 死循环
3.例题
(1)输入一个字符并打印它
getchar()与putchar()函数
getchar()函数:从内存缓冲区中找到并拿走输入的一个字符
当你没有输入字符时,getchar函数会先等待输入,当内存缓冲区
putchar()函数:打印一个字符
1.内存缓冲区
我们前面提到getchar函数时从内存缓冲区中拿出一个字符,那这个内存缓冲区又是什么呢?
缓冲区是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。
也就是说,输入的内容不会直接进入内存中而是先进入内存缓冲区,再进入内存。
2.什么是EOF
EOF表示end of file(文件结束标志),在计算机中它的它定义是一个-1
#include <stdio.h>
int main()
{
int ch = 0;
//定义一个字符,因为字符在计算机中储存为ASCII码值,所以可以定义为整形
while ((ch = getchar()) != EOF)//当取到输入字符为EOF时,跳出循环
putchar(ch);//putchar用于打印单个字符,打印ch
return 0;
}
//getchar()函数可以在内存缓冲区中读取到一个输入字符
//(ch = getchar())表示把getchar()得到的字符赋给ch这个函数的返回值,它的返回值应该是字符ch对应的ASCII码值
//(ch = getchar()) != EOF 表示函数返回值不是EOF
//注意:我们想向下运行程序需要按回车,回车输入的\n也是一个字符,相当于程序运行了两遍
//getchar先读取到你输入的字符,比如字母a,然后缓冲区中还有一个输入的\n
//相当于getchar先找到你输入的字符进行打印,然后又找到了\n,进行打印
//这个while语句实现了多次输入,而当我们想结束程序跳出循环时,只需要按ctrl+z就会使函数读取到EOF
//输入:a
//输出:a
//
(2)打印字符串中的数字字符
//代码2
#include <stdio.h>
int main()
{
char ch = '\0';//对ch进行初始化,而'\0'的ASCII码为0
while ((ch = getchar()) != EOF)//一个一个读取
{
if (ch < '0' || ch > '9')//相当于把它们的ASCII码值进行比较
continue;//ch为非数字字符进入,跳过putchar
putchar(ch);//为数字字符,不进入if,打印
}
return 0;
}
//输入:abc1dcwrew123
//输出:1123
二、for循环
1.基本使用方法
for(表达式1; 表达式2; 表达式3)
循环语句;
其中,表达式1负责初始化,用于初始化循环变量;表达式2负责判断,用于判断循环时候终止;表达式3负责调整,用于循环条件的调整。

#include<stdio.h>
int main()
{
int i = 0;
for (i=1; i<=>10; i++)
//这里的i被初始化为0,这个省去对程序运行也没有影响,但为了避免出错还是应当加上
{
printf("%d ",i);//当i的值满足i<=10时打印i
//在程序内的语句块执行完成后,程序执行调整语句i++,然后再次判断是否满足循环条件
}
return 0;
}
//输出:1 2 3 4 5 6 7 8 9 10
这种情况while与for循环 我选择后者
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)//循环4次后,第5次进入循环时,满足条件
continue;//跳过下面的语句并继续循环
//跳过i+=1;语句后,i=5的值不会被改变,这就变成了一个死循环
printf("%d ", i);
i +=1;
}
return 0;
}
//输出:1 2 3 4 死循环
改成for循环后
#include <stdio.h>
int main()
{
int i = 1;
for (i=1; i<=10; i++)
{
if(i == 5)//循环4次后,第5次进入循环时,满足条件
continue;//跳过下面的语句进行调整后继续循环,i不会保持在5的数值上
printf("%d ", i);
}
return 0;
}
//输出:1 2 3 4 6 7 8 9 10
2.for循环中break与continue的使用方法
与while相同
3.for循环的一些注意事项和特殊代码
(1)不要在语句块内部改变循环变量以防循环失去控制
(2)特殊for循环写法
#include <stdio.h>
int main()
{
//代码1
for(;;)
{
printf("hehe\n");
}
//for循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议省略。
//代码2
int i = 0;
int j = 0;
//根据for循环的嵌套,这里会打印100个hehe
for(i=0; i<10; i++)
{
for(j=0; j<10; j++)
{
printf("hehe\n");
}
}
//代码3
int i = 0;
int j = 0;
//如果省略掉初始化部分,这里只打印10个hehe
for(; i<10; i++)
{
for(; j<10; j++)
{
printf("hehe\n");
}
}
//在第一次进入循环时程序正常工作j=10时跳出循环,没有初始化变量j就会一直保持10,
//从此不会再次进入循环,i从1变到10的过程中只是孤零零地重复了9次,没有操作
//代码4,可以使用多个变量控制循环
int x, y;
for (x = 0, y = 0; x<2 && y<5; ++x, y++)
{
printf("hehe\n");
}
return 0;
}
4.例题
//请问循环要循环多少次?
#include <stdio.h>
int main()
{
int i = 0;
int k = 0;
for(i =0,k=0; k=0; i++,k++)
k++;
return 0;
}
//答案:零次,在for循环的判断那里k=0的表达式值本来就为0,0为假不循环
三、do…while循环
1.基本使用方法
do
循环语句;
while(表达式);
它不管条件符不符合它就先执行,执行完在判断是否需要继续再执行一遍。
特点:循环至少执行一次。
#include <stdio.h>
int main()
{
int i = 10;
do//先执行
{
printf("%d\n", i);
} while (i < 10);//判断能不能接着执行,若不能,则跳出
return 0;
}
//输出:10
2.do…while循环中break与continue的使用方法
与while、for循环相同
四、goto语句
#include<stdio.h>
int main()
{
again:
printf("hello ");
printf("world!\n");
goto again;
return 0;
}
这个程序的输出结果是一个死循环,用while循环语句也可以完成。
goto语句不能跨函数使用
1.基本使用方法
终止程序在某些深度嵌套的结构的处理过程。
例如:一次跳出两层或多层循环。
for(...)
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
…
error:
if(disaster)
// 处理错误情况
用break语句只能跳出一层循环,而goto就可以一次跳出。
不过这东西是有名的bug来源之一,能不用尽量不用。
goto语句与关机程序
下面是使用goto语句的一个例子,然后使用循环的实现方式替换goto语句:
电脑运行起来后,1分中内关机
如果输入:我错了,就取消关机
对计算机命令关机shutdown -s -t 60 前面的英文是命令关机60是60s后
shutdown -a是停止关机
上面的这些命令通过system函数实现,头文件stdlib.h
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int main()
{
char input[20] = {
0 };
system("shutdown -s -t 60");
again:
printf("请注意,你的电脑在60秒内关机,如果输入:我错了,就取消关机\n");
scanf("%s", input);
if (strcmp(input, "我错了")==0)
{
system("shutdown -a");
}
else
{
goto again;
}
return 0;
}
利用while循环来写
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int main()
{
char input[20] = {
0 };
system("shutdown -s -t 60");
while (1)
{
printf("请注意,你的电脑在60秒内关机,如果输入:我错了,就取消关机\n");
scanf("%s", input);
if (strcmp(input, "我错了") == 0)
{
system("shutdown -a");
break;
}
}
return 0;
}
循环的练习题
1.计算n的阶乘
#include<stdio.h>
int main()
{
int i = 1;
int ret = 1;
int num = 0;
scanf("%d", &num);
for (i = 1; i <= num; i++)
{
ret *= i;
}
printf("%d\n", ret);
return 0;
}
2.计算 1!+2!+3!+……+10!
#include<stdio.h>
int main()
{
int i = 1;
int ret = 1;
int sum = 0;
for (i = 1; i <= 10; i++)
{
ret *= i;
sum += ret;
}
printf("%d\n", sum);
return 0;
}
版权声明
本文为[yanghuagai2311]所创,转载请带上原文链接,感谢
https://blog.csdn.net/yanghuagai2311/article/details/124302007
边栏推荐
- Master-slave replication of MariaDB database
- The annual transaction volume of the app store is US $1 million, and only 15% commission is paid. Small and medium-sized developers are very contradictory
- 学习笔记:Unity CustomSRP-10-Point and Spot Shadows
- Nacos source code startup error report solution
- To understand Devops, you must read these ten books!
- Mariadb的半同步复制
- How to realize adaptive layout
- Cross domain CORS relationship~
- MySQL series - install MySQL 5.6.27 on Linux and solve common problems
- Low code and no code considerations
猜你喜欢

CPT 104_ TTL 09

領域驅動模型DDD(三)——使用Saga管理事務

2021 年 25 大 DevOps 工具(下)

Power consumption parameters of Jinbei household mute box series

项目经理值得一试的思维方式:项目成功方程式

Unique primary key ID of tidb sub table -- solution to failure of sequence and Gorm to obtain primary key

7-4 is it too fat (10 points) PTA

2021-09-27

What role do tools play in digital transformation?

Uniapp wechat sharing
随机推荐
Modèle axé sur le domaine DDD (III) - gestion des transactions à l'aide de Saga
npm升级后问题,慌得一批
At pgconf Asia Chinese technology forum, listen to Tencent cloud experts' in-depth understanding of database technology
双击.jar包无法运行解决方法
Power consumption parameters of Jinbei household mute box series
Study notes: unity customsrp-11-post processing --- bloom
WTL 自绘控件库 (CQsCheckComboxBox)
Interpretation of common SQL statements
好的测试数据管理,到底要怎么做?
node中的redis使用--ioredis
(十一)vscode代码格式化配置
Use of uniapp native plug-ins
Locks and transactions in MySQL
What are the most popular recruitment technical skills in 2022? You can't think of it
egg中的cors和proxy(づ ̄3 ̄)づ╭~踩坑填坑的过程~ToT~
日志简介和构建web应用
云计算与云原生 — OpenShift 的架构设计
学习笔记:Unity CustomSRP-12-HDR
Open source rule engine - Ice: dedicated to solving flexible and complex hard coding problems
我这位老程序员对时代危险和机遇的一点感悟?