C++学习笔记——第四天 程序控制结构

目标

  • 了解C++的面向过程的结构化设计方法
  • 熟练掌握C++支持的三种程序结构:顺序结构,选择结构,循环结构
  • 掌握转向语句的功能及其使用

顺序结构

顺序结构是指按照所有语句出现的顺序先后执行,先出现的先执行,后出现的后执行。顺序结构的语句一般包含三种:表达式语句;输入语句;输出语句。

表达式语句
一般形式:
表达式;
复合语句
{
<语句1>
<语句2>
……
<语句n>
}

输入语句
C++没有提供输入/输出语句。其输入/输出功能由函数(scanf,printf)或流控制来实现。
输入/输出流(I/O流)是输入或输出的一系列字节。C++定义了包含重载运算符。“<<”和”>>”的iostream类。

#include<iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int a;
    cin>>a; //输入语句
    getchar();
    return 0;
}

这里写图片描述

输出语句

#include<iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    cout<<"Hello.\n";   //输出语句
    getchar();
    return 0;
}

这里写图片描述

格式控制符

  • flags:该函数一般有以下两种形式,第一种形式是通过参数1Flags重新设置标志字并返回原来的标志字;另一种形式是通过无参数的flags函数返回当前的标志字。
    long flags(long 1Flags);
    long flags();
  • setf:该函数一般也有以下两种形式:第一种形式是通过参数1Flags来设置指定的格式控制标志位;第二种形式是用来设置指定的格式控制标志位的值
    long setf(long 1Flags);
    long setf(long 1Flags,long 1Mask);
  • unsetf:该函数一般形式如下,这种形式是通过参数1Flags来清除指定的格式控制标志位(使那些位的值为“0”)
    long unsetf(long 1Flags);
  • fill:函数一般有以下两种形式,第一种形式是将填充字符设置为cFill,并返回原填充字符;第二种形式是通过无参数的fill函数返回当前的填充字符。
    char fill(char cFill);
    char fill();
  • precision:该函数形式一般也有以下两种,第一种形式是设置浮点数精度为np,并返回原精度;第二种形式是通过无参数的precision函数返回当前的浮点数精度。
    int precision(int np);
    int precision();
  • width:该函数的形式一般也有以下两种,第一种形式设置当前显示数据的域宽nw,并返回原域宽;第二种形式是通过无参数的width函数返回当前显示数据的域宽。
    int width(int nw);
    int width();
    例如:
    控制不同进制的进出。
#include<iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int a=1000;
    cout<<"默认下:"<<a<<endl;
    cout<<"十进制下:"<<dec<<a<<endl;
    cout<<"八进制下:"<<oct<<a<<endl;
    cout<<"十六进制下:"<<hex<<a<<endl;

    getchar();
    return 0;
}

这里写图片描述

控制输出宽度

#include "stdafx.h"
#include<iostream>
#include <iomanip>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int a =1234567890;
    double b = 123.45;
    cout<<setw(10)<<a<<endl;
    cout<<setw(10)<<b<<endl;
    cout<<setw(8)<<b<<endl;
    cout<<setw(6)<<b<<endl;
    cout<<setw(4)<<b<<endl;

    getchar();
    return 0;
}

这里写图片描述
宽度达不到setw控制符中设定的宽度时,将在输出内容前面填补空格,大于控制符中设定的宽度时,系统将全部予以输出。

控制输出精度

#include "stdafx.h"
#include<iostream>
#include <iomanip>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    double a =1.23456789;
    cout<<a<<endl;
    cout<<setprecision(3)<<a<<endl;
    cout<<setprecision(10)<<a<<endl;

    getchar();
    return 0;
}

这里写图片描述

这里写图片描述

应用示例

#include "stdafx.h"
#include<iostream>
#include <iomanip>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    const double Num = 123.4567;
    cout.flags(ios::right); //设置对其的标志位是右
    cout<<setw(10)<<Num<<endl;
    cout.fill('*');//填充字符*
    cout.width(12);//显示数据的域宽是12
    cout<<Num<<endl;
    cout.precision(4);//浮点数的有效个数为4
    cout<<Num<<endl;
    cout.setf(ios::showpos);//显示正号
    cout.precision(2);
    cout<<Num<<endl;
    cout.unsetf(ios::showpos);//显示正号
    int n;
    cout<<"输出一个八进制整数:";
    cin>>oct>>n;
    cout<<"八进制数n是:"<<oct<<n<<endl;
    cout<<"对应的十进制数是"<<dec<<n<<endl;
    cout<<"对应的十六进制数是"<<hex<<n<<endl;
    getchar();
    getchar();
    return 0;
}

这里写图片描述

选择结构

用来判断所给定的语句是否满足条件,根据判断结果,选择执行不同分支语句,常用语句if,if…else,多重if…else,和switch。
if语句
一般形式:
表达式可以是int,long,char和enum型。

if(<表达式>)
    <语句>

#include "stdafx.h"
#include<iostream>
#include <iomanip>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int x,y,temp;
    cout<<"Please input 2 numbers:";
    cin>>x>>y;
    if(x<y)
    {
        temp=x;
        x=y;
        y=temp;
    }
    cout<<"x="<<x<<endl;
    cout<<"y="<<y<<endl;
    getchar();
    getchar();
    return 0;
}

这里写图片描述

if…else语句
if…else语句是双分支语句一般形式为

if(<表达式><语句1>;
else
    <语句2>

#include "stdafx.h"
#include<iostream>
#include <iomanip>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int score;
    cout<<"请输入学生分数:"<<endl;
    cin>>score;
    if(score>=60)
        cout<<"及格"<<endl;
    else
        cout<<"不及格"<<endl;
    getchar();
    getchar();
    return 0;
}

这里写图片描述

多重if…else语句
多重if…else语句为多分支条件语句或if…else if…else语句一般形式为

if(<表达式1><语句1>;
else if(<表达式2>)
    <语句2>;
    ……
else if(<表达式n>)
    <语句n>;
else
    <语句n+1>
#include<iostream>
#include <iomanip>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int score;
    cout<<"请输入学生分数:"<<endl;
    cin>>score;
    if(score>=90)
        cout<<"优"<<endl;
    else if(score>=80)
        cout<<"良"<<endl;
    else if(score>=70)
        cout<<"中"<<endl;
    else if(score>=60)
        cout<<"及格"<<endl;
    else
        cout<<"不及格"<<endl;
    getchar();
    getchar();
    return 0;
}

这里写图片描述

多分支条件语句可以使用if语句的嵌套实现

#include "stdafx.h"
#include<iostream>
#include <iomanip>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int score;
    cout<<"请输入学生分数:"<<endl;
    cin>>score;
    if(score>=60)
    {
        if(score>=70)
        {
            if(score>=80)
            {
                if(score>=90)
                    cout<<"优"<<endl;
                else
                    cout<<"良"<<endl;
            }
            else
                cout<<"中"<<endl;
        }
        else
            cout<<"及格"<<endl;
    }
    else
        cout<<"不及格"<<endl;


    getchar();
    getchar();
    return 0;
}

这里写图片描述

switch语句
switch语句也称情况语句,也是一种多分支语句,说明语句的一般形式:

switch(<表达式1>)
{
case<常量表达式1>;
<语句1>;breakcase<常量表达式2>;
<语句2>;break;
……
case<常量表达式n>;
<语句n>;breakdefault:
<语句n>;break;
}
#include "stdafx.h"
#include<iostream>
#include <iomanip>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int day;
    cout<<"请输入0~6的数值:"<<endl;
    cin>>day;
    switch(day)
    {
    case 0:
        cout<<"星期日"<<endl;
        break;
    case 1:
        cout<<"星期一"<<endl;
        break;
    case 2:
        cout<<"星期二"<<endl;
        break;
    case 3:
        cout<<"星期三"<<endl;
        break;
    case 4:
        cout<<"星期四"<<endl;
        break;
    case 5:
        cout<<"星期五"<<endl;
        break;
    case 6:
        cout<<"星期六"<<endl;
        break;
    default:
        cout<<"输入非法"<<endl;

    }

    getchar();
    getchar();
    return 0;
}

这里写图片描述
这里写图片描述
注意
- 若case后面没有break语句,则程序顺序执行后续的语句,直到switch语句结束。这样就不能实现多分支选择。
- switch语句只能对表达式的结果是否为固定的值进行判断,而不能对其结果是否在某区域进行判断,这与多重if…else语句有所不同
- 每个常量表达式的值不能相同,case语句的排列顺序不影响执行结果

应用示例

// lianxi.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#include <iomanip>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    float a,b,c,d;
    cout<<"a=";
    cin>>a;
    cout<<"b=";
    cin>>b;
    cout<<"c=";
    cin>>c;
    d=b*b-4*a*c;
    if(a==0)
        cout<<"不是一元二次方程"<<endl;
    else if(d>0)
    {
        cout<<"方程有两个实根!"<<endl;
        cout<<"x1="<<(-b+sqrt(d))/(2*a)<<endl;
        cout<<"x2="<<(-b-sqrt(d))/(2*a)<<endl;
    }
    else if(d==0)
    {
        cout<<"方程有一个实根!"<<endl;
        cout<<"x1=x2="<<-b/(2*a)<<endl;
    }
    else
        cout<<"方程无实根!"<<endl;
    getchar();
    getchar();
    getchar();
    getchar();
    getchar();
    getchar();
    return 0;
}

这里写图片描述

循环结构

循环结构用来在指定条件下多次重复执行同一组语句。常用形式:

  • for语句
  • while语句
  • do…while语句

for语句
一般形式:

for(<表达式1><表达式2><表达式3>)
    <语句>
  • 表达式1对循环控制变量进行初始化
  • 表达式2是循环条件
  • 表达式3是对循环控制变量进行递增或递减
    三个表达式可以缺省但分号不能省略
#include "stdafx.h"
#include<iostream>
#include <iomanip>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int i;
    int sum=0;
    for(i=2;i<=100;i=i+2)//for循环
    {
        sum +=i;
    }
    cout<<"100内所有偶数和为:"<<sum<<endl;
    getchar();
    return 0;
}

这里写图片描述

while语句
一般形式:

while(<表达式>)
    <语句>
// lianxi.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#include <iomanip>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int i;
    int sum=0;
    i=2;
    while(i<=100)//while循环
    {
        sum +=i;
        i=i+2;
    }
    cout<<"100内所有偶数和为:"<<sum<<endl;
    getchar();
    return 0;
}

这里写图片描述

do…while语句
do…while语句的循环体至少被执行一次
一般形式为:

do
<语句>
while(<表达式>);
// lianxi.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#include <iomanip>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int i;
    int sum=0;
    i=2;
    do
    {
        sum+=i;
        i=i+2;
    }
    while(i<=100);//do...while循环
    cout<<"100内所有偶数和为:"<<sum<<endl;
    getchar();
    return 0;
}

这里写图片描述

多重循环
多重循环(循环嵌套)是指循环语句的循环体内又包含另一个循环语句。
在多重循环中,循环嵌套的执行顺序是先执行最里层的循环语句,依次往外执行,最后执行最外层的循环
打印一个九九乘法表

// lianxi.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#include <iomanip>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int bcs,cs;
    for(bcs=1;bcs<=9;bcs++)
    {
        for(cs=1;cs<=bcs;cs++)
        { 
            cout<<bcs<<'*'<<cs<<"="<<bcs*cs<<' ';
        }
        cout<<endl;
    }
    getchar();
    return 0;
}

这里写图片描述

应用示例
求1000内的所有水仙花数。所谓水仙花数是指一个位数,其各位数字立方和等于该数字本身。

// lianxi.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#include <iomanip>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int i,j,k,n,m;
    for(i=1;i<=9;i++)//百位数从1到9变化,不能取0;如果百位为0就不是三位数了
    {
        for(j=0;j<=9;j++)//十位从0到9,允许取0
        {
            for(k=0;k<=9;k++)//十位从0到9,允许取0
            {
                n=i*100+j*10+k;//这个数等于百位数乘以100加上十位数乘以10在加上个位数
                m=i*i*i+j*j*j+k*k*k;    //百位上数的立方加上十位上数的立方加上个位上数的立方
                if(n==m)
                    cout<<n<<" ";
                //这是一个三位数是否为水仙花数的条件,即水仙花数是各位数字立方和等于该数字本身
            }
        }
    }
    cout<<endl;
    getchar();
    return 0;
}

这里写图片描述

转向语句

转向语句是C++中用来实现无条件转移的语句,常见的有四种

  1. break语句(跳出语句):用来结束循环结构,然后执行循环体后面的语句,一般形式
    break;

  2. continue语句(继续语句):可用来跳出本次循环而进入下一次循环,一般形式
    continue;
    区别:continue语句是根据条件判断只结束本次循环,不结束整个循环结构。

  3. goto语句(转向语句):用来将程序无条件跳转到指定的标号语句处,一般形式
    goto<标号>;
    其中标号是一个标识符,放在语句的最前面,一般形式
    <标号>:<语句>

  4. return语句(返回语句):可用来停止执行当前函数,转而执行调用该函数后面的语句,一般形式
    return<表达式>;
    例如

// lianxi.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#include <iomanip>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int n=100;
    int i,j;
    for(i=2;i<=n;i++)
    {
        int flag=1;
        for(j=2;j<i;j++)

            if(i%j==0)
            {
                flag=0;
                break;
            }
            if(flag==1)
                cout<<i<<",";
    }
    cout<<endl;
    getchar();
    return 0;
}

这里写图片描述

参考:《21天学通C++》作者:刘蕾

猜你喜欢

转载自blog.csdn.net/weixin_39795049/article/details/82378274