浅析C语言分支循环语句
(C语言小白浅浅总结一下分支循环语句,本篇博客如有错误请各位大佬评论区指正)
一,分支语句
1. if语句
2. if…else语句
3. switch语句
二,循环语句
1. for循环
2. while循环
3. do…while循环
4. 循环中的嵌套(练习)
5.循环中的break和continue语句
分支语句 \color{red}{分支语句} 分支语句
1.if语句
语法结构
1 if(表达式)
2 语句;
表达式为真(非0)语句执行;表达式为假(0)语句不执行。
//举例 输入一个整数,判断是否为奇数
#include<stdio.h>
int main()
{
int num=0;
scanf("%d",&num);
if(num%2==1)/*等价于if(num%2),若num是奇数num%2为1(真),语句执行;
若num是偶数num%2为0(假),语句不执行*/
printf("%d是奇数\n",num);
return 0;
}
拓展👀:嵌套if
//要求输⼊⼀个整数,判断输⼊的整数是0,还是正数或者负数
#include<stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
if (n == 0)
printf("输入的值是0\n");
else
{
if (n > 0)
printf("输入的值是正数\n");
else
printf("输入的值是负数\n");
}
return 0;
}
//以上代码也可以转换成如下代码
#include<stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
if (n == 0)
printf("输入的值是0\n");
else if (n > 0)
printf("输入的值是正数\n");
else
printf("输入的值是负数\n");
return 0;
}
练习:
1.输⼊⼀个⼈的年龄
2.如果年龄 < 18岁,打印"少年"
3.如果年龄在18岁⾄44岁打印"⻘年"
4.如果年龄在45岁⾄59岁打印"中⽼年"
5.如果年龄在60岁⾄89岁打印"⽼年"
6.如果90岁及以上打印"⽼寿星"
#include<stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
printf("少年\n");
else //>=18
{
if (age <= 44)
printf("青年\n");
else//>=45
{
if (age <= 59)
printf("中老年\n");
else//>=60
{
if (age <=89)
printf("老年\n");
else//>=90
printf("老寿星\n");
}
}
}
return 0;
}
2.if…else语句
语法结构
1 if(表达式)
2 语句1;
3 else
4 语句2;
//举例 判断一个整数是否为奇数,如果是奇数打印奇数,否则打印偶数
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num % 2 == 1)
printf("%d是奇数\n", num);
else
printf("%d是偶数\n", num);
return 0;
}
注意⚠️:If/else后有多条语句时要用{}将其括起来形成程序块/代码块/复合语句
拓展👀:悬空else
注意⚠️:else总是跟最接近的if匹配
//举例
#include<stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("hehe\n");
else//此处的else与临近的if匹配
printf("haha\n");
return 0;//只有满足a==1这一条件才会进入下面的if,else选择语句
//故此代码运行后什么都不打印
}
#include<stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
printf("hehe\n");
}
else//此时else与第一的if匹配,代码运行后会打印出haha
printf("haha\n");
return 0;
}
3.switch语句
语法结构
1 switch (expression) {
2 case value1: statement
3 case value2: statement
4 default: statement
5 }
📒:•switch后面的expression必须是整形表达式(字符也算是整型,字符有其对应的ASCII码值)
•case后面的值必须是整型常量表达式
•case和后面的数字之间必须有空格
•每一个case语句中的代码执行完成后,需加上break,才能跳出这个switch语句
•switch 后边的 expression 的结果不是 value1 ,也不是 value2 的时候,就会执⾏ default ⼦句。在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满⾜实 际需求的就可以。 不过我们通常是把 default ⼦句放在最后处理的。
延伸👀:if语句与switch语句的对比
/*用if语句输入一个数,判断其是否整除3,若能整除输出整除了,余数是0;
若不能整除,输出其余数*/
#include<stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
if (n % 3 == 0)
printf("整除了,余数是0\n");
if (n % 3 == 1)
printf("余数是1\n");
if(n%3==2)
printf("余数是2\n");
return 0;
}
//也可以这样写
#include<stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
if (n % 3 == 0)
printf("整除了,余数是0\n");
else if (n % 3 == 1)
printf("余数是1\n");
else
printf("余数是2\n");
return 0;
}
/*用switch语句输入一个数,判断其是否整除3,若能整除输出整除了,余数是0;
若不能整除,输出其余数*/
#include<stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
switch (n % 3)
{
case 0:
printf("整除了,余数是0\n");
break;
case 1:
printf("余数是1\n");
break;
case 2:
printf("余数是2\n");
break;
}
return 0;
}
/*练习:输⼊⼀个1~7的数字,打印对应的星期⼏
例如:
输⼊:1 输出:星期⼀
输⼊:2 输出:星期⼆
输⼊:3 输出:星期三
输⼊:4 输出:星期四
输⼊:5 输出:星期五
输⼊:6 输出:星期六
输⼊: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;
}
/*练习:输⼊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;
}
循环语句 \color{red}{循环语句} 循环语句
1.while循环
语法结构
1 while(表达式)
2 语句;//如果循环体想包含更多的语句,可以加上⼤括号
//举例 在屏幕上打印1~10的值
#include<stdio.h>
int main()
{
int i = 1;//初始化部分
while (i <= 10)//判断部分
{
printf("%d\n", i);
i++;//调整部分
}
return 0;
}
延伸👀:if和while的对比
#include<stdio.h>
int main()
{
while(1)
printf("hehe\n");//只打印一个hehe
return 0;
}
#include<stdio.h>
int main()
{
while(1)
printf("hehe\n");//会陷入死循环
return 0;
}
/*练习:输⼊⼀个正的整数,逆序打印这个整数的每⼀位
例如:
输⼊:1234,输出:4 3 2 1
输⼊:521,输出:1 2 5*/
#include<stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
while (n)
{
printf("%d ",n % 10 );//输出最后一位
n /= 10;//去掉最后一位
}
return 0;
}
2.for循环
for 循环是三种循环中使⽤最多的, for 循环的语法形式如下:
1 for(表达式1; 表达式2; 表达式3)
2 语句;//如果循环体想包含更多的语句,可以加上⼤括号
表达式1:初始化部分 表达式2:判断部分 表达式3:调整部分
for循环的初始化,判断,调整三个部分是可以省略的。初始化部分省略:循环中无法初始化循环变量,可能导致循环变量未被正确初始化而造成意外行为。 判断部分省略:循环条件无法被判断,导致无法退出循环,造成无限循环。 调整部分省略:循环中无法对循环变量进行调整,可能导致循环变量无法按预期进行调整而造成意外行为。 因此,虽然 for 循环中的初始化部分、判断部分、调整部分是可以省略的,但是不建议全部省略,否则可能会导致程序无法正常工作或者产生意外行为。
//举例
#include<stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)/*分别是第一步(初始化);第二步(判断);
第四步(调整)*/
{
printf("%d ", i);//第三步
}
return 0;
}
3.do-while循环
在循环语句中 do while 语句的使⽤最少,它的语法如下:
1 do
2 语句;
3 while(表达式);
while和 for这两种循环都是先判断,如果满⾜条件就进⼊循环,执⾏循环语句,如果不满⾜就跳出循环;⽽do while循环则是先直接进⼊循环体,执⾏循环语句,然后再执⾏ while 后的判断表达式,表达式为真,就会进⾏下⼀次,表达式为假,则不再继续循环。
//举例
#include<stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
/*练习:输⼊⼀个正整数,计算这个整数是⼏位数?
例如:
输⼊:1234 输出:4
输⼊:12 输出:2*/
int main()
{
int n = 0;
scanf("%d", &n);
int cnt = 0;
do
{
n /= 10;//依次去掉末位
cnt++;
} while (n);//当n=0时循环结束
printf("%d\n", cnt);
return 0;
}
4.循环中的嵌套(练习)
/*练习
找出100~200之间的素数,并打印在屏幕上。
注:素数⼜称质数,只能被1和本身整除的数字
*/
int main()
{
int i = 0;
int count = 0;
for (i = 100; i <= 200; i++)
{
int flag = 1;/*不能写到for循环外面,
如果写到for循环外面就会在i = 100第一次循环的时候赋值为0,
之后就一直是0了,在for循环内初始化flag,
不论上次循环结果如何,再次进入循环时flag初始值都是1*/
int j = 0;
for (j = 2; j <=i-1; j++)
{
if (i % j == 0)//证明i有除1和它本身之外的因子,不是素数
flag = 0;
break;//直接跳出循环,不再进行
}
if (flag==1)
{
printf("%d ", i);
count++;
}
}
printf("\ncount=%d\n", count);
return 0;
}
#include<stdio.h>
#include<math.h>
int main()
{
int i = 0;
int count = 0;
for (i = 101; i <= 200; i+=2)//素数不可能是偶数,在奇数中寻找效率更高
{
int flag = 1;
int j = 0;
for (j = 2; j <=sqrt(i) ; j++)
//sqrt() 用来求给定值的平方根,其头文件是#include<stdio.h>,
//i==sqrt(i)*sqrt(i)==(小于sqrt(i)的数)*(大于sqrt(i)的数),
//因此只需在小于sqrt(i)的范围内查找即可,可提高运算效率
{
if (i % j == 0)
flag = 0;
break;
}
if (flag == 1)
{
printf("%d ", i);
count++;
}
}
printf("\ncount=%d\n", count);
return 0;
}
5.循环中的break和continue语句
• break的作⽤是⽤于永久的终⽌循环,只要 break 被执⾏,直接就会跳出循环,继续往后执⾏。
• continue的作⽤是跳过本次循环 continue 后边的代码,在 for 循环和 while 循环中有所差异的。
📚 while循环中的break和continue
//while循环中的break
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
break;//符合i==5的条件后就停止,不再进入循环
printf("%d ", i);
i++;
}
return 0;
}
//while循环中的continue
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
continue;
/*当符合条件i==5时continue会跳过后面的程序,
当再次进入循环时由于无法进行i++的调整,
一直符合条件i==5<10,所以就会陷入死循环*/
printf("%d ", i);
i++;
}
return 0;
}
//while循环中的continue(将上面代码中的调整部分i++换下位置)
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
i++;
if (i == 5)
continue;
/*当符合条件i==5时continue会跳过后面的程序,
当再次进入循环时先进行i++的调整,一直有i>5
直到不符合条件i<=10循环结束*/
printf("%d ", i);
}//输出结果是2 3 4 6 7 8 9 10 11
return 0;
}
📚for循环中的break和continue
//for循环中的break
#include<stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
break;//符合i==5的条件后就停止,不再进入循环
printf("%d ", i);//打印出1 2 3 4
}
return 0;
}
//for循环中的continue
#include<stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;
/*当符合条件i==5时continue会跳过后面的程序,
再次进入循环时进行i++的调整,一直有i>5
直到不符合条件i<=10循环结束*/
printf("%d ", i);//输出结果为1 2 3 4 6 7 8 9 10
}
return 0;
}
📚do while循环中的break和continue
//do while循环中的break
#include<stdio.h>
int main()
{
int i = 1;
do
{
if (i == 5)
break;//符合i==5的条件后就停止,不再进入循环
printf("%d ", i);
i++;
} while (i <= 10);
return 0;//打印出1 2 3 4
}
//do while循环中的break
#include<stdio.h>
int main()
{
int i = 1;
do
{
if (i == 5)
continue;
/*当符合条件i==5时continue会跳过后面的程序,
当再次进入循环时由于无法进行i++的调整,
一直符合条件i==5<10,所以就会陷入死循环*/
printf("%d ", i);
i++;
} while (i <= 10);
return 0;//打印出1 2 3 4死循环
}