5.C++循环与判断(c++11基于范围的for循环),条件运算符 ? :

循环

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 语句有以下两种用法:

  1. 终止该循环:当 break 语句出现在一个循环内时,循环会立即终止,且程序流将继续执行紧接着循环的下一条语句。
  2. 它可用于终止 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 语句必须遵循下面的规则:

  1. switch 语句中的 expression 必须是一个整型、数值型(包括单个字符)枚举类型,或者是一个 class 类型,其中 class 有一个单一的转换函数将其转换为整型或枚举类型。不能是整个字符串(字符数组或者string)
  2. 在一个 switch 中可以有任意数量的 case 语句。每个 case 后跟一个要比较的值和一个冒号
  3. case 的 constant-expression 必须与 switch 中的变量具有相同的数据类型,且必须是一个常量或字面量
  4. 当被测试的变量等于 case 中的常量时,case 后跟的语句将被执行,直到遇到 break 语句为止。当遇到 break 语句时,switch 终止,控制流将跳转到 switch 语句后的下一行。不是每一个 case 都需要包含 break。如果 case 语句不包含 break,控制流将会继续后续的 case,直到遇到 break 为止
  5. 一个 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;
}


输出:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值