- 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