分支与循环
1.if语句
1.1 if语句的语法形式
if(表达式)
语句
表达式成立(为真),语句执行,表达式不成立(为假),则语句不执行 。
那么怎么知道是真的假的?
在C语言中,0为假,非0表示真。
if语句执行流程
例子:输入一个整数,判断是否为奇数。
奇数判断
#include<stdio.h>
int main()
{
int num = 0;//定义一个自变量
scanf("%d", &num);
if (num % 2 == 1)
printf("%d是奇数", num);
return 0;
}
思绪:我们头脑中要有一个数%2=1是奇数,若一个数%2=0是偶数,在C语言中一个=是表示赋值,==表示判断
1.2 else
如果一个数不是奇数,那就是偶数。那么任意一个数,我们要如何清楚判断是奇数还是偶数呢?用代码具体怎么表示?
如下:
#include<stdio.h>
int main()
{
int num = 0;//定义一个自变量
scanf("%d", &num);
if (num % 2 == 1)
printf("%d是奇数", num);
else
printf("%d是偶数", num);
return 0;
}
2.关系操作符
关系操作符主要有“6个”
>:大于操作符
<:小于操作符
>=:大于等于操作符
<=:小于等于操作符
==:相等操作符
!=:不相等操作符
a<b;
a<b;
a>=b;
a<=b;
a==b;
a!=b;
关系表达式通常返回0或者1,表示真假
0表示假的,一切非零值表示真。比如:20>18返回1,18>20返回0
关系表达式用if或while结构
#include<stdio.h>
int main()
{
int x=0;
printf("请输入x的数字:");
scanf("%d", &x);
if (x == 3)
{
printf("x is 3\n");
}
return 0;
}
误区
1、=和==的误解
=是将一个表达式的值赋给左值或者右值。所谓左值是指一个能用于赋值运算左边的表达式。左边必须能被修改,不能是常量。
==是判断两个值是否相同的运算符,当左边的内容与右边的内容相等时,返回1
初学者经常会在表达式误写,如:
if (3=x);
2、多个关系运算符不宜连用
i<j<k;
上面的例子,连续使用两个小于操作符,这是一个合法的表达式,不会报错。但是如果使用多个的话,就达不到我们想要的效果,因为关系运算符是从左到右计算的,所以实际是这样子
(i<j)<k;
i<j返回0或1,所以最终是0或者1与变量k进行比较。如果想要判断变量j的值是否在i和k之间,应该使用这种写法
i<j&&j<k;
比如:我们输入一个年龄,如果年龄在18-36之间,我们就输入青年
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int age = 0;
printf("请输入一个年龄:");
scanf("%d", &age);
if (18 <= age <= 36)
printf("青年\n");
return 0;
}
为什么输入一个15也能输出青年,我们先拿18和age中存放的15比较,表达式18<15为假,18<=age的结果为0,在拿0和36比较,0<36为真,所以打印青年,所以即使当age=15时,也能打印青年,这个逻辑是有问题的,那么该怎么写呢?
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int age = 0;
printf("请输入一个年龄:");
scanf("%d", &age);
if (18 <= age&& age <= 36)
printf("青年\n");
return 0;
}
3.条件操作符
条件操作符也成为三目操作符,具体写法如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
printf("请输入a,b的值");
scanf("%d %d", &a,&b);
int m = a > b ? a : b;
printf("%d\n", m);
return 0;
}
exp1 ? exp2 :exp3
是这样理解的:如果exp1为真,exp2计算,计算的结果是整个表达式的结果,如果exp1为假,exp3计算,计算的的结果是整个表达式的结果。
4.逻辑操作符:&&、||、!
&&:与运算(两侧的表达式都为真则为真,否则为假)
||:或运算(两侧至少有一个表达式为真,则为真,否则为假)
!:逻辑取反运算符(改变单个表达式的真假)
4.1逻辑与运算
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int month = 1;
scanf("%d", month);
if (month >= 3 && month <= 5)
{
printf("春季\n");
}
return 0;
}
&&操作符是平且的意思,只有&&两边的表达式 为真的时候,整个表达式才是正的,只要有一个是假,则整个表达式是假。
4.2逻辑或运算
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int month = 1;
scanf("%d", month);
if (month == 3 || month == 4||month==5)
{
printf("春季\n");
}
return 0;
}
||操作符是或的意思,两边的表达式 只有一个为真的时候,整个表达式是正的,只要两个是假,则整个表达式是假。
4.3逻辑取反运算
我们有一个变量叫flag,如果flag为假,要做一个事情,代码如下
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int flag = 0;
if (flag != 0)
{
printf("要做一些事\n");
}
return 0;
}
如果flag是假的,就执行if里面的的语句
5.switch语句
switch语句是一种特殊的if...else结构,用来判断条件有多个结果的情况
switch(expression){
case value1:statement
case value2:statement
case value3:statement
default:statement
}
expression表示不同的值,执行相应的case分支,如果找不到相应分支的话,就执行default分支。
switch与if...else对比
输入一个整数值,计算除3之后的余数
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int n = 0;
printf("请输入一个整数:");
scanf("%d", &n);
switch (n % 3) {
case 0:
printf("整除,余数是0\n");
break;
case 1:
printf("余数是1\n");
break;
case 2:
printf("余数是2\n");
break;
default:
printf("输入的数字有错误");
break;
}
return 0;
}
case 和后边的数字之间必须有空格
每一个case语句中的代码执行后,需要加如break,才能跳出这个switch语句
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int n = 0;
printf("请输入一个整数:");
scanf("%d", &n);
if (n % 3 == 0)
printf("整除,余数是0\n");
else if (n % 3 == 1)
printf("余数是1\n");
else
printf("余数是2\n");
return 0;
}
6.while循环
6.1 if 和 while的对⽐
if ( 表达式 )语句 ;
while ( 表达式 )语句;
6.2 while语句的执⾏流程
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int i =1 ;
while(i<=10){
printf("%d ", i);
i++;
}
return 0;
}
练习2:输⼊⼀个正的整数,逆序打印这个整数的每⼀位
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int number = 0;
printf("请输入一位数字:");
scanf("%d", &number);
while (number ) {
printf("%d ", number % 10);
number = number / 10;
}
return 0;
}
要想得到n的最低位,可以使⽤n%10的运算,得到的余数就是最低位,如:123456%10得到6
要想去掉n的最低位,找出倒数第⼆位,则使⽤ n=n/10 操作就可以去掉最低位的,如:n=123456/10得到12345,12345相较于123456就去掉了最低位,12345%10就得到倒数第二位5 循环1和2两个步骤,在n变成0之前,就能到所有的位
7.for循环
7.1语法形式
for ( 表达式 1 ; 表达式 2 ; 表达式 3 )语句; // 如果循环体想包含更多的语句,可以加上⼤括号
- 表达式1 ⽤于循环变量的初始化
- 表达式2 ⽤于循环结束条件的判断
表达式3 ⽤于循环变量的调整
7.2 for循环的执⾏流程
⾸先执⾏ 表达式 1 初始化循环变量,接下来就是执⾏ 表达式 2 的判断部分, 表达式 2 的结果如果 表达式2==0,则循环结束; 表达式2 的结果如果!=0则执⾏循环语句,循环语句执⾏完后,再去执⾏表 达式 3 ,调整循环变量,然后再去 表达式 2 的地⽅执⾏判断, 表达式 2 的结果是否为0,决定循环是否继续。整个循环的过程中,表达式1初始化部分只被执⾏1次,剩下的就是表达式2、循环语句、表达式3在循环。
7.3 for循环的实践
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int i = 1;
for (i = 1; i <= 100; i++)
{
printf("%d ", i);
}
return 0;
}
7.4 while循环和for循环的比较
for 和 while 在实现循环的过程中都有初始化、判断、调整这三个部分,但是 for 循环的三个部 分⾮常集中,便于代码的维护,⽽如果代码较多的时候 while 循环的三个部分就⽐较分散,所以从形 式上 for 循环要更优⼀些。
7.5 计算1~100之间3的倍数的数字之和
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int i = 1;
int sum = 0;
for (i = 1; i <= 100; i++)
{
if (i % 3 == 0)
{
sum = sum + i;
}
}
printf("%d\n ", sum);
return 0;
}
8.do-while循环
8.1 语法形式
do语句;while ( 表达式 ) ;
while 和 for 这两种循环都是先判断,条件如果满⾜就进⼊循环,执⾏循环语句,如果不满⾜就跳 出循环 ⽽ do while 循环则是先直接进⼊循环体,执⾏循环语句,然后再执⾏ while 后的判断表达式,表达式为真,就会进⾏下⼀次,表达式为假,则不再继续循环。
8.2 do while循环的实例
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int i = 1;
do {
printf("%d ", i);
i++;
} while (i<=10);
return 0;
}
8.3练习
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int i = 0;
int count = 0;
printf("请输入一位正整数:");
scanf("%d", &i);
do {
count++;
i = i / 10;
} while (i != 0);
printf("%d", count);
return 0;
}
9.break和continue语句
9.1 while循环中的break和continue
9.1.1 break举例
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
break;//当i等于5后,就执⾏break,循环就终⽌了
printf("%d ", i);
i = i + 1;
}
return 0;
}
打印了1,2,3,4后,当i等于5的时候,循环正 break 的地⽅终⽌,不再打印,不再循环。所以 break 的作⽤就是永久的终⽌循环,只要 break 被执⾏,break 外的第⼀层循环就终⽌了。
那以后我们在循环中,想在某种条件下终⽌循环,则可以使⽤ break 来完成我们想要的效果。
9.1.2 continue举例
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
continue;
//当i等于5后,就执⾏continue,直接跳过continue的代码,去循环的判断的地⽅
//因为这⾥跳过了i = i+1,所以i⼀直为5,程序陷⼊和死循环
printf("%d ", i);
i = i + 1;
}
return 0;
}
到这⾥我们就能分析出来, continue 可以帮助我们跳过某⼀次循环 continue 后边的代码,直接到循环的判断部分,进⾏下⼀次循环的判断,如果循环的调整是在 continue 后边的话,可能会造成死循环。
9.2 for循环中的break和continue
9.2.1 break举例
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int i = 1;
for (i = 1; i <= 10; i++)
{
if (i == 5)
break;
printf("%d ", i);
}
return 0;
}
break 的作⽤是永久的终⽌循环,未来我们在某个条件发⽣的时候,不想再继续循环的时候,就可以使⽤ break 来完成。
9.2.2 continue举例
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 1;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;//这⾥continue跳过了后边的打印,来到了i++的调整部分
printf("%d ", i);
}
return 0;
}
所以在 for 循环中 continue 的作⽤是跳过本次循环中 continue 后的代码,直接去到循环的调整部分。未来当某个条件发⽣的时候,本次循环⽆需再执⾏后续某些操作的时候,就可以使⽤continue 来实现。
在这⾥我们也可以对⽐⼀下 while 循环和 for 循环中 continue 的区别:
9.3 do while循环中的break和continue
do.while 语句中的 break 和 continue 的作⽤和 while 循环中⼏乎⼀模⼀样,⼤家下来可以 ⾃⾏测试并体会。
#include <stdio.h>
int main()
{
int i = 1;
do
{
if(i == 5)
break;
printf("%d ", i);
i = i + 1;
}while(i<=10);
return0;
}
#include <stdio.h>
int main()
{
int i = 1;
do
{
if(i == 5)
continue;
printf("%d ", i);
i = i + 1;
}while(i<=10);
return 0;
}
10.循环的嵌套
前⾯学习了三种循环 while , do while , for ,这三种循环往往会嵌套在⼀起才能更好的解决问题,就是我们所说的:循环嵌套,这⾥我们就看⼀个例⼦。
10.1 练习
10.2 题⽬解析:
10.3 代码参考
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int i = 100;
for (i = 100; i <= 200; i++)
{
int j = 2;
int flag = 1;//假设素数是1
for (j = 2; j < i; j++)
{
if (i % j == 0) {
flag = 0;
break;
}
}
if(flag==1) {
printf("%d ", i);
}
}
return 0;
}
11.goto语句
#include <stdio.h>
int main()
{
printf("hehe\n");
goto next:
printf("haha\n");
next:
printf("跳过了haha的打印\n");
return 0;
}
for(...)
{
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
}
error:
//...
本来 for 循环想提前退出得使⽤ break , ⼀个 break 只能跳出⼀层 for 循环,如果3层循环嵌套就得使⽤3个 break 才能跳出循环,所以在这种情况下我们使⽤ goto 语句就会更加的快捷。