数据的输入输出
I/O流
- C++中,将数据从一个对象到另一个对象的流动抽象为“流”,流在使用前要被建立,使用后要被删除
- 数据的输入和输出通过I/O流来实现,
cin
和cout
是预定义的流类对象。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;
}