C语言零基础入门教程:82-100节

082. 简化代码逻辑的最佳实践

实现过程

在此案例中,我们为一个在线购物平台的优惠券系统编写了代码,根据用户的购物车总额和会员等级,系统提供不同等级的折扣。我们首先判断用户是否为VIP,接着根据购物车总额的不同来决定折扣的大小。如果用户不是VIP,则通过判断购物车总额来决定是否给出折扣。

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
#include <stdbool.h>

int main(void)
{
    double cart_total = 120;
    bool is_vip = true;
    double discount_rate = 0.0;

    // 判断VIP等级和购物车总额来决定折扣
    if (is_vip) {
        if (cart_total > 100) {      // VIP,购物车超过100
            discount_rate = 0.20;
        }
        else {                       // VIP,购物车不超过100  
            discount_rate = 0.05;
        }
    }
    else if (cart_total > 50) {      // 不是VIP,购物车大于50
        discount_rate = 0.10;
    }
    else {
        discount_rate = 0.0;         // 不是VIP,购物车不超过50  
    }

    // 输出折扣
    printf("你的折扣为:%.2f%%\n", discount_rate * 100);

    return 0;
}
代码解释
  • 首先定义了购物车总额cart_total和是否为VIP的标志is_vip
  • 通过嵌套if语句判断VIP等级和购物车总额,决定折扣。
  • 对于VIP用户,若购物车总额大于100,则给予20%折扣;若不超过100,则给予5%折扣。
  • 对于非VIP用户,若购物车总额超过50则给予10%折扣,否则不提供折扣。
  • 最后输出计算后的折扣。

083. 卫语句的使用:租车案例

实现过程

这个程序模拟了一个租车的条件判断系统。如果用户的年龄和驾驶经验不符合条件,程序会提前退出并给出相应的提示。通过"卫语句"优化了代码,使得检查条件的逻辑更简洁。

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
#include <stdbool.h>

int main(void)
{
    uint8_t age = 23;
    uint8_t driving_exp_years = 0;

    // 判断年龄
    if (age < 21) {
        puts("年龄不符合条件");
        return 0;
    }

    // 判断驾驶经验
    if (driving_exp_years < 1) {
        puts("驾驶年龄不符合条件");
        return 0;
    }

    // 所有条件满足
    puts("满足条件");

    return 0;
}
代码解释
  • 使用if语句依次检查用户的年龄和驾驶经验。
  • 如果年龄不符合要求,程序立刻退出,输出提示信息。
  • 如果年龄符合要求,但驾驶经验不足,同样输出提示并退出。
  • 如果所有条件都满足,则输出“满足条件”。

084. 简化逻辑表达式:避免 if-else 嵌套

实现过程

在这个示例中,我们简化了if-else语句。通过将逻辑判断提取到更简洁的if条件中,减少了嵌套的复杂性,使得代码更容易理解和维护。

#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>

int main(void)
{
    bool is_weekend = true;
    bool has_invitation = true;

    // 只需检查是否有邀请
    if (has_invitation) {
        puts("可以进入");
        return 0;
    }

    // 否则
    if (!has_invitation) {
        puts("滚蛋");
        return 0;
    }

    return 0;
}
代码解释
  • 该程序简化了多余的逻辑判断。通过直接检查has_invitation是否为true,决定是否允许进入。
  • 如果有邀请,直接输出“可以进入”,程序结束。
  • 如果没有邀请,输出“滚蛋”,并终止程序。

085. breakcontinue 的使用

实现过程

在这个案例中,用户输入一系列数字,直到输入0为止,程序才会计算输入的数字总和。我们使用continue跳过负数的输入,使用break终止循环。

#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>

int main(void)
{
    uint32_t sum = 0;
    int32_t number;

    puts("请输入一系列正整数来计算它们的和。");
    puts("可以输入负数,但它们不会被加入到总和之中。");
    puts("输入0以结束输入并且显示出总和.");

    while (1) {
        puts("请输入一个数字:");
        scanf_s("%d", &number);

        if (number == 0) {
            break;  // break的意思是马上终止,跳出整个循环
        }

        if (number < 0) {
            puts("输入的是负数,不加到总和中。");
            continue;  // 跳过本次循环的剩余部分
        }

        sum += number;  // 累加正数
    }

    printf("这些正整数的和为%u\n", sum);
    
    return 0;
}
代码解释
  • 程序不断要求用户输入数字,直到输入0时才停止。
  • 每次输入负数时,使用continue跳过该数字,不加到总和中。
  • 当输入0时,使用break跳出循环,输出所有输入的正整数的和。

086. switch-caseif-else 的根本区别

实现过程

switch-case语句是基于表达式的值,而if-else是基于布尔条件。对于值的比较,switch-case通常比if-else效率高。

#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <inttypes.h>

int main(void)
{
    int number = 1;

    if (number < 0) {
        // 处理负数
    }
    else if (number == 0) {
        // 处理零
    }
    else {
        // 处理正数
    }

    switch (number) {
    case 1:
        // 处理值为1的情况
        break;
    default:
        // 默认处理
        break;
    }

    return 0;
}
代码解释
  • if-else语句用于处理多个条件的布尔判断。
  • switch-case语句根据number的值执行不同的代码块。
  • switch-case在处理多个具体值时比if-else更为简洁和高效。

087. scanf 的简单使用

实现过程

此案例展示了如何使用scanf接收用户输入的数字,并进行打印输出。此代码有一个小修改,在VS2022中需要使用scanf_s替代scanf来保证安全性。

#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <inttypes.h>

int main(void)
{
    int32_t number;
    printf("请输入一个整数:\n");

    // 要求用户从键盘上输入,与我们交互
    scanf_s("%d", &number);  // ""直接不要乱加\n , 什么的,scanf会扫描

    printf("已扫描到您输入的数字是:%d\n", number);

    return 0;
}
代码解释
  • 使用scanf_s接收用户输入的数字并存储到number中。
  • 然后输出用户输入的数字。

088. 初探 while 循环

实现过程

在这个案例中,我们使用while循环来模拟一个跑步计时器,直到跑步者完成设定的圈数。

#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <inttypes.h>

int main(void)
{
    const uint32_t TOTAL_LAPS = 10;  // 总圈数
    uint32_t current_lap = 0;        // 当前跑的圈数

    puts("开始罚跑");

    while (current_lap < TOTAL_LAPS) {
        current_lap++;
        printf("跑步的人完成第%u圈.\n", current_lap);
    }

    return 0;
}
代码解释
  • 程序使用while循环,当current_lap小于TOTAL_LAPS时继续执行。
  • 每次循环中,跑步者完成一圈,current_lap增加,直到完成10圈


089. 自动贩卖机案例

实现过程

这个案例模拟了一个自动贩卖机,用户需要投入一定金额才能购买饮料。如果投入的钱不够,系统会提示并继续等待投入。

#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <inttypes.h>

int main(void)
{
    const uint32_t PRICE = 5;  // 饮料的价格
    uint32_t balance = 0;  // 当前金额
    uint32_t coin;         // 每次投入的硬币

    puts("欢迎使用自动贩卖机,本机器只提供一种饮料,价格是$5.");
    puts("(只接受1,2,5元三种硬币)");

    // 投币直到金额足够
    while (balance < PRICE) {
        puts("钱不够,请投币:");
        scanf_s("%u", &coin);

        // 检查硬币有效性
        if (coin == 1 || coin == 2 || coin == 5) {
            balance += coin;
            printf("您已经投入了$%u。\n", balance);
        } else {
            printf("对不起,我们不接受$%u的硬币,请重新投币。\n", coin);
        }
    }

    // 计算找零
    if (balance > PRICE) {
        printf("请收好零钱$%u\n", balance - PRICE);
    }

    puts("成功购买饮料!");

    return 0;
}
代码解释
  • 程序要求用户投币,直到余额达到饮料价格。
  • 如果用户投入无效硬币,程序会提示并要求重新投币。
  • 在购买成功后,计算找零并提示用户。

090. 初探 do-while 循环

实现过程

此案例使用do-while循环来完成类似的跑步任务。不同之处在于,do-while循环保证至少执行一次循环体。

#include <stdio.h>
#include <stdint.h>

int main(void)
{
    uint32_t total_laps = 10;    // 总圈数
    uint32_t current_lap = 0;    // 当前圈数

    puts("罚跑开始");

    // `do-while`先执行后判断
    do {
        current_lap++;
        printf("跑步者完成第%" PRIu32 "圈\n", current_lap);
    } while (current_lap < total_laps);

    printf("跑步者跑完所有的%" PRIu32 "圈\n", total_laps);

    return 0;
}
代码解释
  • 使用do-while循环,保证至少执行一次。
  • 每次循环后,检查是否完成所有圈数。如果完成,则跳出循环。

以下是第91到第100节的代码和解释,按照之前的模板整理:


091. 自动贩卖机案例

实现过程

这个案例模拟了一个自动贩卖机,用户需要投入硬币直到金额达到饮料的价格。机器只接受1元、2元和5元的硬币,如果投入不符合要求的硬币,程序会提示并要求重新投入。

#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <inttypes.h>

int main(void)
{
    const uint32_t PRICE = 5;  // 饮料的价格
    uint32_t balance = 0;      // 当前金额
    uint32_t coin;             // 每次投入的硬币

    puts("欢迎使用自动贩卖机,本机器只提供一种饮料,价格是$5.");
    puts("(只接受1,2,5元三种硬币)");

    while (balance < PRICE) {
        puts("钱不够,请投币:");
        scanf_s("%u", &coin);  // 接收硬币输入

        // 检查硬币是否有效
        if (coin == 1 || coin == 2 || coin == 5) {
            balance += coin;
            printf("您已经投入了$%u。\n", balance);
        }
        else {
            printf("对不起,我们不接受$%u的硬币,请重新投币。\n", coin);
        }
    }

    // 找零
    if (balance > PRICE) {
        printf("请收好零钱$%u\n", balance - PRICE);
    }

    puts("成功购买饮料!");

    return 0;
}
代码解释
  • 程序设置饮料价格为5元,用户需要不断投币,直到金额达到或超过5元。
  • 通过while循环,用户每次投币后会检查金额是否足够。如果投币无效(非1元、2元或5元),会提示用户重新投币。
  • 一旦金额足够,程序会计算找零并完成购买。

092. breakcontinue 的使用

实现过程

这个程序用while循环计算用户输入的一系列正整数的和。如果输入的是负数,它会跳过该数字,不加到总和中;如果输入0,则停止输入并显示结果。

#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <inttypes.h>

int main(void)
{
    uint32_t sum = 0;
    int32_t number;

    puts("请输入一系列正整数来计算它们的和。");
    puts("可以输入负数,但它们不会被加入到总和中。");
    puts("输入0以结束输入并且显示出总和.");

    while (1) {
        puts("请输入一个数字:");
        scanf_s("%d", &number);

        if (number == 0) {
            break;  // 输入0,结束循环
        }

        if (number < 0) {
            puts("输入的是负数,不加到总和中。");
            continue;  // 跳过负数,不加到总和
        }

        sum += number;  // 累加正数
    }

    printf("这些正整数的和为%u\n", sum);

    return 0;
}
代码解释
  • 用户输入的数字会被不断累加,直到输入0为止,程序停止。
  • 如果用户输入负数,使用continue跳过本次循环,不加到总和中。
  • 使用break终止循环,最终输出总和。

093. do-whilewhile 的区别

实现过程

此案例通过do-while循环和while循环进行对比,展示两者的不同。do-while循环至少执行一次,而while循环需要先检查条件再执行。

#include <stdio.h>
#include <stdint.h>

int main(void)
{
    uint32_t total_laps = 10;  // 总圈数
    uint32_t current_lap = 0;  // 当前圈数

    puts("罚跑开始");

    // `do-while`先执行后判断
    do {
        current_lap++;
        printf("跑步者完成第%" PRIu32 "圈\n", current_lap);
    } while (current_lap < total_laps);

    printf("跑步者跑完所有的%" PRIu32 "圈\n", total_laps);

    return 0;
}
代码解释
  • 使用do-while循环,首先执行一次循环体,再判断是否满足继续执行的条件。
  • 跑步者完成每一圈后,打印当前圈数,直到完成所有指定的圈数。

094. continue 的用法

实现过程

这个程序要求用户输入一系列数字,计算其和。负数会被跳过,继续输入下一个数字;输入0时,计算结束并显示总和。

#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <inttypes.h>

int main(void)
{
    uint32_t sum = 0;
    int32_t number;

    puts("请输入一系列正整数来计算它们的和。");
    puts("可以输入负数,但它们不会被加入到总和中。");
    puts("输入0以结束输入并且显示出总和.");

    while (1) {
        puts("请输入一个数字:");
        scanf_s("%d", &number);

        if (number == 0) {
            break;  // 输入0,退出循环
        }

        if (number < 0) {
            puts("输入的是负数,不加到总和中。");
            continue;  // 负数跳过
        }

        sum += number;  // 加上正数
    }

    printf("这些正整数的和为%u\n", sum);

    return 0;
}
代码解释
  • 用户输入的每个数字都通过continue跳过负数,直到输入0为止,停止输入。
  • 程序会累加所有的正整数,最后输出结果。

095. for 循环的应用

实现过程

此示例使用for循环控制跑步者完成10圈。在for循环中,初始化变量、判断条件和控制迭代的语句都放在同一行,简洁明了。

#include <stdio.h>
#include <stdint.h>

int main(void)
{
    const uint32_t total_laps = 10;  // 总圈数

    puts("跑步者开始跑步");

    for (uint32_t current_lap = 1; current_lap <= total_laps; current_lap++) {
        printf("跑步者完成第%u圈\n", current_lap);
    }

    return 0;
}
代码解释
  • 使用for循环,current_lap从1开始,每完成一圈加1,直到total_laps
  • 每次循环中,打印当前跑的圈数。

096. switch-caseif-else 的对比

实现过程

在这个示例中,演示了如何通过switch-case语句和if-else语句来处理多种条件。switch-case适用于基于单一变量的多值判断,而if-else适用于复杂条件的判断。

#include <stdio.h>
#include <stdint.h>

int main(void)
{
    int number = 1;

    if (number < 0) {
        // 处理负数
    }
    else if (number == 0) {
        // 处理零
    }
    else {
        // 处理正数
    }

    switch (number) {
    case 1:
        // 处理值为1的情况
        break;
    default:
        // 默认处理
        break;
    }

    return 0;
}
代码解释
  • if-else语句通过判断条件执行不同的代码块。
  • switch-case语句根据number的值来执行相应的代码。

097. scanf 的使用

实现过程

此程序展示了如何使用scanf接收用户输入,并将其转换为整数值,然后进行输出。

#include <stdio.h>
#include <stdint.h>

int main(void)
{
    int32_t number;
    printf("请输入一个整数:\n");

    scanf_s("%d", &number);  // 读取整数输入

    printf("已扫描到您输入的数字是:%d\n", number);

    return 0;
}
代码解释
  • scanf_s接收用户输入的整数并存储在number中。
  • 然后通过printf输出扫描到的数字。

098. while 循环的应用

实现过程

此程序使用while循环模拟跑步计时器,直到完成所有指定的圈数。

#include <stdio.h>
#include <stdint.h

int main(void) { const uint32_t total_laps = 10; // 总圈数 uint32_t current_lap = 0; // 当前圈数

puts("罚跑开始");

while (current_lap < total_laps) {
    current_lap++;
    printf("跑步者完成第%" PRIu32 "圈\n", current_lap);
}

return 0;

}

#### 代码解释

- `while`循环持续运行,直到`current_lap`达到`total_laps`。
- 每次循环打印当前完成的圈数。

---

### 099. `do-while` 的应用

#### 实现过程

此示例使用`do-while`循环,保证至少执行一次循环体,完成跑步任务。

```c
#include <stdio.h>
#include <stdint.h>

int main(void)
{
    uint32_t total_laps = 10;  // 总圈数
    uint32_t current_lap = 0;  // 当前圈数

    puts("罚跑开始");

    do {
        current_lap++;
        printf("跑步者完成第%" PRIu32 "圈\n", current_lap);
    } while (current_lap < total_laps);

    printf("跑步者跑完所有的%" PRIu32 "圈\n", total_laps);

    return 0;
}
代码解释
  • 使用do-while循环,确保至少执行一次跑步任务,直到完成所有圈数。

100. for 循环的应用

实现过程

此案例演示了如何使用for循环控制跑步者完成10圈。

#include <stdio.h>
#include <stdint.h>

int main(void)
{
    const uint32_t total_laps = 10;  // 总圈数

    puts("跑步者开始跑步");

    for (uint32_t current_lap = 1; current_lap <= total_laps; current_lap++) {
        printf("跑步者完成第%u圈\n", current_lap);
    }

    return 0;
}
代码解释
  • 使用for循环,current_lap从1开始,每完成一圈加1,直到total_laps
  • 每次循环打印当前跑的圈数。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值