2020面向对象程序设计寒假作业1
这个作业属于哪个课程 | 2020面向对象程序设计张栋班 | |||||||||||
这个作业的要求在哪里 | 面向对象程序设计寒假作业1 | |||||||||||
这个作业的目标 | 1、学会安装C++的开发环境;2、了解C与C++的不同和相同的地方,并对编译过程有自己的理解;3、理解命令行,并学会使用它来查看编译器版本和一些基础的用法;5、锻炼写代码的能力;4、学习写博客的方法和技巧 | |||||||||||
作业正文 | 2020面向对象程序设计寒假作业1 | |||||||||||
其他参考文献 | C语言编译过程简析;C语言真正的编译过程;C语言Windows命令行编程;strcmp函数用法 |
一、 问答题
1、如果你不了解C++请回答以下问题:你认为C语言有什么缺陷(你觉得哪里用的不顺手)。
因为对其他语言知之甚少,所以也没有办法比较出什么,只有几点在自己写代码的过程中遇到的不方便的地方。
第一个就是头文件,关于abs属于头文件#include
第二个就是指针,在一维数组里应用还是比较得心应手的,但是在二维数组里,指针指示各种地址的形式太多了,还有指针的移动,加减的使用也好不方便。
第三个就是数组的越界了,一不留神它就越界,尽管可以数组定义的大一些,但是也有可能越下界,所以在数组这里也挺麻烦的。
2、查阅相关资料,简述一下C语言/C++的编译过程。
C语言:要经历预处理,编译,汇编,链接这四个步骤。其中第一步是预处理,这一步就是解决所有#开头的语句,把#include里的内容复制源文件中,把#define的定义全部替换掉。第二步是编译,将.c文件生成.s文件,这一步主要是看所有的语句有没有语法错误。第三步是汇编,汇编是将汇编代码生成机器码,也就是二进制文件,这个文件也叫做目标文件,即.obj或者.o文件,汇编是机械转换的过程。最后一步是链接,链接是将生成的一个或者多个中间文件联合生成可执行文件。一个程序只由一个源文件组成显然不可能,所以一定会出现这个源文件中的主函数需要调用其他文件中的函数,数个源文件共同组成一个可执行文件,这时就要用到链接来把这些需要用到的源文件连接起来。
这就是我对C语言编译过程的了解。
二、 实践题
1、 查看自己的C++编译器版本(dev-C++5.11)
首先我一读到题目,就觉得太简单了吧。查看版本嘛,我第一时间就去看了它的属性。
没想到丝毫没有版本的任何踪迹
然后我又去软件里找,于是我找到了,这个(见下图)。
可当我开心的转圈圈的时候,发现大家在群里讨论的是命令行??于是我就灰溜溜地去百度,得到输入gcc -v,就可以得到版本信息,可是出现了这种情况(见下图),于是就去搜索为什么会出现这种情况,万能的百度告诉我,要配置环境,还告诉我要下载mingw,于是我下载了一个晚上,也没下载完。这时只能暂时放弃。
第二天,在群里看到说,dev-c++本身有gcc,但是要去找这个位置。
于是我就去搜索
然后依次打开文件,最后就得到正确答案了。
正确的答案就是它
2、 使用命令行编译一份C语言/C++代码。
第一个问题什么是命令行?
命令行是在DOS下运行的命令。
第二个问题这个题目可以分成几步?
通过观看B站的相关视频,可以先写一段代码,这里自己写的是“你好,世界!“一段超级简单的代码,之后通过命令行来实现。
第一步,写代码。
第二步,启动命令行窗口,win+R,输入cmd。
第三步,应用指令cd(打开),找到“你好,世界!”的程序地址(找到解决方案后,点击debug就找到地址了),进入文件,执行文件就好了
这里参考C语言Windows命令行编程
三、编程题
首先看题目!
题目
中国文化博大精深,从仓颉造字开始,汉字一直流传到了今天。我们在感叹汉字的源远流长时,也不禁感慨,为什么没有一门使用汉字编程的语言?
汉字真的不能编程吗?最近文言文编程火了一把,吾有一數。曰三。名之曰「甲」。这朴实无华的变量定义无疑不是几千年来中华文化的发展中一朵奇葩。
今天小王同学想,文言文能编程那白话文呢?他找到了你,让你帮帮他。
编程要求
编写一个程序,输入满足以下语法要求的一段文字,输出运行后的结果。
变量定义:整数 钱包 等于 零
运算(加法):钱包 增加 四
运算(减法):钱包 减少 四
输出:看看 钱包
样例
输入:
整数 钱包 等于 零
钱包 增加 四
钱包 减少 三
看看 钱包
输出:
一
------摘自作业
第一时间我思考了什么!
1、 怎么样表示开始,怎么样表示结束
2、 怎么把零一二三四五六七八九十转化为0 1 2 3 4 5 6 7 8 9 10
3、 最后怎么又把钱包的钱用汉字表示出来
先解决第一个问题
怎么开始?
“整数 钱包 等于 一个数”这是一大串字符串。我该怎么样让计算机知道看到这种形式就要开始准备进行加减运算?
这是时候我想到了符合==(等于)就开始执行。
但是,
众所周知,字符串没有这样等于的说法,只有strcmp函数比较。
当两个字符串相等时函数返回0,其余返回第一个不相等字符的差值。利用这个函数,我有了一整个代码中的核心!
strcmp("整数 钱包 等于 二", begin) == 0。
这样我就解决了开始和结束还有转换的问题。
在解决最开始的三个问题后,我开始了敲代码了。
首先划分一下有几块内容。
我分为开始(start)、加减(process)、结束(over);
在最开始的时候,输入“整数 钱包 等于 零”并没有得到我的重视,即默认这个字符串不会变,只要符合就开始下一个模块进行加减,于是有以下
int main()
{
void over(int sum);
char begin[100],number[100];
int flag=1,sum=0;
gets(begin);
if(strcmp("整数 钱包 等于 零", begin) == 0)
{
gets(number);
while(flag)
{
if (strcmp("钱包 增加 一", number) == 0)
{sum=sum+1;
gets(number);
}
else if (strcmp("钱包 增加 二", number) == 0)
{sum=sum+2;
gets(number);
(在最后思考有更多可能性的时候,考虑到可能钱包最开始不是零,于是分出了一个开始的选择判断,代码如下)
之后是加减的运算,最开始是这样想的,以“钱包“为判断进行加减的选择,”增加“到加的函数里,”减少“到减的函数里,之后在分别汉字转化。
但是,这里遇到了困难,我没有办法,把这一句话(“钱包 增加 四“)划分成三个字符串,于是这个想法搁置。
之后我又想到了一个超级超级直白简单的方法,就是多次应用选择,把所有的可能都写上去,于是就有了以下代码:
void process(char number[])
{
if (strcmp("钱包 增加 一", number) == 0)
{sum=sum+1;
gets(number);
}
else if (strcmp("钱包 增加 二", number) == 0)
{sum=sum+2;
gets(number);
}
else if (strcmp("钱包 增加 三", number) == 0)
{sum=sum+3;
gets(number);
}
else if (strcmp("钱包 增加 四", number) == 0)
{sum=sum+4;
gets(number);
}
else if (strcmp("钱包 增加 五", number) == 0)
{sum=sum+5;
gets(number);
}
else if (strcmp("钱包 增加 六", number) == 0)
{sum=sum+6;
gets(number);
}
else if (strcmp("钱包 增加 七", number) == 0)
{sum=sum+7;
gets(number);
}
else if (strcmp("钱包 增加 八", number) == 0)
{sum=sum+8;
gets(number);
}
else if (strcmp("钱包 增加 九", number) == 0)
{sum=sum+9;
gets(number);
}
else if (strcmp("钱包 增加 十", number) == 0)
{sum=sum+10;
gets(number);
}
else if (strcmp("钱包 减少 一", number) == 0)
{sum=sum-1;
gets(number);
}
else if (strcmp("钱包 减少 二", number) == 0)
{sum=sum-2;
gets(number);
}
else if (strcmp("钱包 减少 三", number) == 0)
{sum=sum-3;
gets(number);
}
else if (strcmp("钱包 减少 四", number) == 0)
{sum=sum-4;
gets(number);
}
else if (strcmp("钱包 减少 五", number) == 0)
{sum=sum-5;
gets(number);
}
else if (strcmp("钱包 减少 六", number) == 0)
{sum=sum-6;
gets(number);
}
else if (strcmp("钱包 减少 七", number) == 0){sum=sum-7;
gets(number);
}
else if (strcmp("钱包 减少 八", number) == 0)
{sum=sum-8;
gets(number);
}
else if (strcmp("钱包 减少 九", number) == 0)
{sum=sum-9;
gets(number);
}
else if (strcmp("钱包 减少 十", number) == 0)
{sum=sum-10;
gets(number);}
}}
(感觉有点丢人)
整个加加减减的过程结束后,就是结束输出的转换,这里!有两个需要思考的地方,一个是怎么结束以上的加加减减,我用了flag
代码
while(flag)
{
process(number);
if(strcmp("看看 钱包",number) == 0)
{
over(sum);
flag=0;
}
}
另一个是怎么转换,
这里我用switch来转换
代码如下:
void over(int sum)
{
int a[100],n,i=0,t=0;
n=sum;
if(sum<0)
{
printf("haoqionga");//翻译:好穷啊
}
else{
for(i=0;n>10&&sum!=0;i++)
{
a[i]=sum%10;
sum=sum/10;
}
if(n<=10)
{
switch(n)
{
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;
}
}
for(t=i-1;t>=0&&n>10;t--)
{
if(t>0&&a[t]==0&&a[t-1]!=0)
{
printf("零");
}
else{
switch(a[t])
{
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;
}}
if((t==1&&a[t-1]!=0)||(t==1&&i==2))
printf("十");
else if(t==2)
printf("百");
else if(t==3)
printf("千");
else if(t==4)
printf("万");
}
}
}
总结:
我把整个问题的解决分成了三块,开始,加减和结束。
其中转换全部用
strcmp函数进行比较。
我思考到的点,第一个是最开始钱包不是零
第二个是结束时钱包为负数
第三个是结束时钱包不是个位数,而是多位数的情况。
自己已知的没有修改出来的地方,类似两百,两千还有三百零二这样特殊的例子。
完整代码:
#include<string.h>
#include<stdio.h>
void over(int sum);
void process(char number[]);
void start(char begin[]);
char begin[100],number[100];
int flag=1,sum=0;
int main()
{
gets(begin);
start(begin);
gets(number);
while(flag)
{
process(number);
if(strcmp("看看 钱包",number) == 0)
{
over(sum);
flag=0;
}
}
}
void start(char begin[])
{
if(strcmp("整数 钱包 等于 零", begin) == 0)
sum=sum+0;
if(strcmp("整数 钱包 等于 一", begin) == 0)
sum=sum+1 ;
if(strcmp("整数 钱包 等于 二", begin) == 0)
sum=sum+ 2;
if(strcmp("整数 钱包 等于 三", begin) == 0)
sum=sum+3 ;
if(strcmp("整数 钱包 等于 四", begin) == 0)
sum=sum+ 4;
if(strcmp("整数 钱包 等于 五", begin) == 0)
sum=sum+ 5;
if(strcmp("整数 钱包 等于 六", begin) == 0)
sum=sum+ 6;
if(strcmp("整数 钱包 等于 七", begin) == 0)
sum=sum+ 7;
if(strcmp("整数 钱包 等于 八", begin) == 0)
sum=sum+8 ;
if(strcmp("整数 钱包 等于 九", begin) == 0)
sum=sum+9;
if(strcmp("整数 钱包 等于 十", begin) == 0)
sum=sum+10;
}
void process(char number[])
{
{
if (strcmp("钱包 增加 一", number) == 0)
{sum=sum+1;
gets(number);
}
else if (strcmp("钱包 增加 二", number) == 0)
{sum=sum+2;
gets(number);
}
else if (strcmp("钱包 增加 三", number) == 0)
{sum=sum+3;
gets(number);
}
else if (strcmp("钱包 增加 四", number) == 0)
{sum=sum+4;
gets(number);
}
else if (strcmp("钱包 增加 五", number) == 0)
{sum=sum+5;
gets(number);
}
else if (strcmp("钱包 增加 六", number) == 0)
{sum=sum+6;
gets(number);
}
else if (strcmp("钱包 增加 七", number) == 0)
{sum=sum+7;
gets(number);
}
else if (strcmp("钱包 增加 八", number) == 0)
{sum=sum+8;
gets(number);
}
else if (strcmp("钱包 增加 九", number) == 0)
{sum=sum+9;
gets(number);
}
else if (strcmp("钱包 增加 十", number) == 0)
{sum=sum+10;
gets(number);
}
else if (strcmp("钱包 减少 一", number) == 0)
{sum=sum-1;
gets(number);
}
else if (strcmp("钱包 减少 二", number) == 0)
{sum=sum-2;
gets(number);
}
else if (strcmp("钱包 减少 三", number) == 0)
{sum=sum-3;
gets(number);
}
else if (strcmp("钱包 减少 四", number) == 0)
{sum=sum-4;
gets(number);
}
else if (strcmp("钱包 减少 五", number) == 0)
{sum=sum-5;
gets(number);
}
else if (strcmp("钱包 减少 六", number) == 0)
{sum=sum-6;
gets(number);
}
else if (strcmp("钱包 减少 七", number) == 0){sum=sum-7;
gets(number);
}
else if (strcmp("钱包 减少 八", number) == 0)
{sum=sum-8;
gets(number);
}
else if (strcmp("钱包 减少 九", number) == 0)
{sum=sum-9;
gets(number);
}
else if (strcmp("钱包 减少 十", number) == 0)
{sum=sum-10;
gets(number);}
}}
void over(int sum)
{
int a[100],n,i=0,t=0;
n=sum;
if(sum<0)
{
printf("haoqionga");//翻译:好穷啊
}
else{
for(i=0;n>10&&sum!=0;i++)
{
a[i]=sum%10;
sum=sum/10;
}
if(n<=10)
{
switch(n)
{
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;
}
}
for(t=i-1;t>=0&&n>10;t--)
{
if(t>0&&a[t]==0&&a[t-1]!=0)
{
printf("零");
}
else{
switch(a[t])
{
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;
}}
if((t==1&&a[t-1]!=0)||(t==1&&i==2))
printf("十");
else if(t==2)
printf("百");
else if(t==3)
printf("千");
else if(t==4)
printf("万");
}
}
}
其中自己参考的资料:
strcmp函数用法