清华大学 C++ |第二章(下)

数据的输入输出

I/O流

  • C++中,将数据从一个对象到另一个对象的流动抽象为“流”,流在使用前要被建立,使用后要被删除
  • 数据的输入和输出通过I/O流来实现,cincout是预定义的流类对象。cin用来处理标准输入,即键盘输入;cout用来处理标准输出,即屏幕输出。
  • 从流中获取数据的操作称为提取操作,想流中添加数据的操作称为插入操作

预定义的插入符合提取符

  • <<是预定义的插入符,作用在流类对象cout上便可以实现想标准输出设备输出
  • cout << 表达式 << 表达式
  • 标准输入是将提取符作用在流类对象cin
  • cin >> 表达式 >> 表达式

常用的I/O流类库操作符

在这里插入图片描述

if 语句

  • if 语句为选择结构

if语句语法形式

- if (表达式1) 语句1
- else if (表达2) 语句2
- .....
- else 语句n

例子:

// 2-7.cpp : 多重选择结构——嵌套的if结构
#include <iostream>
using namespace std;
int main(void)
{
    int x, y;
    cout << "Enter x and y:";
    cin >> x >> y;
    if (x != y)
    {
        if (x > y)
        {
            cout << "x > y" << endl;
        }
        else
        {
            cout << "x < y" << endl;
        }
    }
    else
    {
        cout << "x = y" << endl;
    }
    system("pause");
    return 0;
}

嵌套的if结构

在这里插入图片描述

switch语句

  • 当在程序中,要根据一个变量或者某一个值来决定接下来的路要往哪儿走,就需要用到switch语句

例子

// 2-8.cpp : 输入一个0-6的整数,转换成星期输出
#include <iostream>
using namespace std;
int main(void)
{
    int day;
    cin >> day;
    switch (day)  //判断day的值是多少
    {
        //开始与case比较
    case 0:   
        cout << "Sunday" << endl;
        break;   //跳出整个switch结构,没有break则继续执行后面的语句
    case 1:
        cout << "Monday" << endl;
        break;
    case 2:
        cout << "Tuesday" << endl;
        break;
    case 3:
        cout << "Wednesday" << endl;
        break;
    case 4:
        cout << "Thursday" << endl;
        break;
    case 5:
        cout << "Friday" << endl;
        break;
    case 6:
        cout << "Saturday" << endl;
        break;

    default:  //如果都不匹配,则default
        cout << "Day out of range Sunday .. Saturday" << endl;
        break;
    }
    system("pause");
    return 0;
}

switch语句的语法

- switch(表达式)
- {
- case 常量表达式1 : 语句1
- case 常量表达式2 : 语句2
- ...
- case 常量表达式n : 语句n
- default : 语句n+1
- }
  • 执行顺序:以case中的常量表达式值为入口标号,由此开始顺序执行。因此,每个case分支最后应该加break语句
  • 注意
  • case分支可包含多个语句,且不用{}
  • 表达式、判断值都是int型或char型
  • 如果若干分支执行内容相同可共用一组语句

循环语句——while语句

  • 进行统计分析,一个一个进行分析,都可以用循环语句

例子

// 2-9.cpp : 求自然数1-10之和
#include <iostream>
using namespace std;
int main(void)
{
    int i = 1, sum = 0;
    while (i <= 10)
    {
        sum += i; //相当于 sum = sum + i
        i++;
    }
    cout << "sum =" << sum << endl;
    system("pause");
    return 0;
}

while语句的语法形式

  • while (表达式) 语句
  • 语句:可以是复合语句,其中必须含有改变条件表达式值的语句,才有可能把条件表达式的值变为假,不然一直为真,就是死循环

函数的调用

  • 调用函数前需要先声明函数原型
  • 类型标识符 被调用函数名 (含类型说明的形参表)
- 函数定义:
- 类型表示符 函数名 (形式参数表)
- {
- 语句序列
- }
- 函数调用:
- 函数名 (实参)
  • 递归调用:函数直接或间接调用自身

例子

// 2-10.cpp : 计算x的n次方
#include <iostream>
using namespace std;

double power(double x, int n)
{
    double val = 1.0;
    while (n--) //n=0时为假,循环结束
    {
        val *= x;
    }
    return val;
}

int main(void)
{
    double pow;
    pow = power(5, 2);
    cout << "5 to the power 2 is:" << pow << endl;
    //函数调用作为一个表达式出现在输出语句中
    system("pause");
    return 0;
}

do-while语句

  • 先做第一次循环,不管条件如何,再做判断以决定要不要再做下一次循环

例子

  • 问题:输入一个数,将各位数字翻转后输出
  • 问题解析:先输入一个数,无论什么数,总得先执行一次,才能输出其翻转的数,再继续循环执行
// 2-11.cpp : 输入一个数,将各位数字翻转后输出
#include <iostream>
using namespace std;

 int main(void)
 {
     int n, right_digit;
     cout << "Enter the number:" << endl;
     cin >> n;
     cout << "The number in reverse order is: ";
     do
     {
         right_digit = n % 10;   //取余,得到最右边的数字
         cout << right_digit;   //输出最右边的数字
         n /= 10;               //整除,删掉最右边的数字
     } while (n != 0);
     cout << endl;
     system("pause");
     return 0;
 }

do-while语句语法形式

- do 
- 语句
- while(表达式)
  • 执行顺序:
  • 先执行循环体语句,后判断条件
  • 表达式为true时,继续执行循环体

for语句

  • 处理循环次数已知的循环
  • 特点:
  • 循环条件的初始化,循环条件的判断以及循环条件的增值都放在循环头中,可读性好,一目了然

例子

问题:输入一个整数,求出它的所有因子

// 2-13.cpp : 输入一个整数,求出它的所有因子
#include <iostream>
using namespace std;

int main(void)
{
    int n;
    cout << "Enter a positive integer;";
    cin >> n;
    cout << "Number " << n << " Factors ";
    for (int k = 1; k <= n; k++)
    {
        if (n % k == 0)
        {
            cout << k << " ";
        }
    }
    cout << endl;
    system("pause");
    return 0;
}

for语句语法规定

  • for(初始语句;表达式1;表达式2)语句
  • 初始语句:循环前先求解
  • 表达式1:为true时执行循环体
  • 表达式2:每次执行完循环体后求解

范围for循环

  • for (声明:表达式) 语句

嵌套的控制结构、其他控制语句

  • 从多个不同的维度去重复执行同一个算法

循环结构与选择结构的嵌套

  • 问题:输入一系列整数,统计出正整数和负整数个数j,读入0则结束
  • 问题分析:需要读入一系列数,但是整数个数不定,要在每次读入之后进行判断,因此使用while循环最为合适。循环控制条件应该是n != 0
// 2-14.cpp : 输入一系列整数,判断正整数和负整数的各个数,0则程序结束
#include <iostream>
using namespace std;

int main(void)
{
    int i = 0, j = 0, n;
    cout << "Enter some integers please (enter 0 to quit):";
    cin >> n;
    while (n != 0)
    {
        if (n > 0)
        {
            i += 1;
        }
        if (n < 0)
        {
            j += 1;
        }
        cin >> n;     
    }
    cout << "Count of positive integers:" << i << endl;
    cout << "Count of negative integers:" << j << endl;
    system("pause");
    return 0;
    
}

其他控制语句

  • break语句:使程序从循环体和switch语句内跳出,继续执行逻辑上的下一条语句
  • continue语句:结束本次循环,接着判断是否执行下一次循环

自定义类型

类型别名:为已有类型另外命名

  • typedef 已有类型名 新类型名表
  • using 新类型名 = 已有类型名

枚举类型

  • 将全部可取值一一列举出来
  • enum 枚举类型名 {变量值列表}
  • enum Weekday {SUN, MON, TUE, WED, THU, FRI, SAT}
  • 默认情况:SUN=0, MON=1, TUE=2, … , SAT=6
  • 不限定作用域枚举类新型
  • 枚举值可以进行关系运算
  • 整数值不能直接赋值给枚举变量
  • 如需要将整数赋值给枚举变量,应进行强制类型转换
  • 枚举值可以赋给整型变量

例子

  • 问题:比赛有四种可能,胜、负、平局、比赛取消,编写程序顺序输出这四种情况
  • 分析:比赛结果只有四种可能,可以声明一个枚举类型
// 2-15.cpp : 体育比赛结果
#include <iostream>
using namespace std;

enum GameResult
{
    WIN,
    LOSE,
    TIE,
    CANCEL
}; //定义一个GameResult枚举类型

int main(void)
{
    GameResult result;  //定义一个枚举类型的变量
    enum GameResult omit = CANCEL;  // 给枚举类型变量omit赋初始值
    for (int count = WIN; count <= CANCEL; count++)
    {
        result = GameResult(count);  // 枚举类型强制类型转换成int类型
        if (result == omit)
        {
            cout << "The game was cancelled" << endl;
        }
        else
        {
            cout << "The game was played ";
            if (result == WIN)
            {
                cout << "and we won!";
            }
            if (result == LOSE)
            {
                cout << "and we lost.";
            }
            cout << endl;
        }
    }
    system("pause");
    return 0;
}

auto类型与decltype类型

  • auto:编译器通过初始值自动推断变量的类型
  • auto val = val1 + val2
  • val1+val2是int类型,则val是int类型
  • val1+val2是double类型,则val是double类型
  • decltype:定义一个变量与某一表达式的类型相同,但并不用该表达式初始化变量
  • decltype(i) j = 2
  • 表示j以2作为初始值,类型与i一致

程序举例

  • 问题1:编写计算图形的面积
    问题描述:程序可计算圆形、长方形、正方形的面积,运行时先提示用户选择图形的类型,然后,对圆形要求用户输入半径值,对长方形要求用户输入长和宽的值,对正方形要求用户输入边长的值,计算出面积的值后将其显示出来
// 2-16.cpp : 编写计算图形的面积
// 问题描述:程序可计算圆形、长方形、正方形的面积,运行时先提示用户选择图形的类型
// 然后,对圆形要求用户输入半径值,对长方形要求用户输入长和宽的值,对正方形要求
// 用户输入边长的值,计算出面积的值后将其显示出来

#include <iostream>
using namespace std;
const float PI = 3.14156;

int main(void)
{
    int iType;
    float radius, a, b, area;

    cout << "圆形的类型为?(1-圆形 2-长方形 3-正方形):";
    cin >> iType;
    switch (iType)  // switch()括号中的量,其类型是int类型的兼容类型
    {
    case 1:
        cout << "圆的半径为:";
        cin >> radius;
        area = PI * radius * radius;
        cout << "面积为:" << area << endl;
        break;
    case 2:
        cout << "矩形的长为:";
        cin >> a;
        cout << "矩形的宽为:";
        cin >> b;
        area = a * b;
        cout << "面积为:" << area << endl;
        break;
    case 3:
        cout << "正方形的边长为:";
        cin >> a;
        area = a * a;
        cout << "面积为:" << area << endl;
        break;
    default:
        cout << "不是合法的输入值!" << endl;
        break;
    }
    system("pause");
    return 0;
}
  • 问题2:声明一个表示时间的结构体,可以精确表示年、月、日、小时、分、秒,提示用户输入年、月、日、小时、分、秒的值,然后完整地显示出来
// 2-17.cpp : 声明一个表示时间的结构体
// 可以精确表示年、月、日、小时、分、秒
// 提示用户输入年、月、日、小时、分、秒的值
// 然后完整地显示出来

#include <iostream>
using namespace std;


struct MyTimeStruct
{
    unsigned int year;
    unsigned int month;
    unsigned int day;
    unsigned int hour;
    unsigned int min;
    unsigned int sec;
};

int main(void)
{
    MyTimeStruct myTime = {2015, 3, 16, 12, 0, 0};

    cout << "Please input year:" << endl;
    cin >> myTime.year;

    cout << "Please input month:" << endl;
    cin >> myTime.month;

    cout << "Please input day:" << endl;
    cin >> myTime.day;

    cout << "Please input hour:" << endl;
    cin >> myTime.hour;

    cout << "Please input min:" << endl;
    cin >> myTime.min;

    cout << "Please input sec:" << endl;
    cin >> myTime.sec;

    cout << "the time is set to: " << myTime.year << "/"
                                   << myTime.month << "/"
                                   << myTime.day << " "
                                   << myTime.hour << ":"
                                   << myTime.month << ":"
                                   << myTime.sec << endl;
    system("pause");
    return 0;
}

  • 问题3:声明一个表示时间的结构体,可以精确表示年、月、日、小时、分、秒,提示用户输入年、月、日、小时、分、秒的值,然后完整地显示出来。
  • 约束每个结构体变量的取值范围
  • 提示1:配合枚举类型,约束各个时间元素的取值
  • 提示2:在输入之后加入条件判断
// 2-17.cpp : 声明一个表示时间的结构体
// 可以精确表示年、月、日、小时、分、秒
// 提示用户输入年、月、日、小时、分、秒的值
// 然后完整地显示出来
// 约束每个结构体变量的取值范围
//提示1:配合枚举类型,约束各个时间元素的取值
//提示2:在输入之后加入条件判断

#include <iostream>
using namespace std;

/*enum MyMonth
{
    Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec
};


enum MyHour
{
    One, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Eleven, Twelve
};

enum MyMin
{
    One, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Eleven, Twelve
};

enum MySec
{
    One, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Eleven, Twelve
};*/

struct MyTimeStruct
{
    unsigned int year;
    unsigned int month;
    unsigned int day;
    unsigned int hour;
    unsigned int min;
    unsigned int sec;
};



int main(void)
{
    MyTimeStruct myTime = {2015, 3, 16, 12, 0, 0};

    cout << "Please input year:" << endl;
    cin >> myTime.year;

    cout << "Please input month:" << endl;
    cin >> myTime.month;
    while (myTime.month > 12)
    {
        cout << "Month is out of range" << endl;
        cout << "Please input month:" << endl;
        cin >> myTime.month;
    }
    

    cout << "Please input day:" << endl;
    cin >> myTime.day;
    while (myTime.day > 31)
    {
        cout << "Day is out of range" << endl;
        cout << "Please input day:" << endl;
        cin >> myTime.day;
    }

    cout << "Please input hour:" << endl;
    cin >> myTime.hour;
    while (myTime.hour > 24)
    {
        cout << "Hour is out of range" << endl;
        cout << "Please input hour:" << endl;
        cin >> myTime.hour;
    }

    cout << "Please input min:" << endl;
    cin >> myTime.min;
    while (myTime.min > 60)
    {
        cout << "Min is out of range" << endl;
        cout << "Please input min:" << endl;
        cin >> myTime.min;
    }

    cout << "Please input sec:" << endl;
    cin >> myTime.sec;
    while (myTime.sec > 60)
    {
        cout << "Sec is out of range" << endl;
        cout << "Please input sec:" << endl;
        cin >> myTime.sec;
    }

    cout << "the time is set to: " << myTime.year << "/"
                                   << myTime.month << "/"
                                   << myTime.day << " "
                                   << myTime.hour << ":"
                                   << myTime.min << ":"
                                   << myTime.sec << endl;
    system("pause");
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值