面向对象程序设计寒假作业1
这个作业属于哪个课程 | |
---|---|
这个作业要求在哪里 | 2020年面向对象程序设计 (福州大学 - 数学与计算机科学学院) |
这个作业的目标 | 了解c与c++之间的关系和区别以及各自的优劣势、 |
作业正文 | 问答题、实践题、编程题 |
其他参考文献 | C/C++程序编译过程详解 c++菜鸟教程 |
面向对象程序设计寒假作业1
问答题
- 如果你不了解C++请回答以下问题:你认为C语言有什么缺陷(你觉得哪里用的不顺手)。
如果你已经了解C++请回答以下问题:你觉得C++和C语言比有什么优点。
c++我其实没了解多少,但是编程斗胆用c++写了下(没写完)( = ^=)
c++相对C而言,多了类与对象,大概是面向对象编程语言的特色吧。类能实现的东西要比c中与之相似的结构体要多,比如在类中插入成员函数,以及不用像c中的结构体那样挂个struct到处跑(虽然有typedef)。而且也对结构体进行了优化,使得结构体拥有了类的部分特性,更适用于面向对象编程了。除此之外,c++多了一个string类。允许程序员直接对字符串进行操作而不需要借助字符数组,而且末尾没有'\0'所以不影响字符串长度测量。可以想象c++“打包”了不少函数与方法来减少面向对象编程时的复杂性。以上(都是靠写一点c++感受到的,想不出其他优点了)。
- 查阅相关资料,简述一下C语言/C++的编译过程。
对于编译器而言,拿到一堆用高级语言写的代码,肯定要进行预处理,先对带井号的语句进行处理,是头文件就调用相应头文件的内容,是宏定义就把所有Name用TokenString替换等等等等。经过
预编译之后,就要进行正式编译与优化。预编译后的输出文件依然是一堆关键字与表达式,这是编译器对这些指令进行语法检查,确认完全无语法错误之后就开始翻译成中间语言或汇编语言代码,之后便对
得到的代码进行优化,分别对中间代码与目标代码的生成进行优化。最终得到所需的汇编代码。
得到汇编代码后,就要开始汇编,将汇编代码汇编成机器语言代码,最后创建出目标文件。再对目标文件进行链接,最终形成可执行的文件。
总结:预编译处理(.c) --> 编译、优化程序(.s、.asm)--> 汇编程序(.obj、.o、.a、.ko) --> 链接程序(.exe、.elf、.axf等)
以上。
实践题
1.查看自己的C++编译器版本。
也没遇上啥问题,就是把装dev c++带的gcc/g++拿来用了。如上图,gcc版本为4.9.2。
2.使用命令行编译一份C语言/C++代码。
为了测试于是写了一个最简单的输出"Saluton mondo!"(世界语:你好,世界!)的程序(对,用记事本,顺便夹带私活233),然后改后缀名为.cpp用g++编译输出可执行文件运行。反正靠必应上的内容照猫画虎摸爬滚打弄出来了233。
编程题
有一说一编程题还没实现( = ^=),不过先奉上不成熟的代码好了。
1.首先,题目要求输入汉字来满足一系列定义,赋值与运算操作。以示例为例,我个人理解是需要定义的变量只有一个,类型只有整数,但变量名不一定是钱包,我给出的变量名限制是8个汉字。且涉及的运算只有加减,数值不超过100。对变量的打印操作通过“看看”实现。那么基本可以确定代码框架了。
2.代码框架。我设计的函数模块只有7个,分别是汉字数字转阿拉伯数字的"ctransform",与阿拉伯数字转汉字数字的"itransform",处理输入的函数"input",处理打包汉字变量的"deal",负责加减的"c_plus"与"c_minus",以及处理变量操作的"operate"。一个汉字变量类c_var,两个字符数组指针分别储存汉字数字与汉字操作。
ctransform:
```char *ctransform(int num)
{
int idigit1,idigit2;char *cdigit[3];
if(num<=10)
{
strcpy(cdigit[0],cd[num]);
}
else if(num>10)
{
idigit1=num%10;
idigit2=num/10;
if(idigit2==0)strcpy(cdigit[0],cd[idigit1]);
else if(idigit2==1)
{
strcpy(cdigit[1],cd[idigit1]);
strcpy(cdigit[0],cd[10]);
}
else
{
strcpy(cdigit[2],cd[idigit1]);
strcpy(cdigit[1],cd[10]);
strcpy(cdigit[0],cd[idigit2]);
}
}
return *cdigit;
}```
itransform:
```int itransform(char *char_num[3])
{
int num,i,j,l=strlen(*char_num);
for(i=l-1;i>=0;i--)
{
for(j=0;j<11;j++)
{
if(strcmp(char_num[i],cd[j])==0)
{
if(j<10)
{
switch(i)
{
case 2:num+=j;break;
case 0:num+=j*10;break;
}
}
else
{
switch(i)
{
case 2:num+=10;break;
case 1:l>2?:num+=10;break;
}
}
}
}
}
return num;
}```
input:
```c_var input()
{
string var_name;char *var_number[3],*var_def[2],*var_equal[2];string var_par[4];int i;
scanf("%s",*var_def);
cin>>var_name;
scanf("%s",*var_equal);
scanf("%s",*var_number);
return deal(var_name,var_number);
}```
deal:
{
c_var character_var;
character_var.name=var_name;
character_var.num=itransform(var_number);
return character_var;
}```
c_plus,c_minus,c_operate:
```int c_plus(c_var character_var,char *c_num[3])
{
int num,pnum;
num=itransform(c_num);
pnum=character_var.num;
return num+pnum;
}
int c_minus(c_var character_var,char *c_num[3])
{
int num,mnum;
num=itransform(c_num);
mnum=character_var.num;
return mnum-num;
}
void operate(c_var character_var)
{
char *op[20];
while(1)
{
scanf("%s",op[0]);
if(op[0]==character_var.name)
{
scanf("%s",op[1]);
scanf("%s",op[2]);
if(op[1]==cp[0])character_var.num=c_plus(character_var,*op[2]);
else if(op[1]==cp[1])character_var.num=c_minus(character_var,*op[2]);
}
else if(op[0]==cp[2])
{
scanf("%s",op[1]);
break;
}
}
cout<<ctransform(character_var.num)<<endl;
}```
完整代码:
include
include
include
include
using namespace std;
const char *cd[11]={"零","一","二","三","四","五","六","七","八","九","十"};
const char *cp[5]={"增加","减少","看看","整数","等于"};
class c_var{
public:
int num;
string name;
char c_number[3];
};
int itransform(char char_num[3])
{
int num,i,j,l=strlen(char_num);
for(i=l-1;i>=0;i--)
{
for(j=0;j<11;j++)
{
if(strcmp(char_num[i],cd[j])==0)
{
if(j<10)
{
switch(i)
{
case 2:num+=j;break;
case 0:num+=j10;break;
}
}
else
{
switch(i)
{
case 2:num+=10;break;
case 1:l>2?:num+=10;break;
}
}
}
}
}
return num;
}
char *ctransform(int num)
{
int idigit1,idigit2;char *cdigit[3];
if(num<=10)
{
strcpy(cdigit[0],cd[num]);
}
else if(num>10)
{
idigit1=num%10;
idigit2=num/10;
if(idigit20)strcpy(cdigit[0],cd[idigit1]);
else if(idigit21)
{
strcpy(cdigit[1],cd[idigit1]);
strcpy(cdigit[0],cd[10]);
}
else
{
strcpy(cdigit[2],cd[idigit1]);
strcpy(cdigit[1],cd[10]);
strcpy(cdigit[0],cd[idigit2]);
}
}
return *cdigit;
}
c_var deal(string var_name,char var_number[3])
{
c_var character_var;
character_var.name=var_name;
character_var.num=itransform(var_number);
return character_var;
}
c_var input()
{
string var_name;char var_number[3],var_def[2],var_equal[2];string var_par[4];int i;
scanf("%s",var_def);
cin>>var_name;
scanf("%s",var_equal);
scanf("%s",*var_number);
return deal(var_name,var_number);
}
int c_plus(c_var character_var,char *c_num[3])
{
int num,pnum;
num=itransform(c_num);
pnum=character_var.num;
return num+pnum;
}
int c_minus(c_var character_var,char c_num[3])
{
int num,mnum;
num=itransform(c_num);
mnum=character_var.num;
return mnum-num;
}
void operate(c_var character_var)
{
char op[20];
while(1)
{
scanf("%s",op[0]);
if(op[0]character_var.name)
{
scanf("%s",op[1]);
scanf("%s",op[2]);
if(op[1]cp[0])character_var.num=c_plus(character_var,op[2]);
else if(op[1]==cp[1])character_var.num=c_minus(character_var,op[2]);
}
else if(op[0]==cp[2])
{
scanf("%s",op[1]);
break;
}
}
cout<<ctransform(character_var.num)<<endl;
}
int main()
{
c_var character_var;
character_var=input();
operate(character_var);
return 0;
}