作业描述 | 作业详情 |
---|---|
这个作业属于哪个课程 | 2020福大数计面向对象程序设计 |
这个作业要求在哪里 | 面向对象程序设计寒假作业1 |
这个作业的目标 | 1.了解c语言的缺点与c++的优点 2.了解c/c++的编译过程 3.查看c++编译器的版本 4.用命令行编译一份c/c++代码 5.编写一个程序,实现简单的中文编程 |
作业正文 | 见下文 |
其他参考文献 | 1、牛逼!用文言文来编程,97 年 CMU 本科生火遍全网! 2、C语言读取中文汉字 3、C/C++程序编译过程详解 4、在Windows命令行中编译运行C/C++程序 |
一、问答题
1、你认为C语言有什么缺陷(你觉得哪里用的不顺手)?
我目前对c++仍不是很了解,经过一学期对c语言的学习,我觉得c语言有许多好处,例如代码短小简练,便于书写,方法多样不拘一格。但同时也存在着一些缺陷,我在使用数组时,有时候不小心就会出现数组越界的现象,对整个程序造成重大的影响,有时候程序出现问题也不会报错,发现错误困难,有时候一道题要花很多时间才能发现错误。
2、简述c/c++编译过程
整个代码编译过程分为预处理、编译、汇编和链接4部分:
预处理指令的执行主要包含下列事情:
a.头文件的包含
b.注释的删除
c.宏定义的替换
d.条件编译的选择
编译主要包含下列事情:
a.编译之前,C语言编译器会进行词法分析、语法分析。
b.在确认所有的指令都符合语法规则之后,将其翻译成相应的后缀为S的汇编文件。
汇编主要包含下列事情:
汇编过程实际上指把汇编语言代码翻译成目标机器指令的过程
链接主要包含下列事情:
由汇编程序生成的目标文件并不能立即就被执行,其中可能还有许多没有解决的问题。例如,某个源文件中的函数可能引用了另一个 源文件中定义的某个符号(如变量或者函数调用等);在程序中可能调用了某个库文件中的函数等等。所有的这些问题,都需要经链接程序的处理方能得以解决。
链接程序的主要工作就是将有关的目标文件彼此相连接,也即将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够诶操作系统装入执行的统一整体。
二、实践题
查看自己的C++编译器版本
使用命令行编译一份C语言/C++代码。
Markdown在线编辑器 - www.MdEditor.com三、编程题
Markdown在线编辑器 - www.MdEditor.com1、题目要求
编写一个程序,输入满足以下语法要求的一段文字,输出运行后的结果。
变量定义:整数 钱包 等于 零
运算(加法):钱包 增加 四
运算(减法):钱包 减少 四
输出:看看 钱包
样例
输入:
整数 钱包 等于 零
钱包 增加 四
钱包 减少 三
看看 钱包
输出:
一
翻译过来就是 输入汉字,用汉字进行变量定义和赋初值、代替数进行加减运算。
(偷工减料限定数据范围在0~99。0~10的数直接表示。11~19的数用“十x”表示。20~99的数用“x十x表示”
2、分解需求:
分解为三个模块(即 exchange函数、cum函数、back函数)
exchange函数 用于将汉字转换成数字进行加减运算和输出。
int exchange( char s4[]){
if( !strcmp(s4,"零") ) return 0;
if( !strcmp(s4,"一") ) return 1;
if( !strcmp(s4,"二") ) return 2;
if( !strcmp(s4,"三") ) return 3;
if( !strcmp(s4,"四") ) return 4;
if( !strcmp(s4,"五") ) return 5;
if( !strcmp(s4,"六") ) return 6;
if( !strcmp(s4,"七") ) return 7;
if( !strcmp(s4,"八") ) return 8;
if( !strcmp(s4,"九") ) return 9;
if( !strcmp(s4,"十") ) return 10;
}
cum函数 用于判断进行的运算 并据此将exchange得到的数进行正负转换 和原始数相加减。
int cum(char s3[],char s4[]){
if( !strcmp(s3,"增加") ) { return exchange(s4); }
if( !strcmp(s3,"减少") ) { return -exchange(s4); }
}
back函数用于输出 将数字转换为汉字形式 并在输出时根据数据范围进行不同格式输出。
int back(int wal){
char a[10][4]={"零","一","二","三","四","五","六","七","八","九"};
if( wal >= 10 && wal <= 99){
int x = wal%10;
wal/=10;
if(wal!=1)
printf("%s十%s",a[wal],a[x]);
else
printf("十%s",a[x]);
}
else printf("%s",a[wal]);
}
Markdown在线编辑器 - www.MdEditor.com
遇到的问题:
3、刚开始写 采用类似“s=”整数“”的形式,结果出现错误。
查阅资料得知汉字占两个字符。于是引入头文件 string.h,采用strcmp函数进行字符串的比较。
4、对数据进行特判处理,如数据不小于零、数据类型为整形等。
5、在运算部分,应先输入第一个字符串进行判断。
我刚开始将三个合在一起输入并判断,于是在遇到“看看 钱包”时,缺少一个字符串,导致程序无法结束。
于是先对“看看”判断,再输入。
完整代码
#include
#include
int exchange( char s4[]){
if( !strcmp(s4,"零") ) return 0;
if( !strcmp(s4,"一") ) return 1;
if( !strcmp(s4,"二") ) return 2;
if( !strcmp(s4,"三") ) return 3;
if( !strcmp(s4,"四") ) return 4;
if( !strcmp(s4,"五") ) return 5;
if( !strcmp(s4,"六") ) return 6;
if( !strcmp(s4,"七") ) return 7;
if( !strcmp(s4,"八") ) return 8;
if( !strcmp(s4,"九") ) return 9;
if( !strcmp(s4,"十") ) return 10;
}
int cum(char s3[],char s4[]){
if( !strcmp(s3,"增加") ) { return exchange(s4); }
if( !strcmp(s3,"减少") ) { return -exchange(s4); }
}
int back(int wal){
char a[10][4]={"零","一","二","三","四","五","六","七","八","九"};
if( wal >= 10 && wal <= 99){
int x = wal%10;
wal/=10;
if(wal!=1)
printf("%s十%s",a[wal],a[x]);
else
printf("十%s",a[x]);
}
else printf("%s",a[wal]);
}
int main()
{
int wal = 0 ;
char s1[100],s2[100],s3[100],s4[100];
scanf("%s %s %s %s",s1,s2,s3,s4);
getchar();
if( strcmp(s1,"整数") ) { printf("输入错误。\n"); }
else wal += exchange(s4);
while(1){
scanf("%s",s2);
if( !strcmp(s2,"看看") ){
if( wal < 0 ) printf("输入错误。\n");
else back(wal);
break;
}
scanf("%s %s",s3,s4);
wal += cum(s3,s4);
}
}
以上就是我第一次作业的全部内容。