【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函数。

暂时先补充这一个逻辑,后面我们学到相关的知识点在继续补充。

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

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

相关文章

Vue74-路由传参2

一、$route中的params参数 二、在配置路由的index.js文件中&#xff0c;声明传参 占位符用的什么名字&#xff0c;params里面的key就是什么。 三、<router-link>标签中传参 3-1、to字符串写法 3-2、to的对象写法 注意&#xff1a;若是用params携带参数&#xff0c;不…

mysql的安装以及分享navicat for MySQL

前言 根据网上分享的安装方法以及自己遇到的问题解决方法 一、mysql是什么&#xff1f; mysql 是一个开放源码的小型关联式数据库管理系统 二、安装过程 1.下载安装包 下载地址&#xff1a;MySQL :: Download MySQL Community Server 跳过直接下载&#xff0c;解压即可 …

DPDK的Cache预取和Cache一致性

1.什么是Cache预取 众所周知&#xff0c;CPU访问Cache中的数据是比访问内存中的数据是要快的&#xff0c;而因为程序都有时间局部性和空间局部性&#xff0c;时间局部性简单来说就是某一条或几条指令在一段时间内会被CPU多次执行&#xff1b;空间局部性简单来说就是某一段数据块…

五十五、openlayers官网示例Loading Spinner解析——给地图添加loading效果,瓦片图层加载时等待效果

官网demo地址&#xff1a; Loading Spinner 这篇介绍了一个非常简单的loading效果 利用地图的loadstart和loadend事件&#xff0c;动态的添加和删除class名。 map.on("loadstart", function () {map.getTargetElement().classList.add("spinner");});map…

Vue72-路由传参1

一、需求 点击哪个消息&#xff0c;就展示哪个消息的详情 这是一个三级路由&#xff01; 给路由组件&#xff1a;detail.vue传递消息数据。 二、代码步骤 2-1、编写路由组件 从$route.query属性里面获取传参 2-2、编写路由规则 2-3、编写路由标签&#xff0c;传参 1、to的字…

Ncorr使用过程的问题解答

问题系列 文章目录 问题系列前言一、如何更改单位&#xff1f;情景&#xff1a;DIC Analysis 二、拉格兰日和欧拉绘图的区别直观 三、控制图像中的显示条上下界限问题展示&#xff1a;解决方案&#xff1a; 更新动态 前言 主要用于记录使用过程中出现的相关问题。 一、如何更改…

数据结构:为什么说链表是顺序表的升级版(c语言实现)

前言&#xff1a; 我们在之前的几篇文章中详细的讲解了顺序表的特点&#xff0c;增删改查操作和动态顺序表的优点&#xff0c;并使用顺序表的底层结构实现了通讯录项目&#xff0c;似乎顺序表是一个非常完美的数据结构&#xff0c;它可以实现按照需求实现增删查改&#xff0c;对…

做好海外ASO优化的7大核心要素你了解几个?

海外App进行ASO优化时&#xff0c;需要综合考虑多个方面以确保应用在应用商店中获得更高的曝光率和下载量。以下是一些关键的ASO优化步骤&#xff0c;结合参考文章中的相关信息进行详细阐述&#xff1a; 1.关键词优化 调研目标市场的用户行为和检索习惯&#xff0c;挖掘与应用…

锂磷硫(LPS)属于硫化物固态电解质 Li7P3S11是代表性产品

锂磷硫&#xff08;LPS&#xff09;属于硫化物固态电解质 Li7P3S11是代表性产品 锂磷硫&#xff08;LPS&#xff09;&#xff0c;为非晶态材料&#xff0c;是硫化物固态电解质代表性产品之一&#xff0c;具有热稳定性好、成本较低等优点&#xff0c;在固态电解质中离子电导率较…

【Deep Learning】Meta-Learning:训练训练神经网络的神经网络

元学习&#xff1a;训练训练神经网络的神经网络 本文基于清华大学《深度学习》第12节《Beyond Supervised Learning》的内容撰写&#xff0c;既是课堂笔记&#xff0c;亦是作者的一些理解。 1 Meta-Learning 在经典监督学习中&#xff0c;给定训练数据 { ( x i , y i ) } i \{…

使用Spring Boot实现用户认证和授权

文章目录 引言第一章 Spring Boot概述1.1 什么是Spring Boot1.2 Spring Boot的主要特性 第二章 用户认证和授权基础知识2.1 用户认证2.2 用户授权2.3 Spring Security概述 第三章 项目初始化第四章 实现用户认证和授权4.1 定义用户实体类和角色实体类4.2 创建Repository接口4.3…

IntelliJ IDE 插件开发 | (十)主题插件开发入门

系列文章 本系列文章已收录到专栏&#xff0c;交流群号&#xff1a;689220994&#xff0c;也可点击链接加入。 前言 在前面的章节中&#xff0c;我们介绍的都是功能性插件的开发内容&#xff0c;本文则会介绍一下主题类插件的开发方式。不过本文也只是带大家入个门&#xff…

靠3个字寻求机会,情商不够,别勉强自己

之前我分享了一篇文章寻求一个自由职业的前端伙伴&#xff0c;吸引了好几位朋友来咨询合作&#xff0c;中间出现了不少插曲&#xff0c;好在结果是令人满意的。 作为一名初次创业者&#xff0c;我承认很多地方做的不是那么到位&#xff0c;比如招聘合作伙伴&#xff0c;理想的状…

LLM2Vec论文阅读笔记

这是篇LLM论文&#xff0c;用decoder-like的LLM去提取embedding文章认为&#xff0c;decoder-like的LLM在text embedding task表现不优的一大原因就是其casual attention mechanism&#xff0c;其实就是mask的问题。所以只要对现有的decoder-only LLM进行如下三步改进&#xff…

品牌价值超1592亿,九牧是如何炼成“六边形战士”?

作者 | 吉羽 来源 | 洞见新研社 经历了多年高速发展的中国市场开始慢慢减速&#xff0c;消费者正变得越来越“挑剔”&#xff0c;在信息爆炸的今天&#xff0c;企业面临“需求”与“流量”的双重考验。 市场凭什么记住你&#xff1f;选择你&#xff1f; 答案只有一个&#x…

关于飞浆文字识别技术的运用

飞桨PaddlePaddle-源于产业实践的开源深度学习平台&#xff0c;有关文章可以在此进行查询 飞桨&#xff08;PaddlePaddle&#xff09;是一个由百度开源的深度学习平台&#xff0c;它提供了丰富的机器学习算法库&#xff0c;支持多种深度学习模型的构建、训练和部署。飞桨平台具…

【漏洞复现】万户-ezOFFICE download_ftp.jsp 任意文件下载漏洞

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

基于51单片机计步器—无线蓝牙APP上传

基于51单片机计步器设计 &#xff08;程序&#xff0b;原理图&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 本设计由STC89C52单片机最小系统ADXL345加速度传感器lcd1602液晶电路蓝牙模块电路呼吸灯电路电源电路组成。 1.通过ADXL345检测步数&#xff0…

调试实战 | 记一次有教益的 vs2022 内存分配失败崩溃分析(续)

前言 前一阵子遇到了 vs2022 卡死的问题&#xff0c;在上一篇文章中重点分析了崩溃的原因 —— 当 vs2022 尝试分配 923MB 的内存时&#xff0c;物理内存页文件大小不足以满足这次分配请求&#xff0c;于是抛出异常。 本篇文章将重点挖掘一下 vs2022 在崩溃之前已经分配的内容…

HTML静态网页成品作业(HTML+CSS+JS)——动漫斗罗大陆介绍网页(3个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;使用Javacsript代码实现图片轮播和tab切换&#xff0c;共有3个页面。 …