- C++
C++循环教程
- @ 2024-12-7 21:50:10
C++循环教程
1. 为什么需要循环?
在编程中,我们经常需要重复执行一些操作。例如,计算1到100的整数和,或者输出一个数组中的所有元素。如果没有循环,我们就需要手动写很多重复的代码,这不仅繁琐,而且容易出错。循环结构可以让我们轻松地重复执行一段代码。
2. for循环
- 基本语法和工作原理
- for循环的基本语法如下:
for (初始化表达式; 条件表达式; 更新表达式) { // 循环体:要重复执行的代码 }- 初始化表达式:在循环开始前执行一次,通常用于初始化循环变量。例如,
int i = 0;初始化一个整数变量i为0。 - 条件表达式:每次循环开始时都会检查这个条件。只要条件为真(非零),就会执行循环体。例如,
i < 10表示当i小于10时,循环继续。 - 更新表达式:在每次循环体执行完后执行,用于更新循环变量。例如,
i++会使i的值每次增加1。
- 示例:计算1到10的整数和
int sum = 0; for (int i = 1; i <= 10; i++) { sum += i; } std::cout << "1到10的整数和为:" << sum << std::endl;- 在这个例子中,
i是循环变量。首先i被初始化为1,然后每次循环检查i <= 10这个条件。如果条件满足,就执行循环体sum += i;(将i的值加到sum上),然后执行i++更新i的值。当i大于10时,循环结束,最后输出总和。
- 在这个例子中,
3. while循环
- 基本语法和工作原理
- while循环的基本语法是:
while (条件表达式) { // 循环体:要重复执行的代码 }- 只要条件表达式为真(非零),就会一直执行循环体。和for循环不同的是,while循环没有专门的初始化和更新部分,需要在循环体外部初始化循环变量,在循环体内部更新循环变量。
- 示例:输出1到5的数字
int num = 1; while (num <= 5) { std::cout << num << " "; num++; } std::cout << std::endl;- 这里首先初始化
num为1,然后每次循环检查num <= 5这个条件。如果为真,就输出num的值,然后执行num++更新num。当num大于5时,循环结束。
- 这里首先初始化
4. do - while循环
- 基本语法和工作原理
- do - while循环的基本语法如下:
do { // 循环体:要重复执行的代码 } while (条件表达式);- do - while循环和while循环很相似,但它是先执行一次循环体,然后再检查条件表达式。这意味着循环体至少会执行一次。
- 示例:猜数字游戏(简单版)
int numberToGuess = 7; int userGuess; do { std::cout << "请猜一个数字(1 - 10):"; std::cin >> userGuess; } while (userGuess!= numberToGuess); std::cout << "猜对了!" << std::endl;- 在这个例子中,首先会要求用户猜一个数字,然后检查用户猜的数字是否等于要猜的数字(7)。如果不等于,就会再次要求用户猜测,直到猜对为止。因为是do - while循环,所以至少会要求用户猜一次数字。
5. 循环嵌套
- 概念和用途
- 循环嵌套是指在一个循环内部再放置一个循环。这在处理二维数据结构(如二维数组)或者需要多层重复操作时非常有用。例如,打印一个乘法口诀表。
- 示例:打印乘法口诀表
for (int i = 1; i <= 9; i++) { for (int j = 1; j <= i; j++) { std::cout << j << "×" << i << "=" << i * j << "\t"; } std::cout << std::endl; }- 外层的for循环控制行数(从1到9),内层的for循环控制每行的乘法算式个数(每行的算式个数和行数相同)。对于每一行
i,内层循环会从1到i,输出乘法算式j × i = i * j,并使用\t(制表符)来使输出格式更整齐。每一行结束后,使用std::cout << std::endl;换行。
- 外层的for循环控制行数(从1到9),内层的for循环控制每行的乘法算式个数(每行的算式个数和行数相同)。对于每一行
6 条评论
-
admin SU @ 2024-12-7 21:54:31
-
基于范围的for循环(C++11引入)
- 功能和语法
- 基于范围的for循环主要用于遍历容器(如数组、
vector、list等)或其他可迭代对象中的元素。它的语法简洁明了,不需要显式地使用索引或迭代器来访问元素。 - 基本语法是:
for (元素类型 元素变量 : 可迭代对象) { 循环体 }。例如,遍历一个整数数组:int numbers[] = {1, 2, 3, 4, 5}; for (int num : numbers) { std::cout << num << " "; } - 在这个例子中,
num是在每次循环中从numbers数组中获取的元素,循环会自动遍历数组中的每个元素,将其赋值给num,然后执行循环体。这种方式比传统的for循环通过索引访问数组元素更加简洁直观,特别是在不需要索引值的情况下。
- 基于范围的for循环主要用于遍历容器(如数组、
- 适用场景
- 当只需要对容器中的元素进行简单的遍历操作,如输出每个元素、对每个元素进行相同的计算等,基于范围的for循环是非常方便的选择。例如,对一个
vector容器中的字符串进行拼接:#include <iostream> #include <vector> #include <string> int main() { std::vector<std::string> words = {"Hello", " ", "World", "!"}; std::string result; for (std::string word : words) { result += word; } std::cout << result << std::endl; return 0; } - 这里通过基于范围的for循环,将
words向量中的每个字符串依次拼接起来,得到最终的结果并输出。
- 当只需要对容器中的元素进行简单的遍历操作,如输出每个元素、对每个元素进行相同的计算等,基于范围的for循环是非常方便的选择。例如,对一个
- 功能和语法
-
递归(可以看作是一种特殊的循环)
- 概念和原理
- 递归是指在函数的定义中使用函数自身的方法。一个递归函数通常包含两个部分:基线条件(递归终止条件)和递归调用。当满足基线条件时,递归停止;否则,函数会调用自身,每次调用时参数会向基线条件靠近。
- 例如,计算阶乘的递归函数:
int factorial(int n) { if (n == 0) { return 1; } else { return n * factorial(n - 1); } } - 在这个函数中,
if (n == 0)是基线条件,当n为0时,函数返回1。否则,函数通过return n * factorial(n - 1)进行递归调用,每次调用时n的值减1,直到n等于0。
- 适用场景
- 递归在处理具有递归结构的数据或问题时非常有用,如树结构(二叉树的遍历、查找等)、分治法问题(如归并排序、快速排序等)。以二叉树的前序遍历为例:
struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; void preorderTraversal(TreeNode* root) { if (root == NULL) { return; } std::cout << root->val << " "; preorderTraversal(root->left); preorderTraversal(root->right); } - 这个函数用于遍历二叉树的节点。当根节点
root为NULL时,递归终止。否则,先输出根节点的值,然后递归地遍历左子树和右子树,按照前序遍历的规则(根 - 左 - 右)访问二叉树中的每个节点。
- 递归在处理具有递归结构的数据或问题时非常有用,如树结构(二叉树的遍历、查找等)、分治法问题(如归并排序、快速排序等)。以二叉树的前序遍历为例:
- 概念和原理
-
-
@ 2024-12-7 21:53:24
-
for循环适用场景
- 遍历数组和容器
- 在C++中,
for循环非常适合用于遍历数组和各种容器(如vector、array等)。因为在这种情况下,通常知道数组或容器的大小,for循环可以方便地通过索引来访问每个元素。 - 例如,遍历一个整数数组:
int numbers[] = {1, 2, 3, 4, 5}; for (int i = 0; i < sizeof(numbers)/sizeof(numbers[0]); i++) { std::cout << numbers[i] << " "; } - 这里通过
for循环的初始化部分定义了索引i,条件判断部分确保i在数组的有效范围内,更新部分i++让索引逐次增加,从而可以依次访问数组中的每个元素并输出。
- 在C++中,
- 执行固定次数的操作
- 当需要执行固定次数的重复任务时,
for循环是很好的选择。例如,计算1到100的整数和:int sum = 0; for (int i = 1; i <= 100; i++) { sum += i; } std::cout << "1到100的整数和为:" << sum << std::endl; - 在这里,我们明确知道要从1加到100,共100次加法操作,
for循环的初始化(i = 1)、条件判断(i <= 100)和更新(i++)部分很好地配合实现了这个固定次数的循环。
- 当需要执行固定次数的重复任务时,
- 遍历数组和容器
-
while循环适用场景
- 基于条件的不确定次数循环
- 当循环的结束条件取决于某个动态变化的条件,且在循环开始前无法确定循环次数时,
while循环很适用。例如,从用户输入中读取数据,直到用户输入特定的值(如-1)结束:int input; std::cout << "请输入整数(输入-1结束):"; std::cin >> input; while (input!= -1) { std::cout << "你输入的是:" << input << std::endl; std::cout << "请输入整数(输入-1结束):"; std::cin >> input; } - 这个例子中,不知道用户会输入多少次数据,循环会一直执行,只要用户输入的不是
-1,就会继续要求用户输入并输出输入的内容。
- 当循环的结束条件取决于某个动态变化的条件,且在循环开始前无法确定循环次数时,
- 等待某个状态改变的情况
- 在一些程序中,需要等待某个外部设备状态改变或者某个变量达到特定值。例如,等待一个文件读取完成,通过检查表示文件读取状态的变量来决定是否继续等待:
bool fileReadComplete = false; while (!fileReadComplete) { // 检查文件读取进度的代码,可能涉及到系统调用或者其他复杂操作 // 如果读取完成,将fileReadComplete设置为true }
- 在一些程序中,需要等待某个外部设备状态改变或者某个变量达到特定值。例如,等待一个文件读取完成,通过检查表示文件读取状态的变量来决定是否继续等待:
- 基于条件的不确定次数循环
-
do - while循环适用场景
- 至少执行一次的操作循环
- 当需要保证循环体中的代码至少执行一次,然后再根据条件判断是否继续循环时,
do - while循环是最佳选择。例如,一个简单的菜单程序,需要先显示菜单,然后根据用户选择决定是否再次显示菜单:int choice; do { std::cout << "1. 开始游戏\n2. 查看帮助\n3. 退出" << std::endl; std::cin >> choice; switch (choice) { case 1: std::cout << "游戏开始!" << std::endl; break; case 2: std::cout << "这是帮助信息。" << std::endl; break; case 3: std::cout << "再见!" << std::endl; break; default: std::cout << "无效选择,请重新选择。" << std::endl; } } while (choice!= 3); - 这个菜单程序首先会显示菜单选项,用户做出选择后,根据选择执行相应操作,然后检查用户是否选择退出(
choice!= 3),如果没有退出,就会再次显示菜单,保证菜单至少显示一次。
- 当需要保证循环体中的代码至少执行一次,然后再根据条件判断是否继续循环时,
- 至少执行一次的操作循环
-
-
@ 2024-12-7 21:52:41
-
for循环执行流程
- 初始化:首先执行循环的初始化部分,这部分通常用于声明和初始化一个循环变量。例如,
for(int i = 0;...;... ),在这里int i = 0就是初始化部分,定义了一个整型变量i并将其初始化为0。这个步骤只在循环开始时执行一次。 - 条件判断:接着会检查条件表达式。只要这个条件为真(在C++中,非零值表示真),就会执行循环体中的代码。例如,
i < 10这个条件表达式,当i的值小于10时,循环会继续执行。 - 循环体执行:如果条件判断为真,就会执行循环体中的代码。循环体是包含在
for循环的花括号{}内的部分,这部分代码会根据条件的判断结果重复执行。 - 更新操作:在每次循环体执行完毕后,会执行更新表达式。例如,
i++会使循环变量i的值增加1。这个操作更新了循环变量,为下一次的条件判断做准备。 - 循环结束条件:当条件表达式的值为假(即0)时,循环结束,程序继续执行循环后面的代码。
- 示例代码:
for(int i = 0; i < 5; i++) { std::cout << i << " "; } // 输出结果为:0 1 2 3 4 - 在这个例子中,
i从0开始,每次循环判断i是否小于5,然后在循环体中输出i的值,最后i自增1。当i等于5时,条件不满足,循环结束。
- 初始化:首先执行循环的初始化部分,这部分通常用于声明和初始化一个循环变量。例如,
-
while循环执行流程
- 初始化(在循环外):在进入
while循环之前,需要先对循环变量进行初始化。例如,int i = 0;在循环外部定义并初始化了一个变量i。 - 条件判断:和
for循环一样,while循环会先检查条件表达式。只要条件为真,就会执行循环体中的代码。例如,while(i < 5),当i的值小于5时,循环会继续。 - 循环体执行:如果条件判断为真,就执行循环体中的代码。循环体同样是花括号
{}内的部分,这部分代码会根据条件的判断结果重复执行。 - 更新操作(在循环内):在循环体内部需要手动更新循环变量。例如,
i++,这样才能使循环最终结束。如果忘记更新循环变量,可能会导致循环一直执行下去,形成死循环。 - 循环结束条件:当条件表达式的值为假(即0)时,循环结束,程序继续执行循环后面的代码。
- 示例代码:
int i = 0; while(i < 5) { std::cout << i << " "; i++; } // 输出结果为:0 1 2 3 4 - 这里,先在循环外初始化
i为0,然后在每次循环中检查i是否小于5,在循环体中输出i的值后,通过i++更新i的值,直到i不小于5,循环结束。
- 初始化(在循环外):在进入
-
do - while循环执行流程
- 初始化(在循环外):类似于
while循环,在进入do - while循环之前,需要先对循环变量等进行初始化。例如,int i = 0;在循环外部定义并初始化变量。 - 循环体执行:
do - while循环的特点是先执行一次循环体中的代码,然后再进行条件判断。这意味着循环体至少会被执行一次。例如,do {... } while(i < 5);,会先执行一次循环体中的内容。 - 条件判断:在循环体执行一次后,会检查条件表达式。只要条件为真,就会再次执行循环体中的代码。例如,当
i < 5为真时,循环会继续执行。 - 更新操作(在循环内):在循环体内部需要手动更新循环变量,以确保循环能够正常结束。例如,通过
i++来更新变量的值。 - 循环结束条件:当条件表达式的值为假(即0)时,循环结束,程序继续执行循环后面的代码。
- 示例代码:
int i = 0; do { std::cout << i << " "; i++; } while(i < 5); // 输出结果为:0 1 2 3 4 - 在此示例中,先初始化
i为0,然后执行循环体,输出i的值并将i自增1。之后检查i是否小于5,如果是,则再次执行循环体,直到i不小于5,循环结束。
- 初始化(在循环外):类似于
-
三种循环的区别
- 执行顺序:
for循环是先初始化,然后进行条件判断,接着执行循环体,最后更新循环变量,再进行下一次条件判断,如此循环。while循环是先进行条件判断,只有条件为真时才执行循环体,在循环体内部更新循环变量,然后再进行条件判断,重复这个过程。do - while循环是先执行循环体,然后再进行条件判断,只要条件为真就继续执行循环体,在循环体内部更新循环变量,然后再进行条件判断,并且循环体至少会执行一次。
- 使用场景:
for循环适用于已知循环次数的情况,例如遍历一个固定大小的数组。例如,for(int i = 0; i < array_size; i++),其中array_size是已知的数组大小,for循环可以很方便地遍历数组中的每个元素。while循环适用于不知道循环次数,但知道循环结束的条件的情况。例如,当从用户输入中读取数据,直到用户输入特定的值(如-1)来结束输入时,就可以使用while循环来不断读取输入并进行判断。do - while循环也适用于不知道循环次数的情况,但它强调循环体至少要执行一次。例如,一个简单的菜单程序,至少要显示一次菜单内容,然后根据用户的选择来决定是否继续显示菜单,就可以使用do - while循环来实现。
- 执行顺序:
-
-
@ 2024-12-7 21:51:55
以下是使用C++语言中的
do-while循环来打印100以内奇数的两种常见代码示例,并且都附带了详细注释,帮助你理解代码的逻辑思路:方法一:通过每次让变量自增2来实现(利用奇数特性)
#include <iostream> using namespace std; int main() { int num = 1; // 初始化变量num为1,从最小的奇数开始 do { cout << num << " "; // 输出当前的奇数 num += 2; // 让num每次增加2,保证其始终为奇数 } while (num < 100); // 循环条件,只要num小于100,就继续循环 cout << endl; // 循环结束后输出换行符,使输出更美观 return 0; }在这个示例中:
- 首先将变量
num初始化为1,因为1是最小的奇数,这是我们要打印的奇数序列的起始值。 - 接着进入
do-while循环,它的特点是先执行一次循环体中的代码,也就是先输出当前的奇数num,然后通过num += 2让num的值增加2,使得num始终保持为奇数。 - 之后再判断
while后面的条件num < 100,只要这个条件为真,也就是num的值还小于100,就会再次执行循环体,重复输出奇数以及更新num的操作。当num不满足小于100的条件时,循环结束,最后输出一个换行符来规范输出的格式,让结果看起来更整齐。
方法二:通过取余判断是否为奇数来实现
#include <iostream> using namespace std; int main() { int num = 0; // 初始化变量num为0 do { if (num % 2!= 0) { // 通过取余运算判断num是否为奇数,余数不为0则是奇数 cout << num << " "; // 如果是奇数,就输出该数 } num++; // 每次循环让num自增1,依次检查每个数是否为奇数 } while (num < 100); // 循环条件,保证处理的数在100以内 cout << endl; return 0; }在这段代码里:
- 先把变量
num初始化为0,然后进入do-while循环。由于do-while循环的特性,会先执行一次循环体的内容。 - 在循环体中,通过
if语句结合取余运算num % 2来判断num是否为奇数,当余数不为0时,说明num是奇数,此时就会输出这个奇数。接着通过num++让num的值自增1,准备检查下一个数是否为奇数。 - 完成一次循环体的执行后,再判断
while后面的条件num < 100,若该条件满足,就会继续执行循环体,如此反复,直到num不小于100了,循环结束,最后输出换行符来完善输出的显示效果,使得打印出来的奇数呈现出更规范的排列形式。
- 首先将变量
-
@ 2024-12-7 21:51:22
以下是使用C++语言中的
while循环来打印100以内奇数的两种常见代码示例,并且附带了详细注释,方便你理解代码逻辑:方法一:通过控制变量每次自增2来实现
#include <iostream> using namespace std; int main() { int num = 1; // 初始化变量num为1,从最小的奇数开始 while (num < 100) { // 只要num小于100,就继续循环,确保在100以内 cout << num << " "; // 输出当前的奇数 num += 2; // 让num每次增加2,这样始终保持为奇数 } cout << endl; // 循环结束后输出换行符,使输出更美观 return 0; }在这个示例中:
- 首先定义并初始化变量
num为1,它作为要打印的奇数序列的起始值。 - 接着进入
while循环,循环的条件是num < 100,意味着只要num的值小于100,循环就会持续执行。 - 在循环体内部,先输出当前的奇数
num,然后通过num += 2让num的值增加2,这样num在下一次循环时依然是奇数,如此反复,直到num不满足小于100的条件,循环结束,最后输出一个换行符来规范输出的格式。
方法二:通过取余判断是否为奇数来实现
#include <iostream> using namespace std; int main() { int num = 0; // 初始化变量num为0 while (num < 100) { // 循环条件,保证处理的数在100以内 if (num % 2!= 0) { // 通过取余运算判断num是否为奇数,余数不为0则是奇数 cout << num << " "; // 如果是奇数,就输出该数 } num++; // 每次循环让num自增1,依次检查每个数是否为奇数 } cout << endl; return 0; }在这段代码里:
- 先把变量
num初始化为0,随后进入while循环,只要num的值小于100,循环就会不断执行下去。 - 在循环体中,使用
if语句结合取余运算num % 2判断num是否为奇数,若余数不为0,说明num是奇数,此时就会输出这个奇数。 - 每次循环结束时,通过
num++让num的值自增1,这样就能逐个检查0到99这些数是否为奇数,并输出所有的奇数,循环结束后输出换行符来完善输出的显示效果。
- 首先定义并初始化变量
-
@ 2024-12-7 21:50:49
以下是使用C++语言中的
for循环来打印100以内奇数的代码示例,代码中添加了详细注释方便你理解其逻辑:#include <iostream> using namespace std; int main() { // for循环的初始化部分,定义一个整型变量i并初始化为1,从最小的奇数开始 for (int i = 1; // 条件表达式,只要i小于100就继续循环,保证只处理100以内的数 i < 100; // 更新表达式,每次循环让i增加2,这样就能保证i始终是奇数 i += 2) { // 在循环体中输出当前的奇数i cout << i << " "; } cout << endl; // 循环结束后输出一个换行符,使输出结果更美观 return 0; }在上述代码中:
for循环的初始化部分int i = 1创建了一个整型变量i并初始化为1,作为起始的奇数。- 条件表达式
i < 100限定了循环的范围,只要i的值小于100,循环就会持续执行下去,确保只处理100以内的数字。 - 更新表达式
i += 2让变量i在每次循环结束后增加2,这样i始终保持为奇数,依次遍历了100以内的所有奇数并进行输出。最后通过cout << endl;输出一个换行符来让整个输出结果在终端上的显示更加整齐规范。
当然,也可以用另一种常见的思路来实现,代码如下:
#include <iostream> using namespace std; int main() { for (int i = 0; i < 100; i++) { // 初始化i为0,范围是小于100 if (i % 2!= 0) { // 通过取余运算判断i是否为奇数,如果余数不为0则是奇数 cout << i << " "; } } cout << endl; return 0; }这段代码里,
for循环先初始化i为0,然后每次循环让i自增1,在循环体内部通过if语句使用取余运算i % 2判断i是否为奇数(奇数除以2的余数不为0),如果是奇数就进行输出,同样能实现打印100以内奇数的功能。
- 1