C方向蓝桥杯学习笔记——完美培优讲义第一部分 C编程知识第二章C语言的IO基础第三节 cin和cout通过第一章《C入门》的学习我们已经基本了解了C语言中提供的cin和cout两个流对象。cin是C语言中提供的标准输入流对象一般针对的是键盘也就是从键盘上输入的字符流使用cin来进行数据的提取cin一般是和 流提取运算符配合使用的。cin的功能和scanf是类似的。cout是C语言中提供的标准输出流对象一般针对的控制台的窗口也就是将数据以字符流的形式输出到控制台窗口上显示。cout一般是和 流插入运算符配合使用。cout的功能和printf是类似的。我们在写程序的时候经常需要处理数据不管什么类型的数据都是以字符流的形式输入和输出的也就是不管是在键盘上输入各种类型的数据还是将程序中的各种类型的数据输出显示到控制台屏幕上都是以字符流的形式处理的。cin和cout的输入输出非常的方便不需要手动控制格式cin和cout能够自动识别变量类型。接下来我们就具体的来学习cin和cout的使用方法。一、cin和cout的基本用法首先来观察下面这段代码其展现了cin和cout的基本用法#include iostream using namespace std; int main(){ int a 0; char b a; double c 0.0; cin a; //读取一个整数 cin b; //读取一个字符 cin c; //读取一个浮点数 cout Print the result endl; cout a endl; cout b endl; cout c endl; return 0; }正常输入数据的时候运行结果应该如下当我们在键盘上输入数据的时候如果输入的数据不能被cin解读为对应类型的数据那么读取就会失败打印出来的结果就会为0。在使用cin函数的时候还应该注意以下几点1cin在读取的时候是根据用户的输入从前往后从上往下依次扫描。2cin在读取的过程中遇到空格和换行符自动会跳过所以不要担心在想要的字符前输入空白字符。当一行读取结束的时候会自动换行读取下一行的内容。3cin后面不可以跟换行endl。二、连续输入输出当我们需要一次输入或输出多个数据的时候也可以使用cin和cout来实现。在上面的代码中使用cout进行变量的输出实质上是将变量插入到cout对象里并以cout对象作为返回值返回因此可以用 在后面连续输出多个内容通过连续输入输出的方式对代码进行编写1、使用cin进行同类型变量连续输入#include iostream using namespace std; int a , b; int main(){ cin a b;//同一类型变量连续输入 cin a endl; //添加换行endl代码编译会报错 return 0; }2、使用cin进行不同类型变量连续输入#include iostream using namespace std; int main(){ int a 0; double b 0.0; char c a; cin a b c;//不同类型变量连续输入 return 0; }3、使用cout进行同一类型变量连续输出#include iostream using namespace std; int main(){ int a 10; int b 1000; cout a b endl; //同一类型变量连续输出 //cin输入的字符流中间可以随意添加空白符cin会自动忽略 //但cout输出的格式必须在写代码时确定例如连续输入两变量中加入空格或换行 return 0; }4、使用cout进行不同类型变量连续输出#include iostream using namespace std; int main(){ int a 10; double b 3.14; char c a; cout a b c endl; //不同类型数据连续输出 cout int: a double: b char: c endl;//实现格式化输出 cout a endl b endl c endl;// 实现多次换行 return 0; }通过观察上面的代码可以概括出cin和cout具有如下优点1cin的好处当输入若干个变量也就是数据量很少的时候我们就可以通过 把所有的数据用一行代码完成接收而且无需关心数据的类型和scanf函数比起来代码的书写更加简洁明了。2cout的好处cout也可以用来连续输出多个数值而且无需考虑数值的类型因为它本身会做类型处理和printf函数比起来更加方便。三、cout的格式输出前面在学习使用printf函数输出数据时指出可以使用printf来指定格式输出比如指定宽度、指定小数点后的位数、对齐方式等等。其实cout也可以实现格式输出达到和printf函数相同的效果。当cout结合iomanip(IO manipulators)头文件中的操纵符可以灵活控制输出格式从而满足各种格式化需求。1、控制宽度和填充· setw()设置字符宽度只对紧接的输出项有效。· setfill()设置填充字符。使用cout进行控制宽度和填充的格式输出示例#include iostream #include iomanip using namespace std; int main(){ int a 123; cout 正常格式输出 a endl; //输出结果“123” cout 设置输出宽度为5 setw(5) a endl; //输出结果“ 123” cout 设置输出宽度为5同时用#补齐 setw(5) setfill(#) a endl; //输出结果“##123” cout 设置输出宽度为10 setw(10) a endl; //输出结果“#######123” //setfill(‘#’)是针对输出流的因此后面的输出都会使用#补齐如果我们想取消这个效果则需要将上面这句话改成如下 cout 设置输出宽度为10 setw(10) setfill( ) a endl; //输出结果“ 123” return 0; }2、控制浮点型数值格式· fixed以固定小数点表示浮点数设置后就不会以科学计数法展示了。· scientific以科学计数法表示浮点数。· setprecision设置浮点数的精度以控制小数点后的数字位数一般先固定小数点再设置精度。使用cout进行控制浮点型数值格式的格式输出示例#include iostream using namespace std; #include iomanip int main(){ double pi 3.141592653589793; cout 正常格式输出: pi endl; cout 固定小数点方式: fixed pi endl; cout 科学计数法方式: scientific pi endl; cout 固定小数点保留小数点后12位有效数字: fixed setprecision(12) pi endl; return 0; }运行结果展示cout结合其他操作符还能完成一些其他的格式输出但是毕竟cout在完成格式化输出的时候不如printf方便所以在竞赛中涉及格式化输出的时候我们一般会使用printf函数来完成通过本部分的学习使用cout也可以达成相同效果。3、控制整数格式· dec以十进制格式显示整数默认。· hex以十六进制格式显示整数。· oct以八进制格式显示整数。使用cout进行控制整数格式的格式输出示例#includeiostream using namespace std; #includeiomanip int main() { int n 255; cout 正常格式输出: n endl; cout 十进制: dec n endl; cout 十六进制: hex n endl; cout 八进制: oct n endl; return 0; }上面这段代码的运行结果展示由上面的代码以及运行结果我们可以观察到实际上dec十进制这个操作符在我们正常输入十进制整数时是完全可以省略的只有当涉及到进制转化或者输入的数值并不是十进制整数时才会使用到。4、控制对齐方式· left左对齐。· right右对齐默认。使用cout进行控制对齐方式的格式输出示例#includeiostream using namespace std; #includeiomanip int main() { int n 123; cout 右对齐: setw(10) right n endl; cout 左对齐: setw(10) left n endl; return 0; }运行结果展示【练习一】输入一个不小于 100 且小于 1000同时包括小数点后一位的一个浮点数例如 123.4 要求把这个数字翻转过来变成 4.321 并输出。· 输入格式一行一个浮点数· 输出格式一行一个浮点数【参考答案1——使用cin和cout解决问题】#include iostream using namespace std; char a, b, c, d, e; int main() { cin a b c d e; cout e d c b a endl; return 0; }【参考答案2——使用scanf和printf函数解决问题】#include cstdio char a, b, c, d, e; int main() { scanf(%c%c%c%c%c, a, b, c, d, e); printf(%c%c%c%c%c\n, e, d, c, b, a); return 0; }【本题注意点】从题目要求中可以看出想要输入小数然后反转输出如果真按照这样的思路编程也能解决问题但是可能就复杂了。其实在不管什么类型的数据都是以字符流的形式输入和输出的那我们就可以把输入的这个小数和小数点都当做字符依次读取然后再按照想要的顺序输出就行。如果使用scanf函数和printf函数注意要指定好占位符如果使用cin/cout要注意指定好变量的类型。【练习二】【参考答案1——使用cin和cout解决问题】#include iostream #include cmath #include iomanip using namespace std; double a, b, c; int main(){ cin a b c; double p (a b c) / 2; double area sqrt(p * (p - a) * (p - b) * (p - c)); cout fixed setprecision(1) area endl; return 0; }【参考答案2——使用scanf和printf函数解决问题】#include cmath #include cstdio double a, b, c; int main() { scanf(%lf%lf%lf, a, b, c); double p (a b c) / 2; double area sqrt(p * (p - a) * (p - b) * (p - c)); printf(%.1lf, area); return 0; }【本题注意点】本题中使用了sqrt库函数这个函数是用来计算平方根的函数原型如下double sqrt(double x); float sqrt(float x); long double sqrt(long double x);sqrt函数可以计算并返回出参数x的平方根这个函数在C语言中需要的包含的头文件是 cmath 。