暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

C++入门:循环结构

酷教 2020-05-03
671

春去春来,花开花谢,缘聚缘散,生死轮回,只有不断的变化才能永恒。我们在时间的更迭中,慢慢的变成自己的模样,却也慢慢渐行渐远。


1



身体质量指数BMI(BMI,Body Mass Index)是国际上常用的衡量人体肥胖程度和是否健康的重要标准,BMI 通过人体体重和身高两个数值获得相对客观的参数,并用这个参数所处范围衡量身体质量。

计算公式为:体重指数BMI=体重/身高的平方(国际单位kg/㎡)

因为亚洲人和欧美人属于不同人种,WHO的标准不适合中国人的情况,为此制定了中国参考标准:

编写程序,输入体重和身高,计算身体质量指数BMI,并根据中国参考标准输出BMI分类。

根据前面学习的内容可以写出下面代码:

#include <iostream>   
using namespace std;
int main()
{
double weight,height,bmi;
cout<<"请输入体重(kg),身高(m):";
cin>>weight>>height;
bmi=weight/(height*height); //注意这里为什么加()
cout<<"您的BMI为:"<<bmi<<endl;
  cout<<"您的身体:"; 
if(bmi<18.5)
cout<<"偏瘦"<<endl;
else if(bmi>=18.5 and bmi<23.9)
cout<<"正常"<<endl;
else if(bmi>=24 and bmi<26.9)
cout<<"偏胖"<<endl;
else if(bmi>=27 and bmi<29.9)
cout<<"肥胖"<<endl;
else
cout<<"重度肥胖"<<endl;
return 0;
}

与许多编程语言不同的是,C++ 没有指数运算符,计算数字的幂需要使用库函数。

#include <math.h>  //可以用这个
#include <cmath> //也可以用这个

math.h是C语言的头文件,在C++中用#include <math.h>也是可以的,C++是兼容C的。不过推荐的是使用#include <cmath>

计算上面的身高平方值就是 pow(height,2),函数原型是double pow( double x, double y ),在dev中,pow(int,int)可以执行,但在其他编译中可以会提示 :error C2668: “pow”: 对重载函数的调用不明确这样的错误,所以要注意原型。

当然这么简单的运算还是height*height更方便。


2



写到这程序也运行正确了,但有没有发现,假如连续计算N个人的BMI需要反复运行程序,非常的不方便,该如何解决呢?

当程序中需要不断的重复执行某个动作时循环语句就能派上大用场了。C++中有3种循环:for循环、while循环、do-while循环。分别了解下:

1、for循环

for循环的格式如下:

for(初始语句;循环条件;一次循环结束时执行的语句){
循环体
}

初始语句是一个赋值语句, 它用来给循环控制变量赋初值; 循环条件是一个关系表达式, 它决定什么时候退出循环; 一次循环结束时执行的语句是每循环一次后循环控制变量按什么方式变化。这三个部分之间用分号(;)分开。

这里在小括号内的三项都可以省略,如果全部省略( 形如 for(;;)  ),那就是一个死循环。

通常用它来进行循环n次的功能,如:

for (count = 1; count <= 5; count++)
    cout << "Hello" << endl;

for循环通常用来实现循环次数固定的循环(或循环变量在循环体中不改变的循环)。

如果循环体有多条语句需要加大括号,如下:
for(int i=0;i<n;++i){
// 循环体
}

2、while循环

while循环的格式十分简单:

while(循环条件){
循环体
}

这里,循环条件不可省略,如果想实现死循环,可以写成 while(1) 或 while(true) (但是效率不如 for(;;) )。while循环通常用来实现循环次数不固定的循环(或循环变量在循环体中会改变的循环)。

3、 do-while循环

do-while的循环与while循环十分相似,但有区别,for和while循环,它们是在循环头部测试循环条件,do…while 循环是在循环的尾部检查它的条件。do…while循环与while循环类似,但是do…while循环会确保至少执行一次循环。

do{
循环体
}while(循环条件);

它先执行循环体,再检查是否符合循环条件,所以它通常用于将循环至少一次的循环。

4、三种循环的联系

for循环可以改成while循环:

for(语句1;表达式;语句2){
循环体;
}

等价于

{
语句1;
while(表达式){
循环体;
语句2;
}
}

5、循环嵌套

其实就是一个循环嵌套另一个循环,只不过要注意循环变量名必须不同。(否则虽然不会报错,但是会出大问题:内层循环的变量覆盖了外层循环的变量)。

C++允许至少 256 个嵌套层次。可以在任何类型的循环内嵌套其他任何类型的循环。比如,一个 for 循环可以嵌套在一个 while 循环内,反之亦然。

// 嵌套for循环
for ( init; condition; increment )
{
for ( init; condition; increment )
{
statement(s);
}
statement(s); // 可以放置更多的语句
}
// 嵌套while循环
while(condition)
{
while(condition)
{
statement(s);
}
statement(s); // 可以放置更多的语句
}
// 嵌套do...while循环
do
{
statement(s); // 可以放置更多的语句
do
{
statement(s);
}while( condition );


}while( condition );



3



循环控制语句

循环控制语句更改执行的正常序列。当执行离开一个范围时,所有在该范围中创建的自动对象都会被销毁。在c++中有下面几种控制,当然您也可以按 Ctrl + C 键终止一个无限循环。

1. break语句

break语句通常用在循环语句或开关语句(switch)中。其作用是从当前循环或当前switch语句中跳出, 从而执行当前语句的下一条语句。

    在前面switch语句时已经简单提到过,如果去掉break ;会是不同的执行结果
int i = 1 ;
switch( i )
{
case 0:
cout<< "0" <<endl ; break ;
case 1:
cout<< "1" <<endl ; break ;
case 2:
cout<< "2" <<endl ; break ;
default:
cout<< "Others" <<endl;
}

在每个case语句后加上一个break语句, 当执行到满足条件的case语句后再执行完该case后的语句块便退出switch语句。

再举一个break语句应用于循环语句中的例子, 以while循环为例:

int i = 0 ;
while( true )
{
cout<< i <<endl ;
i ++ ;


if( i > 10 )
break ;
}

这里使用了while( true )语句, true是C++的关键字之一, 代表真, 也就是说如果没有其他任何语句这就是一个死循环(永远不会停止), 这里我们还定义了一个变量i, 在循环体中使用cout<< i << ;输出i的值, i++ ;语句是i自增1, 接下来是if语句, 条件表达式是当 i > 10时执行if语句块中的语句, 也就是说当i自增到大于10时就会执行break语句, 从而跳出while循环, 这样while( true )就不再是死循环了。

需要注意的是:
        1. break语句对if-else的条件语句不起作用。
        2. 在多层循环中,一个break语句只向外跳一层。    

2. continue语句

continue语句的作用是跳过本轮循环中剩余的语句, 而执行下一轮循环。continue语句只用在for、while、do-while等循环体中, 常与if条件语句一起使用, 用来控制循环, 但不能用来控制if语句中的剩余语句。

看下面实例: 输出100以内同时能被3整除且能同时被5整除的整数。


#include<iostream>
using namespace std ;
int main()
{
int i;
for( i = 0; i < 100; i++ )
{
if( i % 3 != 0 || i % 5 != 0 ) //当i不符合要求时结束本次循环
continue ;
cout<< i <<endl ; //输出i
    }
return 0 ;
}

程序输出的结果是15, 30, 45, 60, 75, 90。从if语句中可以看出, 当i不能整除3或5时就continue继续下一个循环, 所以cout<< i <<endl ;这句不会被每次都执行, 只有没有被continue时才能执行到该输出语句。

3. goto语句
    当循环嵌套较深且需要全部跳出循环时, 使用goto语句应该说是个不错的选择, 例如:
#include<iostream>
using namespace std ;
int main()
{
int i, m, n;
for( i = 0; i < 100; i++ )
{
for( m = 0; m < 100; m++ )
{
for( n = 0; n < 100; n++ )
{
if( (i + m + n) == 256 )
{
cout<<"i = "<< i <<endl;
cout<<"m = "<< m <<endl;
cout<<"n = "<< n <<endl;
goto stop ;
}
}
}
}
    stop: cout<<"Stop"<<endl;
return 0 ;
}

这里是使用3个for循环嵌套, 计算3个100以内的数i, m, n相加和为256的情况, 这里我们只取一个结果, 也就是说只要出现第一个符合条件的i, m, n 输出后便退出循环, 如果在if语句中使用break的话只能退出当前if语句所在的循环, 而无法退出更上一层的循环。

使用goto语句在循环外部定义一个表示stop, 需要退出所有循环时直接goto到循环外部, 这样就相当于一次跳出了3个循环。


4



大致了解了上面几种循环方式和控制语句后,我们可以尝试将开始的身体质量指数BMI计算程序加一个控制,比如当输入的身高等于0时退出程序,想一下该如何实现?

可以尝试下面的练习:

1、利用forwhile,do-while分别计算s=1+2+3+4+...+10 

2、制作输出九九乘法口诀表。
3、求1000以内的水仙花数。(即个位、十位、百位各自的立方和等于三位数本身)


还有CCF第三场NOI Online能力测试524举办。测试分为入门组和提高组,任何感兴趣的选手均可参加,每组成功报名选手在同一时间参加线上测试。错过前两场的同学可以关注一下了。

文章转载自酷教,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论