栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【C语言基础学习笔记】 分支和循环语句

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【C语言基础学习笔记】 分支和循环语句

文章目录
  • 1. 语句的概念
    • 分类
  • 2. 分支语句
    • 2.1 if语句
    • 2.2 switch语句
  • 3.循环语句
    • 3.1 While
      • break和continue
      • 小插曲:scanf和getchar
    • 3.2 for循环
      • break和continue
      • 循环变量的控制
      • for的省略写法(附上例子)
    • 3.3 do...while( )循环
      • break和continue
  • 练习
    • 1. 计算n的阶乘
    • 2. 计算1! + 2! + 3! + …… + 10!
    • 3.在一个有序数组中查找具体的数字n(二分查找)
    • 4.编写代码,演示多个字符从两端移动,向中间汇聚
    • 5.编写代码实现,模拟用户登录情景,并且只能登录3次(只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序)
  • 猜数字游戏
  • 4. goto语句

1. 语句的概念 分类
  1. 表达式语句
  2. 函数调用语句
  3. 控制语句(本文重点)
  4. 复合语句
  5. 空语句

控制语句分类:

  1. 条件判断:if语句、switch语句
  2. 循环执行:do while、while、for
  3. 转向语句:break、goto、continue、return
2. 分支语句 2.1 if语句

语法结构

// 类型一 : 单分支
if(表达式)
    语句;

// 类型二 : 双分支
if (表达式)
    语句1;
else
    语句2;

// 类型3:多分支
if (表达式1)
    语句1;
else if (表达式2)
    语句2;
else 
    语句3;

条件成立怎么判断?

答:如果表达式是0/false表示条件不成立,**非0(就是表达式不等于零的表达式)**表示条件成立

代码块:一对大括号**{}**就是一个代码块

如果条件成立,要执行多条语句,那么就应该使用代码块

注意:else的匹配问题

例子:这个代码会输出什么呢?

#include 
int main()
{
    int a = 0;
    int b = 2;
    if (a == 1)
        if (b == 2)
            printf("hehen");
    else
        printf("hahan");

    return 0;
}

实验结果:什么都没有输出

分析:如果else是跟第一个if匹配的话,最终结果就会输出haha,所以else不是跟第一个if进行匹配的;
结论:如果没有括号的情况,else会跟离他最近的if进行匹配
建议:为了写出可读性比较高的代码,建议写代码的时候加上代码块{}
代码风格(if语句)

  1. 变量和常量的相等比较,将常量放到代码的左边
int main()
{
    int n = 1;
    if (5 == n)
        printf("hhhhn");
}

练习

  1. 判断一个数是否为奇数
int main()
{
    int n = 0;
    printf("请输入一个数字:");
    scanf("%d", &n);
    if (n % 2 == 0)
    {
        printf("不是奇数");
    }
    else
    {
        printf("是奇数");
    }
    return 0;
}
  1. 输出1到100的奇数
int main()
{
    for (int i = 1; i <= 100; i++)
    {
        if (i % 2 == 1)
            printf("%d ", i);
    }
    return 0;
}
2.2 switch语句

语法结构

  • switch决定入口
  • break决定出口
  • switch后面的表达式必须是整型表达式,浮点型不行的(自己可以去实验一下)
  • case后面也要是整型常量表达式
  • default子句:都不满足的时候执行这个,一般是放到最后,但是放前面也行,break要带上
int day = 0;
scanf("%d", &day);
switch (day)
{
    case 1:
        printf("Mondayn");
        break;
    case 2:
        printf("Tuesdayn");
        break;
    case 3:
        printf("Wednesdayn");
        break;
    case 4:
        printf("Thursdayn");
        break;
    case 5:
        printf("Fridayn");
        break;
    case 6:
        printf("Saturdayn");
        break;
    case 7:
        printf("Sundayn");
        break;
    default:
            printf("输入错误");
            break;
   }
3.循环语句
  • while
  • for
  • do while
3.1 While

语法结构

while(表达式)
    循环语句;

例子:打印1到10

break和continue

break
i == 5的时候就跳出循环

continue
终止本次循环,因为变量i没有变化,所以再这里就直接陷入了死循环中

结论:

  1. break:直接跳出循环
  2. continue:终止本次循环
小插曲:scanf和getchar
  1. scanf("%s", password) :读到空格就停下来
  2. getchar() :接受一个字符,返回值就是跟输入的字符一样的

场景:输入密码,确认密码的场景

int main(){
    char password[20] = {0};
    printf("请输入密码:");

    scanf("%s", password);
    int tmp = 0;
    // 这一步筛掉那些输入密码后的回车字符(n)和输入密码带的那些空格
    while ((tmp = getchar()) != 'n');

    printf("请确认密码(Y/N)");
    int ch = getchar();
    if ('Y' == ch)
        printf("确认成功");
    else
        printf("确认失败");
}

3.2 for循环

语法结构

  • 表达式1:初始化部分
  • 表达式2:条件判断部分,用于判断循环何时停止
  • 表达式3:调整部分,用于循环条件的调整
for (表达式1; 表达式2; 表达式3)
    循环语句;
break和continue

break
直接跳出for循环

continue
跳过本次循环,也就是跳过了5

循环变量的控制

建议:

  1. 不要在for循环的循环体里面修改循环变量,也就是for循环的第三个参数
  2. 建议for语句的循环控制变量的取值采用“左闭右开”的写法,根据可读性自己进行判断即可,这里只是建议
int i = 0;
// 左闭右开
for (i = 0; i < 10; i++)
{}

// 两边都是闭区间
for (i = 0; i <= 9; i++)
{}
for的省略写法(附上例子)

问题:如图所示的代码会打印几次"hehe"


先上结果截图:结果是打印了10次

利用debug工具进行分析

  1. j的值变成10之后,j的值一直没变过,一直都是10,所以就没有再能够进入第二层循环
  2. 因为j的值是在外面进行初始化的,因此到10之后,跳出第二层循环,就再也没有机会改变j的值了


建议
初学者还是先不要搞那些省略的东西,就稳稳地把该写的写上,避免一些不必要的麻烦

3.3 do…while( )循环

这个挺少用到的

语法结构

  • 循环体至少执行一次
do
    循环语句;
while(表达式);

例子:打印1~10

break和continue

break

continue

练习
1. 计算n的阶乘
int main(){
    int n = 0;
    printf("请输入一个数:");
    scanf("%d", &n);
    int i = 0;
    int ret = 1;
    for (i = 1; i <= n; i++)
    {
       ret = ret * i;
    }
    printf("%d", ret> );
    return 0;
}
2. 计算1! + 2! + 3! + …… + 10!
  1. 方法一:
int main()
{
    int i = 0;
    int j = 0;
    int res1 = 1; // 用来每个阶乘的答案
    int res2 = 0; // 保存最终答案
    for (i = 1; i <= 10; i++)
    {
        res1 = 1; // 这里一定要进行更新一下
        for (j = 1; j <= i; j++)
        {
            res1 = res1 * j;
        }
        res2 += res1;
    }

    printf("%d ", res2);
    return 0;
}
  1. 方法二:
int main()
{
    int i = 0;
    int res1 = 1; // 用来每个阶乘的答案
    int res2 = 0; // 保存最终答案
    for (i = 1; i <= 10; i++)
    {
        res1 = res1 * i;
        res2 += res1;
    }

    printf("%d ", res2);
    return 0;
}
3.在一个有序数组中查找具体的数字n(二分查找)

注意:

  1. 求出right的值的方法
  2. while循环的条件是l <= r
  3. mid = (left + right) / 2
  4. 找到了之后要break
  5. 如果没找到就要进行判断一下:l > r``
int main()
{
    int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int k = 7;
    int sz = sizeof(arr) / sizeof(arr[0]);  // 算出该数组右多少个元素
    // 查找k
    int l = 0; // 左下标
    int r = sz - 1; // 右下标
    while (l <= r)
    {
        int mid  = (l + r) / 2; // 中间值
        if (arr[mid] < k)
        {
            l = mid + 1;
        }
        else if (arr[mid] > k)
        {
            r = mid - 1;
        }
        else
        {
            printf("找到了,下标是%dn", mid);
            break;
        }
    }
    if (l > r)
    {
        printf("找不到了n");
    }

    return 0;
}
4.编写代码,演示多个字符从两端移动,向中间汇聚
int main()
{
    char arr1[] = "welcome to bit!!!!!";
    char arr2[] = "###################";

    int left = 0;
    // int right = sizeof(arr1) / sizeof(arr1[0]) - 2; 因为字符串的结尾处是''
    int right = strlen(arr1) - 1;

    while (left <= right)
    {
        arr2[left] = arr1[left];
        arr2[right] = arr1[right];
        printf("%sn", arr2);
        Sleep(1000); // 单位是毫秒
        system("cls");
        left++;
        right--;
    }


    return 0;

}
5.编写代码实现,模拟用户登录情景,并且只能登录3次(只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序)

注意:

  1. 两个字符串的比较:用strcmp()
int main()
{
    int i = 0;
    char password[20] = {0};
    // 假设正确密码是123456
    for (i = 0; i < 3; i++)
    {
        printf("请输入密码:");
        scanf("%s", password);
        if (strcmp(password, "123456") == 0)
        {
            printf("密码正确,登录成功n");
            break;
        }
        else
        {
            printf("密码错误,请重新输入n");
        }
    }
    if (3 == i)
    {
        printf("密码输入三次都错误n");
    }

}
猜数字游戏

生成随机数的方法:

  1. srand((unsigned int) time(NULL));
    1. 初始化一次就行了,所以放到了main函数里面
  2. int ret = rand() % 100 + 1;
    1. 生成一个1~100的随机数
  3. 获取时间戳的函数time(NULL)
// 猜数字游戏

void menu()
{
    printf("-----------------n");
    printf("----1. 开始游戏---n");
    printf("----0. 退出游戏---n");
    printf("-----------------n");
}
// 猜数字游戏
void game()
{
    int guess = 0;
    // 1. 生成随机数
    int ret = rand() % 100 + 1;
    // 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;
}

4. goto语句
  1. 不能跨函数跳转
  2. 常用场景:终止程序在某些深度嵌套的结构处理过程
  3. 不过一般没有goto语句也没关系,用其他方式也是可以实现相对应的逻辑的

goto语句使用例子

  • 实现的逻辑:系统1分钟后关机,如果输入我是猪,就会取消关机
    • 这个例子还挺好玩的哈哈哈,大家可以尝试一下
  • 调用了system函数
int main()
{
    char input[20] = {0};

    system("shutdown -s -t 60");//system是一个库函数,用来执行系统命令的
n:
    printf("请注意,你的电脑将在1分钟后关机,如果输入:我是猪,就取消关机n");
    scanf("%s", input);
    // 判断
    if (strcmp(input, "我是猪") == 0)
    {
        system("shutdown -a");
    }
    else
    {
        goto n;
    }
}

不用goto语句实现上面的逻辑

int main()
{
    char input[20] = {0};

    system("shutdown -s -t 60");//system是一个库函数,用来执行系统命令的
    while(1)
    {
        printf("请注意,你的电脑将在1分钟后关机,如果输入:我是猪,就取消关机n");
        scanf("%s", input);
        // 判断
        if (strcmp(input, "我是猪") == 0)
        {
            system("shutdown -a");
            break;
        }
    }
}

scanf(“%s”, input);
// 判断
if (strcmp(input, “我是猪”) == 0)
{
system(“shutdown -a”);
}
else
{
goto n;
}
}

**不用goto语句实现上面的逻辑**
```cpp
int main()
{
    char input[20] = {0};

    system("shutdown -s -t 60");//system是一个库函数,用来执行系统命令的
    while(1)
    {
        printf("请注意,你的电脑将在1分钟后关机,如果输入:我是猪,就取消关机n");
        scanf("%s", input);
        // 判断
        if (strcmp(input, "我是猪") == 0)
        {
            system("shutdown -a");
            break;
        }
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1004821.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号