面向对象程序设计寒假作业1

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/2020OOP
这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/2020OOP/homework/10224
这个作业的目标 1、了解C语言的缺点 2、了解C语言/C++的编译过程 3、查看自己的C++编译器版本 4、使用命令行编译一份C语言/C++代码 5、写一份代码,实现简单的汉字输入输出
作业正文 1、问答题:https://www.cnblogs.com/cyn522/p/12232556.html 2、实践题:https://www.cnblogs.com/cyn522/p/12233273.html 3、编程题:https://www.cnblogs.com/cyn522/p/12234543.html 4、合集:https://www.cnblogs.com/cyn522/p/12235349.html
其他参考文献 1、https://www.cnblogs.com/Eric-jx/articles/10048309.html 2、http://blog.sina.com.cn/s/blog_148b66fae0102yg8f.html 3、https://www.cnblogs.com/CarpenterLee/p/5994681.html#top 4、https://www.bilibili.com/video/av54538668?from=search&seid=17434504392066517517
问答题:

回答以下问题:

1、如果你不了解C++请回答以下问题:你认为C语言有什么缺陷(你觉得哪里用的不顺手)。
如果你已经了解C++请回答以下问题:你觉得C++和C语言比有什么优点。

2、查阅相关资料,简述一下C语言/C++的编译过程。

回答:
1、你认为C语言有什么缺陷?
①有多种输入输出方式,对应不同情况,比较麻烦
②语法限制不太严格,对数组下标越界不检查
③危险性高:C语言的设计思想导致在写程序时只要写法错的不是很离谱就会通过,不会报错,容易产生漏洞
④开发周期长:C语言是面向过程的语言,所以当代码写到10万行时容易崩溃,出现错误
⑤可移植性不强:C程序在其他机器上不一定能运行,就算能运行,结果也可能不一样
⑥较难掌握,要求对程序设计更熟练一些

2、查阅相关资料,简述一下C语言/C++的编译过程。
①预处理:将所有的#include头文件以及宏定义替换成其真正的内容,预处理之后的文件会大很多,但仍可用文本编辑器打开
②编译:将经过预处理之后的程序转换成特定汇编代码
③汇编:将上一步的汇编代码转换成机器码,为每一个源文件产生一个目标文件
④链接:将多个目标文件以及所需的库文件链接成最终的可执行文件

实践题:

自己动手,完成以下任务:

1、查看自己的C++编译器版本。

2、使用命令行编译一份C语言/C++代码。

回答:
1、步骤
①首先打开编译器

②点击右下角“继续但无需代码”

③点击上方工作栏的“工具”中的“命令行”下的“开发者提示”

④输入“cl.exe”

2、使用命令行编译一份C语言/C++代码
命令行:命令提示符是在操作系统中,提示进行命令输入的一种工作提示符。
用命令行编译代码实际上应该是打开一份已经编译完的代码,所以应该先写一份可以成功运行的代码,再用命令行打开

步骤
①编写代码(为了方便,我直接将文件保存于桌面,实际应用时最好不要直接放在桌面上)

②在编译器界面按下“win”+R后,出现像左下角这样的窗口

③输入“cmd”并按下“Enter”键即回车键

④查看刚刚生成的exe文件的地址,右键点击上方地址栏,单击复制地址

⑤返回刚刚输入“cmd”出现的窗口,输入“cd”和刚刚复制的文件地址

⑥按下“Enter”键即回车键后,输入exe文件的名称(eg.我的文件名是“Project1”,所以我输入的是“Project1”,也可输入“Project1.exe”)

⑦按下“Enter”键即回车键即可得到结果(截屏中给出的是输入“Project1”和“Project1.exe”两种情况的结果)

小结:
用命令行编译代码重点在于要找出所要查找的exe文件的地址(建议将代码等放在一个常用且数据不易丢失的盘里),容易出现在输入“cmd”指令打开窗口后直接输入要打开的文件名,或者是打开窗口后输入“cd”指令后直接输入要打开的文件名,这两种都是错误的打开方式。

编程题(请使用C语言或者C++完成以下题目):

中国文化博大精深,从仓颉造字开始,汉字一直流传到了今天。我们在感叹汉字的源远流长时,也不禁感慨,为什么没有一门使用汉字编程的语言?
汉字真的不能编程吗?最近文言文编程火了一把,吾有一數。曰三。名之曰「甲」。这朴实无华的变量定义无疑不是几千年来中华文化的发展中一朵奇葩。
今天小王同学想,文言文能编程那白话文呢?他找到了你,让你帮帮他。

编程要求
编写一个程序,输入满足以下语法要求的一段文字,输出运行后的结果。
变量定义:整数 钱包 等于 零
运算(加法):钱包 增加 四
运算(减法):钱包 减少 四
输出:看看 钱包

样例
输入:

整数 钱包 等于 零
钱包 增加 四
钱包 减少 三
看看 钱包

输出:

注意:

输入输出用例均为GBK编码,推荐使用vscode把文本切换为GBK编码。
数字只会出现以下 零一二三四五六七八九十 。
编程题要求:

1、读题,提取出题目的要求。
2、分解需求,把需求分解为几个你觉得不太相关的模块。
3、思考每个模块怎么写,可以从简单的模块开始写。
4、对于不会的问题进行查阅资料。
5、对于每一个模块设计测试用例。
6、详细记录下以上每一步,并写在博客中。
7、不要求完全做出来,但要求记录详细。
8、建议博客长度不少于1000字(不包含代码)。

思考:
拿到题目,发现题目主要实现汉字的数字运算,由于在“注意”中有提到GBK编码,去看了一下,发现不怎么会用,所以目前暂时不考虑。接着发现题目中的运算数字是十以内的数字,降低了难度,但我在编写代码的过程中将数字范围取到了二十以内,将运算后的结果取到了一千以内。(在实际运行中,发现不论输入的数是多少,汉字转数字返回值均为一,由于暂时还没解决此问题,故将数字范围改为十以内。)
在写的过程中,刚开始只输入一个字符串“整数 钱包 等于 零”,想要通过某种办法只截取字符串中所需要的一段,百度之后得到了“memcpy函数”,但是在实际操作中发现,我的使用方法不能让我得到我要的结果,于是我改成将一句话中出现的每个词语都用一个字符串来实现。
在输入上,考虑到可以有连续的多次运算,我用了一个循环,以“EOF”终止循环。其中在循环体用变量m记录最后终止时i的大小,即可得出输入多少条运算指令。(注意:记得输出“看看 钱包”这条指令)(在实际运行中,由于字符串不能以EOF结束,所以改为输入“看看 钱包”指令时停止输入,因为运算指令有三个字符串,所以将“看看 钱包”指令改为“看看 钱包 钱”指令,否则无法结束输入。)
在运算上,首先我考虑的是先判断指令中是“增加”还是“减少”,这里我用的是字符串的比较函数,通过该函数来确定运算符。接着在数字上,我通过自己编写一个函数来判断数字内容,并将其转化为阿拉伯数字返回,便于运算。函数中确定数字的方法还是用字符串的比较函数来实现,因为将数字的范围设定在二十以内,所以还不算特别麻烦。(目前还没想到更简便的方法)
在输出上,先判断所得到的数字是否是负数,如果是负数直接输出“您已负债”,如果恰好为零输出“当前余额为零”,如果是正数转为汉字后输出。(后来意识到恰好为零可以直接输出零,就把结果的情况只分为两种。)
在转汉字的过程中,分为二十以内,一百以内(不包括一百),一千以内(不包括一千)三种情况。二十以内用switch比较后输出;一百以内,先判断是否为十的整数倍,若不是则判断出十位上和个位上的数字后输出;一千以内,先判断是否为一百的整数倍,若不是则判断是否为十的整数倍,若是则判断百位上和十位上的数字后输出,若不是则判断百位,十位和各位上的数字后输出(在这种情况下要特别注意类似101-109这样范围里的数)。

在写代码时分为这几个部分:输入,运算,输出。
运算中主要识别增加、减少两种情况和汉字转数字的运算(实际写的时候将输入和运算放在一起)



输出中分为二十以内,一百以内(不包括一百),一千以内(不包括一千)三种情况。
二十以内:

一百以内:


一千以内:


小结:
①结果为负数和非负数的两种情况


②开始时,钱包里的数不为零的情况

③结果为二十至一百的两种情况(不包括一百)(二十以内的情况见①②)


④结果为一百至一千的三种情况(不包括一千)


完整代码:







个人想法:
题目中出现整数,那么与之相对应应该还有小数的情况;有钱包,那么还可以有其他可以存放金钱的物品,包括储蓄罐,储蓄卡,收银台等;有加、减,那么还可以有乘除;输入的终止应该还有更合适的方法(暂时还没想到);汉字转数字有考虑过GBK编码,但是GBK编码是按照汉字读音编码,与ASCII有所不同,暂时还没想到要怎么用。

posted @ 2020-01-27 02:29  沐沐Y  阅读(194)  评论(1编辑  收藏  举报