作业1编程题

面向对象程序设计第一次作业(编程题)

这个作业属于哪个课程 2020年面向对象程序设计
这个作业要求在哪里 面向对象程序设计寒假作业1
这个作业的目标 实现白话文编程,学会写博客
作业正文 编程题
其他参考文献 C语言中汉字的存储和输出

编程题

题目要求如下:

中国文化博大精深,从仓颉造字开始,汉字一直流传到了今天。我们在感叹汉字的源远流长时,也不禁感慨,为什么没有一门使用汉字编程的语言?
汉字真的不能编程吗?最近文言文编程火了一把,吾有一數。曰三。名之曰「甲」。这朴实无华的变量定义无疑不是几千年来中华文化的发展中一朵奇葩。
今天小王同学想,文言文能编程那白话文呢?他找到了你,让你帮帮他。

编程要求
编写一个程序,输入满足以下语法要求的一段文字,输出运行后的结果。
变量定义:整数 钱包 等于 零
运算(加法):钱包 增加 四
运算(减法):钱包 减少 四
输出:看看 钱包

样例
输入:

整数 钱包 等于 零
钱包 增加 四
钱包 减少 三
看看 钱包

输出:

注意:

输入输出用例均为GBK编码,推荐使用vscode把文本切换为GBK编码。
数字只会出现以下 零一二三四五六七八九十 。

思考过程:

  • 首先阅读题目,分别有变量定义,变量名称,运算类型,数值,四类组成。
    程序要实现的功能:
  • 将中文数字转化为阿拉伯数字
  • 将阿拉伯数字转化为中文数字
  • 判断进行的运算种类(等于,增加,减少)再进行相应运算。

具体过程

  • 首先我查阅资料得出汉字占两个字节
  • 我定义全局变量二维数组存储字符串,效果等于指针数组。
  • 建立两个函数模块,作用分别是将中文数字转为阿拉伯数字和将阿拉伯数字转为中文数字。
#include<stdio.h>
#include<string.h>
char str[11][4]={"零","一","二","三","四","五","六","七","八","九","十"};
int exchange(char a[]); 
void inexchange(int sum);
  • 将中文数字转为阿拉伯数字(int exchange):根据我们平时的说法,我分为了三种情况,0-10(中文常说“几”)的情况,11-20及10的倍数(中文常说“十几和几十”),和其余的情况(中文常说“几十几”)。
  • 11-20及10的倍数及其余情况:我建立了新的数组,将原本的数据分为两部分,因为汉字是占两个字节,所以将前两个和后个分开存到新的数组里,作为个位和十位。
int exchange(char a[])//汉字转数字// 
{
	int i,j,n;
	char tens[10],unit[10];
    n=strlen(a);
    if(n==2)//0-10// 
	{
		for(i=0;i<=10;i++)
	    {
            if((strcmp(a,str[i])==0))
            return i;
	    }
	}
	if(n==4)//11-20,10的倍数// 
	{
		for(i=0;i<2;i++)
		{
			tens[i]=a[i];
		} 
		for(i=2;i<4;i++)
		{
			unit[i-2]=a[i];
		}
		if(strcmp(tens,"十")==0)
		{
			for(i=0;i<=10;i++)
			{
				if(strcmp(unit,str[i])==0)
				return 10+i;
			} 
		}
		if(strcmp(unit,"十")==0)
		{
			for(i=0;i<=10;i++)
			{
				if(strcmp(tens,str[i])==0)
				return i*10;
			}
		}	
	}
	else//几十几// 
	{
		int sum;
		for(i=0;i<2;i++)
		{
			tens[i]=a[i];
		} 
		for(i=4;i<6;i++)
		{
			unit[i-4]=a[i];
		}
		for(i=0;i<=10;i++)
		{
			if(strcmp(tens,str[i])==0)
			sum=i*10;
		}
		for(i=0;i<=10;i++)
		{ 
			if(strcmp(unit,str[i])==0)
			sum+=i;
		}
		return sum;
	}
  • 阿拉伯数字转为中文数字(void inexchange):同样分为三个部分,建立新的整型变量,储存十位和个位数字,分别转化为中文数字。(这里要注意一点,例如得到50,我们中文常说“五十”,但如果不做处理的话,会得到“五零”,所以要特殊处理这类情况)
void inexchange(int sum)//数字转文本// 
{
	int unit,tens;
	if(sum<=10)//0-10//
	printf("%s\n",str[sum]); 
	else if(sum>=11<=20||sum%10==0)
	{
		unit=sum%10;
		tens=sum/10;
		if(sum%10==0)
		printf("%s十",str[tens]);
		else
		printf("%s%s\n",str[tens],str[unit]);
		 
	}
	else
	{
		unit=sum%10;
		tens=sum/10;
		printf("%s十%s\n",str[tens],str[unit]);
	}
}
  • 判断运算种类和进行运算我全部放倒了主函数内,先初始化总数,存入变量sum中。
  • 判断op字符数组内是哪种运算类型,再分别进行运算,如果不是规定的运算种类,则报错。
int main()
{
	char var[10],name[100],op[100],num[10];//变量类型,变量名,运算// 
	scanf("%s %s %s %s",var,name,op,num); 
	int sum,a; 
    sum=exchange(num);//初始化// 
	
	while((scanf("%s",name))!=EOF)//运算// 
	{
	    if(strcmp(name,"看看")!=0)
		{
			scanf("%s %s",op,num);
			if(strcmp(op,"增加")==0)
		    {
			    a=exchange(num);
			    sum+=a; 
	        }
		    else if(strcmp(op,"减少")==0)
		    {
			    a=exchange(num);
			    sum-=a;
	        } 
		    else
		    printf("错误操作");	
		}
		else 
		{
			scanf("%s",op);//注意此时name存储的是操作,op存储的是变量名字//
			inexchange(sum);
		}	 
	}
	
}

完整代码

#include<stdio.h>
#include<string.h>
char str[11][4]={"零","一","二","三","四","五","六","七","八","九","十"};
int exchange(char a[]); 
void inexchange(int sum);
int main()
{
	char var[10],name[100],op[100],num[10];//变量类型,变量名,运算// 
	scanf("%s %s %s %s",var,name,op,num); 
	int sum,a; 
    sum=exchange(num);//初始化// 
	
	while((scanf("%s",name))!=EOF)//运算// 
	{
	    if(strcmp(name,"看看")!=0)
		{
			scanf("%s %s",op,num);
			if(strcmp(op,"增加")==0)
		    {
			    a=exchange(num);
			    sum+=a; 
	        }
		    else if(strcmp(op,"减少")==0)
		    {
			    a=exchange(num);
			    sum-=a;
	        } 
		    else
		    printf("错误操作");	
		}
		else 
		{
			scanf("%s",op);//注意此时name存储的是操作,op存储的是变量名字//
			inexchange(sum);
		}	 
	}
	
}
int exchange(char a[])//汉字转数字// 
{
	int i,j,n;
	char tens[10],unit[10];
    n=strlen(a);
    if(n==2)//0-10// 
	{
		for(i=0;i<=10;i++)
	    {
            if((strcmp(a,str[i])==0))
            return i;
	    }
	}
	if(n==4)//11-20,10的倍数// 
	{
		for(i=0;i<2;i++)
		{
			tens[i]=a[i];
		} 
		for(i=2;i<4;i++)
		{
			unit[i-2]=a[i];
		}
		if(strcmp(tens,"十")==0)
		{
			for(i=0;i<=10;i++)
			{
				if(strcmp(unit,str[i])==0)
				return 10+i;
			} 
		}
		if(strcmp(unit,"十")==0)
		{
			for(i=0;i<=10;i++)
			{
				if(strcmp(tens,str[i])==0)
				return i*10;
			}
		}	
	}
	else//几十几// 
	{
		int sum;
		for(i=0;i<2;i++)
		{
			tens[i]=a[i];
		} 
		for(i=4;i<6;i++)
		{
			unit[i-4]=a[i];
		}
		for(i=0;i<=10;i++)
		{
			if(strcmp(tens,str[i])==0)
			sum=i*10;
		}
		for(i=0;i<=10;i++)
		{ 
			if(strcmp(unit,str[i])==0)
			sum+=i;
		}
		return sum;
	}
}
void inexchange(int sum)//数字转文本// 
{
	int unit,tens;
	if(sum<=10)//0-10//
	printf("%s\n",str[sum]); 
	else if(sum>=11<=20||sum%10==0)
	{
		unit=sum%10;
		tens=sum/10;
		if(sum%10==0)
		printf("%s十\n",str[tens]);
		else
		printf("%s%s\n",str[tens],str[unit]);
		 
	}
	else
	{
		unit=sum%10;
		tens=sum/10;
		printf("%s十%s\n",str[tens],str[unit]);
	}
}

测试数据

posted @ 2020-01-26 15:25  .Hui  阅读(174)  评论(0编辑  收藏  举报