Fork me on GitHub

寒假作业三

这个作业属于哪个课程 2020年面向对象程序设计
这个作业要求在哪里 寒假作业3
这个作业的目标 完善作业二代码、优化架构、拓展功能、对函数功能进行单元测试
作业正文 寒假作业3

增加新功能

1.扩大数字范围

之前输入的数值范围限制为0-10之间,现在改进为0-99之间。需要考虑到:

  • 一个汉字占两个字符。
  • 中文对于11到99数字的表达习惯不同,需要两个汉字表达的可以是“十三”(11-19)或者“二十”(整十数),需要三个汉字表达的如“五十二”等。

所以需要先对输入的数据进行范围判定,而后再根据不同情况进行具体的数据处理,具体代码如下:

int convert1(char num[])
{
	int len=strlen(num);
	char x[10],y[10];
	int a,b;
	if(len==2)
	{
		if (strcmp(num, "一") == 0)
			return 1;
		else if (strcmp(num, "二") == 0)
			return 2;
		else if (strcmp(num, "三") == 0)
			return 3;
		else if (strcmp(num, "四") == 0)
			return 4;
		else if (strcmp(num, "五") == 0)
			return 5;
		else if (strcmp(num, "六") == 0)
			return 6;
		else if (strcmp(num, "七") == 0)
			return 7;
		else if (strcmp(num, "八") == 0)
			return 8;
		else if (strcmp(num, "九") == 0)
			return 9;
		else if (strcmp(num, "零") == 0)
			return 0;
		else if (strcmp(num, "十") == 0)
		return 10;
	}
	else if(len==4)
	{
		x[0]=num[0];x[1]=num[1];
		y[0]=num[2];y[1]=num[3];
		a=convert1(x);b=convert1(y);
		if(a==10)
		return a+b;
		else
		return a*10;
	}
	else if(len==6)
	{
		x[0]=num[0];x[1]=num[1];
		y[0]=num[4];y[1]=num[5];
		a=convert1(x);b=convert1(y);
		return 10*a+b;
	}
}

对convert1函数测试代码如下:

#include <stdio.h>
#include <string.h>
int convert1(char num[])
{
	int len=strlen(num);
	char x[10],y[10],z[10];
	int a,b;
	if(len==2)
	{
		if (strcmp(num, "一") == 0)
			return 1;
		else if (strcmp(num, "二") == 0)
			return 2;
		else if (strcmp(num, "三") == 0)
			return 3;
		else if (strcmp(num, "四") == 0)
			return 4;
		else if (strcmp(num, "五") == 0)
			return 5;
		else if (strcmp(num, "六") == 0)
			return 6;
		else if (strcmp(num, "七") == 0)
			return 7;
		else if (strcmp(num, "八") == 0)
			return 8;
		else if (strcmp(num, "九") == 0)
			return 9;
		else if (strcmp(num, "零") == 0)
			return 0;
		else if (strcmp(num, "十") == 0)
		return 10;
	}
	else if(len==4)
	{
		x[0]=num[0];x[1]=num[1];
		y[0]=num[2];y[1]=num[3];
		a=convert1(x);b=convert1(y);
		if(a==10)
		return a+b;
		else
		return a*10;
	}
	else if(len==6)
	{
		x[0]=num[0];x[1]=num[1];
		y[0]=num[4];y[1]=num[5];
		a=convert1(x);b=convert1(y);
		return 10*a+b;
	}
}
int main()
{
	int n;
	n=convert1("三十");
	//printf("%d\n",n);
	if(n==30) 
	printf("pass\n");
 	else
 	printf("error\n");
 	n=convert1("十三");
	if(n==13) 
	printf("pass\n");
 	else
 	printf("error\n");
 	n=convert1("二十二");
	if(n==22)  
	printf("pass\n");
 	else
 	printf("error\n");
 }
  

运行结果如下:

2.增加输出负数功能

考虑到运行结果可能是负数,所以在output函数中再添一种情况,即计算结果是负数,增加代码如下:

if(n<0)
    {
    	printf("负");
		n=-n;
		output(n); 
	}

output函数完整代码如下:

void output(int n)
{ 
    if(n<0)
    {
    	printf("负");
		n=-n;
		output(n); 
	}
	else if (n<=10)
    {
        printf("%s",convert2(n));
    }
    else if(n%10==0&&n<100)
    {
        printf("%s十",convert2(n/10));
    }
    else if (n<20)
    {
        n%=10;
        printf("十%s",convert2(n));
    }
    else if (n<100)
    {
        printf("%s十%s", convert2(n/10),convert2(n%10));
    }
}

增加运算法则,“乘以”,“除以”,增加代码如下:

else if(strcmp(b,"乘以")==0)
{
    result*=convert1(c);
}
else if(strcmp(b,"除以")==0)
{
	result/=convert1(c);
}

完整代码如下:

#include<stdio.h>
#include<string.h>
int convert1(char num[])
{
	int len=strlen(num);
	char x[10],y[10],z[10];
	int a,b;
	if(len==2)
	{
		if (strcmp(num, "一") == 0)
			return 1;
		else if (strcmp(num, "二") == 0)
			return 2;
		else if (strcmp(num, "三") == 0)
			return 3;
		else if (strcmp(num, "四") == 0)
			return 4;
		else if (strcmp(num, "五") == 0)
			return 5;
		else if (strcmp(num, "六") == 0)
			return 6;
		else if (strcmp(num, "七") == 0)
			return 7;
		else if (strcmp(num, "八") == 0)
			return 8;
		else if (strcmp(num, "九") == 0)
			return 9;
		else if (strcmp(num, "零") == 0)
			return 0;
		else if (strcmp(num, "十") == 0)
		return 10;
	}
	else if(len==4)
	{
		x[0]=num[0];x[1]=num[1];
		y[0]=num[2];y[1]=num[3];
		a=convert1(x);b=convert1(y);
		if(a==10)
		return a+b;
		else
		return a*10;
	}
	else if(len==6)
	{
		x[0]=num[0];x[1]=num[1];
		y[0]=num[4];y[1]=num[5];
		a=convert1(x);b=convert1(y);
		return 10*a+b;
	}
}
char* convert2(int n)
{
    if (n == 0)  return "零";
    else if (n == 1) return "一";
    else if (n == 2) return "二";
    else if (n == 3) return "三";
    else if (n == 4) return "四";
    else if (n == 5) return "五";
    else if (n == 6) return "六";
    else if (n == 7) return "七";
    else if (n == 8) return "八";
    else if (n == 9) return "九";
    else if (n == 10) return "十";
}
void output(int n)
{ 
    if(n<0)
    {
    	printf("负");
		n=-n;
		output(n); 
	}
	else if (n<=10)
    {
        printf("%s",convert2(n));
    }
    else if(n%10==0&&n<100)
    {
        printf("%s十",convert2(n/10));
    }
    else if (n<20)
    {
        n%=10;
        printf("十%s",convert2(n));
    }
    else if (n<100)
    {
        printf("%s十%s", convert2(n/10),convert2(n%10));
    }
}
int main()
{
    int result;
    char a[10],name[10],b[10],c[10];
    /*printf("输入文件名\n"); 
	 char s[10];
	 scanf("%s",s);
	 freopen(s,"r",stdin);*/
   scanf("%s %s %s %s",a,name,b,c);
    if(strcmp(a,"整数")!=0||strcmp(b,"等于")!=0)
    {printf("输入错误\n");
     return 0;
    }
    result=convert1(c);
    while(1)
    {
	    scanf ("%s ",name);
	    if(strcmp(name,"看看")!=0)
		{
			scanf("%s %s",b,c);
			if(strcmp(b,"增加")==0)
			{
				result+=convert1(c);
			}
			else if(strcmp(b,"减少")==0)
			{
				result-=convert1(c);
			}
			else if(strcmp(b,"乘以")==0)
			{
				result*=convert1(c);
			}
			else if(strcmp(b,"除以")==0)
			{
				result/=convert1(c);
			}
		}
		else break;
	}
    output(result);
    return 0;
}

对完整代码进行部分数据测试:

关于测试脚本,编译脚本

参考寒假作业二

反思

还可以将数据范围扩展到更大,以及输入负数等

posted @ 2020-02-16 17:35  TJThunder  阅读(157)  评论(0)    收藏  举报