分支和循环

 1.if语句
if(表达式)   IF语句先进行表达式的判断,如果条件为真就执行其所附带的花括号里边的语句。
{
    ........;
}   IF后边加分号会使ELSE无从匹配
else if         👈  互斥选择结构,与IF和ELSE构成条件的多重判断
{
    .......;
}
else
{
    ......;
}  花括号不需要加分号
if,else if,else语句如果不加花括号,都将默认与下方一条语句匹配。最好把花括号写开,可以避免BUG产生。
if();
if()       👈  并列选择语句,此算法优点在于写起来简单,缺点在于计算机对每一个IF语句都要进行判断,运行效率上不如互斥选择结构和嵌套选择结构。
if()
......
if()
{
       if()
    else

else         👈  嵌套选择结构,优点:可以减少不必要的比较,而且可以参考数据的特征调整判断条件来做到优化算法,运行效率高;
{                       缺点:代码块可读性下降,如果嵌套太多会冗长
    if()
    else
}
if( i = 5)赋值表达式的值是变量被赋的值,IF获得的值就一直是5.不要与判断符(if (i==5))搞混了。
          2.switch语句:
switch(整型表达式)
{
    case value1: ......;(break);
    case value2:.......;(break);
    default:.......;(break);
}
VALUE的值可以是常量,也可以是整型常量表达式;可以是数字,也可以是字母,VALUE的值就是整形表达式的值。
BREAK用于结束一个分支,并且分支以下的部分全都不执行;如果不用BREAK,则可以确定程序的入口,执行的CASE后边的语句继续执行。
DEFAULT语句用于执行不符合VALUE的值的所有情况,CASE和VALUE所在位置不是固定的,DEFAULT语句也可以不写。
多个CASE如果执行同样的语句,可以多个CASE进行堆叠合并。
int main()
{
    int day = 1;
    switch (day)
    {
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:printf("工作日"); break;
    case 6:
    case 7: printf("今日休息"); break;
    }
    return 0;
}

3.循环  补充

1.break和continue

break语句会终止循环,循环体中剩余部分有语句也将不会再执行。

        int i = 1;

        while (i<=10)

        {

        if ( i == 5)

break; 👈 只要BREAK执行就直接停止循环,

printf("%d",i); 👈 剩余的代码不执行,最终I==5,打印出1 2 3 4.

i++;

}


continue的作用是跳过本次循环中continue后边的代码,继续循环。

int i = 1;

while (i<=10)

{

if ( i == 5)

continue; 👈 当I = 5的时候会跳过本次循环

printf("%d",i); 👈 I= 5 的时候,这一次循环continue后边的循环就别做了

i++;

} 结果:1 2 3 4后陷入死循环

因此WHILE循环+CONTINUE如果不对循环变量进行位置正确的改变,可能会陷入死循环!

特例:for(int i = 1; i < 10;i++)

{

if ( i == 5 )

continue;

........ 👈 continue会跳过省略号部分的语句,但是FOR循环的最后会在最上方的括号内实现循环变量的调整,所以I++仍然会被操作。

(如果i++被省略,并且I++放在了CONTINUE的后边,那就死循环没办法了。。。。)

总结:BREAK适用于当某个条件满足时就彻底结束循环,并且也不再执行循环体之内的所有BREAK之后的代码;

CONTINUE适用于当某个条件满足时,对于本次循环,将循环内CONTINUE后面的代码省略,循环继续;

2.goto语句:实现语句的跳转

int main()

{

printf("hehe");

goto a;

printf("haha");

a: 👈 这是冒号,指示goto执行的代码,可以实现语句的跳转。

printf("heihei"); // 打印结果: hehe heihei

}

{

a:

printf("hehe");

goto a;

printf("haha");

goto可以实现程序的向前/向后跳转。但是向前跳转的时候会降低程序的可读性,也可能造成死循环。

但是如果在多层循环中想要立刻终止循环,除了一堆可能出BUG的break,可以尝试用goto来实现。

3.rand()函数

需要头文件: <stdlib.h> < time.h>

rand()函数生成的是伪随机数,因为没有对种子初始化,所以同一条 rand()产生的随机数是一样的。

int r = rand();
printf("%d\n", r); 执行完后关闭再打开,进行原程序,给出的数字是一样的;如果利用循环重复执行,那么给出的数字是不一样的。


因此,要产生真正的随机数,需要三把手:

  1. strand函数将种子初始化:如果需要真正的随机数,就需要将种子保持变化,不同的种子,随机生成的法则也会变化,所以得到的值也会变化。

    strand(1)会将基准值设为1,但仍然是一个定值,不会产生真正的随机数。

    利用TIME函数产生一个时间戳, 利用时光的流逝,可以产生不同的数字,于是就产生了不同的种子。

    strand接受的形参只能是无符号整数;

    time 函数需要指针,给他一个NULL(空指针),就只返回时间的差值;time函数返回的是整数,但是需要强制类型转换成无符号整数。

    代码:strand((unnsigned)(time(NULL)) 就可以实现持续变化的种子!

  2. rand() 函数有返回值,返回的是0----32767之间的任意一个数字。

    int r = rand(). 👈 将RAND获得的值存储到r里边。

    rand返回的范围可能太大,可以利用取模来进行范围的缩小:

    对于任意一个数字,如果%101,余数将会是0---100的某一个值。

    (rand()%(b-a+1)可以产生0---b-a的某一个余数,加A就可以完成所需要的范围。

    如果要生成a---b的随机数,可以参考int r = a + (rand()%(b-a+1));

  3. 在整个程序当中,只可以进行一次种子的初始化,否则会出现BUG。

    以下是利用循环+自定义函数+RANDOM+TIME完成的小游戏:

 #include <time.h>;

#include <stdio.h>
#include <stdlib.h>

void game()
{
    int count = 5;
    int r = (rand()%100+1); //
    //
    while (count != 0)
    {
        printf("你还有%d次机会。\n",count);
        printf("请猜数字:");
        int m = 0;
        scanf("%d", &m);
        if (r > m)
            printf("小了!\n");
        else if (r < m)
            printf("大了!\n");
        else
        {
            printf("答对了!\n");
            break;
        }
        count--;
    }
    if (count == 0)
        printf("游戏结束!数字是:%d\n", r);
    printf("如果继续,请重新与我交互………………\n");
}
int main()
{
    srand((unsigned)time(NULL)); 
    int a = 2;
    do
    {
        menu();
        scanf("%d", &a);
        switch (a)
        {
        case 1:printf("开始!\n"); game(); break;
        case 0:printf("退出!\n"); break;
        default:printf("你干嘛~哈哈~哎呦~\n"); break;
        }
    } while (a);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值