【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


相关文章
|
1月前
|
存储 并行计算 前端开发
【C++ 函数 基础教程 第五篇】C++深度解析:函数包裹与异步计算的艺术(二)
【C++ 函数 基础教程 第五篇】C++深度解析:函数包裹与异步计算的艺术
39 1
|
1月前
|
数据安全/隐私保护 C++ 容器
【C++ 函数 基础教程 第五篇】C++深度解析:函数包裹与异步计算的艺术(一)
【C++ 函数 基础教程 第五篇】C++深度解析:函数包裹与异步计算的艺术
47 0
|
1月前
|
存储 编译器 C++
在C++语言中计算并打印出两个数的求和
在C++语言中计算并打印出两个数的求和
22 0
|
1月前
|
存储 算法 编译器
探索C++中的模板元编程:一种编译时计算的强大工具
探索C++中的模板元编程:一种编译时计算的强大工具
16 0
|
2月前
|
存储 自然语言处理 算法
【编译原理】逆波兰式的产生及计算:C/C++实现
【编译原理】逆波兰式的产生及计算:C/C++实现
60 0
|
1月前
|
存储 算法 编译器
【C++ 泛型编程 进阶篇】C++模板元编程深度解析:探索编译时计算的神奇之旅
【C++ 泛型编程 进阶篇】C++模板元编程深度解析:探索编译时计算的神奇之旅
95 0
|
3月前
|
算法 Java Go
Rust每日一练(Leetday0018) N皇后II、最大子数组和、螺旋矩阵
Rust每日一练(Leetday0018) N皇后II、最大子数组和、螺旋矩阵
25 1
Rust每日一练(Leetday0018) N皇后II、最大子数组和、螺旋矩阵
|
3月前
|
C++ Python Java
Python每日一练(20230422) 杨辉三角、最长回文子串、逆波兰表达式求值
Python每日一练(20230422) 杨辉三角、最长回文子串、逆波兰表达式求值
17 0
Python每日一练(20230422) 杨辉三角、最长回文子串、逆波兰表达式求值
|
3月前
|
存储 Java 编译器
C++——类和对象(了解面向过程和面向对象、初步认识类和对象、类大小的计算、this指针)
C++——类和对象(了解面向过程和面向对象、初步认识类和对象、类大小的计算、this指针)
|
3月前
|
Linux C++ iOS开发
C++类相关oj题目分享(计算日期到天数转换、日期差值、打印日期、日期累加)
C++类相关oj题目分享(计算日期到天数转换、日期差值、打印日期、日期累加)
44 0