第2章 C++简单程序设计(二)

243 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

第2章 C++简单程序设计(二)

数据的输入和输出

I/O流

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

预定义的插入和提取符

  • ”<<“是预定义的插入符,作用在流类对象cout上便可以实现像标准输出设备输出。
    • cout << 表达式 << 表达式...
  • 标准输入是将提取符作用在流类对象cin上。
    • cin >> 表达式 >> 表达式...
  • 提取符可以连续写多个,每个后面跟一个表达式,该表达式通常是用于存放输入值的变量。例如:
    • int a, b;
    • cin >> a >> b;

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

在这里插入图片描述

例:cout << setw(5) << setprecision(3) << 3.1415

选择结构

if语句

IF语句的语法形式

  • if(表达式) 语句

    例:if(x > y) cout << x;

  • if(表达式) 语句1 else 语句2

    例:if(x > y) cout << x;

    ​ else cout << y;

  • if(表达式1) 语句1

    else if (表达式2) 语句2

    else if (表达式3) 语句3

    ...

    else 语句n

在这里插入图片描述

多重选择结构——嵌套的if结构

例2-3:输入两个整数,比较两个数的大小。

#include <iostream>
using namespace std;
int main() {
	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;
	return 0;
}
Enter x and y:5 8
x < y
Enter x and y:8 8
x = y
Enter x and y:12 8
x > y
嵌套的if结构
  • 语法形式:

    在这里插入图片描述

在这里插入图片描述

  • 注意:
    • 语句1、2、3、4可以是复合语句;
    • 每层的if与else配对,或用{}来确定层次关系。

switch语句

例2-4:输入一个0~6的整数,转换成星期输出

#include <iostream>
using namespace std;
int main() {
	int day;
	cin >> day;
	switch (day) {
		case 0:cout << "Sunday" << endl; 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:
			cout << "Day out of range Sunday ... Saturday" << endl; break;
	}
	return 0;
}
3
Wednesday

switch语句的语法:

  • 一般形式:

    switch语句的语法:

    switch(表达式){

    ​ case 常量表达式1:语句1

    ​ case 常量表达式2:语句2

    ​ ...

    ​ case 常量表达式n:语句n

    ​ default: 语句n+1

    }

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

循环结构

循环结构——while语句

例2-5求自然数1~10之和

#include <iostream>
using namespace std;
int main() {
	int i = 0, sum = 0;
	while (i <= 10) {
		sum += i;
		i++;
	}
	cout << "sum = " << sum << endl;
	return 0;
}
sum = 55
  • while语句的语法形式

    while(表达式) 语句

  • 执行顺序

    先判断表达式的值,若为true时,执行语句。

在这里插入图片描述

do-while语句

do 语句

while(表达式)

例2-6:输入一个数,将各位数字翻转后输出

#include <iostream>
using namespace std;
int main() {
	int n, right_digit, newnum = 0;
	cout << "Enter the number: ";
	cin >> n;
	cout << "The number is reverse order is: ";
	do {
		right_digit = n % 10;
		cout << right_digit;
		n /= 10;
	} while (n != 0);
	cout << endl;
	return 0;
}
Enter the number: 365
The number is reverse order is: 563
  • do-while语句的语法形式

在这里插入图片描述

  • 执行语句

    先执行循环体语句,后判断条件。

    表达式为true时,继续执行循环体。

例2-7用do-while语句编程,求自然数1~10之和

#include <iostream>
using namespace std;
int main() {
	int i = 1, sum = 0;
	 do{
		sum += i;
		i++;
	 } while (i <= 10);
	cout << "sum = " << sum << endl;
	return 0;
}

for语句

例2-8:输入一个整数,求出他的所有因子

#include <iostream>
using namespace std;
int main() {
	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;
	return 0;
}

在这里插入图片描述

for语句的另一种形式:

范围for语句:

for(声明:表达式)

​ 语句

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

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

  • 例2-10

    输入一系列整数,统计出正整数个数i和负整数个数j,读入0则结束。

  • 分析:

    • 需要读入一系列整数,但是整数个数不定,要在每次读入之后进行判断,因此使用while循环最为合适。循环控制条件应该是n!=0。
    • 由于要判断数的正负并分别进行统计,所以需要在循环内部嵌入选择结构。
#include <iostream>
using namespace std;
int main() {
	int i = 0, j = 0, n;
	cout << "Enter some integers please (enter 0 to quit):" << endl;
	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;
	return 0;
}

其他控制语句

  • break语句

    使程序从循环体和switch语句中跳出,继续执行逻辑上的下一条语句。不宜用在别处。

  • continue语句

    结束本次循环,接着判断是否执行下一次循环

  • goto语句

    使程序的执行流程跳转到语句标号所指定的语句。不提倡使用。

自定义类型

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

  • typedef 已有类型名 新类型名

    • 例:

      typedef double Area, Volume;

      typedef int Natural;

      Natrual i1,i2;

      Area a;

      Volume v;

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

    • 例:

      using Area = double

      using Volume = double

枚举类型

问题:如何表示一星期的七天?

列出整数的子集,定义一个新类型:

0,1,2,3,4,5,6

  • 定义方式:

    将全部可取值一一列举出来

  • 语法形式:

    enum 枚举类型名 {变量值列表}

    enum Weekday {SUN, MON, TUE, WED, THU, FRI, SAT}

    默认情况下

    SUN=0,MON=1,TUE=2,......,SAT=6

C++包含两种枚举类型:
  • 不限定作用域枚举类型:

    enum 枚举类型名 {变量值列表}

  • 限定作用域的enum类将在后续章节介绍

不限定作用域枚举类型说明:

  • 枚举元素是常量,不能对它们赋值

    • 例如有如下定义

      enum Weekday {SUN, MON, TUE, WED, THU, FRI, SAT}

  • 不能写赋值表达式:SUN = 0

  • 枚举元素具有默认值,它们依次为:0,1,2,......

  • 也可以在声明中另行指定枚举元素的值

    如:enum Weekday {SUN=7, MON=1, TUE, WED, THU, FRI, SAT}

  • 枚举值可以进行关系运算

  • 整数值不能直接赋给枚举变量

    如需要将整数赋值给枚举变量,应进行强制类型转换

  • 枚举值可以赋给整型变量

例2-11

  • 设某次体育比赛的结果有四种可能:

    胜(WIN)、负(LOSE)、平局(TIE)、比赛取消(CANSEL)

    编写程序顺序输出这四种情况

  • 分析:

    比赛结果只有四种可能,可以声明一个枚举类型

#include <iostream>
using namespace std;
enum GameResult{WIN, LOSE, TIE, CANSEL};
int main() {
	GameResult result;
	enum GameResult omit = CANSEL;
	for (int count = WIN; count <= CANSEL; count++) {
		result = GameResult(count);
		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;
		}
	}
	return 0;
}
The game was playedand we won!
The game was playedand we lost.
The game was played
The game was cancelled

auto类型与decltype类型

  • auto:编译器通过初始值自动推断变量的类型

    例如:auto val = val1 + val2

    如果val1 + val2是int类型,则val是int类型

    如果val1 + val2是double类型,则val是double类型

  • decltype:定义一个变量与某一表达式的类型相同,但并不用该表达式初始化变量

    表示j以2作为初始值,类型与i一致

实验二:C++简单程序设计(下)

例题一

输入并运行例题2-7,即:

用do-while语句编程,求自然数1~10之和。

#include <iostream>
using namespace std;
int main() {
	int i = 1, sum = 0;
	 do{
		sum += i;
		i++;
	 } while (i <= 10);
	cout << "sum = " << sum << endl;
	return 0;
}
#include <iostream>
using namespace std;
int main() {
	int sum = 0;
	for(i = 1; i <=10; i++)
    //
    {
		sum += i;
	}
	cout << "sum = " << sum << endl;
	return 0;
}

例题二

编写计算图形的面积。

程序可计算圆形、长方形、正方形的面积,运行时先提示用户选择图形的类型,然后,对圆形要求用户输入半径值,对长方形要求用户输入长和宽的值,对正方形要求用户输入边长的值,计算出面积的值将其显示出来。

#include <iostream>
using namespace std;
const float PI = 3.1416;
int main() {
	int iType;
	float radius, a, b, area;
	cout << "图形的类型?(1-圆形 2-长方形 3-正方形):";
	cin >> iType;
	switch (iType) {
	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;
	}
	return 0;
}
图形的类型?(1-圆形 2-长方形 3-正方形):2
矩形的长为:2
矩形的宽为:8
面积为:16

例题三

声明一个表示时间的结构体

可以精确表示年、月、日、小时、分、秒;

提示用户输入年、月、日、小时、分、秒的值,然后完整地显示出来。

#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() {
	MyTimeStruct myTime = { 2022, 2, 14, 22, 19, 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.min << ":"
		                           << myTime.sec << endl;
}
please input year:
2022
please input month:
2
please input day:
14
please input hour:
22
please input min:
38
please input sec:
0
the time is set to :2022/2/14 22:38:0