目录
- 082. 简化代码逻辑的最佳实践
- 083. 卫语句的使用:租车案例
- 084. 简化逻辑表达式:避免 `if-else` 嵌套
- 085. `break` 和 `continue` 的使用
- 086. `switch-case` 与 `if-else` 的根本区别
- 087. `scanf` 的简单使用
- 088. 初探 `while` 循环
- 089. 自动贩卖机案例
- 090. 初探 `do-while` 循环
- 091. 自动贩卖机案例
- 092. `break` 与 `continue` 的使用
- 093. `do-while` 与 `while` 的区别
- 094. `continue` 的用法
- 095. `for` 循环的应用
- 096. `switch-case` 与 `if-else` 的对比
- 097. `scanf` 的使用
- 098. `while` 循环的应用
- 100. `for` 循环的应用
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. break 和 continue 的使用
实现过程
在这个案例中,用户输入一系列数字,直到输入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-case 与 if-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. break 与 continue 的使用
实现过程
这个程序用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-while 与 while 的区别
实现过程
此案例通过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-case 与 if-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。 - 每次循环打印当前跑的圈数。
480

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



