面向对象程序设计寒假作业1(编程题)

这个作业属于哪个课程 2020面向对象程序设计张栋班
这个作业要求在哪里 面向对象程序设计寒假作业1
这个作业的目标 按照要求完成简单文言文编程的相关功能
其他参考文献
ps:因为能力有限加上本人有点懒,所以该程序仅支持数据范围在0~99内的处理和很差的错误提示以及代码不够简练,如有大佬发现我的代码有不足之处,请指正,希望日后能改进程序。

1、思考题目所需要的功能

  • (1)数字转换成为汉字需要考虑以下特殊情况:
    • 0~9的数字
    • 10~19的数字
    • 整十的数字
      在这里我设置了一个字符数组记录0~10的数字
char hz[11][10]={"零","一","二","三","四","五","六","七","八","九","十"};

然后分情况处理对应的特殊情况
然后我写了一个函数来完成:

if(num>=10)
{
	if(num%10==0)
	{
		if(num==10)
		{
			printf("%s\n",hz[10]);
		}
		else
		{
		printf("%s%s\n",hz[num/10],hz[10]);
		}
	}
	else
	{
		if(num<20)
		{
			printf("%s%s\n",hz[10],hz[num%10]);
		}
		else
		{
			printf("%s%s%s\n",hz[num/10],hz[10],hz[num%10]);
		}
	}
}
else
{
	printf("%s\n",hz[num]);
}
  • (2)汉字转换为数字:
    这里我了解到gbk编码一个汉字为两个字节,于是我想到用strlen函数先量取字符串长度,因为范围在0~99,因此可以得出字符串长度仅可为2、4、6;
    • 当长度为6时,提取字符串头两个和最后两个位,利用循环在hz数组中对比相应的汉字数字
    • 当长度为4和2时,仅需提取头两位进行循环对比
      函数代码如下:
int hz_to_num(char* str)
{
	char a[10],b[10];
	int len,i,j;
	len=strlen(str);
	if(len==4)
	{
		a[0]=str[0];
		a[1]=str[1];
		b[0]=str[2];
		b[1]=str[3];
		if(strcmp(b,hz[10])==0)
		{
			for(i=0;i<11;i++)
			{
				if(strcmp(a,hz[i])==0)
				{
					return i*10;
				}
			}
		}
		else
		{
			for(i=0;i<10;i++)
			{
				if(strcmp(b,hz[i])==0)
				{
					return i+10;
				}
			}
		}
	}
	else if(len==6)
	{
		a[0]=str[0];
		a[1]=str[1];
		b[0]=str[4];
		b[1]=str[5];
		b[2]=0;//这里十分不解,自己也是试了几遍才试出来,需要加上一个'\0',感觉是内存分配出了问题,但是不知道为什么
		for(i=0;i<10;i++)
		{
			if(strcmp(a,hz[i])==0)
			{
				for(j=0;j<11;j++)
				{
					if(strcmp(b,hz[j])==0)
					{
						return i*10+j;
					}
				}
			}
		}
	}
	else if(len==2)
	{
		a[0]=str[0];
		a[1]=str[1];
		for(i=0;i<11;i++)
		{
			if(strcmp(a,hz[i])==0)
			{
				return i;
			}
		}
	}
}
  • (3)计算功能
    这里引入关键字字符数组:
char keywords[5][20]={"整数","等于","增加","减少","看看"};

该功能需要结合前两个函数进行计算代码如下:

int calculate(int num,char* command,char* number)
{
	int n;
	if(strcmp(command,keywords[2])==0)
	{
		n=hz_to_num(number);
		//printf("%d\n",n);
		num+=n; 
		return num;
	}
	else if(strcmp(command,keywords[3])==0)
	{
		n=hz_to_num(number);
		num-=n;
		return num;
	}
}

2、直接给出代码

#include<stdio.h>
#include<string.h>
int hz_to_num(char* str); 
char hz[11][10]={"零","一","二","三","四","五","六","七","八","九","十"};
char keywords[5][20]={"整数","等于","增加","减少","看看"};
int calculate(int num,char* command,char* number)
{
	int n;
	if(strcmp(command,keywords[2])==0)
	{
		n=hz_to_num(number); 
		num+=n;
		return num;
	}
	else if(strcmp(command,keywords[3])==0)
	{
		n=hz_to_num(number);
		num-=n;
		return num;
	}
}
int hz_to_num(char* str)
{
	char a[10],b[10];
	int len,i,j;
	len=strlen(str);
	if(len==4)
	{
		a[0]=str[0];
		a[1]=str[1];
		b[0]=str[2];
		b[1]=str[3];
		if(strcmp(b,hz[10])==0)
		{
			for(i=0;i<11;i++)
			{
				if(strcmp(a,hz[i])==0)
				{
					return i*10;
				}
			}
		}
		else
		{
			for(i=0;i<10;i++)
			{
				if(strcmp(b,hz[i])==0)
				{
					return i+10;
				}
			}
		}
	}
	else if(len==6)
	{
		a[0]=str[0];
		a[1]=str[1];
		b[0]=str[4];
		b[1]=str[5];
		b[2]=0;
		for(i=0;i<10;i++)
		{
			if(strcmp(a,hz[i])==0)
			{
				for(j=0;j<11;j++)
				{
					if(strcmp(b,hz[j])==0)
					{
						return i*10+j;
					}
				}
			}
		}
	}
	else if(len==2)
	{
		a[0]=str[0];
		a[1]=str[1];
		for(i=0;i<11;i++)
		{
			if(strcmp(a,hz[i])==0)
			{
				return i;
			}
		}
	}
}
int num_to_hz(int num)
{
	if(num>=10)
	{
		if(num%10==0)
		{
			if(num==10)
			{
				printf("%s\n",hz[10]);
			}
			else
			{
				printf("%s%s\n",hz[num/10],hz[10]);
			}
		}
		else
		{
			if(num<20)
			{
				printf("%s%s\n",hz[10],hz[num%10]);
			}
			else
			{
				printf("%s%s%s\n",hz[num/10],hz[10],hz[num%10]);
			}
		}
	}
	else
	{
		printf("%s\n",hz[num]);
	}
}
int main()
{
	char name[20],command[100][20];
	int i=0,target;
	scanf("%s",command[i++]);
	if(strcmp(command[i-1],keywords[0])==0)
	{
		scanf("%s",name);
		scanf("%s",command[i++]);
		if(strcmp(command[i-1],keywords[1])==0)
		{
			scanf("%s",command[i++]);
			target=hz_to_num(command[i-1]);	
		}
		else
		{
			printf("输入错误!\n"); 
			return 0; 
		}		
	}
	else
	{
		printf("错误,请先定义变量!\n");
	}
	while(1)
	{
		scanf("%s",command[i++]);
		if(strcmp(command[i-1],keywords[4])==0)
		{
			scanf("%s",command[i++]);
			if(strcmp(command[i-1],name)==0)
			{
				num_to_hz(target);
				return 0;
			}
			else
			{
				printf("输入名称错误!\n"); 
			}
		}
		else if(strcmp(command[i-1],name)==0)
		{
			scanf("%s",command[i++]);
			scanf("%s",command[i++]);
			target=calculate(target,command[i-2],command[i-1]);
		}
		else
		{
			printf("输入名称错误!\n");
		}
	}	
}

 

3、下面是我的几个测试样例




posted @ 2020-01-25 17:26  骇人的籽  阅读(182)  评论(0编辑  收藏  举报