目录
- if语句
- 关系操作符
- 条件操作符
- 逻辑操作符
- switch语句
- while语句
- for循环
- do while循环
- break和continue
- 循环的嵌套
- goto语句
- 综合-猜数游戏
1. if语句
语法格式:
if (表达式)
语句
0为假,非0表示真。如果是真,语句执行,否则不执行
流程:
else
else表示if条件不满足的另一个分支,如年龄小于18未成年的写法:
int age = 0;
scanf("%d", &age);
if(age>=18)
printf("成年\n");
else
printf("未成年\n");
悬空esle的问题
if语句里面可以同时嵌套if语句,嵌套的else默认和最近的一个if匹配
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
上代码输出结果空,下面的else虽然和第一个if格式相对,但仍匹配的是最近的if,当a==1不满足时,不会执行下面的if,也不会走对应的else
书写if时尽量带上大括号,方便查看if的范围
2. 关系操作符
用于比较的表达式叫关系表达式,运算符称为关系运算符
- > 大于运算符
- < 小于运算符
- >= 大于等于运算符
- <= 小于等于运算符
- == 相等运算符
- != 不相等运算符
关系表达式通常返回0表示假,1表示真
3. 条件操作符
三目操作符,格式:
exp1?exp2:exp3
exp1为真,exp2计算,否则exp3计算
4. 逻辑操作符: && || !
逻辑操作符提供逻辑判断功能,用于构建更复杂的表达式
&&: 与运算符,就是并且的意思 (两侧表达式都为真,则为真,否则为假)
||: 或运算符,或者的意思 (两侧至少有一个为真,则为真,否则为假)
!: 逻辑取反运算符 (改变单个表达式的真假)
逻辑取反运算符
非0取反为0,0取反为非0
练习. 闰年的判断
闰年的两个条件:
- 能被4整除不能被100整除
- 能被400整除
int year = 0;
scanf("%d", &year);
if((year%4==0 && year%100!=0) || (year%400==0))
printf("是闰年\n");
短路
c语言逻辑运算符的特点,先对左侧的表达式求值,如果左边的都不满足,就不会对右边的再计算,这种情况称为短路
if (3>5 && 4>2)
上面语句,首先3不大于5,左边不满足,就不会看右边,直接跳过
5. swithch语句
除过if,还有switch来实现分支结构
注:
- switch后的判断必须是整形表达式
- case后的值,必须是整形常量表达式
break
switch语句的分支只有遇到break才能跳出switch语句,如果case后没有break,代码会继续向下执行,知道遇到break或语句结尾
switch (1) {
case 1:
printf("1");
case 2:
printf("2");
default:
printf("3");
}
switch里面值为1,进入1的分支,没有break会继续进入下面分支,最后输出123
break也不是必须有,如果多种case都是同一种结果,没必要break
switch(day){
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日");
}
default
所有case条件不能满足,就会进入default,这两个并没有顺序要求,但一般将default放在最后
6. while
c语言提供了3种循环方式,while是其中一种
流程:
执行判断表达式,表达式的值为0,循环直接结束;表达式不为0,继续执行循环语句,语句结束后再判断
7. for循环
for循环是使用最多的
for (表达式1,表达式2,表达式3)
表达式1,用于循环变量的初始化
表达式2,循环条件结束的判断
表达式3,循环变量的调整
执行流程:
首先1,初始化循环变量,接下来是表达式2的判断部分,结果为0,则循环结束。不等于0执行循环语句,循环结束后,再执行3,调整循环变量,,然后再去2的地方判断
while和for的对比
8. do while循环
do
语句
while (表达式);
使用最少,先进入循环体,执行语句,然后再进行判断,为真才继续,结尾有分号
流程:
练习
输入一个正整数,计算是几位数
参考代码:
//输入一个数,计算是几位数
int input;
int cnt = 0;
scanf("%d", &input);
do
{
input /= 10;
cnt++;
} while (input);
printf("%d", cnt);
9. break和continue语句
break的作用是永久终止循环,只要遇到break,就会跳出循环
continue的作用是跳过本次循环continue之后的代码,for和while中有所差异
break举例
int i = 1;
for(i=1; i<=10; i++)
{
if(i == 5)
break;
printf("%d ", i);
}
执行结果:
i值加到5时,会直接跳出循环,后面的代码也不执行
continue举例
int i = 1;
for(i=1; i<=10; i++)
{
if(i == 5)
continue;//这⾥continue跳过了后边的打印,来到了i++的调整部分
printf("%d ", i);
}
结果:
i=5时会跳过下面代码,继续循环,所以不输出5
10. 循环的嵌套
练习
找出100-200之间的素数,并打印在屏幕上
注:素数是只能被1和本身整除的数
解析
- 首先生成100-200之间的数,使用循环
- 判断该数字是不是素数,需要和2-该数字-1的值取模,如果结果为0,则不是素数,生成这个数字需要嵌套循环
参考代码:
//生成100-200的素数
for (int i = 100; i <= 200; i++)
{
int flag = 1;
for (int j = 2; j <= i - 1; j++) {
if (i % j == 0) {
flag = 0;
break;
}
}
if(flag)
printf("%d ", i);
}
结果:
优化方案:
- 100不是素数,从101开始判断,偶数肯定不是素数,所以i值每次+2
- 如果一个数n可以拆分成a*b的形式,那么肯定有一个因子是小于√n,只需要判断√n范围,只要有一个因子,就说明该数不是素数
for (int i = 101; i <= 200; i+=2)
{
int flag = 1;
for (int j = 2; j <= sqrt(i); j++) {
if (i % j == 0) {
flag = 0;
break;
}
}
if(flag)
printf("%d ", i);
}
10. goto语句
goto语句和跳转标号,可以在同一函数内跳转到设置好的标号
printf("hehe\n");
goto next:
printf("haha\n");
next:
printf("跳过了haha的打印\n");
got语句会打乱程序的执行流程,尽量少用。但在多层循环的情况下跳出,会非常方便
猜数游戏
要求:
- 游戏界面
- 生成1-100随机数
- 玩猜字游戏,大了或是小了给出对应提示,限定5次机会,猜对游戏结束,回到游戏界面
解析
- 随机数的产生
rand()函数会返回一个伪随机数,范围是0-RAND_MAX之间,大部分编译器的大小是32767
头文件是stdlib.h
伪随机数,即每次启动程序生成的随机数和上一次是一样的,因为rand是根据一个固定的"种子"为基准计算的 - 初始化随机数
srand()可以设置随机数种子,不设置rand的种子默认为1,可以用时间来作为随机数种子,因为时间是每时每刻都在变化的,time函数可以返回1970年1月1日0时0分0秒到程序运行的时间差值,单位秒。返回类型是time_t,本质是32位或64位整形,返回一个时间戳,可以转化为对应的时间 - 1-100的随机数,用rand生成数再模100,值为0-99,最后加1
vs2022 time_t的说明:
//VS2022 上time_t类型的说明
#ifndef _CRT_NO_TIME_T
#ifdef _USE_32BIT_TIME_T
typedef __time32_t time_t;
#else
typedef __time64_t time_t;
#endif
#endif
typedef long __time32_t;
typedef __int64 __time64_t;
32位time_t本质是long类型
srand的参数是unsinged int类型,所以需要转换。srand只需要生成一次
代码:
//主界面
void show() {
printf("********************\r\n");
printf("*****1.开始游戏*****\r\n");
printf("*****0.退出游戏*****\r\n");
printf("********************\r\n");
}
//游戏循环
void game() {
//生成1-100随机数
int number = rand() % 100 + 1;
int innumber = 0; //用户输入
int cnt = 1; //记录次数
printf("猜一个数\r\n");
while (1)
{
if (cnt > 5) {
printf("猜数失败\r\n");
break;
}
scanf("%d",&innumber);
if (innumber == number) {
printf("猜对了\r\n");
break;
}
if (innumber > number)
printf("猜大了\r\n");
if (innumber < number)
printf("猜小了\r\n");
cnt++;
}
}
int main()
{
int input=0;
//生成随机数
srand((unsigned int)time(NULL));
do
{
show();
//用户选择游戏或退出
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
break;
default:
printf("输入错误\r\n");
break;
}
} while (input);;
return 0;
}