# 02-条件与循环控制

AI悦创原创C教程C教程大约 21 分钟...约 6396 字

## 1. if 条件判断

### 1.1 if 语句

if 语句称为条件控制结构，因为它在一个表达式为真时执行语句。由于这个原因，if 也称为决策结构。它的形式为：

``````if (expression) {
// code to be executed if the condition is true
statements
}
``````

demo1
``````#include <stdio.h>

int main() {
int score = 89;

if (score > 75)
printf("You passed.\n");

return 0;
}
``````

``````int a = 13;
int b = 12;
___(a >___) {
printf("hello");
}
``````

### 1.2 关系运算符

1. `<`: 小于
2. `<=`: 小于或等于
3. `>`: 大于
4. `>=`: 大于或等于
5. `==`: 等于
6. `!=`: 不等于

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

int main() {
int num = 41;
num += 1;
// 判断num 是否等于42
if (num == 42) {
printf("You won!");
}
}
``````

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

int main() {
int in_stock = 20;
if (in_stock)
// in_stock 非0，所以为真
}
``````

A. `!=`

B. `*`

C. `+=`

D. `==`

### 1.3 if-else 语句

if 语句可以包括一个可选的 else 子句，当表达式为假时执行 else 语句。

``````if (condition) {
// code to be executed if the condition is true
} else {
// code to be executed if the condition is false
}
``````

demo1
``````#include <stdio.h>

int main() {
int score = 89;

if (score >= 90)
printf("Top 10%%.\n");
else
printf("Less than 90.\n");

return 0;
}
``````

``````int people = 12;
___(people ___ 10)
printf("More than 10.\n");
___
printf("Less than 10.\n");
``````

### 1.4 if-else if-else 语句

``````if (condition1) {
// code to be executed if condition1 is true
} else if (condition2) {
// code to be executed if condition2 is true
} else {
// code to be executed if neither condition is true
}
``````

``````int num = -14;
if (num > 0)
printf("positive");
else ___(num < 0)
printf("negative");
___
printf("zero");
``````

### 1.5 嵌套的 if 语句

``````if (condition1) {
// code
if (condition2) {
// code
}
}
``````

``````if (profit > 1000) {
if (clients > 15)
bonus = 100;
}
else
bonus = 25;
``````

``````int x = 37;
if (x > 22) {
___ (x > 31) {
___ ("x is greater than 22 and 31");
}
}
``````

### 1.6 条件表达式「三元操作符」

`?:` 是 C 语言中的三目运算符，可以用来替代 `if—else` 语句。

`?:` 的使用方法为：

``````<表达式1>?<表达式2>:<表达式3>
condition ? value_if_true : value_if_false;
``````

demo1
``````#include <stdio.h>

int main() {
int y;
int x = 3;

y = (x >= 5) ?  5 : x;

/* 这等价于
if (x >= 5)
y = 5;
else
y = x;
*/

return 0;
}
``````

``````int x = 12;
int y = (x >= 5) ___ 8 ___ x;
``````

### 1.7 小试牛刀

#### 1.7.1 Question 1 找出最大值

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

int main() {
int a, b, c, max;

// 获取用户输入
printf("Enter three integers separated by spaces: ");
scanf("%d %d %d", &a, &b, &c);

// 初始假设a是最大的
max = a;

// 检查b是否比当前的max大
if (b > max) {
max = b;
}

// 检查c是否比当前的max大
if (c > max) {
max = c;
}

// 输出最大值
printf("The largest number is: %d\n", max);

return 0;
}
``````

#### 1.7.2 Question 2 连续整数序列判断

``````3 2 4
``````

``````Yes
``````
``````#include <stdio.h>

int main() {
int a, b, c;

printf("请输入三个数字: ");
scanf("%d %d %d", &a, &b, &c);

// 对数字进行排序，使得后续的检查更加简单。
if (a > b) {
int temp = a;
a = b;
b = temp;
}
if (b > c) {
int temp = b;
b = c;
c = temp;
}
if (a > b) {
int temp = a;
a = b;
b = temp;
}

// 排序后，如果数字是连续的，那么 b 应该是 a + 1，c 应该是 b + 1
if (b == a + 1 && c == b + 1) {
printf("是\n");
} else {
printf("否\n");
}

return 0;
}
``````

#### 1.7.3 Question 3 奇偶性和正负性组合判断

• Both numbers are positive and even.
• Both numbers are positive and odd.
• Both numbers are negative and even.
• Both numbers are negative and odd.
• One number is positive and even, while the other is positive and odd.
...（其他组合）

``````4 -3
``````

``````One number is positive and even, while the other is negative and odd.
``````
``````#include <stdio.h>

int main() {
int x, y;

printf("请输入两个数字: ");
scanf("%d %d", &x, &y);

// 检查数字的正负性以及奇偶性
if (x > 0 && y > 0) {
if (x % 2 == 0 && y % 2 == 0) {
printf("两个数字都是正的并且是偶数。\n");
} else if (x % 2 != 0 && y % 2 != 0) {
printf("两个数字都是正的并且是奇数。\n");
} else {
printf("一个数字是正的偶数，另一个是正的奇数。\n");
}
} else if (x < 0 && y < 0) {
if (x % 2 == 0 && y % 2 == 0) {
printf("两个数字都是负的并且是偶数。\n");
} else if (x % 2 != 0 && y % 2 != 0) {
printf("两个数字都是负的并且是奇数。\n");
} else {
printf("一个数字是负的偶数，另一个是负的奇数。\n");
}
} else {
if ((x > 0 && x % 2 == 0) || (y > 0 && y % 2 == 0)) {
printf("一个数字是正的偶数，另一个是负数。\n");
} else {
printf("一个数字是正的奇数，另一个是负数。\n");
}
}

return 0;
}
``````

#### 1.7.4 Question 4 日期有效性检查

``````29 2 2023
``````

``````Invalid date
``````
``````#include <stdio.h>

int main() {
int day, month, year;

printf("请输入一个日期 (日 月 年): ");
scanf("%d %d %d", &day, &month, &year);

int max_day = 31; // 假设默认每个月都有31天

if (month == 2) {
// 检查是否为闰年
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
max_day = 29; // 闰年的2月有29天
} else {
max_day = 28; // 非闰年的2月有28天
}
} else if (month == 4 || month == 6 || month == 9 || month == 11) {
max_day = 30; // 有些月份只有30天
}

// 判断日期的有效性
if (day < 1 || day > max_day || month < 1 || month > 12) {
printf("日期无效\n");
} else {
printf("日期有效\n");
}

return 0;
}
``````

## 2. switch 开关语句

### 2.1 switch语句

switch 语句通常为 if-else if嵌套 if 语句提供了一个更优雅的解决方案。

``````switch (expression) {
case val1:
statements
break;
case val2:
statements
break;
default:
statements
}
``````

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

int main() {
int num = 3;

switch (num) {
case 1:
printf("One\n");
break;
case 2:
printf("Two\n");
break;
case 3:
printf("Three\n");
break;
default:
printf("Not 1, 2, or 3.\n");
}
}
``````

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

int main() {
int num = 3;

switch (num) {
case 1:
printf("One\n");
break;
case 3:
printf("Two\n");
//            break;
case 22:
printf("Three\n");
break;
default:
printf("Not 1, 2, or 3.\n");
}
}

// --- output ---
Two
Three
``````

A. `switch test;`

B. `SWITCH test { }`

C. `switch (test) { }`

switch 可以有多个 case

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

int main() {
int num = 3;

switch (num) {
case 1:
case 2:
case 3:
printf("One, Two, or Three.\n");
break;
case 4:
case 5:
case 6:
printf("Four, Five, or Six.\n");
break;
default:
printf("Greater than Six.\n");
}
}
``````

``````___ (num) {
case 3:
printf("a prime number");
break;
___ 5:
printf("another prime number");
___;
case 42:
printf("the meaning of life");
break;
}
``````

## 3. 逻辑运算符

• `&&`：逻辑与（AND）
• `||`：逻辑或（OR）
• `!`：逻辑非（NOT）

### 3.1 逻辑与 (`&&`)

demo1
``````#include <stdio.h>

int main() {
int n = 42;

if (n > 0 && n <= 100)
printf("Range (1 - 100).\n");
}
``````

``````int n = 42;
___(n >= 0 ___ n < 100) {
printf("Yes");
}
``````

### 3.2 逻辑或 (`||`)

demo1
``````#include <stdio.h>

int main() {
char n = 'X';

if (n == 'x' || n == 'X')
printf("Roman numeral value 10.\n");
}
``````

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

int main() {
int n = 42;

if (n == 999 || (n > 0 && n <= 100))
printf("Input valid.\n");
}
``````

``````if (n == 'x' ___ n == 'X') {
printf("Roman");
}
``````

### 3.3 逻辑非 (`!`)

demo1
``````#include <stdio.h>

int main() {
char n = 'V';

if (!(n == 'x' || n == 'X'))
printf("Roman numeral is not 10.\n");
}
``````

``````int x = 3;
if(!(x > 2 || y < 0)) {
printf("true");
} else {
printf("false");
}
``````

### 3.4 小示例

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

int main() {
int temperature = 24;        // 假设温度是24°C
int isSunny = 1;             // 假设天气是晴朗的（1表示真，0表示假）

if (temperature >= 20 && temperature <= 30 && isSunny) {
printf("天气很好，建议您外出散步！\n");
} else {
printf("或许您应该留在室内。\n");
}

return 0;
}
``````

## 4. while 循环语句

while 语称为循环结构，因为它在一个表达式为真时重复执行语句，不断循环。它的语法为：

``````while (表达式) {
循环体语句
}
``````

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

int main() {
int count = 1;

while (count < 8) {
printf("Count = %d\n", count);
count++;
}

return 0;
}
``````

while 循环在每次进入循环之前都要评估条件，所以 while 语句有可能永远不执行，也可能永远执行(死循环)。

Test one:

• 1~100 以内的奇数和；
• 1~100 以内的偶数和；

for-loop
``````#include <stdio.h>

int main() {
int oddSum = 0;  // 奇数和
int evenSum = 0; // 偶数和

for (int i = 1; i <= 100; i++) {
if (i % 2 == 0) {
evenSum += i;  // 如果是偶数，加到偶数和上
} else {
oddSum += i;   // 如果是奇数，加到奇数和上
}
}

printf("1~100之间的奇数和为: %d\n", oddSum);
printf("1~100之间的偶数和为: %d\n", evenSum);

return 0;
}
``````

``````int n = 0;
___ (n < 5) {
printf("hello\n");
___ ++;
}
``````

## 5. do-while 循环语句

do-while 进入循环时不做检查，先在循环中执行一次之后再来检查循环的条件是否满足，若满足则进行下一次的循环，否则退出循环。

``````do {
statements
} while (expression);
``````

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

int main() {
int count = 1;

do {
printf("Count = %d\n", count);
count++;
} while (count < 8);

return 0;
}
``````

do-whilewhile 的区别:

``````int count = 1;
do {
printf("%d\n", count);
count++;
} while (count < 8);
``````

A. 8

B. 7

C. 9

## 6. do...while 和 while 的抉择

1. while 循环：首先判断条件，如果条件满足，则执行循环体，否则退出循环。
``````while (条件) {
// 循环体
}
``````
1. do-while 循环：首先执行一次循环体，然后判断条件，如果条件满足，再次执行循环体，否则退出循环。
``````do {
// 循环体
} while (条件);
``````

1. 当你需要确保循环体至少执行一次时，应该选择 `do-while` 循环。
2. 当你希望在进入循环之前先判断条件是否满足时，应该选择 `while` 循环。

1. 例子1：从用户输入中读取数字，直到用户输入一个正数。

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

int main() {
int num;
do {
printf("请输入一个正数：");
scanf("%d", &num);
} while (num <= 0);

printf("你输入的正数是：%d\n", num);
return 0;
}
``````
1. 例子2：打印小于 5 的所有正整数。

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

int main() {
int i = 1;
while (i < 5) {
printf("%d\n", i);
i++;
}
return 0;
}
``````

## 7. break 和 continue语句

switch 语句中已经看到了 break 的用法。它对于立即退出一个循环也很有用。

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

int main() {
int num = 5;

while (num > 0) {
if (num == 3) {
break;
}
printf("%d\n", num);
num--;
}

return 0;
}
``````

``````5
4
``````

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

int main() {
int num = 5;

while (num > 0) {
num--;
if (num == 3) {
continue;
}

printf("%d\n", num);
}
}
``````

``````4
2
1
0
``````

``````int num = 5;

while (num > 0) {
___ (num == ___ )
___;
printf("%d\n", num);
num--;
}
``````

## 8. break 与 continue 的抉择

1. break 语句：用于立即退出循环，跳过循环后的其余部分，并执行循环后的下一个语句。

2. continue 语句：用于立即跳过当前迭代的其余部分，并执行下一个循环迭代。

1. 例子1：找出 0 到 10 之间的第一个能被 3 和 5 同时整除的数字。

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

int main() {
int i;
for (i = 0; i <= 10; i++) {
if (i % 3 == 0 && i % 5 == 0) {
printf("第一个能被3和5同时整除的数字是：%d\n", i);
break;
}
}
return 0;
}
``````
1. 例子2：打印 0 到 10 之间的数字，但跳过所有能被 3 整除的数字。

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

int main() {
int i;
for (i = 0; i <= 10; i++) {
if (i % 3 == 0) {
continue;
}
printf("%d\n", i);
}
return 0;
}
``````

• 当你需要中断循环并跳出循环时（如搜索问题），使用 `break`
• 当你只想跳过循环的当前迭代并继续下一次迭代时，使用 `continue`

## 9. for 循环

for 语句是一个循环结构，它执行固定次数的循环。语法如下：

``````for (initvalue; condition; increment) {
statements;
}
``````
• initvalue：一个设置为初始值的计数器。这一部分的 for 循环只执行一次。
• condition：一个布尔表达式，在每次循环前将计数器与一个值进行比较，当返回假时停止循环。
• increment: 将计数器增加（或减少）一个设定值。

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

int main() {
int i;
int max = 10;

for (i = 0; i < max; i++) {
printf("%d\n", i);
}
}
``````

``````int x;
int end = 5;
___(x = 0; x <= end; x++) {
___("%d\n", ___);
}
``````

for 循环可以包含多个表达式，每个部分用逗号 `,` 分隔。 例如：

``````for (x = 0, y = num; x < y; i++, y--) {
statements;
}
``````

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

int main() {
int i=0;
int max = 10;

for (;i < max; i++) {
printf("%d\n", i);
}
}
``````

1.0
``````#include <stdio.h>

int main() {
int i, j;
int table = 10;
int max = 12;

for (i = 1; i <= table; i++) {
for (j=0; j <= max; j++) {
printf("%d x %d = %d\n", i, j, i*j);
}
printf("\n"); /* 打印换行 */
}

return 0;
}
``````

``````for (int i = 0; i < 5; i++) { }
``````

## 小测验

1. 填空，输入数字存储在变量 `age` 中。 如果 `age` 大于 21 岁，则输出 "允许喝酒"。如果 `age` 小于 10 岁，则输出"学习数学"。
Question
``````int age;
scanf("%d", & ___ );
___(age > 21) {
printf("允许喝酒");
}
else if (___ < 10) {
printf("学习数学");
}
``````
1. 填空，使用 do-while 循环结果，打印数字 0 到 5.
Question
``````int c = 0;
___{
printf("%d", c);
___++;
} while (c <=  5)___
``````
1. 填空，使用 for 循环，打印"pythontip" 3 次。
Question
``````___(int i = 0; i ___3; ++i) {
printf("pythontip");
}
``````
1. 填空，使用 switch 语句，打印数字对应的英文：
Question
``````___ (num) {
case 1:
printf("one");
break;
___ 2:
printf("two");
___;
case 3:
printf("three");
break;
}
``````
1. 填空，如果 `age` 大于 17 且小于等于 99，则输出"`I can drive`"：
Question
``````int age = 25;
___ (age > 17 ___ age < 99){
printf("I can drive");
}
``````

AI悦创·编程一对一

AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Linux、Web、Sql」，全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh

C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh

• 0
• 0
• 0
• 0
• 0
• 0

• 按正序
• 按倒序
• 按热度