【C++】一个极简但完整的C++程序
一、一个极简但完整的C++程序
我们编写程序是为了解决问题和任务的。
1、任务:
某个书店将每本售出的图书的书名和出版社,输入到一个文件中,这些信息以书售出的时间顺序输入,每两周店主会手工计算每本书的销售量、以及每个出版社的销售量。报表以出版社名称的字母顺序排序,以便下订单进货,填补已经卖出去的书。
现在我们写一个程序来完成这个任务。
2、分解任务
将复杂问题分解成一个个容易实现的小问题。分而治之divide and conquer, 逐步求精stepwise refinement。
上面书店任务分成以下4个子任务:
(1)读取销售文件;
(2)根据书名和出版社名称计算销售量
(3)以出版社名称对书名进行排序
(4)输出结果
子问题3还是太复杂,继续分隔任务:
(1)读取销售文件;
(2)根据书名和出版社名称计算销售量
(3a)按出版社排序 (3b)对每个出版社的书,按书名排序 (3c)在每个出版社组中,比较相邻的书名,如果二者匹配,增加第一个的数量,删除第二个。
(4)输出结果
子问题脉络不清,继续整理动作序列:
(1)读取销售文件;
(2)对文件排序————先按出版社,然后在出版社内部按书名排序;
(3)压缩重复的书名;
(4)将结果写入文件;
这个动作序列就是算法algorithm,下面就是把这个算法转化为C++语言的程序。
3、编写程序
(1)C++语句 
在C++语言中,操作数operand + 操作符operator = 表达式expression。也就是动作被称为表达式。
以分号结尾的表达式称为语句statement。语句是C++中最小的程序单元。上述代码就是3条语句。
语句A:是一个声明语句declaration。
book_count是标识符identifier或者叫符号变量symbolic variable,简称变量variable,或者对象object。都是指计算机内存中的一块区域,这块区域是存储整数值的,这块区域与变量名book_count相关联。认真看过编译原理的同学就知道,变量名其实是给程序员看的,程序编译的时候,变量名直接被编译器映射成首地址和长度(长度是从变量的类型上看到的,比如上面的int类型)。
0是文字常量literal constant,表示变量book_count被初始化为0。
语句B:是一个赋值语句assignment。作用就是把变量books_on_shelf和变量books_on_order的值相加,并把结果写入变量book_count的内存区域中。当然前提是books_on_shelf和books_on_order都已经被声明和初始化过了。
语句C:是一个输出语句output。作用是在用户终端先输出一个字符串,再输出与变量名book_count相关联的内存区域中的值。
cout是用户终端;<<是输出操作符。
(2)编写C++程序
把上述语句按逻辑语义分组,就形成一些有名字的单元,这些单元称为函数function。
每个程序都是由一系列函数组成的。那照葫芦画瓢,我们把书店任务子任务(1)读取销售文件的实现语句都组织到一个称为readIn()的函数中。其他任务同理分别组织到:sortBook()、compactBook()、printBook()函数。
在C++中,每个程序必须有一个main()函数,程序才能运行。因为main函数是一个程序的入口(当然你也可以设置其他入口,但每必要)。这个main函数是由程序员写的。
一个程序是不可能一下子从头到尾一口气写出来的,都是渐进式一点点添加完成的,所以下面我们先用哑函数来实现这个书店的任务,也就是先把程序代码的整体大块写出来:
解释:
a、上图ABCDEF都是函数。通常函数由四部分组成:返回类型、函数名、参数表、函数体。
void表示该函数没有返回值。int表示函数返回值是整数类型。
参数表由小括号括起来。多个参数由逗号分开。
函数体由花括号括起来。函数体由多个程序语句序列构成。
b、上图F函数是main函数,main函数是一个程序的入口。也就是说这个程序是从main函数开始执行的,然后是从上往下依次执行的,除非遇到条件语句、分支语句、控制流语句等才会跳出执行,跳出执行完毕后,继续回到原来位置继续往下执行。
return 是C++预定义的语句,作用是终止函数的执行。return 后面的值是函数的返回值return value。在C++标准中,如果main函数没有显示的提供返回语句,则默认返回0。
c、上例中,函数BCDE都是定义函数。main函数里面的才是函数调用。当开始执行main函数时,main函数体先调用invoke函数(这部分在编译时讲过),然后才是readIn,sortBook,依次往后,执行到return 0;后,程序正常结束。
d、include是预处理器指示符preprocessor include directive,预处理器指示符用#号 标识。作用是复制iostream文件中的内容到本文本文件中,这是预处理器的作用,预处理器又是捆绑在编译器中。
iostream是输入输出流库标准文件,文件中就包括比如cout的信息。但是类似cout这样的关键字不是你可以直接在代码文本中使用的,你还得加上using namespace std;语句才可以直接使用。
这条语句被称为using指示符using directive。C++标准库中的名字都是在一个叫std的名字空间中声明的。using指示符告诉编译器要使用在名字空间std中声明的名字。
4、编译程序
当我们的文本程序文件————.cpp文件中的代码编写完毕后,就改执行这个.cpp文件,看它是否可以帮我我们完成书店的任务。
代码是人类认识的文本,计算机cpu只认识0和1,所以代码到执行中间还有很长的路,这个路就是编译。
编译也是一个非常非常复杂的过程,建议大家先看:【C++】编译原理-CSDN博客
这里我就简单说一些流程就好了。
(1)编辑-编译-调试 edit-compile-debug
在程序编译阶段,一般情况下,都会报出bug,就是我们写的程序计算机理解不了,编译器都会报出来,比如你的代码犯了语法错误、类型错误等,编译器就会报错,此时你首先要明白,既然报错就一定是你代码的错,不可能是计算机的错,所以要改的是你的代码。然后你就进入编辑-编译-调试这个循环过程,直到顺利编译完毕,没有bug为止。
(2)代码生成code generation
当编译成功后,也就是你的代码被编译器成功转化为目标代码或汇编指令代码,这些代码是cpu理解的代码。而你编译成功的结果一般是生成一个.exe的可执行文件,如上图的G。
5、执行程序
双击运行G这个可执行文件,就是上图的H。
如果H的运行结果符合我们的要求,比如正确统计出来并显示,那就任务完成。上图的结果H显然不是我们想要的结果,哈哈,那是因为的的代码还没开始写,我们用的是哑函数,这里主要展示项目开发的流程,实际功能就根本没开始写呢。下面我们开始慢慢补充。
6、补充1
我们先不补充这几个函数,我们补充一种情况:比如如果销售很慢,比如这两周店主卖出了0本,或者只卖出了1本。当卖出0本时,我们也要给店主回复个没有销售记录的提示。当卖出1本时,我们就不必要排序和压缩了。当然如果卖出了2本或2本以上,那就走正常流程了。我们先用if语句实现这种情况,代码如下:

(1)此时就得修改readIn函数的返回值,我们根据readIn函数的返回值决定程序该如何执行。
(2)修改main函数。首先是获取readIn函数的返回值,代码A,用一个整型变量count接受readIn函数的返回值。
如果readIn函数返回值count大于1,就是卖出了2本或者2本以上,那我们正常执行,就是继续执行排序、压缩。
如果readIn函数返回值count等于0,就是没有销售,返回一个字符串“no sales this nonth...”
如果readIn函数返回值count不等于0,就执行else语句,也就是B语句,就是调用writeBook函数。
暂时先补充这一个逻辑,后面我们学到相关的知识点在继续补充。
相关文章:
【C++】一个极简但完整的C++程序
一、一个极简但完整的C程序 我们编写程序是为了解决问题和任务的。 1、任务: 某个书店将每本售出的图书的书名和出版社,输入到一个文件中,这些信息以书售出的时间顺序输入,每两周店主会手工计算每本书的销售量、以及每个出版社的…...
Lua迭代器详解(附加红点功能实例)
Lua迭代器详解与用法 1. 什么是迭代器2. 为什么需要理解迭代器的原理3. 迭代器的实现0. 闭包1. 有状态迭代器2. 无状态迭代器 4. 红点树系统基础 1. 什么是迭代器 迭代器是一种能让我们遍历一个集合中的所有元素的代码结构。比如常用ipairs()和pairs()。 2. 为什么需要理解迭代…...
锂磷硫(LPS)属于硫化物固态电解质 Li7P3S11是代表性产品
锂磷硫(LPS)属于硫化物固态电解质 Li7P3S11是代表性产品 锂磷硫(LPS),为非晶态材料,是硫化物固态电解质代表性产品之一,具有热稳定性好、成本较低等优点,在固态电解质中离子电导率较…...
PointCloudLib 点云边缘点提取 C++版本
0.实现效果 1.算法原理 PCL(Point Cloud Library)中获取点云边界的算法主要基于点云数据的几何特征和法向量信息。以下是对该算法的详细解释,按照清晰的格式进行归纳: 算法概述 PCL中的点云边界提取算法主要用于从3D点云数据中识别并提取出位于物体边界上的点。这些边界…...
【Qt】QList<QVariantMap>中数据修改
1. 问题 QList<QVariantMap> 类型中,修改QVariantMap中的值。 2. 代码 //有效代码1QVariantMap itemMap itemList.at(0);itemMap.insert("title", "test");itemList.replace(0, itemMap);//有效代码 2itemList.operator [](0).insert(…...
如何避免vue的url中使用hash符号?
目录 1. 安装 Vue Router 2. 配置 Vue Router 使用 history 模式 3. 更新 main.js 4. 配置服务器以支持 history 模式(此处需要仔细测试) a. Nginx 配置 b. Apache 配置 5. 部署并测试 总结 在 Vue.js 项目中,避免 URL 中出现 # 符号的…...
Java学习 - MySQL存储过程、函数和触发器练习实例
存储过程 存储过程是什么 存储过程是一组已经编译好的SQL语句存储过程优点有什么 安全 性能高 提高代码复用性创建存储过程的语法 DELIMITER $ # 不能加分号CREATE PROCEDURE 存储过程名(IN|OUT|INOUT 参数名 参数类型) BEGIN存储过程语句块 END;$DELIMITER ;创建一个无参的存储…...
【深度神经网络 (DNN)】
深度神经网络 (DNN) 深度神经网络 (DNN) 是机器学习领域中一种强大的工具,它由多层神经元组成,能够学习复杂的数据模式,解决各种任务,如图像识别、语音识别、自然语言处理等。 DNN 的构成: 神经元: DNN 的基本单元&…...
ES全文检索支持繁简和IK分词检索
ES全文检索支持繁简和IK分词检索 1. 前言2. 引入繁简转换插件analysis-stconvert2.1 下载已有作者编译后的包文件2.2 下载源码进行编译2.3 复制解压插件到es安装目录的plugins文件夹下 3. 引入ik分词器插件3.1 已有作者编译后的包文件3.2 只有源代码的版本3.3 安装ik分词插件 4…...
解决Visual Studio Code在Ubuntu上崩溃的问题
解决Visual Studio Code在Ubuntu上崩溃的问题 我正在使用Ubuntu系统,每次打开Visual Studio Code时,只能短暂打开一秒钟,然后就会崩溃。当通过终端使用code --verbose命令启动Visual Studio Code时,出现以下错误信息:…...
【OpenGauss源码学习 —— (ALTER TABLE(SET attribute_option))】
ALTER TABLE(SET attribute_option) ATExecSetOptions 函数 声明:本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和学术成果,力求遵循合理使用原则,并在适用的情况下注明引用来源。…...
Elasticsearch 数据提取 - 最适合这项工作的工具是什么?
作者:来自 Elastic Josh Asres 了解在 Elasticsearch 中为你的搜索用例提取数据的所有不同方式。 对于搜索用例,高效采集和处理来自各种来源的数据的能力至关重要。无论你处理的是 SQL 数据库、CRM 还是任何自定义数据源,选择正确的数据采集…...
‘浔川画板v5.1’即将上线!——浔川python社
1 简介: 浔川画板是一款专业的数字绘画和漫画创作软件,它为艺术家和设计师提供了丰富的绘画工具、色彩管理功能以及易于使用的界面。用户可以使用浔川画板进行手绘风格的绘画、精细的素描、漫画分格、UI设计等多种创作。该软件支持多种笔刷和特效&#…...
RockChip Android12 System之Datetime
一:概述 本文将针对Android12 Settings二级菜单System中Date&time的UI修改进行说明。 二:Date&Time 1、Activity packages/apps/Settings/AndroidManifest.xml <activityandroid:name="Settings$DateTimeSettingsActivity"android:label="@stri…...
详解 ClickHouse 的副本机制
一、简介 副本功能只支持 MergeTree Family 的表引擎,参考文档:https://clickhouse.tech/docs/en/engines/table-engines/mergetree-family/replication/ ClickHouse 副本的目的主要是保障数据的高可用性,即使一台 ClickHouse 节点宕机&#…...
速卖通测评成本低见效快,自养号测评的实操指南,快速积累销量和好评
对于初入速卖通的新卖家而言,销量和评价的积累显得尤为关键。由于新店铺往往难以获得平台活动的青睐,因此流量的获取成为了一大挑战。在这样的背景下,进行产品测评以积累正面的用户反馈和销售记录,成为了提升店铺信誉和吸引潜在顾…...
php反序列化漏洞简介
目录 php序列化和反序列化简介 序列化 反序列化 类中定义的属性 序列化实例 反序列化实例 反序列化漏洞 序列化返回的字符串格式 魔术方法和反序列化利用 绕过wakeup 靶场实战 修复方法 php序列化和反序列化简介 序列化 将对象状态转换为可保持或可传输的格式的…...
力扣随机一题 模拟+字符串
博客主页:誓则盟约系列专栏:IT竞赛 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 1910.删除一个字符串中所有出现的给定子字符串【中等】 题目: …...
java-正则表达式 1
Java中的正则表达式 1. 正则表达式的基本概念 正则表达式(Regular Expression, regex)是一种用于匹配字符串中字符组合的模式。正则表达式广泛应用于字符串搜索、替换和解析。Java通过java.util.regex包提供了对正则表达式的支持,该包包含两…...
Python xlrd库:读excel表格
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
