【C++之标准输入输出流】 判断是否符合条件并计算三角形的面积

题目要求

输入三角形的三边 a, b, c, 计算三角形的面积的公式是
area
s

构成三角形的条件是:a+b > c, b+c > a, c+a > b。编写程序,输入 a,b,c,检查 a,b,c 是否满足以上条件,如不满足,由 cerr 输出有关出错信息。

——谭浩强的《C++面向对象程序设计》第7章习题第1小题

标准输入流

标准输入流使数据从标准输入设备(键盘)传入内存(变量空间)。

cin 流

  • 运算符>>在流中提取数据时通常跳过流中的空格、tab键、换行符等字符。
  • 只有输入回车键时输入的数据才进入键盘缓冲区,形成输入流,提取运算符“>>”才能从其中提取数据。
  • 当遇到无效字符(与变量数据类型不一致)或文件结束符时,输入流cin就处于出错状态,此时对cin流的所有操作都被终止。

例如:输入 a, b, c 三个数:

int a, b, c;
cin >> a >> b >> c;

从键盘输入的时候,可以写入:
用空格间隔

3 4 5

或用TAB键间隔

3       4       5

或用换行符间隔

3
4
5

如果用逗号间隔,则会报错

3,4,5

原因是输入类型(char)和声明类型(int)不匹配。
最后输入回车键,数据进入键盘缓冲区,形成输入流。

流成员函数

1.用 get 函数读入一个字符

不带参数的 get 函数

  • 格式:cin.get()
  • 功能:从输入流中当前位置提取一个字符作为函数值返回。
  • 函数的返回类型是字符编码(int);
  • 如在流中遇到文件结束符时,则返回EOF(-1)。

带一个参数的get函数

  • 格式: cin.get(char ch)
  • 功能:从输入流中提取一个当前字符赋予字符变量ch。
  • 如成功提取则返回非0值(真),否则提取失败(或遇到文件结束符EOF)则返回0值(假),结束提取。

带3个参数的 get()函数:

  • 格式:cin.get (char* pc,int n,char ec=‘\n’)
  • pc为指向字符数组/chuan指针,目标字符串。
  • n 与提取的字符个数相关。函数从键盘缓冲区最多顺序提取n-1个字符,顺序放入字符指针所指的字符数组。

cin.get三种函数对比:

  • cin.get() 中不带参数和只带一个参数的函数,都是以文件结束符EOF作为终止提取的控制符。成功提取一个字符后会自动把当前指针移到输入流中的下一个字符
  • cin.get() 中带三个参数的函数,以字符个数或指定终止提取字符作为终止提取的控制条件。当遇到终止字符时,终止提取操作;同时当前指针继续停留在终止字符处,保持原始位置、不后移。

“>>” 与 get( ) 类成员函数对比:

  • “>>” 将跳过任何空白字符(空格、tab符、backspace符和回车符);
  • get( ) 类成员函数对输入流的字符提取则不会跳过这些空白字符。

2.cin.getline( ) 成员函数获取一行字

调用格式: cin.getline(char *buf, int n, deline=‘\n’)
其中,buf用来存放一个字符串;n用来限定读取的字符个数不能超过n-1个;第三个参数用来限定一行字符的结束标志,默认为‘\n’。
终止条件:
① 读取n-1个字符之后
② 读取到换行符‘\n’之后
③ 读取到文件结束符或其他结束符之后

cin>>和cin.getline都具有从键盘缓冲区按指针所指提取字符串的功能。两者的主要区别如下:
(1)cin>>忽略起始的空白字符;而cin.getline不忽略起始的空白字符
(2)cin>>当提取到非空白字符后,遇到空白字符时就终止提取,指针就停留在空白字符处;而cin.getline在遇到设置的终止字符后终止提取操作,指针则停留在终止字符后相邻的字符处
(3)通过对>> 的重载,cin可以提取其他类型的数据;而cin.getline只能提取输入的字符串

cin.getline与三参 cin.get(字符指针,n,终止字符)的用法对比:

  • 函数功能与带三个参数的cin.get()函数类似,具有相同的终止条件,且都不忽略提取过程中遇到的空白字符
  • 不同的是,两者对终止操作的后续反应不同。当输入流满足前n个字符的提取要求时,三参cin.get()首先提取其中前n-1个字符,在终止操作的同时将当前指针指向输入流中的第n个字符;而cin.getline在满足字符个数停止提取时,则会清空输入流。
  • 而在满足“终止字符”条件时,cin.getline会把当前指针移到终止字符后相邻的字符;三参cin.get() 函数在此条件下当前指针则停留在终止字符处,不再向后移动。

3.cin.read( ) 成员函数用于获取若干行字符

调用格式: cin.read(char *buf, int size)
其中,buf用来存放一个字符串;size用来指定读取字符的个数。 可以用gcount( )来统计上一次read( )函数读取的字符个数。
终止条件:
① 读取(size-1)个字符之后
② 读取到文件结束符之后

istream类的其它成员函数

1. eof()函数

当输入缓冲区的指针遇到文件结束符时函数值为真,否则为假。从键盘可以用ctrl+z模拟输入文件结束符。

2. peek( )函数

功用:查看输入流中当前指针指向的字符
格式:c=cin.peek( )
说明:
• c为输入流中待访问的当前位置字符(编码)
• peek只是用于查看当前位置的字符,并不移动输入流的指针位置。
• 如果当前指针指向了文件末尾,则返回c的值为EOF(-1)。

3. putback( )函数

功用:将来自输入流的某个字符插入到其当前指针位置。
格式:cin. putback(ch)
说明:
• ch为来自输入流的字符;
• putback仅仅用ch插入到输入流中当前指针位置,当前指针位置保持不变;但后续输入流中的字符要顺序后移一个单位。

标准输出流

标准输出流是流向标准输出设备的数据。
ostream类定义了coutcerrclog三个流对象。

cout流对象

cout流在内存开辟一个缓冲区存放流中的数据,当遇到endl时,立即输出流中的所有数据,然后插入一个换行符并清空缓冲区。

cerr流对象

cerr流对象是标准出错流。它向标准出错设备输出有关出错的信息。

例如:当 a+b > c, b+c > a, c+a > b 三个条件不同时满足时,输出错误信息:

if(a + b <= c)
	cerr << "error: a + b <= c" << endl;
else if (b + c <= a)
	cerr << "error: b + c <= a" << endl;
else if (a + c <= b)
	cerr << "error: a + c <= b" << endl;

clog流对象

clog流对象也是标准出错流,它与cerr的区别是,cerr不经过缓冲区直接向显示器输出出错信息,clog把出错信息存放在缓冲区,当缓冲区满或遇到endl时向显示器输出出错信息。

程序

/*
*************************************************************************
@file:    main.cpp
@date:   2020.12.23
@author: Xiaoxiao
@brief:   计算三角形的面积
@blog:    https://blog.csdn.net/weixin_43470383/article/details/111502572
*************************************************************************
*/
#include<iostream>
#include<cmath>
using namespace std;

int main()
{
	float a, b, c, s, area;
	cout << "pls input a, b, c:" << endl;
	cin >> a >> b >> c;
	if(a + b <= c)
		cerr << "error: a + b <= c" << endl;
	else if (b + c <= a)
		cerr << "error: b + c <= a" << endl;
	else if (a + c <= b)
		cerr << "error: a + c <= b" << endl;
	else
	{
		s = (a + b + c) / 2;
		area = sqrt(s*(s - a)*(s - b)*(s - c));
		cout << "s:" << s << endl;
		cout << "area:" << area << endl;
	}
	system("pause");
	return 0;
}

运行结果

1
输入1:1 1 3
输出1:error: a + b <= c

2
输入2:3 4 5
输出2:
s:6
area:6

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不雨_亦潇潇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值