循环
C++ 编程语言提供了以下几种循环类型。
while
用法:
while(条件)
{
代码块;
}
for
用法:
for ( init; condition; increment )
{
statement(s);
}
注意for()内用的是分号;来分隔三个部分
流程图:
1.初始条件:init 会首先被执行,且只会执行一次。这一步允许您声明并初始化任何循环控制变量。您也可以不在这里写任何语句,只要有一个分号出现即可。
2.判断条件:接下来,会判断 condition。如果为真,则执行循环主体。如果为假,则不执行循环主体,且控制流会跳转到紧接着 for 循环的下一条语句。
3.增量:在执行完 for 循环主体后,控制流会跳回上面的 increment 语句。该语句允许您更新循环控制变量。该语句可以留空,只要在条件后有一个分号出现即可。
4.条件再次被判断。如果为真,则执行循环,这个过程会不断重复(循环主体,然后增加步值,再然后重新判断条件)。在条件变为假时,for 循环终止。
例:
#include <iostream>
using namespace std;
int main ()
{
// for 循环执行
for( int a = 10; a < 20; a = a + 1 )
{
cout << "a 的值:" << a << endl;
}
return 0;
}
输出:
a 的值: 10
a 的值: 11
a 的值: 12
a 的值: 13
a 的值: 14
a 的值: 15
a 的值: 16
a 的值: 17
a 的值: 18
a 的值: 19
C++11 基于范围的for循环
for 语句允许简单的范围迭代,下例基于数组范围高级写法:
#include <iostream>
using namespace std;
int main()
{
int a[] = { 1,2,3,4,5 };
for (int &i : a)
{
i *= 2;
cout << i << endl;
}
cout << a<<endl;//注意cout只能输出字符数组的内容,对于整型数组只能输出16进制地址,要想输出全部内容得用循环,见第三个for
for (auto i : a) // auto 类型也是 C++11 新标准中的,用来自动获取变量的类型
{
i *= 2;
cout << i << endl;
}
for (auto &i : a)//因为上面一个for没有加&,没有改变数组内部的值
cout << i << ' ';
return 0;
}
输出:
可见用(&i:a)这个方法取值的i在数组内部的值已经被改变了。为引用调用。
而不加&的(i:a)没有改变数组的值。为传值调用。
所以在函数内改变数组值的时候取值一定要用&,输出的时候加不加都一样。
例2:
#include <iostream>
#include<string>
#include<cctype>
using namespace std;
int main()
{
string s("abcdefg");
for (auto &c : s)
{
c = toupper(c); //把字符变大写
}
cout << s;
return 0;
}
输出:
do…while
不像 for 和 while 循环,它们是在循环头部测试循环条件。do…while 循环是在循环的尾部检查它的条件。do…while 循环与 while 循环类似,但是 do…while 循环会确保至少执行一次循环。
如下例:若用while循环最后一个输出应为20,用do while循环则最后一个输出为19
#include <iostream>
using namespace std;
int main ()
{
// 局部变量声明
int a = 10;
// do 循环执行
do
{
cout << "a 的值:" << a << endl;
a = a + 1;
}while( a < 20 );
return 0;
}
输出:
a 的值: 10
a 的值: 11
a 的值: 12
a 的值: 13
a 的值: 14
a 的值: 15
a 的值: 16
a 的值: 17
a 的值: 18
a 的值: 19
嵌套循环
关于嵌套循环有一点值得注意,您可以在任何类型的循环内嵌套其他任何类型的循环。比如,一个 for 循环可以嵌套在一个 while 循环内,反之亦然。
for:
for ( init; condition; increment )
{
for ( init; condition; increment )
{
statement(s);
}
statement(s); // 可以放置更多的语句
}
whlie:
while(condition)
{
while(condition)
{
statement(s);
}
statement(s); // 可以放置更多的语句
}
do while:
do
{
statement(s); // 可以放置更多的语句
do
{
statement(s);
}while( condition );
}while( condition );
循环控制语句
循环控制语句更改执行的正常序列。当执行离开一个范围时,所有在该范围中创建的自动对象都会被销毁。
C++ 提供了下列的控制语句。
1.break
break 语句有以下两种用法:
- 终止该循环:当 break 语句出现在一个循环内时,循环会立即终止,且程序流将继续执行紧接着循环的下一条语句。
- 它可用于终止 switch 语句中的一个 case。
注:嵌套循环:break 语句会停止执行最内层的循环,然后开始执行该块之后的下一行代码。
2.continue
continue 会跳过当前循环中的代码,强迫开始下一次循环。
对于 for 循环,continue 语句会导致执行条件测试和循环增量部分。
对于 while 和 do…while 循环,continue 语句会导致程序控制回到条件测试上。
3.go to
goto 语句允许把控制无条件转移到同一函数内的被标记的语句。在任何编程语言中,都不建议使用 goto 语句。因为它使得程序的控制流难以跟踪,使程序难以理解和难以修改。任何使用 goto 语句的程序可以改写成不需要使用 goto 语句的写法。
判断
判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的)。C++ 编程语言提供了以下类型的判断语句。
if省略
if…else:如果布尔表达式为 true,则执行 if 块内的代码。如果布尔表达式为 false,则执行 else 块内的代码。
if(boolean_expression)
{
// 如果布尔表达式为真将执行的语句
}
else
{
// 如果布尔表达式为假将执行的语句
}
if…else if…else:
else if可以有多个,意思就是,要么1,要么2,。。。,否则。。
if(boolean_expression 1)
{
// 当布尔表达式 1 为真时执行
}
else if( boolean_expression 2)
{
// 当布尔表达式 2 为真时执行
}
else if( boolean_expression 3)
{
// 当布尔表达式 3 为真时执行
}
else
{
// 当上面条件都不为真时执行
}
注意多层嵌套时:
if…if…else…多层嵌套下的匹配原则:else与最近的未匹配的if匹配
if()
if()
else
switch:
一个 switch 语句允许测试一个变量等于多个值时的情况。每个值称为一个 case,且被测试的变量会对每个 switch case 进行检查。
switch(expression){
case constant-expression :
statement(s);
break; // 可选的
case constant-expression :
statement(s);
break; // 可选的
// 您可以有任意数量的 case 语句
default : // 可选的
statement(s);
}
switch 语句必须遵循下面的规则:
- switch 语句中的 expression 必须是一个整型、数值型(包括单个字符)或枚举类型,或者是一个 class 类型,其中 class 有一个单一的转换函数将其转换为整型或枚举类型。不能是整个字符串(字符数组或者string)
- 在一个 switch 中可以有任意数量的 case 语句。每个 case 后跟一个要比较的值和一个冒号。
- case 的 constant-expression 必须与 switch 中的变量具有相同的数据类型,且必须是一个常量或字面量。
- 当被测试的变量等于 case 中的常量时,case 后跟的语句将被执行,直到遇到 break 语句为止。当遇到 break 语句时,switch 终止,控制流将跳转到 switch 语句后的下一行。不是每一个 case 都需要包含 break。如果 case 语句不包含 break,控制流将会继续后续的 case,直到遇到 break 为止。
- 一个 switch 语句可以有一个可选的 default case,出现在 switch 的结尾。default case 可用于在上面所有 case 都不为真时执行一个任务。default case 中的 break 语句不是必需的。
简单例:
#include <iostream>
using namespace std;
int main ()
{
// 局部变量声明
char grade = 'D';
switch(grade)
{
case 'A' :
cout << "很棒!" << endl;
break;
case 'B' :
case 'C' :
cout << "做得好" << endl;
break;
case 'D' :
cout << "您通过了" << endl;
break;
case 'F' :
cout << "最好再试一下" << endl;
break;
default :
cout << "无效的成绩" << endl;
}
cout << "您的成绩是 " << grade << endl;
return 0;
}
条件运算符 ? :
Exp1 ? Exp2 : Exp3;
? 被称为三元运算符,因为它需要三个操作数.
其中,Exp1、Exp2 和 Exp3 是表达式。请注意冒号的使用和位置。? : 表达式的值取决于 Exp1 的计算结果。如果 Exp1 为真,则计算 Exp2 的值,且 Exp2 的计算结果则为整个 ? : 表达式的值。如果 Exp1 为假,则计算 Exp3 的值,且 Exp3 的计算结果则为整个 ? : 表达式的值。
可以用来代替如下所示的 if-else 语句:
if(y < 10){
var = 30;
}else{
var = 40;
}
上面的代码可以写成以下语句:
var=(y<10)?30:40;
实例:输出2—100中所有的质数
分析:两层for循环,第一层i从2开始到100,第二层j再从2开始,看i能不能整除j,用“/”,能整除就肯定不是质数直接break内层循环,i自加到下一位数,如果
但问题在于这个第二层j有没有必要跑到i截止,显然这里浪费了较多的算力,
j只需要跑到 √i 或者 (i/j)就完全可以判断i是不是质数了,没必要继续往后跑。
#include <iostream>
using namespace std;
int main()
{
int i, j;
int n = 0;//用来计数,有多少个质数
for (i = 2; i <= 100; i++)
{
for (j = 2;j <= (i / j); j++)
{
if ((i%j) == 0)
{
break;
}
}
if (j > (i / j))
{
n++;
cout << "第" << n << "个质数: ";
cout << i << endl;
}
}
return 0;
}
输出: