这个作业属于哪个课程 | 2020面向对象程序设计张栋班 |
这个作业要求在哪里 | 面向对象程序设计寒假作业1 |
这个作业的目标 | 安装C++开发环境,了解编译过程,回顾知识,编写代码,总结并发布博客 |
作业正文 | https://www.cnblogs.com/hanakokun/p/12236871.html |
其它参考文献 | https://wenku.baidu.com/view/8976aeb765ce05087632130a.html |
问答题:
1.C语言的缺陷:
(1)指针较为复杂,新手难以熟练运用。
(2)数据类型错误,数组越界等不会报错。
2.C语言的编译过程
实践题
(1)查看我的C++编译器版本
输入cl.exe
(2)使用命令行编译一份C语言/C++代码。
编程题
中国文化博大精深,从仓颉造字开始,汉字一直流传到了今天。我们在感叹汉字的源远流长时,也不禁感慨,为什么没有一门使用汉字编程的语言?
汉字真的不能编程吗?最近文言文编程火了一把,吾有一數。曰三。名之曰「甲」。
这朴实无华的变量定义无疑不是几千年来中华文化的发展中一朵奇葩。
今天小王同学想,文言文能编程那白话文呢?他找到了你,让你帮帮他。
编程要求
编写一个程序,输入满足以下语法要求的一段文字,输出运行后的结果。
变量定义:整数 钱包 等于 零
运算(加法):钱包 增加 四
运算(减法):钱包 减少 四
输出:看看 钱包
注意:
- 输入输出用例均为GBK编码,推荐使用vscode把文本切换为GBK编码。
- 数字只会出现以下 零一二三四五六七八九十 。
思考过程:
用strcmp函数确定输入的是什么数字
先写一个函数change将汉字的个位数字转换成数字
int change(char x[]){ if(strcmp(x,"零")==0)return 0; else if(strcmp(x,"一")==0)return 1; else if(strcmp(x,"二")==0)return 2; else if(strcmp(x,"三")==0)return 3; else if(strcmp(x,"四")==0)return 4; else if(strcmp(x,"五")==0)return 5; else if(strcmp(x,"六")==0)return 6; else if(strcmp(x,"七")==0)return 7; else if(strcmp(x,"八")==0)return 8; else if(strcmp(x,"九")==0)return 9; else if(strcmp(x,"十")==0)return 10; }
了解到汉字要用字符串来存储,用symbol表示输入的运算符号从而确定是增加还是减少,money表示增加或减少的钱,sum表示钱包里的钱。
flag用来判断,如果输入的不是“看看”则进行运算,如果是“看看”则结束循环
char flag[5],money[5],symbol[5],a[5],b[5],c[5],d[5]; int sum; scanf("%s%s%s%s",a,b,c,d); sum=change(d); while(1){ scanf("%s",flag); if(strcmp(flag,"看看")!=0){ scanf("%s%s",symbol,money); if(strcmp(symbol,"增加")==0) sum+=change(money); else sum-=change(money); } else{ scanf("%s",b); break; } }
经过以上过程已完成最终结果sum的计算,接下来将其转换成汉字输出,由题意“ 数字只会出现 零一二三四五六七八九十 ”可知,这里只考虑最终结果为一位数或两位数的情况。
若sum为一位数
if(sum<=10) switch(sum){ case 0:printf("零");break; case 1:printf("一");break; case 2:printf("二");break; case 3:printf("三");break; case 4:printf("四");break; case 5:printf("五");break; case 6:printf("六");break; case 7:printf("七");break; case 8:printf("八");break; case 9:printf("九");break; case 10:printf("十");break; }
若sum为二位数,假设sum=10*a+b,我的想法是按“a 十 b”的方式将其输出。
若a=1,则不输出a。
输出“十”。
若b=0,则不输出b。
else{ switch(sum/10){ case 1:break; case 2:printf("二");break; case 3:printf("三");break; case 4:printf("四");break; case 5:printf("五");break; case 6:printf("六");break; case 7:printf("七");break; case 8:printf("八");break; case 9:printf("九");break; } printf("十"); if(sum%10!=0){ switch(sum%10){ case 1:printf("一");break; case 2:printf("二");break; case 3:printf("三");break; case 4:printf("四");break; case 5:printf("五");break; case 6:printf("六");break; case 7:printf("七");break; case 8:printf("八");break; case 9:printf("九");break; } } }
测试数据,数据主要分为:结果为一位数,结果在10到20之间,结果为大或等于20的个位数为零的数,结果为大于20的个位数不为零的数,共四类。多组测试数据下来没有发现问题
完整代码
#include#include<string.h> int change(char x[]){ if(strcmp(x,"零")==0)return 0; else if(strcmp(x,"一")==0)return 1; else if(strcmp(x,"二")==0)return 2; else if(strcmp(x,"三")==0)return 3; else if(strcmp(x,"四")==0)return 4; else if(strcmp(x,"五")==0)return 5; else if(strcmp(x,"六")==0)return 6; else if(strcmp(x,"七")==0)return 7; else if(strcmp(x,"八")==0)return 8; else if(strcmp(x,"九")==0)return 9; else if(strcmp(x,"十")==0)return 10; } int main() { char flag[5],money[5],symbol[5],a[5],b[5],c[5],d[5]; int sum; scanf("%s%s%s%s",a,b,c,d); sum=change(d); while(1){ scanf("%s",flag); if(strcmp(flag,"看看")!=0){ scanf("%s%s",symbol,money); if(strcmp(symbol,"增加")==0) sum+=change(money); else sum-=change(money); } else{ scanf("%s",b); break; } } if(sum<=10) switch(sum){ case 0:printf("零");break; case 1:printf("一");break; case 2:printf("二");break; case 3:printf("三");break; case 4:printf("四");break; case 5:printf("五");break; case 6:printf("六");break; case 7:printf("七");break; case 8:printf("八");break; case 9:printf("九");break; case 10:printf("十");break; } else{ switch(sum/10){ case 1:break; case 2:printf("二");break; case 3:printf("三");break; case 4:printf("四");break; case 5:printf("五");break; case 6:printf("六");break; case 7:printf("七");break; case 8:printf("八");break; case 9:printf("九");break; } printf("十"); if(sum%10!=0){ switch(sum%10){ case 1:printf("一");break; case 2:printf("二");break; case 3:printf("三");break; case 4:printf("四");break; case 5:printf("五");break; case 6:printf("六");break; case 7:printf("七");break; case 8:printf("八");break; case 9:printf("九");break; } } } return 0; }
运行过程倒是没有遇到什么问题,主要是写程序时遇到了不熟悉的汉字输入。因为搞不懂gbk编码的转化,所以用了dev,因为之前没有遇到过汉字的处理,所以一开始折腾了很久才知道汉字的输入输出方式,目前对此还有很多不明白的东西。
以及,像这样用枚举法暴力解决问题导致代码很长也是一个问题。
如果没有题目的限制条件(比如结果必定为一位数或二位数),我的处理方法就要做出很大的改变。因此感受到了当前所学的知识能解决的问题十分有限,希望在接下去的学习中掌握更多更有效的方法。