C++编程语言 02
本节课我们将深入学习如何通过流程控制语句来决定程序的执行路径,以及如何使用数组和字符串来有效地组织和处理数据。
第一部分: 流程控制语句
流程控制语句是编程中至关重要的组成部分,它允许我们根据不同的条件执行不同的代码块,或者重复执行特定的代码段。本部分将介绍 C++ 中常用的流程控制语句。
1. if
语句:让程序做出判断
概念和作用:
if
语句允许程序根据一个条件的真假来决定是否执行特定的代码块。这就像我们日常生活中的“如果……就……”的逻辑判断。语法结构:
if
语句有多种形式,最基本的是if
结构,可以配合else if
和else
提供更精细的条件判断。c++if (条件表达式) { // 当条件为真时执行的代码块 }
c++if (条件表达式) { // 当条件为真时执行的代码块 } else { // 当条件为假时执行的代码块 }
c++if (条件表达式1) { // 当条件1为真时执行的代码块 } else if (条件表达式2) { // 当条件1为假且条件2为真时执行的代码块 } else { // 当所有条件都为假时执行的代码块 }
条件表达式:
if
语句的核心是条件表达式,其结果必须是布尔值(true
或false
)。比较运算符: 用于构建条件表达式,比较两个值之间的关系:
==
(等于)!=
(不等于)<
(小于)>
(大于)<=
(小于等于)>=
(大于等于)
逻辑运算符: 用于组合多个条件表达式:
&&
(逻辑与,AND):所有条件都为真,结果才为真。||
(逻辑或,OR):只要有一个条件为真,结果就为真。!
(逻辑非,NOT):对条件取反,真变假,假变真。
示例:判断一个字符是否为大写字母,并演示单行
if
语句的简写形式c++#include <iostream> using namespace std; int main() { char ch; cout << "请输入一个字符: "; cin >> ch; // 完整的 if-else 结构 if (ch >= 'A' && ch <= 'Z') { cout << ch << " 是大写字母" << endl; } else { cout << ch << " 不是大写字母" << endl; } // 单行 if 语句(不推荐在复杂逻辑中使用,易读性较差) if (ch >= 'a' && ch <= 'z') cout << ch << " 是小写字母" << endl; return 0; }
注意: 当
if
或else
后面的代码块只有一行语句时,可以省略花括号{}
,但这会降低代码的可读性,建议始终使用花括号。思考题: 如何判断一个年份是否为闰年?(提示:能被 4 整除但不能被 100 整除,或者能被 400 整除的年份是闰年)
2. while
语句:重复执行直到条件不满足
概念和作用:
while
语句用于在给定条件为真的情况下,重复执行一段代码块。它的特点是先判断条件,再执行循环体,这意味着如果初始条件为假,循环体将不会执行。语法结构:
c++while (条件表达式) { // 循环体:当条件为真时重复执行的代码 }
循环执行的过程:
- 首先判断
条件表达式
的值。 - 如果条件为真 (
true
),则执行循环体中的代码。 - 执行完循环体后,再次回到步骤 1,重新判断条件。
- 如果条件为假 (
false
),则跳出循环,执行while
循环后面的代码。
- 首先判断
示例:使用
while
循环计算 1 到 10 的和c++#include <iostream> using namespace std; int main() { int i = 1, sum = 0; while (i <= 10) { sum += i; i++; } cout << "1 到 10 的和为: " << sum << endl; return 0; }
重点: 务必确保循环体内有能够最终使条件表达式为假的操作,否则会导致无限循环(死循环)。
引入
do-while
语句:至少执行一次的循环do-while
语句与while
语句类似,但它的特点是先执行循环体,再判断条件。这意味着do-while
循环体内的代码至少会被执行一次。c++do { // 循环体 } while (条件表达式);
应用场景: 当你需要先执行一次操作,然后再根据结果决定是否继续循环时,
do-while
非常有用,例如,在菜单驱动的程序中,你可能需要先显示菜单,然后根据用户的选择来决定是否继续。练习: 使用
while
循环实现一个程序,不断要求用户输入数字,直到用户输入 0 为止,并计算输入的正数的个数。
3. for
循环:结构化的循环
概念和作用:
for
循环提供了一种更简洁的方式来组织需要重复执行的代码,尤其适用于循环次数已知或可以预先确定的情况。语法结构:
c++for (初始化语句; 条件表达式; 递增/递减语句) { // 循环体 }
详细讲解:
- 初始化语句(Initialization Statement): 在循环开始前执行一次,通常用于初始化循环控制变量(例如,声明并赋值一个计数器)。
- 条件表达式(Condition Expression): 在每次循环迭代之前进行判断。如果为真,则执行循环体;如果为假,则跳出循环。
- 递增/递减语句(Increment/Decrement Statement): 在每次循环体执行完毕后执行,通常用于更新循环控制变量的值,使其逐渐接近循环结束的条件。
- 循环体(Loop Body): 当条件表达式为真时执行的代码块。
执行流程:
- 执行初始化语句(只执行一次)。
- 判断条件表达式的值。
- 如果条件为真,执行循环体。
- 执行递增/递减语句。
- 返回步骤 2,继续判断条件。
- 如果条件为假,跳出循环。
示例 1:使用
for
循环计算 1 到 10 的和c++#include <iostream> using namespace std; int main() { int sum = 0; for (int i = 1; i <= 10; i++) { sum += i; } cout << "1 到 10 的和为: " << sum << endl; return 0; }
示例 2:使用
for
循环计算 10 的阶乘c++#include <iostream> using namespace std; int main() { int factorial = 1; for (int i = 1; i <= 10; i++) { factorial *= i; } cout << "10 的阶乘为: " << factorial << endl; return 0; }
灵活的
for
循环:for
循环的三个部分都可以省略,但分号;
不能省略。例如:c++for (;;) { // 无限循环,需要使用 break 语句跳出 }
c++int i = 0; for (; i < 5;) { cout << i << " "; i++; } cout << endl;
练习: 使用
for
循环打印出 1 到 100 之间的所有奇数。
第二部分: 复合数据类型
除了基本数据类型(如 int
, char
, double
)之外,C++ 还提供了复合数据类型,允许我们存储和操作更复杂的数据结构。本部分将介绍数组和字符串。
1. 数组:存储相同类型数据的集合
介绍数组的概念: 数组是一种可以存储相同数据类型的多个元素的线性数据结构。可以将数组想象成一系列连续的存储单元,每个单元存储一个元素。
为什么要使用数组? 当需要处理一组相同类型的数据时,使用数组可以更方便地组织和访问这些数据,避免声明大量的独立变量。
数组的声明: 声明数组需要指定数组的类型、名称和元素的个数(大小)。
c++数据类型 数组名[数组大小];
例如:
c++int numbers[5]; // 声明一个可以存储 5 个整数的数组 double prices[10]; // 声明一个可以存储 10 个双精度浮点数的数组
数组的初始化: 可以在声明数组的同时进行初始化。
c++int numbers[5] = {1, 2, 3, 4, 5}; // 初始化数组的 5 个元素 double prices[3] = {19.99, 29.95, 99.99};
部分初始化: 如果初始化时提供的元素少于数组的大小,剩余的元素将自动初始化为 0(对于数值类型)。
c++int scores[5] = {80, 90}; // scores[0] = 80, scores[1] = 90, scores[2] = 0, scores[3] = 0, scores[4] = 0
省略大小的初始化: 如果初始化时提供了所有元素的初始值,可以省略数组的大小。
c++int data[] = {10, 20, 30}; // 编译器会自动推断数组大小为 3
数组下标: 数组中的每个元素都有一个唯一的索引,称为下标。C++ 中数组的下标从 0 开始,因此,一个大小为
n
的数组,其元素的下标范围是从0
到n-1
。访问数组元素: 使用数组名和下标来访问数组中的特定元素。
c++cout << numbers[0] << endl; // 输出数组 numbers 的第一个元素 numbers[2] = 100; // 将数组 numbers 的第三个元素赋值为 100
注意: 访问超出数组边界的下标会导致未定义的行为,可能会导致程序崩溃或产生不可预测的结果。这是 C++ 中需要特别注意的地方。
示例:编写程序,计算数组元素的平均值
c++#include <iostream> using namespace std; int main() { int numbers[5] = {10, 20, 30, 40, 50}; int sum = 0; // 使用 for 循环遍历数组 for (int i = 0; i < 5; i++) { sum += numbers[i]; } // 将 sum 强制转换为 double 类型,以获得浮点数结果 double average = static_cast<double>(sum) / 5; cout << "数组元素的平均值为: " << average << endl; return 0; }
练习: 创建一个包含 10 个整数的数组,并找出数组中的最大值和最小值。
2. 字符串:处理文本数据
C 风格字符串的概念: 在 C++ 中,C 风格字符串本质上是字符数组,用于存储一串字符。它的一个重要特点是以空字符
\0
作为结束标志。这个空字符标志着字符串的结尾。C 风格字符串的声明和初始化:
c++char str1[] = "hello"; // 编译器会自动在末尾添加 '\0' char str2[6] = {'h', 'e', 'l', 'l', 'o', '\0'}; // 必须手动添加 '\0' char str3[10] = "world"; // 剩余的位置会被初始化为 '\0'
注意: 声明字符数组来存储字符串时,必须确保数组的大小足够容纳字符串的所有字符以及结尾的空字符
\0
。使用下标访问 C 风格字符串中的字符: 可以像访问普通数组元素一样,使用下标来访问 C 风格字符串中的单个字符。
c++cout << str1[0] << endl; // 输出 'h' str2[1] = 'E'; // 将 str2 的第二个字符修改为 'E'
string
类:C++ 标准库提供的字符串处理方式C++ 标准库
<string>
头文件提供了一个功能强大的string
类,它比 C 风格字符串更方便、更安全。string
对象可以自动管理内存,无需手动处理字符串的长度和结尾的空字符。string
对象的定义、输入输出以及常用操作:c++#include <iostream> #include <string> // 引入 string 头文件 using namespace std; int main() { // 定义并初始化 string 对象 string str1 = "hello"; string str2; // 输入字符串 cout << "请输入一个字符串: "; cin >> str2; // 输出字符串 cout << "str1: " << str1 << endl; cout << "str2: " << str2 << endl; // 一些常用的 string 操作 cout << "str1 的长度: " << str1.length() << endl; // 获取字符串长度 cout << "str1 和 str2 的拼接: " << str1 + " " + str2 << endl; // 字符串拼接
课后作业 (课后完成)
- 利用
while
循环打印 100以内的偶数。 - 利用
for
循环找出 100以内除以 7 余数为偶数的数,打印出来。
参考实现:
#include <iostream>
using namespace std;
int main() {
int number = 0;
cout << "100 以内的偶数: ";
while (number <= 100) {
if (number % 2 == 0) {
cout << number << " ";
}
number++;
}
cout << endl;
return 0;
}
#include <iostream>
using namespace std;
int main() {
cout << "100 以内除以 7 余数为偶数的数: ";
for (int number = 1; number < 100; number++) {
int remainder = number % 7;
if (remainder % 2 == 0) {
cout << number << " ";
}
}
cout << endl;
return 0;
}