zoukankan      html  css  js  c++  java
  • 面向对象程序设计寒假作业3

    这个作业属于哪个课程 2020面向对象程序设计张栋班
    这个作业的要求在哪里 面向对象程序设计寒假作业3
    这个作业的目标 1、对于代码拓展性的理解;2、优雅地命名函数;3、单元测试
    作业正文 2020面向对象程序设计寒假作业3
    其他参考文献 C++中,字符串比较函数strcmp()的用法指针与string类

    一、题目要求

    依旧是通过题目我读到的要求:

    1、 拓展性是什么?

    根据直播得来,我学习到的代码拓展性就是好不好加功能,加功能的时候不用修改太多更或者是重新写。

    2、 我想要加的功能?

    加入能读取汉字的两位数(例如二十,十一,二十一)!
    能够在钱包加加减减的过程中变化成负数(脱离现实嘛),报错!
    还有就是支持负数(好吧,就是要脱离现实)

    3、 我自己的代码拓展性好不好呢?

    在自己写这道题的时候好好的体会感受一下,再来回答!

    二、写题过程

    1、 我想加入输入两位数

    这是我通过看直播才想到的,真是为自己的智商担忧。
    我得到的思路就是读取和翻译出来两个要解决的问题。
    根据助教直播的时候用的是一位位比较读取,比如二十一,先读二,再读十,再读一。
    我也想尝试一下这种。
    但是,很不幸的是,我用的是string类,这样我得到汉字(例如二十一),根本就没办法用指针一位一位来读取,于是我痛下决心,嗯,改了string类。
    经过努力
    我把情况分为了汉字一位数(例如“五”),二位数(二十,十一),三位数(五十三)。
    分为三个函数来转换one two three
    分别如下:

    one:

    int one()
    {
    	char *cn,a[100]={0};
    	int i=0,t=0,j=0,n=0,m=0,sum1=0;
    	cn=number;	
    	for (i = 0;; i++)
    		{
    			if (strcmp(cn,chinese[i]) == 0)
    			{
    				break;
    			}
    		}
    	return sum1+i;	
    }
    

    two:

    int two()
    {
    	char *cn,a[100]={0};
    	int i=0,t=0,j=0,n=0,m=0,sum1=0;
    	cn=number;	
    	for(t=0,j=0;j<strlen(number);t++,j+=2)
    	{
    	for(m=0;m<2;n++,m++)
    	{
    		a[m]=number[n];//更新到下一个汉字
    	}
    	cn=a;
    	sum1=sum1+i;
    	for (i = 0;; i++)
    	{
    		if (strcmp(cn,chinese[i]) == 0)
    		{
    			break;
    		}
    	}
    	if(i!=10&&t==0)
    	return i*10;//二十,三十之类的这里出去
    	}
    	return sum1+i;//十一,十三这样的这里出去
    }
    

    three:

    int three()
    {
    	char *cn,a[100]={0};
    	int i=0,t=0,j=0,n[2]={0,4},m=0,sum1=0;
    	for(t=0;t<2;t++)
    	{
    	for(m=0;m<2;n[t]++,m++)//跳过二十三中的十的作用。
    	{
    		a[m]=number[n[t]];
    	}
    	cn=a;
    	sum1=sum1+i*t*10;	
    	for (i = 0;; i++)
    	{
    		if (strcmp(cn,chinese[i]) == 0)
    		{
    			break;
    		}
    	}
    	}
    	return sum1+i;
    }
    

    整体测试代码以及结果:

    #include<iostream>
    #include<string>
    #include<cstring>
    using namespace std;
    string  add = "增加", depress = "减少";
    const char *chinese[11] = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"};
    int sum=0,flag = 1;
    int one(char number[])
    {
    	char *cn,a[100]={0};
    	int i=0,t=0,j=0,n=0,m=0;
    	cn=number;	
    	for (i = 0;; i++)
    		{
    			if (strcmp(cn,chinese[i]) == 0)
    			{
    				break;
    			}
    		}
    	return sum+i;	
    }
    int two(char number[])
    {
    	char *cn,a[100]={0};
    	int i=0,t=0,j=0,n=0,m=0;
    	cn=number;	
    	for(t=0,j=0;j<strlen(number);t++,j+=2)
    	{
    	for(m=0;m<2;n++,m++)
    	{
    		a[m]=number[n];
    	}
    	cn=a;
    	sum=sum+i;
    	for (i = 0;; i++)
    	{
    		if (strcmp(cn,chinese[i]) == 0)
    		{
    			break;
    		}
    	}
    	if(i!=10)
    	return i*10;
    	}
    	sum=sum+i;
    	return sum;
    }
    int three(char number[])
    {
    	char *cn,a[100]={0};
    	int i=0,t=0,j=0,n[2]={0,4},m=0;
    	for(t=0,j=0;j<strlen(number);t++,j+=2)
    	{
    	for(m=0;m<2;n[t]++,m++)
    	{
    		a[m]=number[n[t]];
    	}
    	cn=a;
    	sum=sum+i*t*10;	
    	for (i = 0;; i++)
    	{
    		if (strcmp(cn,chinese[i]) == 0)
    		{
    			break;
    		}
    	}
    	}
    	return sum+i;
    }
    int  transform(char number[])
    {
    	char *cn,a[100]={0};
    	int i=0,t=0,j=0,n=0,m=0;
    	if(strlen(number)==2)
    	return	one(number);
    	else if(strlen(number)==4)
    	return two(number);
    	else
    	return three(number);
    
    }
    int main()
    {
    	char number[100]={0};
    	for(int i=1;i<=4;i++)
    	{
    	cin>>number;
    	cout<<transform(number);
    	}
    	return 0;
    }
    

    整个代码测试结果:

    2、 报错

    这是最有想法的了!从第一次作业就想解决的问题,!
    我的第一思路,添加一个判断的函数在每次的加(或者减)的时候判断,若出错,马上报错,返回0,停止process函数,并且不再读取,整个函数结束!
    但是我在写的过程中发现了另一个思路,啊啊啊啊,我最爱的flag!
    因为我在每行每行读取的时候,判断到看看钱包的时候用flag来结束输入,所以我再次借用这个flag,当sum<0的时候,flag=0,结束输入。
    步骤:

    1、 前提准备:先把flag改为全局变量,方便在其他函数里用。
    2、 函数本身:写judge函数
    3、 函数应用位置:经过思考,我觉得这个函数只要在减的过程中用就好。
    4、 测试一下

    Judge函数:

    void judge(int sum)
    {
    	if(sum<0)
    	{
    	flag=0;
    	cout<<"钱包的钱不够了!倒欠:"<<-sum<<"元";
    	} 
    
    }
    

    测试函数以及测试结果:

    #include<iostream>
    #include<string>
    using namespace std;
    string chinese[11] = { "零","一","二","三","四","五","六","七","八","九","十" }, add = "增加", depress = "减少";
    int sum,flag = 1;
    void judge(int sum)
    {
    	if(sum<0)
    	{
    	flag=0;
    	cout<<"钱包的钱不够了!倒欠:"<<-sum<<"元";
    	} 
    
    }
    int main()
    {
    	int sum[3]={0,-3,2};
    	for(int i=0;i<=2;i++)
    	{
    		judge(sum[i]);
    	}
    	return 0;
    }
    

    添加功能后的整个函数测试:

    3、 支持负数

    因为支持负数,所以就删除报错的功能先。
    我的思路,负数,就设置一个“负”的常量比较,有这个数就添加一个负号,在把这个数更新为正数(例如 负三 更新为三)尝试用一个判断函数judge2来写写看。

    judge2

    void judge2()
    {
    	symbol=1;
    	char*cn,a[100]={0};
    	for(int i=0;i<2;i++)
    	{
    		a[i]=number[i];
    	}
    	cn=a;
    	if(strcmp(cn,minuss) == 0)
    	{
    		symbol=-1;
    		for(int i=0,t=2;i<=strlen(number);i++,t++)
    		{
    			number[i]=number[t];
    		}
    	}
    }
    

    测试代码及结果

    #include<iostream>
    #include<string>
    #include<cstring>
    using namespace std;
    string  add = "增加", depress = "减少";
    const char *chinese[11] = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"},minuss[3]={"负"};
    int sum,symbol=1;
    int flag = 1;
    char number[100]={0};
    void judge2()
    {
    	char*cn,a[100]={0};
    	for(int i=0;i<2;i++)
    	{
    		a[i]=number[i];
    	}
    	cn=a;
    	if(strcmp(cn,minuss) == 0)
    	{
    		symbol=-1;
    		for(int i=0,t=2;i<=strlen(number);i++,t++)
    		{
    			number[i]=number[t];
    		}
    	}
    }
    int one()
    {
    	char *cn,a[100]={0};
    	int i=0,t=0,j=0,n=0,m=0;
    	cn=number;	
    	for (i = 0;; i++)
    		{
    			if (strcmp(cn,chinese[i]) == 0)
    			{
    				break;
    			}
    		}
    	return sum+i;	
    }
    int two()
    {
    	char *cn,a[100]={0};
    	int i=0,t=0,j=0,n=0,m=0;
    	cn=number;	
    	for(t=0,j=0;j<strlen(number);t++,j+=2)
    	{
    	for(m=0;m<2;n++,m++)
    	{
    		a[m]=number[n];
    	}
    	cn=a;
    	sum=sum+i;
    	for (i = 0;; i++)
    	{
    		if (strcmp(cn,chinese[i]) == 0)
    		{
    			break;
    		}
    	}
    	if(i!=10&&t==0)
    	return i*10;
    	}
    	return sum+i;
    }
    int three()
    {
    	char *cn,a[100]={0};
    	int i=0,t=0,j=0,n[2]={0,4},m=0;
    	for(t=0;t<2;t++)
    	{
    	for(m=0;m<2;n[t]++,m++)
    	{
    		a[m]=number[n[t]];
    	}
    	cn=a;
    	sum=sum+i*t*10;	
    	for (i = 0;; i++)
    	{
    		if (strcmp(cn,chinese[i]) == 0)
    		{
    			break;
    		}
    	}
    	}
    	return sum+i;
    }
    int  transform()
    {
    	symbol=1;
    	judge2(); 
    	if(strlen(number)==2)
    	return	symbol*one();
    	else if(strlen(number)==4)
    	return symbol*two();
    	else
    	return symbol*three();
    
    }
    int main()
    {
    	for(int i=1;i<=4;i++)
    	{
    	sum=0;
    	cin>>number;
    	cout<<transform();
    	}
    	return 0;
    }
    

    结果:

    三、完整代码

    先评价一下,我觉得自己的代码添加功能还是比较容易的。所以拓展性还可以啦!

    #include<iostream>
    #include<string>
    #include<cstring>
    using namespace std;
    string  add = "增加", depress = "减少";
    const char *chinese[11] = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"},minuss[3]={"负"};
    int sum,symbol=1;
    int flag = 1;
    char number[100]={0};
    int one()
    {
    	char *cn,a[100]={0};
    	int i=0,t=0,j=0,n=0,m=0,sum1=0;
    	cn=number;	
    	for (i = 0;; i++)
    		{
    			if (strcmp(cn,chinese[i]) == 0)
    			{
    				break;
    			}
    		}
    	return sum1+i;	
    }
    int two()
    {
    	char *cn,a[100]={0};
    	int i=0,t=0,j=0,n=0,m=0,sum1=0;
    	cn=number;	
    	for(t=0,j=0;j<strlen(number);t++,j+=2)
    	{
    	for(m=0;m<2;n++,m++)
    	{
    		a[m]=number[n];
    	}
    	cn=a;
    	sum1=sum1+i;
    	for (i = 0;; i++)
    	{
    		if (strcmp(cn,chinese[i]) == 0)
    		{
    			break;
    		}
    	}
    	if(i!=10&&t==0)
    	return i*10;
    	}
    	return sum1+i;
    }
    int three()
    {
    	char *cn,a[100]={0};
    	int i=0,t=0,j=0,n[2]={0,4},m=0,sum1=0;
    	for(t=0;t<2;t++)
    	{
    	for(m=0;m<2;n[t]++,m++)
    	{
    		a[m]=number[n[t]];
    	}
    	cn=a;
    	sum1=sum1+i*t*10;	
    	for (i = 0;; i++)
    	{
    		if (strcmp(cn,chinese[i]) == 0)
    		{
    			break;
    		}
    	}
    	}
    	return sum1+i;
    }
    /*void judge(int sum)
    {
    	if(sum<0)
    	{
    	flag=0;
    	cout<<"钱包的钱不够了!倒欠:"<<-sum<<"元";
    	} 
    
    }*/
    void judge2()
    {
    	symbol=1;
    	char*cn,a[100]={0};
    	for(int i=0;i<2;i++)
    	{
    		a[i]=number[i];
    	}
    	cn=a;
    	if(strcmp(cn,minuss) == 0)
    	{
    		symbol=-1;
    		for(int i=0,t=2;i<=strlen(number);i++,t++)
    		{
    			number[i]=number[t];
    		}
    	}
    }
    int  transform()
    {
    	judge2(); 
    	if(strlen(number)==2)
    	return	symbol*one();
    	else if(strlen(number)==4)
    	return symbol*two();
    	else
    	return symbol*three();
    
    }
    void process(string first)
    {
        cin>>number;
        getchar();
    	if (first == add)
    	{
    		sum = sum + transform();
    	}
    	else
    	{
    		sum = sum - transform();
    		//judge(sum);
    	}
    }
    void putout()
    {
    	int a[10], n, i, t,l;
    	string outcome;
    	if (sum < 0) 
    	{
    		cout << "负";
    		sum=-sum;
    	}
    		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 << outcome;
    		}
    }
    int main()
    {
    	string begin,later, first;
    	for (int i = 1; i <= 3; i++)
    	getline(cin, begin, ' ');
    	cin>>number;
    	getchar();
    	sum = transform();
    	do {
    		getline(cin, later, ' ');
    		if (later == "钱包")
    		{
    			getline(cin, first, ' ');process(first);
    		}
    		else
    		{
    			putout();flag = 0;
    		}
    	} while (flag);
    	return 0;
    }
    
  • 相关阅读:
    [转]面向接口编程详解(二)——编程实例
    [转]面向接口编程详解(一)——思想基础
    [转] LINQ to SQL快速上手 step by step
    Java备份MySQl数据库,并备份图片数据
    用密码密码拦截
    引用 MySQL集群:主从数据库配置 实现查询负载
    Oracle 对表操作 提示:资源正忙,要求指定nowait
    Jquery一款非好的图片轮换效果
    CodeBlocks集成ObjectiveC开发 Windows下学习ObjectiveC
    查询指定库中所有表
  • 原文地址:https://www.cnblogs.com/zouzou-1/p/12310583.html
Copyright © 2011-2022 走看看