第四课:分支和循环(上)
1.if语句
1.1分支中包含多条语句
默认在if和else语句中都只控制一条语句,例如:
在这种情况下,您已经成年了和haha这两句话都会被打印出来
所以我们需要在if语句后面加上大括号来让语句能够控制多条语句
1.2悬空else问题
值else语句只和离它最近的if语句相匹配
2.关系操作符
2.1关系操作符连用问题
关系操作符不宜连用,比如 1 < a < 5, 应该使用 1 < a && a < 5
例子如下:
当所给的num的值是21时,程序运行之后会打印haha,但是不会打印出hehe,理由如下:
3条件操作符(三目操作符)
条件操作符也被称为三目操作符,形式如下:
1 exp1? exp2: exp3
计算逻辑为:如果exp1为真,则计算exp2,exp2的结果就是整个表达式的结果;如果exp1为假,则计算exp3,exp3的结果就是整个表达式的结果
4.逻辑操作符
- ! 逻辑取反操作符(改变单个表达式的真假)
- && 逻辑与操作符(两侧表达式都为真,则为真,否则为假)
- || 逻辑或操作符(两侧至少有一个表达式为真,则为真,否则为假)
4.1练习:闰年的判断
4.2短路
c语言逻辑运算符在使用过程中有一个特点,它总是先对左边的表达式求值,再对右边的表达式求值
如果左边的表达式已经能够对整个表达式进行判断时,右边的表达式将不再进行计算
下面是一个练习题:
分析代码:
那么这个代码的运行结果就是
i = 0; a = 1; b = 2; c = 3; d = 4
结果:
i = 1; a = 1; b = 3; c = 3; d = 4
5.switch语句
switch逻辑模板:
1 switch (expression) {
2 case value1: statement
3 case value2: statement
4 default: statement
5 }
注意:
1.switch语句后边的expression必须是整形表达式
2.case后边的值,必须是整形常量表达式
5.1练习
输入任意一个整数值,输出除以3以后的余数
如果输入3的话,运算结果为:
余数是0 余数是1 余数是2
这是因为3 % 3 = 0;程序会从case 0这个入口进,如果不写break的话,程序会一直往下进行
改为上边那样便可以正常执行了
注意:
1.case和后边的数字之间必须有空格
2.每一个case语句后边必须加上break,才能跳出这个switch语句
5.2练习
要求:
输入1 - 5,输出的是“工作日”
输入6 - 7,输出的是“休息日”
我们完全可以这样写,但是这样写出的代码太冗杂,所以可以改为:
注意:
default可以放在任意位置,case语句也是如此,他们知识switch语句的一个入口,当default语句前面的case语句没有输入break时,也会执行default里面的语句
6.while语句
7.for循环
8.do while循环
do while循环会先进入循环体,然后再进行条件判断
9.break 和 continue语句
-
break语句
用于永久地终止一个循环 -
continue语句
用于终止循环中continue后边的代码,但是不会跳出循环
9.1break举例
运行结果为:1 2 3 4
9.2continue举例
运行结果为:1 2 3 4 …(死循环)
10.循环的嵌套
就是指一个循环中再套用多个循环
10.1参考代码
找出100 - 200之间的素数
11.goto语句
goto语句不建议多次使用,以免发生程序执行过程中代码随意跳转的情况,但是goto语句在某些情况下使用起来很方便,例如:
在多层循环中,由于一个break只能跳出一个if语句,所以在这个时候使用goto语句就会变得很方便
所有代码展示
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//证明 if 和 else if 的区别
int main()
{
int a = 0;
scanf("%d", &a);
if (a % 2 == 0)
{
printf("hehe\n");
}
if (a % 4 == 0)
{
printf("haha\n");
}
return 0;
}
#include <math.h>
//讨论平方根的整形值
//平方根所需要的函数是sqrt
//需要引用math.h库函数
int main()
{
int i = sqrt(2);
printf("%d\n", i); //值为1
float j = sqrt(2);
printf("%f\n", j); //值为1.414214
return 0;
}
//讨论strcmp的返回值
//strcmp是用于比较两个字符串是否相等的函数
//需要引用string.h库函数
int main()
{
char arr[20];
printf("i = ");
scanf("%s", arr);
if (strcmp(arr, "我是猪") == 0)
{
printf("0\n");
}
if (strcmp(arr, "我是猪") == 1)
{
printf("1\n");
}
printf("%d\n", strcmp(arr, "我是猪"));
return 0;
}
//分支和循环讲课代码
//1.输入一个整数,判断是否为奇数
int main()
{
int n = 0;
printf("请输入需要怕判断的数:");
scanf("%d", &n);
if (n % 2 == 1)
{
printf("这个数为奇数");
}
else
{
printf("这个数不是奇数");
}
return 0;
}
//1.1 讨论if else函数中语句控制问题
int main()
{
int age = 0;
printf("请输入您的年龄:");
scanf("%d", &age);
if (age >= 18)
printf("您已经成年了\n");
printf("haha\n");
return 0;
}
//2.1 讨论关系操作符连用问题
int main()
{
int num = 0;
printf("请输入num的值:");
scanf("%d", &num);
if (1 < num && num < 20)
{
printf("hehe\n");
}
if (1 < num < 20)
{
printf("haha\n");
}
return 0;
}
//4.1 闰年的判断
//闰年判断的规则:
// 能被4整除并且不能被100整除是闰年
// 能被400整除是闰年
int main()
{
int year = 0;
printf("请输入所要判断的年份:");
scanf("%d", &year);
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
{
printf("%d是闰年\n", year);
}
return 0;
}
//4.2 短路练习题
//计算下面代码运行的结果
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
printf("i = %d\n a = %d\n b = %d\n c = %d\nd = %d\n",i, a, b, c, d);
return 0;
}
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++||++b||d++;
printf("i = %d\n a = %d\n b = %d\n c = %d\nd = %d\n",i, a, b, c, d);
return 0;
}
//5.1 switch语句练习
int main()
{
int num = 0;
printf("请输入num的值:");
scanf("%d", &num);
switch (num % 3)
{
case 0:
printf("余数是0\n");
break;
case 1:
printf("余数是1\n");
break;
case 2:
printf("余数是2\n");
break;
}
return 0;
}
//5.2 练习
int main()
{
int day = 0;
printf("day = ");
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日");
break;
case 6:
case 7:
printf("休息日");
break;
default:
printf("请输入1-7之内的数!");
}
return 0;
}
//9.1 break语句的讨论
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
{
break;//当i等于5后,就执⾏break,循环就终⽌了
}
printf("%d ", i);
i = i + 1;
}
return 0;
}
//9.2 continue语句的讨论
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;
}
//10.1 循环的嵌套
int main()
{
int i = 0;
for (i = 101; i <= 200; i+=2)//因为是2的倍数的数不可能是素数,所以写成i += 2
{
int j = 0;
int cmp = 1; //用于判断是否是素数
for (j = 2; j <= sqrt(i); j++)
{
if (i % j == 0)
{
cmp = 0;
break;
}
}
if (cmp)
{
printf("%d ", i);
}
}
return 0;
}