题目要求
输入三角形的三边 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