【C语言初阶】2 分支与循环语句

在C语言中如何表示真假?
0表示假,非0表示真。

分支语句

1.悬空else

#include <stdio.h>
int main()
{
    int a = 0;
    int b = 2;
    if(a == 1)
        if(b == 2)
            printf("hehe\n");
    else
        printf("haha\n");
    return 0;
}

这里并不会打印出haha,如果没有大括号else语句只会和相离最近的if进行匹配,但是这种代码风格又很容易让人误解
放进大括号中,让代码更整洁

2.if 形式的比较

//代码1
if (condition) {
    return x;
}
return y;
//代码2
if(condition)
{
    return x;
}
else
{
	return y;
}

return 会跳出当前函数,所以代码1和代码2所表达的意思相同,但是代码1很容易让人造成误解

//代码3
int num = 1;
if(num == 5)
{
    printf("hehe\n");
}
//代码4
int num = 1;
if(5 == num)
{
    printf("hehe\n");
}

这里的5和num进行位置交换主要是为了防止写代码的过程中,将==(比较判断)写成=(赋值),代码4的情况下写成=是会发出报错的

循环语句

循环分为三种:
while
for
do while

1.while 循环

break在while循环中的作用:
其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。
所以:while中的break是用于永久终止循环的
continue在while循环中的作用就是:
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,
而是直接跳转到while语句的判断部分。进行下一次循环的入口判断

getchar定义成int类型,是因为getchar的返回值是字符或者EOF(end of file),#define 定义EOF为整型的-1
在这里插入图片描述

#include <stdio.h>
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)
putchar(ch);
return 0;
}
//这里的代码适当的修改是可以用来清理缓冲区的

在这里插入图片描述
getchar在未获取到字符会在输入缓冲区等待,要让getchar获取到字符要在键盘上输入回车键(\n),但是输入缓冲区中也就有两个字符 ‘a’ , ’ \n ‘,因此while循环会putchar两次,光标会在下一行闪
在这里插入图片描述
此时输入缓冲区除了密码还有\n,scanf只是取走了其中的密码,还剩下一个\n
scanf函数的读取规则
getchar看到输入缓冲区还有数据’\n’ 就直接与’Y’进行比较,并未让我们自行判断
所以,应当取走\n,让getchar等待输入
在这里插入图片描述
如果我们只是在getchar获取字符前加一个getchar来获取\n,如果密码中带空格,又不行了
scanf读取到空格就不会往后读取,而getchar又只获取了一个字符,输入缓冲区还是有数据,还是会自动判断
此时,就需要一个循环来读取,将缓冲区所有的数据读走,再进行判断
在这里插入图片描述
在这里插入图片描述
while 循环三部分代码块比较分散,在修改的过程中容易出现问题
在这里插入图片描述

2.for 循环

for循环中break和while循环相似,但是continue不一样
在这里插入图片描述
for循环是跳过后面的代码来到调整部分,而while是跳过后面的代码进入判断部分

2.1 for循环的变种

#include <stdio.h>
int main()
{
//代码1
for(;;)
{
printf("hehe\n");
}
//for循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问题。

在这里插入图片描述
这里i,j的初始化部分都省略了,j循环3次后 j = 3 ,由于失去初始化 j 始终是等于3,无法进入循环内部,所以最终是只打印3个hehe
在这里插入图片描述
判断部分k=0,=是赋值符号,将k赋值为假,循环0次

通过循环解决问题

求n的阶乘之和
在这里插入图片描述
1的阶乘加到3的阶乘,这里要注意ret 每次乘起来之后要及时的置为1,才不会出现累乘的效果
在这里插入图片描述
代码优化,将两层for循环变成1层

典型例题

折半查找法

在这里插入图片描述
两个关键点:
1、不能写成left<right的形式 left <= right某些情况下left和right将指向同一位置(最难找的情况)
2、 mid的初始化要放在循环中,每次进入while循环中mid的位置都会发生改变,放在循环外就没法修改了

多个字符从两端移动,向中间汇聚

在这里插入图片描述
1.strlen函数计算的是字符串长度,不包括斜杠0,但是right计算的是下标所以要减一,而sizeof计算的是字符个数,其中包括斜杠0
2.sleep函数要引用头文件windows
3.cls清空命令,system系统函数

用户登录情景,并且只能登录三次。

只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序

在这里插入图片描述
比较2个字符串是否相等,不能使用==,而应该使用一个库函数:strcmp,如果返回值是0,表示2个字符串相等
在这里插入图片描述

猜大小

基本框架如下:
基础框架的构建
关键是case 1当中的猜数字实现
在这里插入图片描述
但是rand函数生成的随机数每次都是固定的
在这里插入图片描述
在这里插入图片描述
在rand之前设置随机生成器srand函数

在这里插入图片描述
srand中也要传入1个随机值才能生成随机值(设置时间戳)时间戳的设置涉及time函数 time函数的返回值是long long 函数,而srand需要的是unsigned int 类型,所以需要强制类型转换
在这里插入图片描述
srand 函数头文件<stdlib.h> time函数的头文件<time.h>
在这里插入图片描述
srand 函数若设置在game函数中,可能会出现一样的情况,srand只需要在工程中设置一次即可
在这里插入图片描述
将rand%100可以将随机值控制在0~99之内.再加1就是100
在这里插入图片描述
猜数字的实现
在这里插入图片描述

goto语句

在这里插入图片描述
在这里插入图片描述
goto语句不能跨函数跳转,只能在当前函数体内跳转

关机程序

在这里插入图片描述
shutdown -s -t 60 设置电脑在60秒内关机
shutdown -a 取消关机
在这里插入图片描述
scanf %c 和%s的区别 %c是针对单个字符的 %s是字符串

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值