【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的主页」…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...
嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...
AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
Name:3ddown Serial:FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名:Axure 序列号:8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...
