C语言是结构化的程序设计语言
顺序结构,选择结构,循环结构
分支语句
if switch
循环语句
while, for, do while
什么是语句 ?
C语句可分为以下5类:
1、表达式语句
2、函数调用语句
3、控制语句
4、复合语句
5、空语句
这个就是表达式语句
![]()
这个是函数调用语句
![]()
分支语句(选择结构)
if语句
语法结构:



if语句单分支

在C语言中,if或者else的后面他们默认只能控制一条语句,想要控制多条就需要加上大括号
就像这样:

还有这样:

接下来看看这个代码

认为这个代码能打印出什么?
其实根本无法打印

因为第二个if语句是被第一个直接包括在内,而第一个if语句的条件是 a = 1 代码才能运行,上述显然不符合条件,所以根本无法打印
还有:else只跟离他最近的if相对应
再观察下面这个代码:

这个代码的意思就是条件满足返回x,条件不满足返回y
但这样不容易看出来,可以写成这样:

Tip:写判断语句时可以写成这样,当代码测试时就会报错,避免埋雷,以后程序运行时出现的bug

practice:
判断一个数是否为奇数

输出一个1~100之间的奇数

Switch语句
switch语句也是一种分支语句。
常常用于多分支的情况
就像这样:

使用if语句:

使用Switch语句:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期1\n");
case 2:
printf("星期2\n");
case 3:
printf("星期3\n");
case 4:
printf("星期4\n");
case 5:
printf("星期5\n");
case 6:
printf("星期6\n");
case 7:
printf("星期天\n");
}
return 0;
}
但我们打印的效果不太行

当我们输入3后它径直打印了星期四及后面所有,这时只需给每个case后面都加上break,即可解决问题

我们可以得出
switch上面必须是整型表达式
![]()
case后面也必须是整型常量表达式
还可以将代码改成这样,每当输入1-5, 就会打印工作日,6-7会打印休息日,输入其他数字则会提示输入错误

如果我们输入了1~7之外的数字,那么就需要加一个默认项:default

我们再观察下面这段代码:

首先,n=1进入case1,m+1,随即进入case2,n+1,再因为n=2进入case2,两者都+1,再出switch,进入case4,m+1,最后n = 3 ,m= 5
while循环
语法结构:

判断这个代码的结果

当 i = 5时,因为break的作用是直接终止循环,所以只会打印1234
这下进行了一些改动:

这里break变成了continue,而continue的作用是跳过本回合,直接进入下一循环的判断阶段,这里 i 还是5,所以也会进入死循环
这里break和continue最大的区别是break会跳过后面所有代码,而continue则是直接进入循环。
getchar函数
获取字符,返回的是 int ,也要放回 int 的变量里面
当我们把那个字符的ASCII码值放在 ch 里面后打印他则需要putchar函数

我们观察一下这个代码

运行后,你输入什么他就会输出什么

这里的 EOF是-1
因为每一次输入后都点击了一次回车,所以回车也被getchar接收,所以结果会是上面那样
如果你想要停下来,只需按键盘上的 Ctrl +z,,此时也是让程序返回了EOF。

EOF :end of file 叫文件结束标志
再观察一下这段代码:

这里的passedWord是数组名,数组名本身就是地址所以不用取地址,除了数组都要取地址
程序运行后,随便输入密码,突然发现还没有让我们判断,就直接显示失败了
当我们在键盘上输入字符串后并不是直接进入scanf,而是因为我们scanf和键盘上有个输入缓冲区,scanf刚开始是在输入缓冲区里查找有没有数据,如果没有那就会等,我们输入密码后敲入回车,scanf就会看见,并且开始从缓冲区里拿东西,但是拿走的是 abcdef

随后getchar也读数据,就把\n读走放在ch里面去了,然后判断不等于 Y,所以就会确认失败
,我们就可以在passedWord后面再加上一个getchar,将\n清理

这里再次运行程序就会成功
但当我们这样输入时,又会跟上面的错误一样

这里的scanf也同样只读到了abcdef,后面的就没有管,而getchar一次又只能吸收一个字符,这次字符较多,再用上面的方法不现实
我们随即加了这一串代码,只要不是\n都会被接收,然后\n也会被拿走,最后循环才会停下来,程序也会正常运行
for循环
语法结构:

跟while循环大差不差
我们再次观察一段熟悉的代码

这段代码的结果应该是 1234就会停止
这里的break换成continue后结果会变成 1234 678910
两个建议:
不要在for循环体内改变循环变量

建议for语句的循环控制便利的取值采用“前闭后开区间”写法

这里不建议把 <10写成<=9
for的初始化,判断,调整三个部分都可以省略,但是省略掉判断部分,就意味着判断恒为真
这里会打印100次hehe

这个代码就是因为乱省略,结果大为不同

当 i = 0 时打印了10次,当i=1时就无法打印
do ...while循环
这个语句似乎不太常见
语法:

打印1~10

这样就只有1、2、3、4

这样则是1234死循环

计算n的阶乘

计算1~10的阶乘

练习!!!
二分查找/折半查找
在一个有序数组中查找具体的某个数字n。
先将最左边的数字标记为left,最右边的标记为right,再将两者相加除2所得值mid相比较,如果较大,mid则变为left,right则为原来的right。较小则相反。

假设n = 7,首先left下标为0right下标为9,mid则为4,4
mid还可以这样写
![]()
welcome to bit !!!
编写代码,演示多个字符从两端移动,向中间汇聚。

这样

将arr1的字符换为arr2的字符:

这里的sleep是指让打印的缓慢一点,单位是毫秒
![]()
还需要加头文件
上面strlen也需要头文件:
![]()
结果:

模拟登录
编写代码实现,模拟用户登录情景,并且只能登陆三次。(只允许输入三次密码,如果密码正确则提示登陆成功,如果三次均输入错误,则退出程序。
假设正确的密码是:“bitbit”
程序是:

密码输入成功是这样:

猜数字游戏
电脑随机生成一个1~100之间的数字
如果你猜小了,告知猜小了
如果你猜大了,告知猜大了
如果你猜对了,告知猜对了
代码:

结果:

这个代码用来清理屏幕上的所有显示。
![]()
这个是打印出来的效果

接下来具体完成猜数字的游戏代码
先生成随机数,然后才是猜数字
rand函数可以生成随机数,返回一个0 ~ RAND_MAX之间的随机数。头文件是#include
这个是RAND_MAX的值
![]()
通过计算机换算得 : 32707
这个是随机数代码

运行后代码也可以正常显示:

但是当关闭窗口后,下一次运行代码,会发现还是一样的数字,一点没有改变,说明代码需要改进,要对随机数生成器进行初始化。
通过调节这个字符

我们可以发现srand后面的值不同,所随机的结果不同




这时为了保证数值的随机性,我们需要使用时间戳,就是就是电此时此刻运行代码的时间也与电脑开机时间的差值,类似这样:

C语言中的time函数,可以生成 当前时间的时间戳。
![]()
由于time函数有指针,而我们现在只想用他的返回值不想用参数,只用传一个空指针 NULL 而且time函数的返回类型是time_t的。
srand需要的参数是unsigned

我们就需要吧time_t返回类型强转成unsigned
![]()
time函数需要用到的头文件是 #include
这时候我们运行代码会发现数值在时刻变化:

但是这里有个bug,如果我们两次按的非常快,那他生成的随机数就会相等

这是因为我们的代码里随机数生成器每一次都要设置一次,被过于频繁的调用了,而我们只需要在主函数开头设置一次就行了

这样效果就比较好

但我们刚开始的目的是生成1-100之间的数字,我们只需给生成的数字%100就可以了(任何数%100所得的数只能在0-99)

这样生成随机数就完成了

这下就进入编写猜数字代码的环节了
就是猜数字代码:

由于我们要进行多次猜数字,所以需要加上一个循环。

这里的while(1),是指如果一直猜那就是一直为真。
这就是最终效果

如果我们想在vs外运行猜数字游戏
那就要把这里的Debug换成Relsas,随后运行代码
![]()
就可以在运行框里找到代码的地址,然后根据地址就可以找到exe程序
猜数字游戏源码
#define _CRT_SECURE_NO_WARNINGS 1
//猜数字游戏实现
//电脑随机生成一个1~100之间的数字
//猜数字
//如果你猜小了,告知猜小了
//如果你猜大了,告知猜大了
//如果你猜对了,告知猜对了
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
printf("*********************************\n");
printf("********** 1. play ************\n");
printf("********** 0. exit ************\n");
printf("*********************************\n");
}
//rand函数可以生成随机数
//返回一个0~RAND_MAX(32767)
void game()
{
int guess = 0;
//1. 生成随机数
int ret = rand()%100+1;//0~99-->1~100
//printf("%d\n", ret);
//2. 猜数字
while (1)
{
printf("请猜数字:>");
scanf("%d", &guess);
if (guess < ret)
{
printf("猜小了\n");
}
else if (guess > ret)
{
printf("猜大了\n");
}
else
{
printf("恭喜你,猜对了\n");
break;
}
}
}
int main()
{
int input = 0;
//设置随机数的生成器
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,重新选择!\n");
break;
}
} while (input);
return 0;
}
C语言分支与循环语句详解
1401

被折叠的 条评论
为什么被折叠?



