2020面向对象程序设计寒假作业1
作业描述 | 详情 |
---|---|
这个作业属于哪个课程 | 2020面向对象程序设计 |
这个作业要求在哪里 | 面向对象程序设计寒假作业1 |
这个作业的目标 | 1.安装C++开发环境 2.完成问答题:讨论C语言的不足之处以及了解c/c++编译过程 3.完成实践题:查看自己的C++编译器版本以及使用命令行编译一份C语言/C++代码。 4.完成编程题,实现中文编程. 5.发布博客 |
作业正文 | 面向对象程序设计寒假作业1 |
其他参考文献 | 【1】百度百科静态链接 【2】百度百科动态链接 【3】c语言编译过程 【4】宏 |
一、问答题:
回答以下问题:
- 如果你不了解C++请回答以下问题:你认为C语言有什么缺陷(你觉得哪里用的不顺手)。
如果你已经了解C++请回答以下问题:你觉得C++和C语言比有什么优点。 - 查阅相关资料,简述一下C语言/C++的编译过程。
c语言不顺手的地方。
对变量赋值的格式对应,要求不严格。
在c语言中,我要是把一个浮点型数据赋给一个整型变量,在编译的时候只会给出警告,告诉你会丢失精度,但是是可以运行的,那这样子就导致在运行后发现有错,但是很难发现哪里出现错误,这也就让后期找错修改代码要花费很多不必要的时间。(深受其害o(╥﹏╥)o)
数组下标越界不检查
C语言在数组下标越界的时候是不会提示错误的,这导致经常自己犯了数组越界的错误而不自知,只看到最后的运行结果是错误的,最后常常要经过好几次调试才能发现越界的错误。
switch语句
C语言的switch语句由case组成,每个case结束以后都要用一个break来跳出case,否则会继续执行下面的case。这样的设定可有好有坏,好处就是可以让多种情况执行相同的操作,不大好的地方就是,如果要在需要跳出case的地方忘了break,那就会出错,并且后期检查不易看到。
思考过程:
- 去翻了翻之前在做c语言作业的过程中遇到问题时向别人提问的内容.
- 回忆了一下之前卡了很久的题卡在了哪里.
C语言/C++的编译过程
- 预处理: 展开头文件/宏替换/去掉注释/条件编译 (test.i main .i)
- 编译:检查语法,生成汇编 ( test.s main .s)
- 汇编: 汇编代码转换机器码 (test.o main.o)
- 链接:链接到一起生成可执行程序 a.out
在看这篇文章的预处理部分时发现了很多关于宏的内容,于是乎查了一下宏.- 宏:所谓宏是指电脑运用过程中用于简化操作的一系列系统代码,在一定程度上可以使一系列复杂的命令或任务自动执行。
- 链接:
静态链接:静态链接是由链接器在链接时将库的内容加入到可执行程序中的做法。链接器是一个独立程序,将一个或多个库或目标文件(先前由编译器或汇编器生成)链接到一块生成可执行程序。
动态链接:简单地讲,就是不对那些组成程序的目标文件进行链接,等到程序要运行时才进行链接。也就是说,把链接这个过程推迟到了运行时再进行,这就是动态链接(Dynamic Linking)的基本思想。可以动态链接的库,在Windows上是dynamic link library (DLL)。
二、实践题
1.查看自己的C++编译器版本
- 查看Dev-C++的编译器版本
遇到的问题:
- 最初以为Dev的编译器就在Dev的软件里,在查询的时候就直接输入了Dev-C++.lnk,结果当然是查询不到。后来通过同学了解到gcc的准确位置,才得以找到gcc。
- 找到gcc的位置之后又犯了个错误,就是直接输文件名试图打开文件,结果当然是不行,看了一早上才发现用命令行要cd+文件名才可以打开文件。o(╥﹏╥)o,幸好最后还是被我查到了版本。
- 查看visual studio的编译器版本
遇到的问题:
找不到visual studio 内部的命令行的入口,经过多方询问,才找到。
2.使用命令行编译一份C语言/C++代码
-
Dev-C++:
这是一个加法的程序。
-
visual studio:
输出Hello
- 思考过程:
查询资料,询问同学。
三、编程题
(请使用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;
}