C++ Programming Language —— 第4章:程序流程结构
目录
一、选择结构
1.if语句
(1)单行格式if语句例题
(2)双分支 if 语句例题
(3)多分支 if 语句例题
2. 三目运算符
3. switch 语句
4.练习题
①温度转换提示
②闰年判断
③计算器程序
二、循环结构
1. while 循环语句
①含义
②语法表达
③作用
④练习代码
2. do...while 循环语句
①含义
②语法表达
③作用
④练习代码
3. for 循环语句
①含义
②语法表达
③作用
④练习代码
4. 嵌套循环
①含义
②语法表达
③作用
④练习代码(打印乘法口诀表)
5.练习题
①斐波那契数列生成
②素数判断
三、循环控制语句
1.无限循环
2. break 语句
2. continue 语句
3. goto 语句
4.综合训练习题
习题 1:寻找素数
习题 2:计算奇数和
习题 3:简单的菜单系统
四、综合训练
1. 计算平均分并评级
2. 斐波那契数列生成器
3. 素数判断与统计
4. 工资计算器
5. 数字游戏(猜数字)
C/C++支持最基本的三种程序运行结构:顺序结构、选择结构、循环结构
- 顺序结构:程序按顺序执行,不发生跳转
- 选择结构:依据条件是否满足,有选择的执行相应功能
- 循环结构:依据条件是否满足,循环多次执行某段代码
一、选择结构
1.if语句
①作用:执行满足条件的语句
②if语句的三种形式
- 单行格式if语句
- 多行格式if语句
- 多条件的if语句
// 单分支
if (condition) {// 条件为真时执行
}// 双分支
if (condition) {// 条件为真时执行
} else {// 条件为假时执行
}// 多分支
if (condition1) {// 条件1为真时执行
} else if (condition2) {// 条件2为真时执行
} else {// 所有条件为假时执行
}
(1)单行格式if语句例题
题目:判断一个数是否为正数
#include <iostream>
using namespace std;int main() {int num;cout << "请输入一个整数: ";cin >> num;if (num > 0) {cout << num << " 是正数" << endl;}return 0;
}
(2)双分支 if 语句例题
题目:判断一个数是奇数还是偶数
#include <iostream>
using namespace std;int main() {int num;cout << "请输入一个整数: ";cin >> num;if (num % 2 == 0) {cout << num << " 是偶数" << endl;} else {cout << num << " 是奇数" << endl;}return 0;
}
(3)多分支 if 语句例题
题目:根据考试成绩输出对应的等级
#include <iostream>
using namespace std;int main() {int score;cout << "请输入考试成绩(0-100): ";cin >> score;if (score >= 90) {cout << "等级: A" << endl;} else if (score >= 80) {cout << "等级: B" << endl;} else if (score >= 70) {cout << "等级: C" << endl;} else if (score >= 60) {cout << "等级: D" << endl;} else {cout << "等级: F" << endl;}return 0;
}
2. 三目运算符
①含义:简化版的双分支 if-else 语句
②语法:
condition ? expression1 : expression2;
③作用:根据条件返回不同的值
④示例:返回两个数中的较大值
int a = 10, b = 20;
int max = (a > b) ? a : b; // max = 20
3. switch 语句
①含义:基于表达式的值执行多个分支中的一个
②语法:
switch (expression) {case value1:// 执行代码块1break;case value2:// 执行代码块2break;default:// 所有case不匹配时执行
}
③作用:替代复杂的多分支 if 语句
④示例:根据星期几输出活动安排
int day = 3;
switch (day) {case 1: case 2: case 3: case 4: case 5:cout << "工作日";break;case 6: case 7:cout << "休息日";break;default:cout << "无效输入";
}
4.练习题
①温度转换提示
#include <iostream>
using namespace std;int main() {int temperature;cout << "请输入当前温度(整数):";cin >> temperature;if (temperature >= 30) {cout << "穿短袖短裤" << endl;} else if (temperature >= 20) {cout << "穿薄外套" << endl;} else if (temperature >= 10) {cout << "穿毛衣" << endl;} else {cout << "穿羽绒服" << endl;}return 0;
}
②闰年判断
#include <iostream>
using namespace std;int main() {int year;cout << "请输入年份:";cin >> year;bool isLeapYear = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);cout << year << (isLeapYear ? " 是闰年" : " 不是闰年") << endl;return 0;
}
③计算器程序
#include <iostream>
using namespace std;int main() {double num1, num2;char op;cout << "请输入两个数字:";cin >> num1 >> num2;cout << "请输入运算符(+、-、*、/):";cin >> op;double result;bool valid = true;switch (op) {case '+':result = num1 + num2;break;case '-':result = num1 - num2;break;case '*':result = num1 * num2;break;case '/':if (num2 != 0) {result = num1 / num2;} else {cout << "错误:除数不能为零!" << endl;valid = false;}break;default:cout << "错误:无效的运算符!" << endl;valid = false;}if (valid) {cout << num1 << " " << op << " " << num2 << " = " << result << endl;}return 0;
}
二、循环结构
1. while 循环语句
①含义
while
循环属于前测试循环,也就是在执行循环体之前,会先判断条件是否成立。当条件为真时,才会执行循环体;一旦条件为假,就会立即退出循环。
②语法表达
while (condition) {// 循环体
}
③作用
适用于那些不确定循环次数,只知道循环结束条件的情况。
④练习代码
#include <iostream>
using namespace std;int main() {int i = 1;while (i <= 5) {cout << i << " ";i++;}return 0;
}//结果:1 2 3 4 5
2. do...while 循环语句
①含义
do...while
循环属于后测试循环,它会先执行一次循环体,然后再判断条件。只要条件为真,就会继续执行循环体;当条件为假时,循环终止。
②语法表达
do {// 循环体
} while (condition);
③作用
和while
循环类似,但由于是先执行后判断,所以循环体至少会被执行一次。
④练习代码
#include <iostream>
using namespace std;int main() {int i = 1;do {cout << i << " ";i++;} while (i <= 5);return 0;
}
//结果:1 2 3 4 5
3. for 循环语句
①含义
for
循环是一种前测试循环,它把循环控制变量的初始化、条件判断以及更新操作都整合在了一起,让循环结构更加简洁明了。
②语法表达
for (initialization; condition; update) {// 循环体
}
③作用
特别适合那些已知循环次数的场景。
④练习代码
#include <iostream>
using namespace std;int main() {for (int i = 1; i <= 5; i++) {cout << i << " ";}return 0;
}
//结果:1 2 3 4 5
4. 嵌套循环
①含义
嵌套循环指的是在一个循环体内部又包含了另一个或多个循环。嵌套的层数可以根据实际需求来确定,但一般不建议嵌套过深,以免影响代码的可读性。
②语法表达
for (initialization; condition; update) {// 外层循环体for (initialization; condition; update) {// 内层循环体}
}
③作用
常用于处理二维数据结构,比如矩阵运算、打印图案等。
④练习代码(打印乘法口诀表)
#include <iostream>
using namespace std;int main() {for (int i = 1; i <= 9; i++) {for (int j = 1; j <= i; j++) {cout << j << "×" << i << "=" << i*j << "\t";}cout << endl;}return 0;
}
5.练习题
①斐波那契数列生成
#include <iostream>
using namespace std;int main() {int n;cout << "请输入斐波那契数列的项数:";cin >> n;int a = 0, b = 1;cout << "斐波那契数列前" << n << "项为:";for (int i = 0; i < n; i++) {cout << a << " ";int next = a + b;a = b;b = next;}return 0;
}
②素数判断
#include <iostream>
using namespace std;int main() {int num;cout << "请输入一个正整数:";cin >> num;bool isPrime = true;if (num <= 1) {isPrime = false;} else {for (int i = 2; i * i <= num; i++) {if (num % i == 0) {isPrime = false;break;}}}if (isPrime) {cout << num << " 是素数。" << endl;} else {cout << num << " 不是素数。" << endl;}return 0;
}
三、循环控制语句
1.无限循环
无限循环就是循环条件永远为真的循环,也被称为死循环。在实际应用中,无限循环通常需要配合break
语句来使用,从而在特定条件下退出循环。
// 无限循环的写法
while (true) {// 循环体
}for (;;) {// 循环体
}
循环优化:为了提高循环的执行效率,在编写循环时可以遵循以下几个原则:
- 尽量减少循环内部的重复计算。
- 合理安排循环的嵌套顺序,一般建议将执行次数多的循环放在内层。
- 避免在循环内部进行 IO 操作,因为 IO 操作的速度相对较慢,会影响循环的执行效率。
2. break 语句
- 含义:在循环或者
switch
语句里使用break
,可以让程序立即跳出当前所在的语句块,接着执行该语句块后面的代码。 - 语法:break;
- 作用:能够终止循环的执行,防止执行循环体中剩余的代码。
- 示例代码:
#include <iostream>
using namespace std;int main() {for (int i = 1; i <= 10; i++) {if (i == 5) {break; // 当i等于5时,跳出循环}cout << i << " ";}// 输出结果:1 2 3 4return 0;
}
2. continue 语句
- 含义:
continue
会跳过当前循环中剩余的代码,直接开始下一次循环的迭代。 - 语法:continue;
- 作用:可以跳过循环体里的部分代码,让程序直接进入下一次循环。
- 示例代码
#include <iostream>
using namespace std;int main() {for (int i = 1; i <= 10; i++) {if (i % 2 == 0) {continue; // 当i是偶数时,跳过后续代码,直接进入下一次循环}cout << i << " ";}// 输出结果:1 3 5 7 9return 0;
}
3. goto 语句
- 含义:
goto
能够让程序无条件地跳转到同一个函数内的指定标签处。 - 语法:
goto label;
// ...
label:
// 代码块
- 作用:可以实现代码的无条件跳转,不过滥用
goto
会使代码的逻辑变得混乱。 - 示例代码:
#include <iostream>
using namespace std;int main() {int i = 1;
start:cout << i << " ";i++;if (i <= 10) {goto start; // 跳转到start标签处}// 输出结果:1 2 3 4 5 6 7 8 9 10return 0;
}
4.综合训练习题
习题 1:寻找素数
编写一个程序,找出 1 到 100 之间的所有素数,并且使用break
语句优化素数的判断过程。
#include <iostream>
using namespace std;int main() {for (int num = 2; num <= 100; num++) {bool isPrime = true;for (int i = 2; i <= num / 2; i++) {if (num % i == 0) {isPrime = false;break; // 不是素数,提前结束循环}}if (isPrime) {cout << num << " ";}}return 0;
}
习题 2:计算奇数和
编写一个程序,计算 1 到 100 之间所有奇数的和,使用continue
语句跳过偶数。
#include <iostream>
using namespace std;int main() {int sum = 0;for (int i = 1; i <= 100; i++) {if (i % 2 == 0) {continue; // 跳过偶数}sum += i;}cout << "1到100之间的奇数和为:" << sum << endl;return 0;
}
习题 3:简单的菜单系统
编写一个简单的菜单系统,让用户可以进行选择。当用户输入错误时,使用goto
语句提示用户重新输入。
#include <iostream>
using namespace std;int main() {int choice;
menu:cout << "请选择操作:" << endl;cout << "1. 查看余额" << endl;cout << "2. 存款" << endl;cout << "3. 取款" << endl;cout << "4. 退出" << endl;cout << "请输入你的选择:";cin >> choice;switch (choice) {case 1:cout << "余额:1000元" << endl;break;case 2:cout << "存款功能已启动" << endl;break;case 3:cout << "取款功能已启动" << endl;break;case 4:cout << "感谢使用,再见!" << endl;return 0;default:cout << "输入无效,请重新输入!" << endl;goto menu; // 跳转到菜单开始处}goto menu; // 操作完成后返回菜单
}
四、综合训练
1. 计算平均分并评级
编写一个程序,要求用户输入学生的姓名和 5 门课程的成绩。计算平均分后,根据平均分给出评级(90-100 为 A,80-89 为 B,70-79 为 C,60-69 为 D,低于 60 为 F)。最后输出学生的姓名、平均分和评级。
#include <iostream>
#include <string>
using namespace std;int main() {string name;double scores[5], sum = 0;cout << "请输入学生姓名: ";cin >> name;for (int i = 0; i < 5; i++) {cout << "请输入第" << i + 1 << "门课成绩: ";cin >> scores[i];sum += scores[i];}double average = sum / 5;char grade;if (average >= 90) grade = 'A';else if (average >= 80) grade = 'B';else if (average >= 70) grade = 'C';else if (average >= 60) grade = 'D';else grade = 'F';cout << "\n学生姓名: " << name << endl;cout << "平均分: " << average << endl;cout << "评级: " << grade << endl;return 0;
}
2. 斐波那契数列生成器
编写一个程序,要求用户输入一个正整数 n(n≥2)。生成并输出斐波那契数列的前 n 项。斐波那契数列的定义为:F (1)=1,F (2)=1,F (n)=F (n-1)+F (n-2)(n≥3)。
#include <iostream>
using namespace std;int main() {int n;cout << "请输入一个≥2的正整数: ";cin >> n;if (n < 2) {cout << "输入无效!" << endl;return 1;}int a = 1, b = 1, next;cout << "斐波那契数列前" << n << "项: ";cout << a << " " << b << " ";for (int i = 3; i <= n; i++) {next = a + b;cout << next << " ";a = b;b = next;}cout << endl;return 0;
}
3. 素数判断与统计
编写一个程序,要求用户输入一个正整数 n(n≥2)。判断从 2 到 n 之间的每个数是否为素数,并统计素数的个数。最后输出所有素数和素数的总数。
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;int main() {srand(time(0));int answer = rand() % 100 + 1;int guess, attempts = 0;cout << "猜数字游戏!我想了一个1-100之间的整数,你猜是多少?" << endl;do {cout << "请输入你的猜测: ";cin >> guess;attempts++;if (guess > answer) cout << "猜大了,再小一点!" << endl;else if (guess < answer) cout << "猜小了,再大一点!" << endl;else cout << "恭喜你,猜对了!答案是" << answer << endl;} while (guess != answer);cout << "你一共猜了" << attempts << "次";if (attempts <= 3) cout << ",天才!" << endl;else if (attempts <= 6) cout << ",优秀!" << endl;else if (attempts <= 10) cout << ",良好!" << endl;else cout << ",继续努力!" << endl;return 0;
}
4. 工资计算器
编写一个程序,模拟公司员工的工资计算。程序应要求用户输入员工的姓名、工作小时数和每小时工资。根据以下规则计算工资:
- 正常工作时间为 40 小时,超过 40 小时的部分按 1.5 倍工资计算。
- 如果员工的总工资超过 5000 元,超过部分需缴纳 10% 的税。
最后输出员工的姓名、工作小时数、每小时工资、总工资和税后工资。
#include <iostream>
#include <cmath>
using namespace std;bool isPrime(int num) {if (num < 2) return false;for (int i = 2; i <= sqrt(num); i++) {if (num % i == 0) return false;}return true;
}int main() {int n, count = 0;cout << "请输入一个≥2的正整数: ";cin >> n;cout << "2到" << n << "之间的素数: ";for (int i = 2; i <= n; i++) {if (isPrime(i)) {cout << i << " ";count++;}}cout << "\n共有" << count << "个素数" << endl;return 0;
}
5. 数字游戏(猜数字)
编写一个程序,生成一个 1 到 100 之间的随机整数作为答案。让用户猜这个数字,每次猜测后给出提示(猜大了、猜小了或猜对了)。记录用户的猜测次数,直到猜对为止。最后输出答案和用户的猜测次数,并根据猜测次数给出评价(例如:1-3 次:天才,4-6 次:优秀,7-10 次:良好,11 次及以上:继续努力)。
#include <iostream>
#include <string>
using namespace std;int main() {string name;double hours, rate, basePay, overtimePay, grossPay, tax, netPay;cout << "请输入员工姓名: ";cin >> name;cout << "请输入工作小时数: ";cin >> hours;cout << "请输入每小时工资: ";cin >> rate;if (hours <= 40) {basePay = hours * rate;overtimePay = 0;} else {basePay = 40 * rate;overtimePay = (hours - 40) * rate * 1.5;}grossPay = basePay + overtimePay;tax = (grossPay > 5000) ? (grossPay - 5000) * 0.1 : 0;netPay = grossPay - tax;cout << "\n员工姓名: " << name << endl;cout << "工作小时数: " << hours << endl;cout << "每小时工资: " << rate << endl;cout << "总工资: " << grossPay << endl;cout << "税后工资: " << netPay << endl;return 0;
}