面向对象程序设计寒假作业2
这个作业属于哪个课程 | 2020面向对象程序设计张栋班 | |||||||||||
这个作业的要求在哪里 | 面向对象程序设计寒假作业2 | |||||||||||
这个作业的目标 | 1、学习git的创建仓库和上传代码;2、优化代码并且可以优雅地命名;3、学习window批处理 | |||||||||||
作业正文 | 2020面向对象程序设计寒假作业2 | |||||||||||
其他参考文献 | freopen函数;C++语言程序设计基础;windows批处理教程;创建仓库;commit和push |
首先读题吧!
编程题(请使用C语言或者C++完成以下题目):
• 继续完成作业一的编程题。
• 优化架构,一般要求每个函数长度不超过15行。
• 优化规范,尤其是命名规范。
• 制作一个编译脚本,运行该脚本可以编译你的代码,可选的脚本语言,python(2.7),windows批处理,powershell,shell。
• 进行单元测试,即测试每一个函数,并制作一个测试脚本,运行该脚本可以进行测试,并显示测试结果。
• 在作业一编程题的基础上添加以下功能:
o 通过命令行读取一个文件,然后运行这个文件。如我的程序叫lang,lang 1.txt代表我要运行1.txt这个文本中的代码。
o 假设我的1.txt内容如下:
• 整数 钱包 等于 零
• 钱包 增加 四
• 钱包 减少 三
看看 钱包
o 输入lang 1.txt后,命令行输出一。
一、关于代码!要求:把作业一的编程题优化,首先要把每个函数的长度控制在15行以内,其次是命名要规范。
我要解决的就是函数长度问题和命名的问题(main(主函数),transform(转化),process(步骤),output(输出),这是第二个要求,命名,我也不晓得我这样命名专不专业!),自己代码太长了,要思考更好的写法。这一次我想尝试用C++来写,原因是我觉得String类这个应该会有很大的用处,就可不用strcmp函数了,直接用==,output的时候直接用+,这样可太方便了。还有一个就是getline函数!!
首先我初始化了一些东西,主要是用在汉字转化上,
string chinese[11] = { "零","一","二","三","四","五","六","七","八","九","十" }, add = "增加", depress = "减少";
之后我把整个问题分为了,四个函数来实现,分别是main(主函数),transform(转化),process(步骤),output(输出)。
第一个transform(转化)是汉字转化为阿拉伯数字,这里的想法是运用数组下标对于数字,这在结束的转化里也用到了。
int transform(string number)
{
int i;
for (i = 0;; i++)
{
if (number == chinese[i])
{
break;
}
}
return i;
}
第二个是钱包的加加减减,函数process(步骤)同样是运用到数组下标的对应。
void process(string first)
{
string number;
getline(cin, number);
if (first == add)
{
sum = sum + transform(number);
}
else
{
sum = sum - transform(number);
}
}
第三个是output函数,代码比较长,原本想要分两个来函数来写,但是最终还是没分出来,它们之间的变量关系比较紧密,所以超出了几行。
void putout()
{
int a[10], n, i, t,l;
string outcome;
if (sum < 0) cout << "error!";
else {
n = sum;
if (sum <= 10) cout << chinese[sum];
else {
for (i = 1; n != 0; i++)
{
a[i] = n % 10;
n = n / 10;
}
if (a[i - 1] != 1) outcome = chinese[a[i - 1]];
if (a[i - 2] == 0) outcome = outcome + "十";
else {
for (t = i - 2; t > 0; t--)
{
l = a[t];
outcome = outcome + "十" + chinese[a[t]];
}
}
cout << sum << endl << outcome;
}
}
}
最后是main函数。大量应用了getline函数,比如最开始“整数 钱吧 等于 零”,三个循环,每次读取字符串到空格,最后分出汉字数字“零”来,这解决了我在第一次作业里的困惑。
int main()
{
string begin, origin, later, first;int flag = 1;
for (int i = 1; i <= 3; i++)
getline(cin, begin, ' ');
getline(cin, origin);
sum = transform(origin);
do {
getline(cin, later, ' ');
if (later == "钱包")
{
getline(cin, first, ' ');process(first);
}
else
{
putout();flag = 0;
}
} while (flag);
return 0;
}
完整代码如下:
#include<iostream>
#include<string>
using namespace std;
string chinese[11] = { "零","一","二","三","四","五","六","七","八","九","十" }, add = "增加", depress = "减少";
int sum;
int transform(string number)
{
int i;
for (i = 0;; i++)
{
if (number == chinese[i])
{
break;
}
}
return i;
}
void process(string first)
{
string number;
getline(cin, number);
if (first == add)
{
sum = sum + transform(number);
}
else
{
sum = sum - transform(number);
}
}
void putout()
{
int a[10], n, i, t,l;
string outcome;
if (sum < 0) cout << "error!";
else {
n = sum;
if (sum <= 10) cout << chinese[sum];
else {
for (i = 1; n != 0; i++)
{
a[i] = n % 10;
n = n / 10;
}
if (a[i - 1] != 1) outcome = chinese[a[i - 1]];
if (a[i - 2] == 0) outcome = outcome + "十";
else {
for (t = i - 2; t > 0; t--)
{
l = a[t];
outcome = outcome + "十" + chinese[a[t]];
}
}
cout << sum << endl << outcome;
}
}
}
int main()
{
string begin, origin, later, first;int flag = 1;
for (int i = 1; i <= 3; i++)
getline(cin, begin, ' ');
getline(cin, origin);
sum = transform(origin);
do {
getline(cin, later, ' ');
if (later == "钱包")
{
getline(cin, first, ' ');process(first);
}
else
{
putout();flag = 0;
}
} while (flag);
return 0;
}
二、有关脚本的那些事!
第一个:编译脚本
我好难啊!
学习过程就不提了!
讲讲我遇到的问题
首先,我的思路的这样的,依次打开(type)文件,直至打开作业二.cpp,然后编译!
可想而知,我遇到了什么!
那就是满屏的代码!!
之后,我就仔细想想,这不太行,会不会是只要打开路径就好,在作业二.cpp所在的文件夹就行。
于是我就是试了试!
没想到,满屏代码消失了,却出现了令我闻风丧胆,看了就吐的这一段话!
<
'gcc' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
又又又找不到gcc了!!
我该怎么办,也只能百度了,于是可爱的网友告诉我要以下这样写!
但是,就在我开心的转圈圈的时候!!gcc它竟然找不到作业二.cpp了
所以!
我试了一遍又一遍都搞不定它,所以我只好灵机一动,把作业二.cpp复制在了脚本的文件夹了,然后成功了!!
哈哈哈!!
第二个:测试脚本
我开始因为是写一个批处理文件然后就相当于一个程序来测试,然后参考了其他同学的作业,才发现是,重新写一个.cpp来测试,测试脚本只是来运行它的??希望我的理解没有错。
首先根据我自己的代码吧,我觉得只有output函数最需要测试,这也是自己在写代码的时候修改最多的。
根据这个函数的性质,我的测试程序的功能是,输入一个数字(当然这个数字在0~99之间),得到正常的对应汉字可判断。
这很像在学习写作业的提交反馈哦。
我的测试代码:
#include<iostream>
using namespace std;
int sum;
string b[10] = { "九","十","二十","十五","九十九","三十五","六十六","十一","零","一" };
string chinese[11] = { "零","一","二","三","四","五","六","七","八","九","十" }, add = "增加", depress = "减少";
string output()
{
int a[10], n, i, t, l;
string outcome;
if (sum < 0) cout << "error!";
else {
n = sum;
if (sum <= 10) outcome=chinese[sum];
else {
for (i = 1; n != 0; i++)
{
a[i] = n % 10;
n = n / 10;
}
if (a[i - 1] != 1) outcome = chinese[a[i - 1]];
if (a[i - 2] == 0) outcome = outcome + "十";
else {
for (t = i - 2; t > 0; t--)
{
l = a[t];
outcome = outcome + "十" + chinese[a[t]];
}
}
}
}
return outcome;
}
int main()
{
string output();
int a[10] = {9,10,20,15,99,35,66,11,0,1},i;
for (i = 0; i < 10; i++)
{
sum = a[i];
if (output() == b[i])
cout << "pass" << endl;
else
cout << "error" << endl;
}
}
我的测试脚本和截图:
三、添一些功能?!
添加功能!
我看到题目的时候是惊呆的状态!这样可以??可以用代码写出来的??竟然要打开一个txt。
然后通过大佬的提示用freopen函数来写就好。于是粗粗看过百度对这个函数用法的介绍,我就上场写了,没想到,竟然成了!
我的代码:
int main()
{
string begin, origin, later, first;int flag = 1;
freopen("D:\\window批处理学习\\cin.txt","r" , stdin);
for (int i = 1; i <= 3; i++)
getline(cin, begin, ' ');
getline(cin, origin);
sum = transform(origin);
do {
getline(cin, later, ' ');
if (later == "钱包")
{
getline(cin, first, ' ');process(first);
}
else
{
putout();flag = 0;
}
} while (flag);
return 0;
}
结果:
创建仓库和上传代码!
首先,我先从群里下载了,GitHubdesktop,然后创建了自己的仓库
步骤如下
第一步在D盘新建一个文件夹,取名git
第二步点击软件页面菜单栏file后选择第一个new repository
第三步选择创建位置为文件夹git,取一个你喜欢的名字
第四步创建完成!
之后把你整理好的代码文件夹放在你新创建的仓库里!
之后就是commit(填写summary之后点击左下角)
再push它
ok了!