寒假作业1 编程题
作业描述 | 详情 |
---|---|
这个作业属于哪个课程 | 2020面向对象程序设计 |
这个作业要求在哪里 | 面向对象程序设计寒假作业1 |
这个作业的目标 | 完成编程题,实现中文编程。 |
作业正文 | 面向对象程序设计寒假作业1 编程题 |
其他参考文献 | 无 |
三、编程题
(请使用C语言或者C++完成以下题目):
中国文化博大精深,从仓颉造字开始,汉字一直流传到了今天。我们在感叹汉字的源远流长时,也不禁感慨,为什么没有一门使用汉字编程的语言?
汉字真的不能编程吗?最近文言文编程火了一把,吾有一數。曰三。名之曰「甲」。这朴实无华的变量定义无疑不是几千年来中华文化的发展中一朵奇葩。
今天小王同学想,文言文能编程那白话文呢?他找到了你,让你帮帮他。
-
编程要求
编写一个程序,输入满足以下语法要求的一段文字,输出运行后的结果。
变量定义:整数 钱包 等于 零
运算(加法):钱包 增加 四
运算(减法):钱包 减少 四
输出:看看 钱包 -
样例
输入:
整数 钱包 等于 零
钱包 增加 四
钱包 减少 三
看看 钱包
输出:
一 -
注意:
输入输出用例均为GBK编码,推荐使用vscode把文本切换为GBK编码。
数字只会出现以下 零一二三四五六七八九十 。 -
编程题要求:
1.读题,提取出题目的要求。
2.分解需求,把需求分解为几个你觉得不太相关的模块。
3.思考每个模块怎么写,可以从简单的模块开始写。
4.对于不会的问题进行查阅资料。
5.对于每一个模块设计测试用例。
6.详细记录下以上每一步,并写在博客中。
7.不要求完全做出来,但要求记录详细。
8.建议博客长度不少于1000字(不包含代码)。
-
题目要求:
编写一个程序,输入满足以下语法要求的一段文字,输出运行后的结果。
变量定义:整数 钱包 等于 零
运算(加法):钱包 增加 四
运算(减法):钱包 减少 四
输出:看看 钱包 -
分解需求:
模块一:
根据题意的输入格式
模块二:
将中文的“一二三……十”转换为数字“1,2,3……,10”
模块三:
将数字转换为中文
模块四:
将中文的“增加,减少,乘以,除以”转换为“+-*/” -
思考解法
模块一:根据题意的输入格式
“整数 钱包 等于 零” 此行单独输入,“钱包 增加 四” 这种类型的循环输入,到出现“看看”时,再进行一次输入后,使用break跳出循环。
代码实现:
int main()
{
int n,p;
char str1[100],str2[100],str3[100],str4[100];
scanf("%s %s %s %s",&str1,&str2,&str3,&str4);
n=zhuanhuan(str4);
for(;;)
{
scanf("%s",str1);
if(strcmp(str1,"看看")==0)
{
scanf("%s",str2);
break;
}
else
{
scanf("%s %s",str2,str3);
p=zhuanhuan(str3);
n=jisuan(str2,n,p);
}
}
zhuanhuan2(n);
return 0;
}
模块二:将中文的“一二三……十”转换为数字“1,2,3……,10”
我没有弄明白怎么用gbk码,最后选择了用strcmp处理,例如:if(strcmp(str,"十")==0) return 10;
不过目前我还处理不了大于十的输入,除非我从“一”一直列举到“九十九”,等解决了以后再补充。
代码实现:
int zhuanhuan(char a[100])
{
if(strcmp(a,"零")==0)
return 0;
else if(strcmp(a,"一")==0)
return 1;
else if(strcmp(a,"二")==0)
return 2;
else if(strcmp(a,"三")==0)
return 3;
else if(strcmp(a,"四")==0)
return 4;
else if(strcmp(a,"五")==0)
return 5;
else if(strcmp(a,"六")==0)
return 6;
else if(strcmp(a,"七")==0)
return 7;
else if(strcmp(a,"八")==0)
return 8;
else if(strcmp(a,"九")==0)
return 9;
else if(strcmp(a,"十")==0)
return 10;
}
模块三:将数字转换为中文
我将数字分为小于等于十和大于十的情况处理。
- 小于等于十的情况直接转化输出
- 大于十的情况,将数字的两位数分别取出,例如:第一位是3,则直接输出三十,第二位是4,则输出四,最后可得到结果三十四
代码实现:
char zhuanhuan2(int e)
{
int j,k;
if(e<=10)
{
if(e==0)
printf("零");
else if(e==1)
printf("一");
else if(e==2)
printf("二");
else if(e==3)
printf("三");
else if(e==4)
printf("四");
else if(e==5)
printf("五");
else if(e==6)
printf("六");
else if(e==7)
printf("七");
else if(e==8)
printf("八");
else if(e==9)
printf("九");
else if(e==10)
printf("十");
}
else
{
j=e%10;
e=e/10;
k=e;
if(k==1)
printf("一十");
else if(k==2)
printf("二十");
else if(k==3)
printf("三十");
else if(k==4)
printf("四十");
else if(k==5)
printf("五十");
else if(k==6)
printf("六十");
else if(k==7)
printf("七十");
else if(k==8)
printf("八十");
else if(k==9)
printf("九十");
else if(k==10)
printf("一百");
if(j==1)
printf("一");
else if(j==2)
printf("二");
else if(j==3)
printf("三");
else if(j==4)
printf("四");
else if(j==5)
printf("五");
else if(j==6)
printf("六");
else if(j==7)
printf("七");
else if(j==8)
printf("八");
else if(j==9)
printf("九");
}
}
模块四:将中文的“增加,减少,乘以,除以”转换为“+-*/”
同样使用strcmp,例如:if(strcmp(str,"乘以")==0)
进行乘法运算。
代码实现:
int jisuan(char b[100],int c,int d)
{
if(strcmp(b,"增加")==0)
c=c+d;
if(strcmp(b,"减少")==0)
c=c-d;
if(strcmp(b,"乘以")==0)
c=c*d;
if(strcmp(b,"除以")==0)
c=c/d;
return c;
}
- 测试样例:
模块一:根据题意的输入格式
模块二:将中文的“一二三……十”转换为数字“1,2,3……,10”
模块三:将数字转换为中文
模块四:
将中文的“增加,减少,乘以,除以”转换为“+-*/”
任意不大于十的输入样例:
- 完整代码
#include<stdio.h>
#include<string.h>
int zhuanhuan(char a[100]);
int jisuan(char b[100],int c,int d);
char zhuanhuan2(int e);
char str5[100],str6[100];
int main()
{
int n,p;
char str1[100],str2[100],str3[100],str4[100];
scanf("%s %s %s %s",&str1,&str2,&str3,&str4);
n=zhuanhuan(str4);
for(;;)
{
scanf("%s",str1);
if(strcmp(str1,"看看")==0)
{
scanf("%s",str2);
break;
}
else
{
scanf("%s %s",str2,str3);
p=zhuanhuan(str3);
n=jisuan(str2,n,p);
}
}
zhuanhuan2(n);
return 0;
}
int zhuanhuan(char a[100])
{
if(strcmp(a,"零")==0)
return 0;
else if(strcmp(a,"一")==0)
return 1;
else if(strcmp(a,"二")==0)
return 2;
else if(strcmp(a,"三")==0)
return 3;
else if(strcmp(a,"四")==0)
return 4;
else if(strcmp(a,"五")==0)
return 5;
else if(strcmp(a,"六")==0)
return 6;
else if(strcmp(a,"七")==0)
return 7;
else if(strcmp(a,"八")==0)
return 8;
else if(strcmp(a,"九")==0)
return 9;
else if(strcmp(a,"十")==0)
return 10;
}
char zhuanhuan2(int e)
{
int j,k;
if(e<=10)
{
if(e==0)
printf("零");
else if(e==1)
printf("一");
else if(e==2)
printf("二");
else if(e==3)
printf("三");
else if(e==4)
printf("四");
else if(e==5)
printf("五");
else if(e==6)
printf("六");
else if(e==7)
printf("七");
else if(e==8)
printf("八");
else if(e==9)
printf("九");
else if(e==10)
printf("十");
}
else
{
j=e%10;
e=e/10;
k=e;
if(k==1)
printf("一十");
else if(k==2)
printf("二十");
else if(k==3)
printf("三十");
else if(k==4)
printf("四十");
else if(k==5)
printf("五十");
else if(k==6)
printf("六十");
else if(k==7)
printf("七十");
else if(k==8)
printf("八十");
else if(k==9)
printf("九十");
else if(k==10)
printf("一百");
if(j==0)
printf("零");
else if(j==1)
printf("一");
else if(j==2)
printf("二");
else if(j==3)
printf("三");
else if(j==4)
printf("四");
else if(j==5)
printf("五");
else if(j==6)
printf("六");
else if(j==7)
printf("七");
else if(j==8)
printf("八");
else if(j==9)
printf("九");
}
}
int jisuan(char b[100],int c,int d)
{
if(strcmp(b,"增加")==0)
c=c+d;
if(strcmp(b,"减少")==0)
c=c-d;
if(strcmp(b,"乘以")==0)
c=c*d;
if(strcmp(b,"除以")==0)
c=c/d;
return c;
}