作业描述 | 详情 |
---|---|
这个作业属于哪个课程 | 2020福大面向对象程序设计 |
这个作业要求在哪里 | 面向对象程序设计寒假作业一 |
这个作业的目标 | a.安装c++开发环境; b.了解c语言缺陷,以及c++/c语言编译过程; c.了解命令行,查看编译器版本,用命令行编译代码; d.学习markdown技巧,完成要求编程题 |
作业正文 | 寒假作业一 |
其他参考文献 | visual studio2019的安装以及使用、markdown、C++ Primer Plus |
一、问答题
1.如果你不了解C++请回答以下问题:你认为C语言有什么缺陷(你觉得哪里用的不顺手)。
1.C语言比较灵活,但这就造成语法限制不严格。
C语言对数组下标越界不检查,对变量类型也约束不严,运行时类型检查不可用,这样就很难发现错误。
2.C语言运算符多,优先级也不太一样,使用的时候比较麻烦。
有的时候对部分运算符优先级使用错误,也较难发现。
3.C语言在实现过程中可能会比较复杂,有时代码需要写的很长。
4.输入输出都比较麻烦,对于字符串的输入输出问题也更容易出现问题。
2.查阅相关资料,简述一下C语言/C++的编译过程。
(最近刚开始看c++,这边对c++的编译过程进行简述)
编译源代码,这个过程是将源代码翻译为主机使用的内部语言——机器语言。
过程大概是预编译处理(.c)->编译优化程序(.s->汇编程序(.obj、.o、.a)-> 链接程序(.exe、.elf等)
1.编译预处理
预处理是做些代码文本替换工作。编译器执行预处理指令(以#开头,如#include),这个过程会得到不包含#指令的.i文件。
会拷贝#include包含的文件代码,进行#define 宏定义的替换,处理条件编译指令等。
2.编译优化
通过预编译输出的.i文件中,只有常量:数字、字符串、变量的定义,以及一些关键字,如main、if、else、for等。
编译优化过程是通过语法分析和词法分析,确定所有指令是否符合规则,之后翻译成汇编代码,将.i文件转化位.s文件。
3.汇编
汇编过程就是把汇编语言翻译成目标机器指令的过程,生成目标文件(.obj .o等)。
目标文件中存放的也就是与源程序等效的目标的机器语言代码。
目标文件由段组成,通常至少有两个段:
代码段:包换主要程序的指令。该段是可读和可执行的,一般不可写
数据段:存放程序用到的全局变量或静态数据。可读、可写、可执行。
这个过程将.s文件转化成.o文件。
4.链接目标代码与其他代码。
由汇编程序生成的目标文件并不能立即就执行,还要有链接的过程。
链接指的是将目标代码同使用的函数的目标代码以及一些标准的启动代码组合起来,生成程序的运行阶段版本。
包含该最终产品的文件被称为可执行代码。
二、实践题
1.查看自己的C++编译器版本。
选择VS 2019界面里的工具->命令行->开发者命令提示
输入cl.exe,回车则可查看
2.使用命令行编译一份C语言/C++代码。
这里我是点开VS工具里的命令行->开发者命令提示,用cl命令打开
分别输入cl,空格,代码文件地址,然后回车(发现这样也可以看到编译器版本)
之后输入代码文件名.exe就完成了代码的编译运行。
三、编程题
编程题(请使用C语言或者C++完成以下题目):
中国文化博大精深,从仓颉造字开始,汉字一直流传到了今天。我们在感叹汉字的源远流长时,也不禁感慨,为什么没有一门使用汉字编程的语言?
汉字真的不能编程吗?最近文言文编程火了一把,吾有一數。曰三。名之曰「甲」。这朴实无华的变量定义无疑不是几千年来中华文化的发展中一朵奇葩。
今天小王同学想,文言文能编程那白话文呢?他找到了你,让你帮帮他。
编程要求
编写一个程序,输入满足以下语法要求的一段文字,输出运行后的结果。
变量定义:整数 钱包 等于 零
运算(加法):钱包 增加 四
运算(减法):钱包 减少 四
输出:看看 钱包
样例
输入:
整数 钱包 等于 零
钱包 增加 四
钱包 减少 三
看看 钱包
输出:
一
思考
从题目可以看到,首先定义初始值,之后进行加减运算,“看看”表示输出结果。
需考虑输入输出转换,以及计算过程的实现。
一开始没有考虑错误输入的问题,后来看到同学们的讨论,又补上了对错误输入的判断。
代码中输出有三种情况:小于十的结果;整十的结果;大于十但不为整十的结果
代码问题:目前没有办法实现输入整数大于九的数的运算
程序划分
通过两个函数转换过程:1.把输入的汉字转化成数字
2.把计算结果以汉字形式输出
在主函数完成输入、运算、输出过程,其中还包括错误输入的排除。
转换以及错误输入的判断主要通过strcmp函数实现。
转化过程:
1.汉字转化成数字
int convert1(char wen[])
{
using namespace std;
if (strcmp(wen, "零") == 0)
return 0;
if (strcmp(wen, "一") == 0)
return 1;
if (strcmp(wen, "二") == 0)
return 2;
if (strcmp(wen, "三") == 0)
return 3;
if (strcmp(wen, "四") == 0)
return 4;
if (strcmp(wen, "五") == 0)
return 5;
if (strcmp(wen, "六") == 0)
return 6;
if (strcmp(wen, "七") == 0)
return 7;
if (strcmp(wen, "八") == 0)
return 8;
if (strcmp(wen, "九") == 0)
return 9;
}
2.把计算结果以汉字形式输出
void convert2(int integer)
{
using namespace std;
if (integer == 0)
cout << "零";
if (integer == 1)
cout << "一";
if (integer == 2)
cout << "二";
if (integer == 3)
cout << "三";
if (integer == 4)
cout << "四";
if (integer == 5)
cout << "五";
if (integer == 6)
cout << "六";
if (integer == 7)
cout << "七";
if (integer == 8)
cout << "八";
if (integer == 9)
cout << "九";
}
3.主函数
int main(void)
{
using namespace std;
char a[20], x[20], b[20], y[20], m[20], n[20], s[20], h[20];
int integer;
cin >> a >> x >> b >> y;
if (strcmp(a, "整数") != 0 || strcmp(b, "等于") != 0)//对输入的判断
cout << "输入错误" << endl;
integer = convert1(y);
while (1)//利用while循环实现计算过程
{
cin >> m;
if (strcmp(m, "看看") == 0)//输入到“看看”的时候,计算已结束,退出循环
break;
if (strcmp(m, x) != 0)//对计算对象的判断
{
cout << "输入错误" << endl;
return 0;
}
cin >> n >> s;
if (strcmp(n, "增加") == 0)//运算的实现
integer = integer + convert1(s);
else if (strcmp(n, "减少") == 0)
integer = integer - convert1(s);
else
{
cout << "输入错误" << endl;
return 0;
}
}
cin >> h;//接下来是输出的过程
if (integer / 10 == 0)//第一种情况:输出小于十的结果
convert2(integer);
else if (integer % 10 == 0)//第二种情况:输出整十的结果
{
convert2(integer % 10 == 0);
cout << "十";
}
else//第三种情况:输出大于十,且不是整十的结果
{
convert2(integer / 10);
cout << "十";
convert2(integer % 10);
}
return 0;
}
完整代码
#include<iostream>
#include<string>
int convert1(char wen[])
{
using namespace std;
if (strcmp(wen, "零") == 0)
return 0;
if (strcmp(wen, "一") == 0)
return 1;
if (strcmp(wen, "二") == 0)
return 2;
if (strcmp(wen, "三") == 0)
return 3;
if (strcmp(wen, "四") == 0)
return 4;
if (strcmp(wen, "五") == 0)
return 5;
if (strcmp(wen, "六") == 0)
return 6;
if (strcmp(wen, "七") == 0)
return 7;
if (strcmp(wen, "八") == 0)
return 8;
if (strcmp(wen, "九") == 0)
return 9;
}
void convert2(int integer)
{
using namespace std;
if (integer == 0)
cout << "零";
if (integer == 1)
cout << "一";
if (integer == 2)
cout << "二";
if (integer == 3)
cout << "三";
if (integer == 4)
cout << "四";
if (integer == 5)
cout << "五";
if (integer == 6)
cout << "六";
if (integer == 7)
cout << "七";
if (integer == 8)
cout << "八";
if (integer == 9)
cout << "九";
}
int main(void)
{
using namespace std;
char a[20], x[20], b[20], y[20], m[20], n[20], s[20], h[20];
int integer;
cin >> a >> x >> b >> y;
if (strcmp(a, "整数") != 0 || strcmp(b, "等于") != 0)
cout << "输入错误" << endl;
integer = convert1(y);
while (1)
{
cin >> m;
if (strcmp(m, "看看") == 0)
break;
if (strcmp(m, x) != 0)
{
cout << "输入错误" << endl;
return 0;
}
cin >> n >> s;
if (strcmp(n, "增加") == 0)
integer = integer + convert1(s);
else if (strcmp(n, "减少") == 0)
integer = integer - convert1(s);
else
{
cout << "输入错误" << endl;
return 0;
}
}
cin >> h;
if (integer / 10 == 0)
convert2(integer);
else if (integer % 10 == 0)
{
convert2(integer % 10 == 0);
cout << "十";
}
else
{
convert2(integer / 10);
cout << "十";
convert2(integer % 10);
}
return 0;
}
运行结果示例: