分支和循环语句

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值