面向对象程序设计第一次作业
这个作业属于哪个课程 | 2020春福大面向对象程序设计 |
---|---|
这个作业要求在哪里 | 寒假作业1 |
这个作业的目标 | 安装开发环境,回顾知识,了解编译过程,实现白话文编程,记录学习过程,发布博客 |
作业正文 | 问答题 实践题 编程题 |
其他参考文献 | 在各题链接中体现 |
问答题
你认为C语言有什么缺陷(你觉得哪里用的不顺手)
- 我在使用C语言的过程中经常出现一些数组下标越界的问题,但是编译的时候不会提示错误,由于越界的内容是未知的,运行的时候就可能产生一些我想象不到的混乱的答案。如果不够熟练C语言中的语法要求,会产生逻辑问题。C语言的运算符数量多,优先级比较复杂,不易记住,所以使用的时候容易出现错误。
- 关于平行的问题“你觉得C++和C语言比有什么优点”,因为我之前完全不了解c++,所以搜索了一些资料。下面是一些个人收获和想法:
C语言是面向过程的语言,C++是基于面向对象的语言。面向过程是指先通过分析得到解决问题所需的步骤,然后把这些步骤用函数一步步实现,使用的时候依次调用。面向对象是把构成问题的成分分解成几个对象,用功能来划分问题,建立对象的目的是描述某个事物在解决问题步骤中的行为。
封装是将抽象得到的数据和行为(或功能)相结合,是将数据与操作数据的源代码进行有机的结合,形成“类”。
首先,类是一种用户定义的引用数据类型,类的本质是数据类型,不是可以操作的数据,所以也没有开辟空间。其次,类的成员当中可以有成员变量(数据成员)和成员函数,类的属性与数据成员(也是一种数据类型)相对应,成员函数则用于操作类的各项属性,是一个类具有的特有的操作。
C语言的编译过程
C语言的编译过程包括预处理,编译,汇编,链接四个步骤。
- 预处理的工作包括将#include头文件和宏定义替换成真正的内容。预处理结束后,得到的是一个体积比原来文件大的文本文件。
- 预处理得到的程序中有数字、字符串、变量的定义,以及C语言的关键字。编译过程可以检查语法,在确认所有指令符合语法规则后,就可以将经过预处理的程序转换成汇编代码。
- 汇编过程将汇编代码转成机器码,生成目标文件,是二进制格式。目标文件由段组成。代码段包含的主要是程序的指令。数据段主要存放程序中要用到的各种全局变量或静态的数据。
- 链接过程将多个目标文件和库文件连接成最终的可执行文件。链接处理分成静态链接和动态链接。
实践题
查看自己的C++编译器版本
在visual studio 2019界面中,选择工具栏->命令行->开发者命令提示,然后输入cl.exe即可查看编辑器版本
用命令行编译一份C代码
在visual studio 2019界面中,按住键盘win键+r键,在出现的页面中输入cmd,点击确定即可打开命令行。
输入要编译的代码所在的盘符,例如D:并按回车键,随后输入代码的地址和文件名,例如CC\case。这是个Hello world的代码,按下回车即可显示结果。
编程题
阅读题目
中国文化博大精深,从仓颉造字开始,汉字一直流传到了今天。我们在感叹汉字的源远流长时,也不禁感慨,为什么没有一门使用汉字编程的语言?
汉字真的不能编程吗?最近文言文编程火了一把,吾有一數。曰三。名之曰「甲」。这朴实无华的变量定义无疑不是几千年来中华文化的发展中一朵奇葩。
今天小王同学想,文言文能编程那白话文呢?他找到了你,让你帮帮他。
编程要求
编写一个程序,输入满足以下语法要求的一段文字,输出运行后的结果。
变量定义:整数 钱包 等于 零
运算(加法):钱包 增加 四
运算(减法):钱包 减少 四
输出:看看 钱包
样例
输入:
整数 钱包 等于 零
钱包 增加 四
钱包 减少 三
看看 钱包
输出:
一
思考及划分模块过程
从题目中我们可以看到
整数 钱包 是用来定义初始值的
等于 用来赋值
增加 减少 分别表示加和减
看看 是用来输出结果的
程序按功能划分需要分为以下几个部分
- 把输入的汉字转化成数字
- 把计算结果以汉字的形式进行输出
- 排除错误的输入
- 根据“增加”和“减少”分别进行计算
编写模块及测试样例
百度得知在中文windows操作系统下,中文默认是采用BGK字符集,每个字符占两个字节。因此char数组就可以存汉字了,且strcmp(a,b)在a,b完全相同时返回一个值0,所以可以用strcmp函数进行判断。现在我们可以写出一个判断初始值的函数。
int change(char shu[])
{
if(strcmp(shu,"一")==0)
return 1;
if(strcmp(shu,"二")==0)
return 2;
if(strcmp(shu,"三")==0)
return 3;
if(strcmp(shu,"一")==0)
return 1;
if(strcmp(shu,"四")==0)
return 4;
if(strcmp(shu,"五")==0)
return 5;
if(strcmp(shu,"六")==0)
return 6;
if(strcmp(shu,"七")==0)
return 7;
if(strcmp(shu,"八")==0)
return 8;
if(strcmp(shu,"九")==0)
return 9;
if(strcmp(shu,"零")==0)
return 0;
}
接下来我们需要写一个函数用来输出算好的结果(函数中只写单个数字的输出,数据保证只从0-99所以两位数的情况可以放到主函数中判断)
void change1(int num)
{
if(num==0) printf("零");
if(num==1) printf("一");
if(num==2) printf("二");
if(num==3) printf("三");
if(num==4) printf("四");
if(num==5) printf("五");
if(num==6) printf("六");
if(num==7) printf("七");
if(num==8) printf("八");
if(num==9) printf("九");
}
先来考虑怎么输入第一行。可以用四个短的字符数组分别存四个词语,并设置错误输入的特判。由于变量的名字不一定是“钱包”,所以输入第一行的时候如果变量名不是“钱包”不算错误输入,同时我们可以进行数据的初始化。下面是main函数中用于输入并检查第一行的语句。
scanf("%s %s %s %s",a,b,c,d);
if(strcmp(a,"整数")!=0||strcmp(c,"等于")!=0)
{printf("输入错误\n");
return 0;
}
num=change(d);
由于“看看”说明需要输出结果了,所以当输入“看看”时不再进入计算过程。
如果计算行输入的变量名与第一行的变量名不同,也属于输入错误。
排除这种情况后,再输入接下来的计算种类和数值。
如果计算种类与“增加”或“减少”相同,则分别进入不同的运算,如果出现“加上”“减去”这样的输入则不进入运算。
while(1)
{scanf("%s",y);
if(strcmp(y,"看看")==0) break;
if(strcmp(y,b)!=0)
{printf("输入错误\n");
return 0;
}
scanf("%s",z);
scanf("%s",x);
if(strcmp(z,"增加")==0)
num=num+change(x);
else if(strcmp(z,"减少")==0)
num=num-change(x);
else
{printf("输入错误\n");
return 0;
}
}
原来的输出部分只写了一句
change1(num);
这样可以满足样例的输入输出。
但是后来想到虽然数字只有零到九,但是多次运算可以得到大于十的数,所以要对得到的计算结果进行分类。
可以分成三类,第一类是个位数,第二类是整十的数,第三类是两位数但不是整十的数。
if(num/10==0)
change1(num);
else if(num%10==0)
{change1(num/10);
printf("十");
}
else
{change1(num/10);
printf("十");
change1(num%10);
}
这样就可以满足大于十的计算结果输出。
下面是一个检测变量名可以不用是“钱包”的样例
需要改进的地方
如果输入的数字不是个位数,那么我的程序无法判断并计算
完整代码
#include<stdio.h>
#include<string.h>
int change(char shu[])
{
if(strcmp(shu,"一")==0)
return 1;
if(strcmp(shu,"二")==0)
return 2;
if(strcmp(shu,"三")==0)
return 3;
if(strcmp(shu,"一")==0)
return 1;
if(strcmp(shu,"四")==0)
return 4;
if(strcmp(shu,"五")==0)
return 5;
if(strcmp(shu,"六")==0)
return 6;
if(strcmp(shu,"七")==0)
return 7;
if(strcmp(shu,"八")==0)
return 8;
if(strcmp(shu,"九")==0)
return 9;
if(strcmp(shu,"零")==0)
return 0;
}
void change1(int num)
{
if(num==0) printf("零");
if(num==1) printf("一");
if(num==2) printf("二");
if(num==3) printf("三");
if(num==4) printf("四");
if(num==5) printf("五");
if(num==6) printf("六");
if(num==7) printf("七");
if(num==8) printf("八");
if(num==9) printf("九");
}
int main()
{char a[10],b[10],c[10],d[10],y[10],z[10],x[10],m[10];
int num;
scanf("%s %s %s %s",a,b,c,d);
if(strcmp(a,"整数")!=0||strcmp(c,"等于")!=0)
{printf("输入错误\n");
return 0;
}
num=change(d);
while(1)
{scanf("%s",y);
if(strcmp(y,"看看")==0) break;
if(strcmp(y,b)!=0)
{printf("输入错误\n");
return 0;
}
scanf("%s",z);
scanf("%s",x);
if(strcmp(z,"增加")==0)
num=num+change(x);
else if(strcmp(z,"减少")==0)
num=num-change(x);
else
{printf("输入错误\n");
return 0;
}
}
scanf("%s",m);
if(num/10==0)
change1(num);
else if(num%10==0)
{change1(num/10);
printf("十");
}
else
{change1(num/10);
printf("十");
change1(num%10);
}
return 0;
}