当前位置: 首页 > news >正文

01-02-03 C++编程知识 C++语言的IO(基础) cin和cout

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函数的时候还应该注意以下几点:

(1)cin在读取的时候是根据用户的输入,从前往后,从上往下依次扫描。

(2)cin在读取的过程中遇到空格和换行符,自动会跳过,所以不要担心在想要的字符前输入空白字符。当一行读取结束的时候,会自动换行,读取下一行的内容。

(3)cin后面不可以跟换行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具有如下优点:

(1)cin的好处:当输入若干个变量(也就是数据量很少)的时候,我们就可以通过 >> 把所有的数据用一行代码完成接收,而且无需关心数据的类型,和scanf函数比起来代码的书写更加简洁明了。

(2)cout的好处: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进行控制整数格式的格式输出示例:

#include<iostream> using namespace std; #include<iomanip> 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进行控制对齐方式的格式输出示例:

#include<iostream> using namespace std; #include<iomanip> 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> 。

http://www.jsqmd.com/news/449390/

相关文章:

  • 机房U位混乱难解?这个系统用数据说话,精准优化每一分资源!
  • 自定义类型 Traits
  • 实时网络同步技术
  • nodejs基于vue的天天足浴客人KTV包厢预约管理系统vue
  • 【必藏】大模型开发必看:Agent、传统编程与Workflow的本质区别及协同之道
  • 计算机毕业设计java基于Java语言的健身房信息管理系统基于B/S架构的健身房会员管理与课程预约系统设计与实现面向健身场馆的会员充值、器材使用与教练管理一体化平台开发
  • Python在金融科技(FinTech)中的应用
  • 基于SpringBoot+Vue的二手交易平台的系统设计与实现
  • 看完就会:专科生专属的AI论文网站 —— 千笔·专业论文写作工具
  • 写论文省心了 9个一键生成论文工具:MBA毕业论文+开题报告+学术写作深度测评
  • 3月7日(130-132题)
  • 鸿蒙应用开发UI基础第二十节:ArkTS 状态管理 V1 进阶 - 深层监听、跨级共享与渲染优化 - 鸿蒙
  • 【必收藏】大模型产业落地全流程指南:从技术选型到企业价值转化
  • C++中的享元模式
  • 英卡工业设备(上海)有限公司电话查询:业务咨询与使用建议参考 - 十大品牌推荐
  • 自主智能体记忆架构实战教程(非常详细),从OpenClaw到企业级落地,收藏这一篇就够了!
  • C++中的迭代器模式
  • 北京美林泉保洁服务有限公司电话查询:服务预约与沟通注意事项 - 十大品牌推荐
  • STL容器内部实现剖析
  • 【AI开发】—— 山东省智能政策助手部署实战:从 0 到 1 上线与更新避坑指南
  • C++中的构建器模式
  • 英卡工业设备(上海)有限公司电话查询:联系前需了解的事项 - 十大品牌推荐
  • 苍穹外卖:菜品新增功能全流程解析
  • 模板代码跨平台适配
  • 嵌入式C++调试技术
  • 代码覆盖率工具实战
  • 实时数据压缩库
  • 分布式文件系统设计
  • 聊聊GEO推广费用,江西鲸荣科技为企业节省成本攻略 - 工业品牌热点
  • 聊聊2026年酒柜定制品牌企业,这些值得关注 - mypinpai