这个作业属于哪个课程 | 2020年面向对象程序设计 |
---|---|
这个作业要求在哪里 | 面向对象程序设计寒假作业1 |
这个作业的目标 | 1.安装C++开发环境(见附录)2.完成问答题、实践题及编程题3.发布博客 |
作业正文 | 如下 |
其他参考文献 | C语言的不足之处 C语言的编译过程 |
一.问答题:(基础3分)
回答以下问题:
1.1如果你不了解C++请回答以下问题:你认为C语言有什么缺陷(你觉得哪里用的不顺手)。
1.2如果你已经了解C++请回答以下问题:你觉得C++和C语言比有什么优点。
2.查阅相关资料,简述一下C语言/C++的编译过程。
1.1:C语言语法限制不太严格,程序设计自由度大。例如, C语言对数组下标越界不检查,容易造成数据在内存中的混乱。
C语言中许多运算符具有不同的意义,甚至有些关键字也具有好几种意义。例如, void作为函数的返回类型,表示不返回任何值;在指针声明中,表示通用指针类型;在参数列表中,表示没有参数。
c语言不太严谨,例如,整型和浮点型变量运算时不会报错。
2:编译分为四个过程,分别是预处理,编译,汇编,链接。
预处理用于将所有#include头文件以及宏定义替换成其真正内容,预处理后会得到比原来体积大得多的文本文件。
编译将经过预处理之后的程序转换成特定汇编代码的过程,生成的也是文本文件。
汇编将上一步的汇编代码转换成机器码,为每一个源文件产生一个目标文件,是二进制格式。
链接将多个目标文件及所需的库文件链接成最终的可执行文件。
二.实践题:(基础2分)
1.自己动手,完成以下任务:
查看自己的C++编译器版本。
2.使用命令行编译一份C语言/C++代码。
1:打开vs中工具中的命令行工具,输入cl.exe即可查看c++编译器版本。
2.在vs中按下win+R,输入cmd打开命令行,打开相应磁盘,如打开D盘,则输入D:,再输入相应路径,即可运行程序。
三.编程题(请使用C语言或者C++完成以下题目):(基础5分)
中国文化博大精深,从仓颉造字开始,汉字一直流传到了今天。我们在感叹汉字的源远流长时,也不禁感慨,为什么没有一门使用汉字编程的语言?
汉字真的不能编程吗?最近文言文编程火了一把,吾有一數。曰三。名之曰「甲」。这朴实无华的变量定义无疑不是几千年来中华文化的发展中一朵奇葩。
今天小王同学想,文言文能编程那白话文呢?他找到了你,让你帮帮他。
编程要求
编写一个程序,输入满足以下语法要求的一段文字,输出运行后的结果。
变量定义:整数 钱包 等于 零
运算(加法):钱包 增加 四
运算(减法):钱包 减少 四
输出:看看 钱包
样例
输入:
整数 钱包 等于 零
钱包 增加 四
钱包 减少 三
看看 钱包
输出:
一
注意:
输入输出用例均为GBK编码,推荐使用vscode把文本切换为GBK编码。
数字只会出现以下 零一二三四五六七八九十 。
编程题要求:
读题,提取出题目的要求。
分解需求,把需求分解为几个你觉得不太相关的模块。
思考每个模块怎么写,可以从简单的模块开始写。
对于不会的问题进行查阅资料。
对于每一个模块设计测试用例。
详细记录下以上每一步,并写在博客中。
不要求完全做出来,但要求记录详细。
建议博客长度不少于1000字(不包含代码)。
1.题目要求:对白话文的处理进行编程,要求输出经过一连串处理后钱包中的数量,重点是白话文和数字的转换以及多种情况的考虑。
2.分解需求:首先想到要写一个函数对白话文的输入进行处理,因为题目中提到只会出现从零到十的数字,所以输入时只需考虑十及以内的情况。
函数代码如下
int shuru(char a[]) { if(!strcmp(a,"零")) return 0; else if(!strcmp(a,"一")) return 1; else if(!strcmp(a,"二")) return 2; else if(!strcmp(a,"三")) return 3; else if(!strcmp(a,"四")) return 4; else if(!strcmp(a,"五")) return 5; else if(!strcmp(a,"六")) return 6; else if(!strcmp(a,"七")) return 7; else if(!strcmp(a,"八")) return 8; else if(!strcmp(a,"九")) return 9; else if(!strcmp(a,"十")) return 10; }
接着考虑主函数,包括对已转换成数字的钱数进行处理和运算,其中需要注意对非法输入的讨论,汉字的比较需要用到strcmp函数。
int main() { char zs[5],qb[5],dy[5],num[5],q[5]; int sum; scanf("%s %s %s %s",zs,qb,dy,num); if(strcmp(zs,"整数")==0&&strcmp(qb,"钱包")==0&&strcmp(dy,"等于")==0)//其他输入均为非法输入 { sum=shuru(num);//将汉字转换为数字 while(1) { scanf("%s",qb); if(strcmp(qb,"钱包"))//根据输入是否为“钱包”判断循环是否继续 break; scanf("%s %s",dy,num); if(!strcmp(dy,"增加"))//根据不同操作进行不同运算 { sum+=shuru(num); } else if(!strcmp(dy,"减少")) { sum-=shuru(num); } else//其他运算为非法 { printf("error!"); break; } } scanf("%s",q);//注意到此时“看看”已经存到qb中,只需再输入“钱包” if(strcmp(qb,"看看")==0&&strcmp(q,"钱包")==0) { if(sum<=10) shuchu1(sum); else shuchu2(sum); } else printf("error!"); } else printf("error!"); return 0; }
处理和运算结束后需要考虑输出问题,其中包括五种情况。考虑到实际情况中,钱数不会小于0,所以第一种是小于零的情况,需要特别考虑。第二种是大等于零,小等于十的情况。第三种是大于十,小于二十的情况。第四种是大于二十,小于一百的情况。由于能力有限,将大等于一百都归于第五种情况。因为大于十小于一百的情况下将数字个位数与十位数拆开后需要用到钱数小等于十的情况中的转换,所以写两个输出函数。
函数代码如下
void shuchu1(int sum) { if(sum>0) { if(sum==0) printf("零"); else if(sum==1) printf("一"); else if(sum==2) printf("二"); else if(sum==3) printf("三"); else if(sum==4) printf("四"); else if(sum==5) printf("五"); else if(sum==6) printf("六"); else if(sum==7) printf("七"); else if(sum==8) printf("八"); else if(sum==9) printf("九"); else if(sum==10) printf("十"); } else if(sum<0) { printf("over-expenditure!"); } } void shuchu2(int sum) { if(sum<=99) { int a,b; a=sum%10; b=sum/10; if(b==1)//当钱数大于10小于20时要特别考虑 { printf("十"); shuchu1(a); } else { shuchu1(b); printf("十"); if(a!=0)//如果a等于0,则不用再用到shuchu1 shuchu1(a); } } else printf("You are a rich man!"); }
完整代码如下
#include <stdio.h> #include <string.h> int shuru(char a[]) { if(!strcmp(a,"零")) return 0; else if(!strcmp(a,"一")) return 1; else if(!strcmp(a,"二")) return 2; else if(!strcmp(a,"三")) return 3; else if(!strcmp(a,"四")) return 4; else if(!strcmp(a,"五")) return 5; else if(!strcmp(a,"六")) return 6; else if(!strcmp(a,"七")) return 7; else if(!strcmp(a,"八")) return 8; else if(!strcmp(a,"九")) return 9; else if(!strcmp(a,"十")) return 10; } void shuchu1(int sum) { if(sum>0) { if(sum==0) printf("零"); else if(sum==1) printf("一"); else if(sum==2) printf("二"); else if(sum==3) printf("三"); else if(sum==4) printf("四"); else if(sum==5) printf("五"); else if(sum==6) printf("六"); else if(sum==7) printf("七"); else if(sum==8) printf("八"); else if(sum==9) printf("九"); else if(sum==10) printf("十"); } else if(sum<0) { printf("over-expenditure!"); } } void shuchu2(int sum) { if(sum<=99) { int a,b; a=sum%10; b=sum/10; if(b==1) { printf("十"); if(a!=0) shuchu1(a); } else { shuchu1(b); printf("十"); if(a!=0) shuchu1(a); } } else printf("You are a rich man!"); } int main() { char zs[5],qb[100],dy[100],num[5],q[5]; int sum; scanf("%s %s %s %s",zs,qb,dy,num); if(strcmp(zs,"整数")==0&&strcmp(qb,"钱包")==0&&strcmp(dy,"等于")==0) { sum=shuru(num); while(1) { scanf("%s",qb); if(strcmp(qb,"钱包")) break; scanf("%s %s",dy,num); if(!strcmp(dy,"增加")) { sum+=shuru(num); } else if(!strcmp(dy,"减少")) { sum-=shuru(num); } else { printf("error!"); break; } } scanf("%s",q); if(strcmp(qb,"看看")==0&&strcmp(q,"钱包")==0) { if(sum<=10) shuchu1(sum); else shuchu2(sum); } else printf("error!"); } else printf("error!"); return 0; }
运行结果:
来源:https://www.cnblogs.com/2636r/p/12234580.html