• 面向对象程序设计寒假作业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了!

  • 相关阅读:
    多线程编程(8)Timer
    WPF 元素的查找
    拖放操作和文件复制小功能
    gridview 编辑,删除,更新的用法
    VS2005 制作安装程序
    C# 学习基础概念二十五问
    DBHelper
    c# 实现网页上用户自动登陆|asp.net 模拟网站登录
    C#模拟登录总结
    Python 调用.net framework写的类库的方法
  • 原文地址:https://www.cnblogs.com/zouzou-1/p/12253815.html
Copyright © 2020-2023  润新知