2020 面向对象程序设计寒假作业 1
1、这个作业属于哪个课程:2020面向对象程序设计张栋班
2、作业要求:https://www.cnblogs.com/jhy16193335/p/12212380.html
3、作业目标:
(1)学会安装C++的开发环境;
(2)了解C与C++的不同和相同的地方,并对编译过程有自己的理解;
(3)理解命令行,并学会使用它来查看编译器版本和一些基础的用法;
(4)锻炼写代码的能力;
(5)学习写博客的方法和技巧
一、问答题:
1、c的缺陷(http://c.biancheng.net/view/132.html)
(1)危险性高。
C语言设计的思想是:你想怎么写程序就怎么写,只要你的这种写法错得不是很离谱,就认为你这么写有特殊的含义,可以通过。比如C语言中你可以将一个浮点型数据赋给一个整型变量,编译时只会警告,但是会丢失精度。因为有歧义的程序也可以通过,这样就会有很多漏洞,黑客往往会抓住这些漏洞进行攻击。所以说C语言比较危险。
(2)开发周期长。
C语言是面向过程的语言,面向过程语言的一个特点就是写大项目的时候很容易“崩溃”。当代码上到 10 万行的时候很容易崩溃,会出现各种各样莫名其妙的错误。这时候就需要用另外一种思想将整个程序的框架重新设计一下,即用面向对象的思想设计。
(3)可移植性不强。
用C语言写的代码在其他机器上运行结果可能不一样,甚至不能运行。
2、C语言的编译过程(https://blog.csdn.net/weixin_40756041/article/details/88052207)
编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可执行程序。
(1)编译预处理。
读取C语言源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理。伪指令主要包括以下四个方面:
①宏定义指令
②条件编译指令,如#ifdef, #ifndef, #else, #elif, #endif
③头文件包含指令,如#include “FileName” 或者 #include 等。
④特殊符号,预编译程序可以识别一些特殊的符号。
预编译程序所完成的基本上是对源程序的“替代”工作。经过此种替代,生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件。这个文件的含义同没有经过预处理的源文件是相同的,但内容有所不同。下一步,此输出文件将作为编译程序的输出而被翻译成为机器指令。
(2)编译阶段。
经过预编译得到的输出文件中,将只有常量,如数字、字符串、变量的定义,以及C语言的关键字,如main, if, else, for, while, {, }, +, -, *, \, 等等。预编译程序所要做的工作就是通过词法分析和语法分析,在确认所有的指令都符合语法规则之后,将其翻译成等价的中间代码表示或汇编代码。
(3)优化阶段。
优化处理是编译系统中一项比较艰深的技术。它涉及到的问题不仅同编译技术本身有关,而且同机器的硬件环境也有很大的关系。优化一部分是对中间代码的优化。这种优化不依赖于具体的计算机。另一种优化则主要针对目标代码的生成而进行的。
经过优化得到的汇编代码必须经过汇编程序的汇编转换成相应的机器指令,方可能被机器执行。
(4)汇编过程。
汇编过程实际上指把汇编语言代码翻译成目标机器指令的过程。对于被翻译系统处理的每一个C语言源程序,都将最终经过这一处理而得到相应的目标文件。目标文件中所存放的也就是与源程序等效的目标的机器语言代码。
(5)链接程序。
由汇编程序生成的目标文件并不能立即就被执行,其中可能还有许多没有解决的问题。例如,某个源文件中的函数可能引用了另一个源文件中定义的某个符号(如变量或者函数调用等);在程序中可能调用了某个库文件中的函数,等等。所有的这些问题,都需要经链接程序的处理方能得以解决。
链接程序的主要工作就是将有关的目标文件彼此相连接,也即将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来。
二、实践题:
1、查看vs的C++编译器版本(https://blog.csdn.net/u013346007/article/details/77655569?utm_source=blogxgwz8)
(1)点击顶部的工具,选择命令行中的开发者提示。

(2)输入RC/?

(3)图中白底数字即为编译器版本

2、使用**命令行**编译一份C语言/C++代码。(https://www.cnblogs.com/-beyond/p/6636485.html)
(1)打开cmd

(2)查看代码文件的路径:

(3)在cmd中进入文件所在目录(输入cd ‘文件名’进入):

(4)用g++ 加上文件名,注意要加上文件扩展名,这样会生成一个a.exe的可执行文件

【这里我遇到一个问题,一开始输入时它显示“ 'g++' 不是内部或外部命令,也不是可运行的程序或批处理文件。”

查了一下说要先下载一个MinGW并且配置环境变量才行。(教程:https://www.jianshu.com/p/9bffbaf12bed)】
(5)直接输入a.exe并回车, 即可执行由homework1.cpp编译链接生成的程序

(6)输入参数即a与b的值,敲击回车之后即可出结果

【源代码如图:(是个简单的加法运算)
】
三、编程题:
1、思路:分别判断后面两个字符串(s3和s4)以使钱包的值发生变化。
2、代码存在的问题:
(1)只能输入十以内的数(汉字形式)
(2)只能输出100以内的数
3、解题过程遇到的问题:
(1)转化汉字为数字时一开始用switch比较,但switch只能比较数字,汉字只能用if和strcmp比较
(2)不知道怎么把10以上的汉字转化为数字
4、代码如下:
1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 char s1[5],s2[5],s3[5],s4[5]; 6 int sum,t,i; 7 scanf("%4s%4s%4s",s1,s2,s3); 8 while(strcmp(s2,"看看")!=0){ 9 scanf("%s",s4); 10 /*判断s4,即变化量的绝对值*/ 11 if(strcmp(s4,"零")==0)t=0; 12 if(strcmp(s4,"一")==0)t=1; 13 if(strcmp(s4,"二")==0)t=2; 14 if(strcmp(s4,"三")==0)t=3; 15 if(strcmp(s4,"四")==0)t=4; 16 if(strcmp(s4,"五")==0)t=5; 17 if(strcmp(s4,"六")==0)t=6; 18 if(strcmp(s4,"七")==0)t=7; 19 if(strcmp(s4,"八")==0)t=8; 20 if(strcmp(s4,"九")==0)t=9; 21 if(strcmp(s4,"十")==0)t=10; 22 /*下面判断s3,即加减,等于的运算符号*/ 23 if(strcmp(s3,"等于")==0)sum=t; 24 if(strcmp(s3,"增加")==0)sum+=t; 25 if(strcmp(s3,"减少")==0)sum-=t; 26 /*清空s4(数字)后输入下一组数据*/ 27 for(i=0;i<7;i++){ 28 s4[i]='\0'; 29 } 30 scanf("%4s%4s",s2,s3); 31 } 32 /*将sum的值转化为汉字输出,此时可以用switch操作,先判断十位数再判断个位数*/ 33 if(sum<0)printf("欠债了!"); 34 else if(sum>99)printf("超过一百元,我无能为力TAT"); 35 else{ 36 t=sum; 37 switch(t/10){ 38 case 1:printf("十");break; 39 case 2:printf("二十");break; 40 case 3:printf("三十");break; 41 case 4:printf("四十");break; 42 case 5:printf("五十");break; 43 case 6:printf("六十");break; 44 case 7:printf("七十");break; 45 case 8:printf("八十");break; 46 case 9:printf("九十");break; 47 case 0:break; 48 } 49 switch(sum%10){ 50 case 1:printf("一");break; 51 case 2:printf("二");break; 52 case 3:printf("三");break; 53 case 4:printf("四");break; 54 case 5:printf("五");break; 55 case 6:printf("六");break; 56 case 7:printf("七");break; 57 case 8:printf("八");break; 58 case 9:printf("九");break; 59 case 10:printf("十");break; 60 } 61 } 62 return 0; 63 }
还有很多不足之处,希望以后能改进。

浙公网安备 33010602011771号