寒假作业1
#寒假作业一
问答题
如果你不了解C++请回答以下问题:你认为C语言有什么缺陷(你觉得哪里用的不顺手)。
地址符不打检测不出来,会直接运行错误。数组一不小心就越界了。输入的时候,字符数组里的字符有时候会被回车键代替。
查阅相关资料,简述一下C语言/C++的编译过程。
(1) 预处理
预编译又称预处理,主要对源文件进行一些文本处理,处理的对象是以#开头的语句,包括#include(文件包含)#define(宏定义)和条件编译(#ifdef #ifndef #if #undef),具体的说,将被include文件中的内容复制到源文件中,然后将所有宏进行替代(根据宏的定义,替换掉所有的宏,例如定义了#define true 1,那么会将所有语句中的true用1进行代换,预处理后的文件中不再含有任何宏定义),处理条件编译的语句(只保留符合编译条件的语句,不符合条件的语句会删除掉),预处理之后的文件不会出现以#开头的任何语句。
(2) 编译
编译主要是将源文件.C文件生成汇编代码文件.s文件。编译的主要工作是进行语法检查,查看是否有语法错误。特别注意一点,对于一些非本源文件中的外部函数(非本源文件中定义的函数),外部变量(非本源文件中定义的变量),编译不会去追究其定义及实现,一般只要有对应的声明,就可编译通过,甚至说外部函数没声明都可以编译通过(比如一般gcc就不会报错,只要链接能找到对应函数,仍然会生成可执行文件,但是g++就会报函数未声明的错误)。
(3) 汇编
汇编是将汇编代码生成机器码,也就是二进制文件,这个文件也叫做目标文件,即.obj或者.o文件,汇编是机械转换的过程。
(4) 链接
链接是将生成的一个或者多个中间文件联合生成可执行文件。所有的可执行文件都需要一个入口函数,在c语言里面入口函数是main函数,每个源文件都可能调用到其他源文件中的函数,所以生成的.o目标文件要进行链接,链接其他.o文件中的函数实现,最终生成一个可执行文件,链接主要工作是链接函数实现(本目标文件内部或者其他目标文件中定义的)和外部变量(函数体外的变量,也就是全局变量),进行各个目标文件的交互,具体是这样的,目标文件中的每个函数如果调用到了其他函数,那么就去链接其他的函数到本函数中,如果用到了外部的变量,那么去链接这个变量。
实践题
###查看自己的C++编译器版本
点工具,然后命令行,开发者命令提示,然后输入cl.exe.

###使用命令行编译一份C语言/C++代码。
这个完全全不明白怎么搞,先是自己上网搜没啥结果,然后看同学作业提交的 ,win加r,然后cmd,然后输入自己写的文件的地址和文件名然后我就傻了,找不到也不知道怎么找.
编程题
编写一个程序,输入满足以下语法要求的一段文字,输出运行后的结果。
变量定义:整数 钱包 等于 零
运算(加法):钱包 增加 四
运算(减法):钱包 减少 四
输出:看看 钱包
样例
输入:
整数 钱包 等于 零
钱包 增加 四
钱包 减少 三
看看 钱包
输出:
一
注意:
输入输出用例均为GBK编码,推荐使用vscode把文本切换为GBK编码。
数字只会出现以下 零一二三四五六七八九十 。
先写一个函数把得到的中文数字转化为阿拉伯数字,方便后面计算;
int num(char d[])
{
if (!strcmp(d, "零")) return 0;
else if (!strcmp(d, "一")) return 1;
else if (!strcmp(d, "二")) return 2;
else if (!strcmp(d, "三")) return 3;
else if (!strcmp(d, "四")) return 4;
else if (!strcmp(d, "五")) return 5;
else if (!strcmp(d, "六")) return 6;
else if (!strcmp(d, "七")) return 7;
else if (!strcmp(d, "八")) return 8;
else if (!strcmp(d, "九")) return 9;
else if (!strcmp(d, "十")) return 10;
}
然后写一个函数用来判断数字增加还是减少
int judge(int n, char c[], char d[])
{
if (!strcmp(c, "增加")) return n + num(d);
else if (!strcmp(c, "减少")) return n - num(d);
}
再写一个函数将最后的阿拉伯数字重新转化为汉字,省的最后用一大堆if。
void sum(int n)
{
char nums[10][4] = { "零","一","二","三","四","五","六","七","八","九" };
printf("%s", nums[n]);
}
主函数就是先得到,输入的数据然后进行一通计算
int main()
{
char a[10], b[10], c[10], d[10];
int n;
scanf("%s%s%s%s", a, b, c, d);
getchar();\这个是为了防止回车键干扰得到的数据,在自己试的时候结果不对,后来加上这个
n = num(d);
scanf("%s %s %s", a,b,c);
n = judge(n, b, c);
getchar();
scanf("%s%s%s", a, b, c);
n = judge(n, b, c);
sum(n);
}
然后完整的代码就是
include<stdio.h>
include<string.h>
int num(char d[])
{
if (!strcmp(d, "零")) return 0;
else if (!strcmp(d, "一")) return 1;
else if (!strcmp(d, "二")) return 2;
else if (!strcmp(d, "三")) return 3;
else if (!strcmp(d, "四")) return 4;
else if (!strcmp(d, "五")) return 5;
else if (!strcmp(d, "六")) return 6;
else if (!strcmp(d, "七")) return 7;
else if (!strcmp(d, "八")) return 8;
else if (!strcmp(d, "九")) return 9;
else if (!strcmp(d, "十")) return 10;
}
int judge(int n, char c[], char d[])
{
if (!strcmp(c, "增加")) return n + num(d);
else if (!strcmp(c, "减少")) return n - num(d);
}
void sum(int n)
{
char nums[10][4] = { "零","一","二","三","四","五","六","七","八","九" };
printf("%s", nums[n]);
}
int main()
{
char a[10], b[10], c[10], d[10];
int n;
scanf("%s%s%s%s", a, b, c, d);
getchar();
n = num(d);
scanf("%s %s %s", a,b,c);
n = judge(n, b, c);
getchar();
scanf("%s%s%s", a, b, c);
n = judge(n, b, c);
sum(n);
}
样例