流程控制结构

流程控制结构的概念

流程控制结构是指根据需要改变程序运行顺序或执行不同部分执行不同次数的程序结构。

流程控制结构的分类

顺序结构

顺序结构的概念

顺序结构指自上而下的顺序依次执行,执行完上一条语句就无条件自动执行下一条语句。

变量的交换

  • 临时变量交换法:
temp = a;
a = b;
b = temp;
  • 交换函数法:swap(a, b);

选择结构

选择结构的概念

根据某个条件是否满足来决定是否执行指定的操作任务,或者从给定的两种或多种操作选择其一。

选择结构的类型

单分支选择结构 if
  • 代码模板:
if (表达式) {
    语句块;
}
  • 示例:
if (a < b) {
    swap(a, b);
}
双分支选择结构 if-else
  • 代码模板:
if (表达式) {
    语句块1;
} else {
    语句块2;
}
  • 示例:
if (a < b) {
    cout << a << endl;
} else {
    cout << b << endl;
}
多分支选择结构 if-else if-else
  • 代码模板:
if (表达式1) {
    语句块1;
} else if (表达式2) {
    语句块2;
} else if (表达式3) {
    语句块3;
} else {
    语句块4;
}
  • 示例(分数等级判定):
if (n >= 90) {
    cout << "A" << endl;
} else if (n >= 80) {
    cout << "B" << endl;
} else if (n >= 70) {
    cout << "C" << endl;
} else if (n >= 60) {
    cout << "D" << endl;
} else {
    cout << "E" << endl;
}
  • 注意:多分支结构需要逐层排除条件
  • 选择结构嵌套示例:
if (a > b) {
    if (a > c) {
        cout << a << endl;
    } else {
        cout << c << endl;
    }
} else {
    if (b > c) {
        cout << b << endl;
    } else {
        cout << c << endl;
    }
}
多分支开关 switch-case-break-default
  • 代码模板:
switch(n) {
    case 常量1:
        语句块1;
        break;
    case 常量2:
        语句块2;
        break;
    case 常量3:
        语句块3;
        break;
    // ... 更多case
    default:
        默认语句块;
        break;
}
  • 示例(星期输出):
switch(n) {
    case 1:
        cout << "Monday" << endl;
        break;
    case 2:
        cout << "Tuesday" << endl;
        break;
    case 3:
        cout << "Wednesday" << endl;
        break;
    case 4:
        cout << "Thursday" << endl;
        break;
    case 5:
        cout << "Friday" << endl;
        break;
    case 6:
        cout << "Saturday" << endl;
        break;
    case 7:
        cout << "Sunday" << endl;
        break;
    default:
        cout << "Error" << endl;
        break;
}
  • 注意:switch 后的表达式只能为整型int、字符型char、逻辑型bool、枚举型enum
条件表达式 a > b ? a : b
  • 语法格式:表达式 ? 语句1 : 语句2
  • 示例:
int maxNum = a > b ? a : b;

经典问题

BMI体重指数判定
if (BMI < 18.5) {
    cout << "偏瘦" << endl;
} else if (BMI < 24) {
    cout << "正常" << endl;
} else if (BMI < 28) {
    cout << "超重" << endl;
} else {
    cout << "肥胖" << endl;
}
闰年判断
  • 解法一:单分支结构(最简写法)
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
    cout << "Yes" << endl;
} else {
    cout << "No" << endl;
}
  • 解法二:多分支结构
bool leap = false;
if (year % 100 == 0) {
    // 能被100整除的年份
    if (year % 400 == 0) {
        leap = true;
    } else {
        leap = false;
    }
} else {
    // 不能被100整除的年份
    if (year % 4 == 0) {
        leap = true;
    } else {
        leap = false;
    }
}
if (leap) {
    cout << "Yes" << endl;
} else {
    cout << "No" << endl;
}
  • 解法三:分支嵌套结构
bool leap = false;
if (year % 4 == 0) {
    if (year % 100 == 0) {
        if (year % 400 == 0) {
            leap = true;
        } else {
            leap = false;
        }
    } else {
        leap = true;
    }
} else {
    leap = false;
}
if (leap) {
    cout << "Yes" << endl;
} else {
    cout << "No" << endl;
}

循环结构

循环结构的概念

根据某个条件是否满足来处理需要进行的重复操作。

循环结构的类型

无限循环结构
  • 代码模板:
while(true) {
    循环体;
}
  • 示例:
int i = 1, sum = 0;
while(true) {
    sum += i;
    i++;
    if(i > n) break;
}
前置条件循环 while
  • 代码模板:
while (循环条件表达式) {
    循环体;
}
  • 示例:
int i = 1, sum = 0;
while(i <= n) {
    sum += i;
    i++;
}
后置条件循环 do-while
  • 代码模板:
do {
    循环体;
} while (循环条件表达式);
  • 示例:
int i = 1, sum = 0;
do {
    sum += i;
    i++;
} while(i <= n);
次数循环 for
  • 代码模板:
for (循环变量初始化; 循环条件; 循环变量更新) {
    循环体;
}
  • 示例:
int sum = 0;
for(int i = 1; i <= n; i++) {
    sum += i;
}

循环结构的嵌套

  • 概念:在循环体中再次引入循环语句,称为循环嵌套。外层循环称为外循环,内层循环称为内循环。
  • 示例(双重循环):
for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
        cin >> num;
    }
}

跳过当前循环 continue

  • 作用:仅结束本次循环,不终止整个循环的执行,直接进入下一次循环判断。
  • 示例:
for (int i = 1; i <= 10; i++) {
    if(i < 5)
        continue;
    cout << i << endl;
}
// 输出:5 6 7 8 9 10

中止循环 break

  • 作用:强制终止整个循环,不再判断循环条件,直接跳出循环体。
  • 注意:嵌套循环中,break 仅终止当前所在的一重循环。
  • 示例(素数判定):
bool isPrime = true;
for (int i = 2; i <= sqrt(n); i++) {
    if(n % i == 0) {
        isPrime = false;
        break;
    }
}

角谷猜想

int N;
cin >> N;
while (N > 1) {
    if (N % 2 == 1) {
        N = N * 3 + 1;
    } else {
        N /= 2;
    }
    cout << N << endl;
}

经典问题

百钱买百鸡
  • 解法一:三重枚举法(运算次数:100×100×100100 \times 100 \times 100)
for (int i = 1; i <= 100; ++i) { // 公鸡数量
    for (int j = 1; j <= 100; ++j) { // 母鸡数量
        for (int k = 1; k <= 100; ++k) { // 小鸡数量
            if(i + j + k == 100 && 5 * i + 3 * j + k / 3.0 == 100) {
                cout << "公鸡:" << i << ",母鸡:" << j << ",小鸡:" << k << endl;
            }
        }
    }
}
  • 解法二:双重枚举优化(运算次数:100×100100 \times 100)
for (int i = 1; i <= 100; ++i) { // 公鸡数量
    for (int j = 1; j <= 100; ++j) { // 母鸡数量
        int k = 100 - i - j; // 小鸡数量由总数量推导
        if(5 * i + 3 * j + k / 3.0 == 100) {
            cout << "公鸡:" << i << ",母鸡:" << j << ",小鸡:" << k << endl;
        }
    }
}
  • 解法三:剪枝优化(运算次数:20×3320 \times 33)
for (int i = 1; i <= 20; ++i) { // 公鸡最多20只(5*20=100)
    for (int j = 1; j <= 33; ++j) { // 母鸡最多33只(3*33=99)
        int k = 100 - i - j;
        if(5 * i + 3 * j + k / 3.0 == 100) {
            cout << "公鸡:" << i << ",母鸡:" << j << ",小鸡:" << k << endl;
        }
    }
}
鸡兔同笼
  • 解法一:双重枚举法
int head, foot;
cin >> head >> foot;
for(int i = 1; i <= head; ++i) { // 兔的数量
    for(int j = 1; j <= head; ++j) { // 鸡的数量
        if(i + j == head && i * 4 + j * 2 == foot) {
            cout << "兔:" << i << ",鸡:" << j << endl;
        }
    }
}
  • 解法二:单重枚举剪枝
int head, foot;
cin >> head >> foot;
for(int i = 1; i <= foot/4; ++i) { // 兔最多foot/4只
    int j = head - i;
    if(i * 4 + j * 2 == foot) {
        cout << "兔:" << i << ",鸡:" << j << endl;
    }
}
  • 解法三:数学推导法(O(1)时间复杂度)
int head, foot;
cin >> head >> foot;
// 推导公式:
// 设鸡c只,兔r只
// c + r = head
// 2c + 4r = foot
// 解得:c = (4*head - foot)/2,r = head - c
int chicken = (4 * head - foot) / 2;
int rabbit = head - chicken;
cout << "兔:" << rabbit << ",鸡:" << chicken << endl;
比索问题(菲律宾储蓄计划)
int budget, personMoney = 0, motherMoney = 0;
bool isEnough = true;
for (int i = 1; i <= 12; i++) {
    cin >> budget;
    if (personMoney + 300 - budget < 0) {
        // 当月钱不够,标记失败
        isEnough = false;
        break;
    } else {
        // 当月剩余 = 个人剩余 + 300补贴 - 当月预算
        personMoney += 300 - budget;
        // 每满100比索,存入妈妈账户
        motherMoney += personMoney / 100 * 100;
        // 个人剩余取模100
        personMoney %= 100;
    }
}
if (isEnough) {
    // 年末妈妈账户返还1.2倍利息
    cout << personMoney + motherMoney * 1.2 << endl;
}