分支与循环

一 分支语句
1.if语句
2.关系操作符
3.条件操作符
4.逻辑操作符
5.switch语句
二 循环语句
1.while
2.for
3.do while
4.continue与 break(用与循环中的效果)
5.goto语句
三 综合练习
前言
C语⾔是结构化的程序设计语⾔,这⾥的结构指的是顺序结构、选择结构、循环结构。仔细想想其实我们生活也是这样的。
通过这个我相信你肯定能对if switch用于分支,while for do-while用于循环能更深理解
分支语句
1. if语句
if(表达式)
语句 1
else
语句2
在c语言中0表示假,非0表示真,如果表达式为假就不执行,如果为真就执行,在这里如果为真就执行语句1 反正则执行语句2
例题 输入一个数,判断是奇数还是偶数
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num % 2 == 1)
{
printf("是奇数\n");// if规定后面只能跟一条语句,如果多条语句必须要大括号。
}
else
{
printf("是偶数\n");
}
return 0;
}
嵌套if else(if与else是相匹配的)
例题 从键盘输入一个数判断其是正数,还是负数,还是0
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num > 0)
{
printf("正数\n");
}
else if (num < 0)
{
printf("负数\n");
}
else
{
printf("零\n");
}
return 0;
}
2. 关系操作符
主要有6个 >,<,<=,>=,==(一个=是赋值两个=才是判断相等),!=(不等于)
关系操作符通常返回0或1通常与if while结合运用
3. 条件操作符(三目操作符)
exp1 ? exp2 : exp3
如果exp1为真,返回exp2,反之返回exp3
例题 使⽤条件表达式实现找两个数中较⼤值。
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int max = a > b ? a : b;
printf("%d\n", max);
return 0;
}
//但这个用if else语句也可以写,因此如果特别复杂的话不建议使用这个
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
int max = 0;
scanf("%d%d", &a, &b);
if (a > b)
{
max = a;
}
else
{
max = b;
}
printf("%d\n", max);
return 0;
}
4. 逻辑操作符:&&,||,!
&& :逻辑与运算符 两侧表达式都为真才为真
||:逻辑或运算符 两侧表达式一个为真就为真
!:逻辑取反运算符 用于改变其真假
c语言中 0表示假 ,非0 表示真
例题 如果我们说⽉份是3⽉到5⽉,是春天,输入一个数判断断
注意:这里千万不可以写成 3 =<month<=5(这是错的),这样它会从左到右判断,然后返回0或1后在进行后面判断,逻辑错误
#include<stdio.h>
int main()
{
int month = 0;
scanf("%d", &month);
if (month >= 3 && month <= 5)
{
printf("是春天\n");
}
else
{
printf("不是春天\n");
}
return 0;
}
例题 输入月份判断是不是冬天(1,2,12),这里用到了逻辑或||
#include<stdio.h>
int main()
{
int month = 0;
scanf("%d", &month);
if (month == 1 == month == 2 || month == 12)
{
printf("是冬天\n");
}
else
{
printf("不是冬天\n");
}
return 0;
}
5. switch语句
switch (expression) {
case value1: statement
case value2: statement
...
default: statement
先进行expression判断,寻找case分支,如果没找到则执行default
注意 这里对case和default顺序没有要求,但一般放最后或开始
注意expression中必须是整形表达式(char 字符也是整形家族的)
case 后面必须是整形常量表达式
例题 输入星期几,判断是休息日 还是工作日
#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");
}
return 0;
}
这个代码中的break是非常重要的,如果没有,则会导致找到分支以后并不会跳出去,后面的语句全部执行,结果出错 (例如下面代码)
循环语句
1. while循环
while(表达式)
语句;
⾸先上来就是执⾏判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执⾏循环语句,语句执⾏完后再继续判断,是否进⾏下⼀次判断
练习 输⼊⼀个正的整数,逆序打印这个整数的每⼀位
输⼊:1234,输出:4 3 2 1
想要得到最低为数直接让%10得到了最后一位,然后再让其/10把求出的哪一位去掉,不断循环
#include <stdio.h>
int main()
{
int n = 0;//初始化
scanf("%d", &n);
while(n)//判断
{
printf("%d ", n%10);
n /= 10;//调整
}
return 0;
}
2. for循环(一般用于循环次数却定的情况)
for(表达式1; 表达式2; 表达式3)
语句;//如果循环体想包含更多的语句,可以加上⼤括号
表达式1:初始化
表达式2:判断
表达式3:调整
首先执行初始化,然后执行判断,如果符合条件进入循环体,然后进入调整,一直进行下去知道不符合表达式2后跳出循环(整个过程中表达式1只被执行一次,但表达式2,循环体和表达式3在循环进行
练习 计算1-100之间3的倍数之和
#include<stdio.h>
int main()
{
int i = 0;
int sum = 0;
for (i = 1;i <= 100;i++)
{
if (i % 3 == 0)
{
sum = sum + i;
}
}
printf("%d\n", sum);
return 0;
}
//小优化,减少循环次数,代码执行效率更高
#include<stdio.h>
int main()
{
int i = 0;
int sum = 0;
for (i = 3;i < 100;i+=3)
{
sum = sum + i;
}
printf("%d\n", sum);
return 0;
}
3. do-while循环
do
语句;
while(表达式);
do-while循环时限执行循环体语句,在进行判断,而while和for循环使用时先判断在执行,所以do-while循环至少执行一次循环体,(这种特质在有些代码中有妙用,但有时候可能带来不便,这个要自己斟酌,选择最合适的循环类型)
练习 输⼊⼀个正整数,计算这个整数是⼏位数(这个用do -while才更为准确)
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
int count = 0;
do
{
count++;
num /= 10;
} while (num);
printf("%d\n", count);
return 0;
}
如果使用while循环时输入0则结果明显不对,所以do-while有自己的特性
4. break和continue语句
while循环中的break和continue
break是跳出整个循环,结束循环,而continue是结束本次循环在while和for循环中又说差异,下面是一些例子
while循环下的
下面这个明显死循环了,因为i=5后跳过了i++,一直执行判断,一直为真
for循环下的
下面这个结果明显与while有区别
5 goto语句
它可以跳转到自己标记好的位置
例如下面的代码,直接跳过haha,当然自己也不能随意使用,可能会导致代码混乱
如果在多层循环中可以使用goto跳出循环
综合练习
1 输⼊⼀个⼈的年龄
如果年龄<18岁,打印"少年"
如果年龄在18岁⾄44岁打印"⻘年"
如果年龄在45岁⾄59岁打印"中⽼年"
如果年龄在60岁及以上打印"⽼年"
#include<stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
{
printf("少年\n");
}
else if (age >= 18 && age <= 44)
{
printf("青年\n");
}
else if (age >= 45 && age <= 59)
{
printf("中老年\n");
}
else
{
printf("老年\n");
}
return 0;
}
2 打印1000-2000年之间的润年
闰年规则
- 能被4整除并且不能被100整除是闰年
- 能被400整除是闰年
#include<stdio.h>
int main()
{
int i = 0;
int count = 0;//统计有多少润年
for (i = 1000;i <= 2000;i++)
{
if ((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0))
{
printf("%d ", i);
count++;
}
}
printf("\n%d",count);
return 0;
}
3分析下面程序运行结果
C语⾔逻辑运算符还有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是
保证的。
如果左边的表达式可以确定这个逻辑运算符的条件是真还是假,就不再对右边的表达式求值。这种情况称为“短路”
**&&只要有一个为假就为假,||只要有一个为真就为真
分析 :这个的话a是后置++(先使用后加加)所以判断从左到右,第一个为假,后面直接不算了,只有a进行了++操作
那如果我把&&换成||**呢
分析 :这里的话a为假,根据逻辑||的特性,继续往下算,++b为2了为真,逻辑表达式的值确定为真了,就不会往下算了
4 编写程序数一下 1到 100 的所有整数中出现多少个数字9
自己要注意99中有两个9
#include<stdio.h>
int main()
{
int i = 0;
int count = 0;
for (i = 1;i <= 100;i++)
{
if (i % 10 == 9)
{
count++;
}
if (i / 10 == 9)//因为99中有两个9所以不用或者来写
{
count++;
}
}
printf("%d\n", count);
return 0;
}
5 在屏幕上输出9*9乘法口诀表
用到双重for循环
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
for (i = 1;i <= 9;i++)//控制行数
{
for (j = 1;j <= i;j++)//控制一行打印几个
{
printf("%d*%d=%-2d ",j,i,i*j );//%-2d是让其站两个字符左对齐,%d默认是右对齐,
}
printf("\n");
}
return 0;
}
运行结果如下
到这里就结束,希望这对大家有所帮助,欲知后事如何请提,请听下回分解。