第一次个人编程作业
这个作业属于哪个课程 | 软件工程 (福州大学至诚学院 - 计算机工程系) |
---|---|
这个作业要求在哪里 | 第一次个人编程作业 |
这个作业的目标 | 了解GitHub以及复习c语言 |
作业正文 | GitHub仓库地址 |
其他参考文献 | 感谢洪成龙大佬的帮助 |
记录自己的代码行数,需求分析时间,编码时间。
- 代码行数:214行
- 需求分析时间:一小时
- 编码时间:2天
编程题目
汉字是迄今为止持续使用时间最长的文字,也是上古时期各大文字体系中唯一传承至今者,中国历代皆以汉字为主要的官方文字。我们在感叹汉字的源远流长时,也不禁感慨,为什么没有一门使用汉字编程的语言?
小杨同学想到:用汉字来进行编程一定很有趣,来请你帮帮他。
编程要求
请编写一个程序,制作一个简易的中文语言编译器,即使用中文语法进行编程,输入为逐行输入,每行为一个语句,一个语句代变一个操作,满足以下语法要求(括号内代变格式类型,具体参考样例):
- 变量定义:整数 (变量名) 等于 (数字)
- 运算(加法):(变量名) 增加 (数字)
- 运算(减法):(变量名) 减少 (数字)
- 输出:看看 (变量名) or 看看 “(字符串内容)”
附加要求:
- 选择:如果 (判断语句) 则 (操作语句) 否则 (操作语句)
若否则后没有任何操作使用(无)来进行填充(参考样例2)。
注意事项
- 输入输出采用utf-8编码,请在编码过程中注意。
- 数字只会出现:零一二三四五六七八九十。(此条作废,可先完成0-10的情况)
- 字符串输出的双引号是全角,即中文双引号。
- 变量类型要求只有整数,如有余力,可以自己实现更多。
- 测试数据会相较于样例复杂,请考虑充分需求。
- 不限制编程语言。
- 不能使用eval函数动态执行代码,或调用系统指令。
- 数据输入形式为交互式运行,类似于shell。
分析与学习
看到题目是想了想自己会什么代码,最后决定用了自己记得最多的c写。
本来不知道怎么多次输入,经过百度查询到了scanf("%s",var1))!=EOF
去除双引号的方法则是由洪成龙大佬教导完成
最后完成的代码其实只是根据样例完成的,比较死板,还要改进。
- 把汉字转为数字(只做了0-10的情况)
int exchange(char a[])
{
if(strcmp("零",a)==0)return 0;
if(strcmp("一",a)==0)return 1;
if(strcmp("二",a)==0)return 2;
if(strcmp("三",a)==0)return 3;
if(strcmp("四",a)==0)return 4;
if(strcmp("五",a)==0)return 5;
if(strcmp("六",a)==0)return 6;
if(strcmp("七",a)==0)return 7;
if(strcmp("八",a)==0)return 8;
if(strcmp("九",a)==0)return 9;
if(strcmp("十",a)==0)return 10;
}
- 去除双引号(只能去除英文双引号)
void disp(char *p)
{
int l=strlen(p);
if(p[0]='"')
{
for(int i=1;i<l-1;i+=2)
printf("%c%c",p[i],p[i+1]);
}
}
- 主函数(对输入的字符串进行判断实现输出)
int main()
{
char *str[11]={"零","一","二","三","四","五","六","七","八","九","十"};
char var[100],var1[100],name[100],name1[100],name2[100],op[100],num[100];
char a1[100],a2[100],a3[100],a4[100],a5[100],a6[100],a7[100],a8[100],a9[100];
scanf("%s %s %s %s",var,name,op,num);
int sum1,sum2,sum3,a,b;
sum1=exchange(num);
while((scanf("%s",var1))!=EOF)
{
if(strcmp(var1,var)==0)
{
scanf("%s %s %s ",name1,op,num);
sum2=exchange(num);
}
else if(strcmp(var1,name)==0)
{
scanf("%s %s",op,num);
if(strcmp(op,"增加")==0)
{
a=exchange(num);
sum1+=a;
}
else if(strcmp(op,"减少")==0)
{
a=exchange(num);
sum1-=a;
}
}
else if(strcmp(var1,name1)==0)
{
scanf("%s %s",op,num);
if(strcmp(op,"增加")==0)
{
a=exchange(num);
sum2+=a;
}
else if(strcmp(op,"减少")==0)
{
a=exchange(num);
sum2-=a;
}
}
else if(strcmp(var1,"看看")==0)
{
scanf("%s",name2);
if(strcmp(name2,name)==0)
printf("%s\n",str[sum1]);
else if(strcmp(name2,name1)==0)
printf("%s\n",str[sum2]);
}
else if(strcmp(var1,"如果")==0)
{
scanf("%s %s %s %s %s %s %s %s %s",a1,a2,a3,a4,a5,a6,a7,a8,a9);
if(strcmp(a5,"看看")!=0)
{
if(strcmp(a1,name)==0)
{
sum3=exchange(a3);
b=exchange(a7);
if(strcmp(a2,"大于")==0)
{
if(sum1>sum3)
{
if(strcmp(a5,name)==0)
{
if(strcmp(a6,"增加")==0)
sum1+=b;
else if(strcmp(a6,"减少")==0)
sum1-=b;
}
if(strcmp(a5,name1)==0)
{
if(strcmp(a6,"增加")==0)
sum2+=b;
else if(strcmp(a6,"减少")==0)
sum2-=b;
}
}
}
else if(strcmp(a2,"小于")==0)
{
if(sum1<sum3)
{
if(strcmp(a5,name)==0)
{
if(strcmp(a6,"增加")==0)
sum1+=b;
else if(strcmp(a6,"减少")==0)
sum1-=b;
}
if(strcmp(a5,name1)==0)
{
if(strcmp(a6,"增加")==0)
sum2+=b;
else if(strcmp(a6,"减少")==0)
sum2-=b;
}
}
}
}
if(strcmp(a1,name1)==0)
{
sum3=exchange(a3);
b=exchange(a7);
if(strcmp(a2,"大于")==0)
{
if(sum1>sum3)
{
if(strcmp(a5,name)==0)
{
if(strcmp(a6,"增加")==0)
sum1+=b;
else if(strcmp(a6,"减少")==0)
sum1-=b;
}
if(strcmp(a5,name1)==0)
{
if(strcmp(a6,"增加")==0)
sum2+=b;
else if(strcmp(a6,"减少")==0)
sum2-=b;
}
}
}
else if(strcmp(a2,"小于")==0)
{
if(sum1<sum3)
{
if(strcmp(a5,name)==0)
{
if(strcmp(a6,"增加")==0)
sum1+=b;
else if(strcmp(a6,"减少")==0)
sum1-=b;
}
if(strcmp(a5,name1)==0)
{
if(strcmp(a6,"增加")==0)
sum2+=b;
else if(strcmp(a6,"减少")==0)
sum2-=b;
}
}
}
}
}
else if(strcmp(a5,"看看")==0)
{
sum3=exchange(a3);
if(strcmp(a1,name)==0)
{
if(strcmp(a2,"大于")==0)
{
if(sum1>sum3)
disp(a6);
else
disp(a9);
}
if(strcmp(a2,"小于")==0)
{
if(sum1<sum3)
disp(a6);
else
disp(a9);
}
}
if(strcmp(a1,name1)==0)
{
if(strcmp(a2,"大于")==0)
{
if(sum2>sum3)
disp(a6);
else
disp(a9);
}
if(strcmp(a2,"小于")==0)
{
if(sum2<sum3)
disp(a6);
else
disp(a9);
}
}
}
}
}
}
测试样例