C++面向对象程序设计 - 输入输出流进一步研究

        在C++中,输入输出流(I/O)是一个强大的特性,它允许程序与各种输入/输出设备(如键盘、显示器、文件等)进行交互。C++标准库中的<iostream>头文件定义了基本的输入输出流类,如std::cin(用于输入)、std::cout(用于输出)和std::cerr(用于错误输出)。

        这篇将通过一些实例进一步了解输入输出流的相关知识。

一、标准输出流

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

area=\sqrt{s(s-a)(s-b)(s-c)}

s=\frac{a+b+c}{2}

构成三角形的条件是:a+b>c,b+c>a,c+a>b
编写程序,输入a,b,c检查a,b,c是否满足以上条件,如不满足,由cerr输出有关出错信息。

解释:此题相对较容易,只要输入三个数值满足三角形条件即可,例如:10、15、20。通过cin输入10 15 20后,使用if判断,当三个条件都不满足时并且在前面添加非(!)则为true,显示错误信息。如果都满足,则进后后续计算并输出结果。

示例代码如下:

#include <iostream>
#include <cmath>
using namespace std;int main(){float a, b, c, s, area;			// 定义变量// 输出a,b,c数值cin >>a >>b >>c;// 判断条件if(!((a + b > c) && (b + c > a) && (c + a > b))) {cerr <<"The entered values a,b, and c do not meet the conditions" <<endl;} else{// 满足条件情况下进行计算s = (a + b + c) / 2;				// 计算出s的值// 计算面积的值area = sqrt(s * (s - a) * (s - b) * (s - c));// 输出结果cout <<"Result:" <<area <<endl;}return 0;
}

        运行后结果如下图:

二、格式输出与字符串流

题目:从键盘输入一批数值,要求保留3位小数,在输出时上下行小数点对齐。

解释:此题将通过三块知识来实现:

  1. 首先是通过iostream类中的cin输入和cout输出,从键盘获取数据并输出显示结果;
  2. 再通过sstream类中的ostringstream输出字符串流对象,将最大值max转换为字符串并赋值给string类型变量str;再通过string类型中的size()函数获取字符长度,作为每行显示的最大宽度。
  3. 最后设置格式状态,按题中要求进行输出显示。

示例代码如下:

#include <iostream>
#include <sstream> 
#include <string>
using namespace std;int main(){double nums[3];cout <<"Please enter the value" <<endl;// 输入数值for(int i = 0; i < 3; i++) cin >>nums[i];cout <<endl;// 计算出最大值,以便获取每行数据显示最大宽度值double max = nums[0];for(int i = 1; i < 3; i++) if(max < nums[i]) max = nums[i];// 装载到输出字符串流中ostringstream oss;// 插入字符串数据oss <<max;// 将字符串流 赋值给string类型变量strstring str = oss.str();				// 对齐输出三位数cout.precision(3);					// 保留3位小数cout.setf(ios::fixed);				// 以浮点数格式输出cout.setf(ios::right);				// 右对齐// 循环输出for(int i = 0; i < 3; i++) {cout.width(str.size());			//通过最大值获取每行最大显示范围cout <<nums[i] <<endl;}return 0;
}

        运行后结果如下图:

三、输出三角形

题目:在显示屏上显示一个由字母B组成的三角形。

解释:此题要实现由字母B组成的三角形,则需要使用嵌套for循环。每行的前半部分得先输出空格字符来占位,后部分再输出B字母。另外还须保证每行输出字母B的个数为奇数,这样才能保证每列中字母是竖向对齐。下面代码中几点的说明:

  1. 当在 i 的值偶数行时输出;
  2. 虽然size为20,但i<size并且为偶数行时才输出,所以此三角形只显示10行。
  3. 前半部分通过m<(size-i)/2限制,所以只能输出1~9个空格字符;第一行中前半部分输出9个空字符,第10位刚显示显示字母B,在三角形正中间位置。
  4. 后部分由于n>=0,所以i为0且i%2==0时,第一行输入一个字母B;当i为2且i%2==0时,n满足条件值为0,1,2输出三个字母B;当i为4且i%2==0时,n满足条件值为0,1,2,3,4输出5个字母B。以此类推,则每行显示字母B个数都为奇数。

示例代码:

#include <iostream>
using namespace std;int main(){int size = 20;for(int i = 0; i < size; i++){// 偶数部分输出if(i%2==0){// 前半部分(空白填充)for(int m = 0; m < (size - i)/2; m++) cout <<" ";// 后部分(输出字符B)for(int n = i; n < size && n >= 0; n--) cout <<"B";cout <<endl;}}return 0;
}

        运行后结果如下图:

四、输入和输出文件流

        建立两个磁盘文件file1.txt和file2.txt,编程序实现以下工作:

(1)题目一:创建并存储数据

        从键盘输入20个数,分别存放在两个磁盘文件中(每个文件中放10个整数);

示例代码如下:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(){// 定义文件名称 string file1 = "file1.txt", file2 = "file2.txt";int len = 20;		// 定义整数长度int nums[len];		// 定义数组存储数值// 输入20个整数,并分别存入两个文件中cout <<"Please enter 20 integer values:" <<endl;for(int i = 0; i < len; i++) cin >>nums[i];ofstream ofs;		// 定义输出文件流对象ofs.open(file1);		// 打开file1.txt文件,并输出if(!ofs.is_open()){cerr <<"Open " <<file1 <<" error.";exit(1);} else{// 插出数据for(int i = 0; i < len; i++) ofs <<nums[i] <<' ';}ofs.close();				// 关闭流文件ofs.open(file2);			// 打开file2.txtif(!ofs.is_open()){cerr <<"Open " <<file2 <<" error.";exit(1);} else{// 插出数据for(int i = 0; i < len; i++) ofs <<nums[i] <<' ';}ofs.close();				//关闭流文件return 0;
}

        运行后结果如下图:

        执行后,目录中侧生成file1.txt和file2.txt文件,并且内部已存入相同的20个整数值。如下图:

(2)题目二:读取并追加数据

        从file1.txt读入10个数,然后存放到file2.txt文件原有数据的后面;

示例代码如下:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(){// 定义文件名称 string file1 = "file1.txt", file2 = "file2.txt";// 定义整数长度int len = 10;// 定义数组存储数值int nums[len];	ifstream ifs(file1);		// 定义输入文件流对象,并打开file1.txt文件	// 将数据存储数组num2中for(int i = 0; i < len; i++) {ifs >>nums[i];cout <<nums[i] <<" ";}// 写入到file2.txt文件中,并追加ofstream ofs(file2, ios::app);					// 定义输出文件流对象for(int i = 0; i < len; i++) ofs <<nums[i] <<' ';return 0;
}

        运行结果如下图:

        此时file2.txt中则追加了file1.txt前10个整数,ios::app为打开文件并在后追加数据方式。如下图:


(3)题目三:读取并排序

        从file2.txt中读入20个整数,将它们按小到大的顺序存放到file2.txt(不保留原来的数据)。

示例代码:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(){// 定义文件名称 string file2 = "file2.txt";int len = 20;				// 定义整数长度// 定义数组存储数值int nums[len];	ifstream ifs(file2);		// 定义输入文件流对象,并打开file2.txt文件	// 将数据存储数组num2中for(int i = 0; i < len; i++) ifs >>nums[i];// 对数组nums进行排序(冒泡排序)int temp;for(int i = 0; i < len - 1; i++){for(int j = i + 1; j < len; j++){if(nums[i] > nums[j]){temp = nums[j];nums[j] = nums[i];nums[i] = temp;}}}// 覆盖写入到file2.txt文件中ofstream ofs(file2);					// 定义输出文件流对象for(int i = 0; i < len; i++) {cout <<nums[i] <<' ';		//输出控制台显示结果ofs <<nums[i] <<' ';		//输出到file2.txt文件中}return 0;
}

        运行后结果如下图:

        此时file2.txt中则为排序后整数,之前内容直接被覆盖。如下图:

五、二进制文件的操作

编程序实现以下功能:

(1)题目一:创建对象并存储

        按职工号由小到大的顺序将5个员工的数据(包括职工号、姓名、年龄、工资)输出到磁盘文件中保存。

示例代码:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
// 定义员工类
class Employee{private:int num;char name[50];int age;float wage;public:Employee(int num, const char* nameStr, int age, float wage):num(num), age(age), wage(wage){strncpy(name, nameStr, sizeof(name) - 1); // 复制nameStr到name,并确保最后一个字符是'\0'  name[sizeof(name) - 1] = '\0';}// 打印学员信息void print() const {cout <<"num:" <<num <<", name:" <<name <<", age:" <<age <<", wage:" <<wage <<endl;}
};int main(){// 定义员工类数组,存储5位员工信息Employee s[5] = {Employee(100, "Tom", 30, 5000.0f),Employee(101, "John", 29, 5500.0f),Employee(102, "Lily", 29, 5500.0f),Employee(103, "Marry", 24, 4500.0f),Employee(104, "Make", 23, 4500.0f)};// 定义输出文件流对象ofstream outfile("employee.txt", ios::binary);if(!outfile){cerr <<"Open employee.txt error.";abort();}// 循环输出员工信息for(int i = 0; i < 5; i++){outfile.write((char *)&s[i], sizeof(s[i]));}outfile.close();			//关闭文件流return 0;
}

        运行后文件以二进制形式输出并存储到employee.txt文件中,如下图:


(2)题目二:追加员工信息

        从键盘输入两个员工的数据(职工号大于已有的职工号),增加到文件的末尾。

示例代码:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
// 定义员工类
class Employee{private:int num;char name[50];int age;float wage;public:Employee(){}Employee(int num, const char* nameStr, int age, float wage):num(num), age(age), wage(wage){strncpy(name, nameStr, sizeof(name) - 1); // 复制nameStr到name,并确保最后一个字符是'\0'  name[sizeof(name) - 1] = '\0';}// 打印学员信息void print() const {cout <<"num:" <<num <<", name:" <<name <<", age:" <<age <<", wage:" <<wage <<endl;}
};int main(){// 定义员工类数组,存储新员工信息Employee s[2];// 定义临时变化接收输入数据int num, age;char name[50];float wage;for(int i = 0; i < 2; i++){cout <<"Please enter your employee information:" <<endl;cin >>num >>name >>age >>wage;s[i] = Employee(num, name, age, wage);}// 定义输出文件流对象ofstream outfile("employee.txt", ios::binary|ios::app);if(!outfile){cerr <<"Open employee.txt error.";abort();}// 循环输出员工信息for(int i = 0; i < 2; i++){outfile.write((char *)&s[i], sizeof(s[i]));}outfile.close();			//关闭文件流return 0;
}

运行后结果如下图:

此时employee.txt文件中已追加两条数据,如下图:


(3)题目三:读取全部员工信息

        输出文件中全部职工的数据。

示例代码:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
// 定义员工类
class Employee{private:int num;char name[50];int age;float wage;public:Employee(){}Employee(int num, const char* nameStr, int age, float wage):num(num), age(age), wage(wage){strncpy(name, nameStr, sizeof(name) - 1); // 复制nameStr到name,并确保最后一个字符是'\0'  name[sizeof(name) - 1] = '\0';}// 打印学员信息void print() const {cout <<"num:" <<num <<", name:" <<name <<", age:" <<age <<", wage:" <<wage <<endl;}
};int main(){// 定义文件流对象,读取员工信息ifstream infile("employee.txt", ios::binary);if(!infile){cerr <<"Open employee.txt error.";abort();}// 定义数组,存储员工信息Employee list[7];for(int i = 0; i < 7; i++){infile.read((char*)&list[i], sizeof(list[i]));		// 将数据写入到数组中list[i].print();}infile.close();return 0;
}

        运行后结果如下图:


(4)题目四:查询员工信息

        从键盘输入一个号码,从文件中查找有无此职工号,如有则显示此职工是第几个职工,以及此职工的全部数据。如有没,就输出“无此人”。可以反复多次查询,如果输入查找的职工号为0,就结束查询。

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
// 定义员工类
class Employee{private:int num;char name[50];int age;float wage;public:Employee(){}Employee(int num, const char* nameStr, int age, float wage):num(num), age(age), wage(wage){strncpy(name, nameStr, sizeof(name) - 1); // 复制nameStr到name,并确保最后一个字符是'\0'  name[sizeof(name) - 1] = '\0';}// 获取职工号int getNum() const{return num;}// 打印学员信息void print() const {cout <<"num:" <<num <<", name:" <<name <<", age:" <<age <<", wage:" <<wage <<endl;}
};int main(){// 定义文件流对象,读取员工信息ifstream infile("employee.txt", ios::binary);if(!infile){cerr <<"Open employee.txt error.";abort();}// 定义数组,存储员工信息Employee list[7];for(int i = 0; i < 7; i++){infile.read((char*)&list[i], sizeof(list[i]));		// 将数据写入到数组中list[i].print();}cout <<endl;infile.close();// 执行查询int num;			// 定义接收num变量do{cout <<"Please enter the employee number:" ;cin >>num;			// 输入职工号// 开始查询int index;			//索引Employee* e = nullptr;for(int i = 0; i < 7; i++){if(list[i].getNum() == num){index = i + 1;e = &list[i];}}// 如果员工存在,则显示结果if(e != nullptr){cout <<"Index:" <<index <<endl;e->print();} // 不存在,显示“查无此人”else if(num != 0) cout <<"No such person" <<endl;else if(num == 0) cout <<"End of query." <<endl;cout <<endl;} while(num != 0);		//num不为0则继承查询return 0;
}

        运行结果如下图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/25898.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

搭建RocketMQ主从异步集群

搭建RocketMQ主从异步集群 1、RocketMQ集群模式 为了追求更好的性能&#xff0c;RocketMQ的最佳实践方式都是在集群模式下完成的。RocketMQ官方提供了三种集群搭建方式&#xff1a; 2主2从异步通信方式&#xff1a;使用异步方式进行主从之间的数据复制。吞吐量大&#xff0c;…

665. 非递减数列(中等)

665. 非递减数列 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java 1. 题目描述 题目中转&#xff1a;665. 非递减数列 2.详细题解 判断在最多改变 1 个元素的情况下&#xff0c;该数组能否变成一个非递减数列&#xff0c;一看到题目&#xff0c;不就是遍历判断有几处不…

现实转虚拟:Video2Game引领3D互动体验

在当今数字化时代&#xff0c;虚拟环境的创建对于游戏开发、虚拟现实应用和自动驾驶模拟器等多个领域至关重要。然而&#xff0c;传统的虚拟环境创建过程不仅复杂而且成本高昂&#xff0c;通常需要专业人员和专业软件开发工具的参与。例如&#xff0c;著名的《侠盗猎车手V》以其…

GUI编程02-布局管理器

流式布局 FlowLayout 东西南北中 BorderLayout 表格布局 GridLayout 流式布局 package YMP.GUI; ​ import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; ​ public class TestFlowLayout {public static void main(String[] args…

QSlider样式示例

参考代码&#xff1a; /********************QSlider横向滑动条样式**********************/ QSlider {background-color: rgba(170, 255, 255, 100); /* 设置滑动条主体*/ }QSlider::groove:horizontal {border: 1px solid #999999;height: 8px; /* 默认…

猫头虎分享已解决Bug || Uncaught TypeError: Cannot set property ‘innerHTML‘ of null**

猫头虎分享已解决Bug || Uncaught TypeError: Cannot set property ‘innerHTML’ of null** 原创作者&#xff1a; 猫头虎 作者微信号&#xff1a; Libin9iOak 作者公众号&#xff1a; 猫头虎技术团队 更新日期&#xff1a; 2024年6月6日 博主猫头虎的技术世界 &#x…

【InternLM实战营第二期笔记】07:OpenCompass :是骡子是马,拉出来溜溜

文章目录 课程实操 课程 评测的意义是什么呢&#xff1f;我最近也在想。看到这节开头的内容后忽然有个顿悟&#xff1a;如果大模型最终也会变成一种基础工具&#xff08;类比软件&#xff09;&#xff0c;稳定或可预期的效果需要先于用户感知构建出来&#xff0c;评测 case 就…

创新案例|创新实时零售模式,千亿时尚巨头Shein的全球扩张之路

SHEIN&#xff0c;一家估值千亿美元的快时尚电商独角兽&#xff0c;是全球增长最快的服饰平台。它通过数据和平台的双轮驱动&#xff0c;构建了全新的“实时零售”模式&#xff0c;实现了数据与商业的紧密衔接。同时&#xff0c;通过领导力和组织能力建设&#xff0c;打造了独特…

两句话让LLM逻辑推理瞬间崩溃!!

一道简单的逻辑问题&#xff0c;竟让几乎所有的LLM全军覆没&#xff1f; 对于人类来说&#xff0c;这个名为「爱丽丝梦游仙境」&#xff08;AIW&#xff09;的测试并不算很难—— 「爱丽丝有N个兄弟&#xff0c;她还有M个姐妹。爱丽丝的兄弟有多少个姐妹&#xff1f;」 稍加思考…

LabVIEW开发实验室超导体电流特性测试系统

本系统旨在为学校实验室提供一个基于LabVIEW的超导体电流特性测试平台&#xff0c;通过精确测量超导体在不同温度和电流条件下的电学特性&#xff0c;帮助学生和研究人员深入理解超导体的物理性质。本文将从背景、目标、工作原理、使用方法、操作流程和注意事项等方面详细介绍该…

汇编语言作业(六)

目录 一、实验目的 二、实验内容 三、实验步骤以及结果 四、实验结果与分析 五、实验总结 一、实验目的 掌握加减法运算指令对各状态标志位的影响及测试方法掌握汇编语言长整数的加法的操作方法 二、实验内容 对于以下几组数&#xff0c; 087H和034H 0C2H和5FH 0F3H和0F3H&am…

「网络原理」三次握手四次挥手

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;计网 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 三次握手&四次挥手 &#x1f349;连接管理&#x1f34c;三次握手&#x1f34c;意义&#x1f34c;四次挥手&#x1f34c;TCP 状态转换…

【web本地存储】storage事件,StorageEvent对象介绍

storage事件 Web Storage API 内建了一套事件通知机制&#xff0c;当存储区域的内容发生改变&#xff08;包括增加、修改、删除数据&#xff09;时&#xff0c;就会自动触发storage事件&#xff0c;并把它发送给所有感兴趣的监听者&#xff0c;因此&#xff0c;如果需要跟踪存…

Flink⼤状态作业调优实践指南:状态报错与启停慢篇

摘要&#xff1a;本文整理自俞航翔、陈婧敏、黄鹏程老师所撰写的大状态作业调优实践指南。由于内容丰富&#xff0c;本文分享终篇状态报错与启停慢篇&#xff0c;主要分为以下四个部分&#xff1a; 检查点和快照超时的诊断与调优 作业快速启动和扩缩容方案 总结 阿里云企业级…

creo学习一

设置好当前配置后&#xff0c;导出config配置文件&#xff0c;并覆盖掉此路径下的旧文件&#xff0c;使得新配置永久生效&#xff0c;这样每次打开软件都是新配置的设置&#xff1a; 系统颜色的导出&#xff1a; 打开版本的问题&#xff1a; 不能有弱尺寸&#xff1a; 注意&a…

分享一个 .NET Core Console 项目中应用 NLog 写日志的详细例子

前言 日志在软件开发中扮演着非常重要的角色&#xff0c;通常我们用它来记录应用程序运行时发生的事件、错误信息、警告以及其他相关信息&#xff0c;帮助在调试和排查问题时更快速地定位和解决 Bug。 通过日志&#xff0c;我们可以做到&#xff1a; 故障排除和调试&#xff…

MySQL普通表转换为分区表实战指南

码到三十五 &#xff1a; 个人主页 引言 本文将详细指导新手开发者如何将MySQL中的普通表转换为分区表。分区表在处理庞大数据集时展现出显著的性能优势&#xff0c;不仅能大幅提升查询速度&#xff0c;还能有效简化数据维护工作。通过掌握这一技巧能够更好地应对数据密集型应…

《编程小白变大神:DjangoBlog带你飞越代码海洋》

还在为你的博客加载速度慢而烦恼&#xff1f;DjangoBlog性能优化大揭秘&#xff0c;让你的网站速度飞跃提升&#xff01;本文将带你深入了解缓存策略、数据库优化、静态文件处理等关键技术&#xff0c;更有Gunicorn和Nginx的黄金搭档&#xff0c;让你的博客部署如虎添翼。无论你…

解决阿里云的端口添加安全组仍然无法扫描到

发现用线上的网站扫不到这个端口&#xff0c;这个端口关了&#xff0c;但是没有更详细信息了 我用nmap扫了一下我的这个端口&#xff0c;发现主机是活跃的&#xff0c;但是有防火墙&#xff0c;我们列出云服务器上面的这个防火墙list&#xff0c;发现确实没有5566端口 参考&a…

大数据解决方案案例:电商平台日志分析

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…