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

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

题目要求


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



构成三角形的条件是: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
1
2
3


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


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类定义了cout、cerr和clog三个流对象。


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 3

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



输入2:3 4 5

输出2:

s:6

area:6


相关文章
|
4月前
|
C++
C++ 根据程序运行的时间和cpu频率来计算在另外的cpu上运行所花的时间
C++ 根据程序运行的时间和cpu频率来计算在另外的cpu上运行所花的时间
50 0
|
6月前
|
安全 编译器 C++
C++一分钟之-编译时计算:constexpr与模板元编程
【6月更文挑战第28天】在C++中,`constexpr`和模板元编程用于编译时计算,提升性能和类型安全。`constexpr`指示编译器在编译时计算函数或对象,而模板元编程通过模板生成类型依赖代码。常见问题包括误解constexpr函数限制和模板递归深度。解决策略包括理解规则、编写清晰代码、测试验证和适度使用。通过实战示例展示了如何使用`constexpr`计算阶乘和模板元编程计算平方。
101 13
|
4月前
|
C++
C++ PCL 计算多个RT矩阵变换后的变换矩阵
C++ PCL 计算多个RT矩阵变换后的变换矩阵
56 0
|
4月前
|
C++
C++代码来计算一个点围绕另一个点旋转45度后的坐标
C++代码来计算一个点围绕另一个点旋转45度后的坐标
101 0
|
5月前
|
机器学习/深度学习 算法 C++
C++多态崩溃问题之为什么在计算梯度下降时需要除以批次大小(batch size)
C++多态崩溃问题之为什么在计算梯度下降时需要除以批次大小(batch size)
|
5月前
|
C++ 开发者
C++一分钟之-编译时计算:constexpr与模板元编程
【7月更文挑战第2天】C++的`constexpr`和模板元编程(TMP)实现了编译时计算,增强代码效率。`constexpr`用于声明编译时常量表达式,适用于数组大小等。模板元编程则利用模板进行复杂计算。常见问题包括编译时间过长、可读性差。避免方法包括限制TMP使用,保持代码清晰。结合两者可以解决复杂问题,但需明确各自适用场景。正确使用能提升代码性能,但需平衡复杂性和编译成本。
142 3
|
6月前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-2
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
6月前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-1
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
7月前
|
C++
C++ 重载 数组对象输入输出流的实现!!!
C++ 重载 数组对象输入输出流的实现!!!
|
7月前
|
编译器 C语言 C++
从C语言到C++①(第一章_C++入门_上篇)C++学习介绍(命名空间和C++输入输出流)(下)
从C语言到C++①(第一章_C++入门_上篇)C++学习介绍(命名空间和C++输入输出流)
45 0