作业信息
这个作业属于哪个课程 <班级的链接>(如2024-2025-1-计算机基础与程序设计)
这个作业要求在哪里 <作业要求的链接>(如2024-2025-1计算机基础与程序设计第一周作业)
这个作业的目标 <写上具体方面>功能设计与面向对象设计,面向对象设计过程,面向对象语言三要素,汇编、编译、解释、执行
作业正文
教材学习内容总结
1.面向对象方法
面向对象
对象:是面向对象中的基本单元,可将现实世界里的事物抽象成对象,比如一辆汽车、一个人等,每个对象都有自己的属性(描述其特征,像汽车的颜色、速度等)和方法(能执行的操作,如汽车的启动、刹车操作)。
设计方法
以对象为核心构建系统,通过抽象出类,定义类的属性、方法以及类之间的关系(如封装、继承、多态等特性)来设计软件。例如开发一个电商系统,可抽象出用户类、商品类、订单类等,明确它们相互的关联和各自功能,使系统结构清晰、易于维护和扩展。
2.翻译过程
编译器
编译器是一种将高级编程语言编写的源程序转换为目标机器可执行的机器语言程序的软件工具。
它的工作过程包含多个阶段,先是词法分析,把源程序的字符流分割成一个个单词;接着进行语法分析,构建出对应的语法树来检查程序语法结构是否正确;再通过语义分析明确程序语义;之后进行代码优化,改善生成代码的质量;最后生成目标代码,比如针对特定操作系统和硬件平台的可执行文件等。
常见的编译器有GCC(用于编译C、C++等语言)、javac(用于编译Java语言)等,不同的编译器服务于不同的编程语言,在软件开发中起着至关重要的作用,能让人们用高级语言方便编程,再转化为机器可读懂执行的代码。
解释器
解释器是一种计算机程序,用于执行高级编程语言编写的代码。
它与编译器不同,不会一次性将整个源程序编译成目标机器码,而是逐行读取源程序代码,对每行进行词法分析、语法分析等操作,理解其含义后立即执行,边解释边运行,每次运行都需要解释器参与。
像Python语言的CPython解释器、JavaScript的V8解释器等都很常见,解释器让代码编写更灵活,能快速看到执行效果,尤其适合脚本类、交互式编程场景,不过运行效率通常相对编译型语言生成的可执行文件来说会低一些。
3.程序设计语言范型
命令式泛型
在命令式编程中,强调通过一系列改变程序状态的语句来实现具体功能,比如赋值语句、控制流语句(像循环、条件判断等)。而泛型则是让代码能在多种不同类型的数据上复用,不必针对每种类型重复编写相似逻辑。
命令式泛型就是将泛型的特性融入到命令式编程风格里,例如在使用Java等支持泛型的命令式编程语言时,编写像泛型方法、泛型类等,用具体的命令式语句操作泛型参数指定的不同类型的数据,实现更通用、高效且可复用的代码逻辑,提升编程的灵活性以及代码的可维护性。
声明式泛型
声明式泛型主要侧重于以声明的方式来运用泛型这一特性。
与命令式编程中通过具体语句操作来体现不同,声明式泛型重点在于描述期望达成的结果或者约束条件,而不是详细指明实现步骤。它更多是在类型层面进行定义和约束,比如在编程语言中声明某个函数、类等能适用于多种符合特定规则的类型,像Haskell这类函数式编程语言运用类型类(type classes)机制来实现类似声明式泛型的效果,通过声明类型要满足的接口、行为规范等,让代码能灵活适配多种类型,增强代码的通用性和复用性,使得编程在处理不同类型数据时更加简洁、抽象且高效。
4.高级程序设计语言的功能性
布尔表达式
布尔表达式是一种表达式,其计算结果只有两种可能值,即真(True) 或假(False)。
它通常由布尔常量(True和False)、布尔变量以及布尔运算符(像“与”&&、“或”||、“非”! 等)组成,还可包含关系运算符(如大于>、等于==等)构成的比较式子,用于逻辑判断、条件控制等场景,常见于编程语言的条件语句(如if语句)、循环语句的控制条件中,能帮助决定程序的执行流程。
数据归类
数据归类是按照一定的规则和特征将数据划分到不同类别中的操作,以下是常见情况:
按数据类型归类
比如可分为数值型(像整数、小数等)、字符型(文字、符号等)、日期时间型、逻辑型(布尔值)等,不同类型的数据在存储、运算、使用方式上各有特点。
按来源归类
有来源于传感器采集的数据(如温度传感器的温度值)、用户输入的数据(网页表单填写内容)、系统自动生成的数据(日志文件记录等)等,便于了解数据出处及可靠性等情况。
按用途归类
可分为业务数据(如电商交易记录用于分析销售情况)、监控数据(服务器性能指标用于运维保障)、分析数据(经处理提炼用于决策的数据)等,有助于针对性地管理和利用数据。
按数据结构归类
例如可分为结构化数据(像关系数据库里规整排列的数据)、半结构化数据(如XML、JSON格式数据有一定结构但较灵活)、非结构化数据(图像、音频等无固定格式的数据),不同结构的数据处理手段差异较大。
输入/输出结构
输入结构
键盘输入:像在Python中可以使用 input() 函数,它会暂停程序执行,等待用户从键盘输入内容,输入的字符串可后续进行处理、赋值给变量等。在C、C++语言里常用 scanf() 等函数实现从键盘按指定格式读取数据,比如读取整数、浮点数等不同类型的数据并赋值给相应变量。
文件输入:通过打开指定文件,按相应规则读取文件中的数据。例如Python中用 open() 函数打开文件后,配合 read() 、 readline() 等方法获取文件内容;C语言里使用 fopen() 打开文件,再利用 fread() 等函数读取其中的数据,可用于批量处理外部已存储的数据。
其他输入方式:有些语言还支持从网络套接字等接收数据作为输入,像Java在网络编程场景下,可接收客户端发来的数据等用于后续程序处理。
输出结构
屏幕输出:Python可直接使用 print() 函数将内容显示在屏幕上,如变量的值、文本等;C、C++常用 printf() 函数按设定格式输出数据到屏幕,方便展示程序的运行结果、提示信息等给用户查看。
文件输出:同样是先打开文件,然后把要输出的数据写入文件中保存起来。例如Python的 open() 配合 write() 方法向文件写内容,C语言用 fopen() 结合 fwrite() 等函数完成数据向文件的输出,利于结果的长久存储与后续查阅、分析。
其他输出途径:部分语言还能将数据输出到数据库等特定目标,或者通过网络接口发送出去,像在Web开发中,将处理后的数据响应给客户端浏览器等情况。、
控制结构
顺序结构
顺序结构就是按照语句编写的先后顺序依次执行,例如:
include <stdio.h>
int main() {
int num1 = 5;
int num2 = 10;
int sum = num1 + num2;
printf("两数之和为:%d\n", sum);
return 0;
}
这段代码先定义两个变量,接着计算它们的和,最后输出结果,语句依次执行。
选择结构(以 if - else 语句为例)
根据条件判断来决定执行哪部分代码,如下:
include <stdio.h>
int main() {
int score = 80;
if (score >= 60) {
printf("成绩及格\n");
} else {
printf("成绩不及格\n");
}
return 0;
}
这里根据 score 的值判断是否大于等于 60,进而输出相应结果。
多分支选择结构(以 switch 语句为例)
用于处理多种不同的固定情况,比如:
include <stdio.h>
int main() {
int day = 3;
switch (day) {
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
default:
printf("其他日子\n");
}
return 0;
}
按照 day 的取值来决定输出对应的星期几的信息。
循环结构(以 for 循环为例)
用于重复执行一段代码,示例如下:
include <stdio.h>
int main() {
for (int i = 0; i < 5; i++) {
printf("当前数字是:%d\n", i);
}
return 0;
}
会循环 5 次,每次输出当前循环变量 i 的值。
另一种循环结构(以 while 循环为例 只要条件满足就一直循环,像:
include <stdio.h>
int main() {
int count = 0;
while (count < 3) {
printf("正在计数:%d\n", count);
count++;
}
return 0;
}
当 count 小于 3 时就持续执行循环体中的代码并更新 count 的值。
5.面向对象语言的功能性
封装:把类中的数据(属性)和操作这些数据的方法捆绑在一起,对外隐藏内部实现细节,只通过特定接口来访问,就像一个“黑箱”,能保护数据安全、提高代码复用性与可维护性,比如用户操作银行账户类,只需通过规定接口存钱、取钱,无需知道内部复杂的数据处理过程。
类:是对象的抽象模板,定义了对象具有的属性和方法,例如定义一个“动物”类,规定了动物有名称、年龄等属性,还有进食、移动等通用方法,对象则是类的具体实例化产物。
继承:允许创建新类(子类)去继承已有类(父类)的属性和方法,子类可以复用父类代码,还能添加自身特有的属性和方法,从而构建出类的层次关系,像“哺乳动物”类继承“动物”类,又在其基础上有胎生等更具体的特性。
多态:不同类的对象对同一消息(比如同样的方法调用)能做出不同响应,常见实现方式有方法重写、重载等,增强了程序的灵活性与可扩展性,例如不同形状类(圆形、矩形等)对计算面积的方法,有各自不同的实现逻辑。
6.过程设计与面向对象设计的区别
设计出发点不同
过程设计:以功能为出发点,着重考虑的是要实现的具体操作流程、步骤以及相应的算法,将整个系统按执行顺序分解成一个个相对独立的过程来设计,比如设计一个文件加密程序,会先规划读取文件、执行加密算法、写入加密后文件等各步骤的实现细节。
面向对象设计:以对象作为基本单元来构建系统,把现实世界中的事物抽象成对象,关注对象的属性、行为以及对象间的相互关系,例如开发一个校园管理系统,会先抽象出学生、教师、课程这些对象,再定义它们的特征和能做的事以及彼此如何交互。
数据与操作的关联方式不同
过程设计:数据和操作相对分离,数据常作为参数在不同的函数(过程)间传递,各函数负责具体的操作,数据在不同操作环节中流转、被处理,像在C语言中编写函数对数组进行排序操作,数组作为参数传递给排序函数。
面向对象设计:通过封装把数据(属性)和操作数据的方法紧密捆绑在对象内部,对象对外提供接口来访问和操作数据,外部一般无需知晓内部具体实现细节,像银行账户类把账户余额等数据和存款、取款等操作封装在一起,用户通过类的接口进行操作。
代码复用性和扩展性体现不同
过程设计:复用性主要依赖函数的复用,若要拓展功能,大多是新增函数或者修改已有函数内部逻辑,当系统复杂后,代码容易变得混乱,维护拓展较困难,例如在一个简单的数值计算程序中,若想增加新的计算类型,可能要大量修改原有的计算函数。
面向对象设计:利用继承可以方便地复用父类的属性和方法,子类能基于父类拓展新功能,多态又使得不同对象对同一消息有不同响应,便于灵活扩展系统功能,像游戏开发中,不同角色类继承自基础角色类,可轻松添加新角色并赋予独特行为,系统扩展性强。
对复杂问题的处理方式不同
过程设计:面对复杂问题往往是通过进一步细化功能模块、增加更多的函数以及复杂的调用关系来解决,随着复杂度提升,模块间的耦合可能变高,整体系统逻辑理解起来更困难,例如大型的数据处理系统,按过程细分会有众多功能模块且交互复杂。
面向对象设计:通过抽象出不同层次、不同类别的对象,梳理它们之间的关系,构建清晰的类层次结构来应对复杂问题,让整个系统的结构更直观、易于理解,像企业资源管理系统,用对象抽象出各部门、人员、资源等,以类关系体现业务逻辑,条理更清晰。
教材学习
1.功能设计与面向对象设计
功能设计:
着重关注系统要实现的各项功能,从用户需求出发去规划具体应具备哪些操作、业务流程等,侧重于清晰定义每个功能模块及其交互逻辑,常以流程图、功能列表等形式呈现,旨在确保系统能达成预期的任务执行要求。
面向对象设计:
以对象为核心,将现实世界中的事物抽象成类,类里包含属性和方法。通过类的实例化创建对象,对象之间通过消息传递等机制交互协作,注重对数据和操作的封装、继承以及多态等特性运用,使得系统具有更好的可扩展性、可维护性和复用性,常借助类图等来进行设计展示。
二者联系紧密,功能设计中确定的功能可通过面向对象设计里类与对象的构建、协作来落地实现,面向对象设计能为功能设计提供更灵活、高效的实现方式。
2.面向对象设计过程
面向对象设计过程一般包含以下几个主要步骤:
需求分析
充分理解系统要达成的目标、用户需求及相关业务场景,梳理出需要系统具备的各项功能和服务。
识别对象和类
从需求里找出关键的实体,将其抽象成类,确定类的属性(用来描述对象的特征)和方法(对象可执行的操作)。
定义类之间的关系
明确类之间存在的关联、聚合、组合、继承、依赖等关系,比如哪些类之间存在整体与部分的关系,哪些存在继承层次结构等。
设计对象的交互
确定对象之间如何通过消息传递等方式进行协作,以实现系统的功能,构建出合理的交互流程和顺序。
完善细节与优化
对类的属性、方法等细节进一步完善,考虑访问控制权限等,同时从可维护性、可扩展性等角度进行优化,必要时进行设计模式的应用,提升整体设计质量。
评审与验证
组织相关人员对设计进行评审,通过用例等方式验证设计能否满足需求,根据反馈进行调整修改。
3.面向对象语言三要素
面向对象语言的三要素为封装、继承、多态。
封装是将数据和操作数据的方法绑定起来,对外部隐藏对象的内部实现细节,仅通过特定接口访问,保障数据安全性与完整性。
继承允许创建的新类基于现有类,新类(子类)能继承父类的属性和方法,可实现代码复用与层次化的类结构构建。
多态指不同类的对象对同一消息做出不同响应,可通过重写、重载等方式体现,增强了程序的灵活性与可扩展性。
4.汇编、编译、解释、执行
汇编
是将汇编语言源程序转换为机器语言目标程序的过程。汇编语言使用助记符来表示机器指令,通过汇编器进行汇编操作,生成可由计算机硬件直接识别并执行的二进制代码形式的目标文件。
编译
针对高级编程语言(如C、C++等),编译器把源程序一次性全部翻译成目标机器可执行的机器语言程序(比如.exe文件等),编译后生成的文件可直接运行,后续运行时无需再次翻译源程序代码。
解释
对于像Python、JavaScript等语言,解释器会逐行读取源程序代码并立即执行,边解释边运行,不会生成独立的可脱离解释环境运行的目标文件,每次运行都需要解释器参与对源程序的解释工作。
运行
就是执行已经汇编、编译好的机器语言程序或者通过解释器对源程序进行实时解释执行的过程,让程序按照编写的逻辑完成相应任务,最终得到预期的输出结果。