作业信息
作业归属课程:https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP
作业要求:https://www.cnblogs.com/rocedu/p/9577842.html#WEEK08
作业目标:功能设计与面向对象设计;面向对象设计过程;面向对象语言三要素;汇编、编译、解释、执行
作业正文:https://www.cnblogs.com/incamellia/p/18550414
教材学习内容总结
《计算机科学概论(第七版)》第9章
- 功能设计与面向对象设计
- 功能设计:
功能设计关注于软件系统的功能需求,即系统应该做什么。它通常涉及将问题分解为更小的、可管理的功能单元,并定义这些单元之间的接口。 - 面向对象设计:
面向对象设计(OOD)是一种以类和对象为中心的软件设计方法。它强调数据(对象的状态)和行为(对象的操作)的封装,以及类之间的继承和多态性。OOD的目标是创建一个可重用、可扩展和易于维护的系统。
- 面向对象设计过程
- 需求分析:确定系统的需求,包括功能需求和非功能需求。
- 概念性设计:定义系统的高级结构,包括主要的类和对象,以及它们之间的关系。
- 详细设计:细化概念性设计,定义每个类的属性和方法,以及类之间的交互。
- 实现:根据详细设计编写代码。
- 测试:验证代码是否满足需求,并修复发现的问题。
- 维护:根据用户反馈和系统变化,对软件进行持续的改进和更新。
- 面向对象语言三要素
- 封装:
封装是将数据(属性)和操作数据的方法(行为)捆绑在一起的过程。它隐藏了对象的内部状态,只通过一个清晰的接口与外部交互。 - 继承:
继承是一种创建新类(子类)的方式,新类可以继承现有类(父类)的属性和方法。这允许代码重用,并建立类之间的层次结构。 - 多态:
多态性允许不同的对象对同一消息做出响应。这意味着同一个方法调用可以有不同的行为,这取决于对象的实际类型。
- 汇编、编译、解释、执行
- 汇编:
汇编是将汇编语言代码转换为机器代码的过程。汇编语言是一种低级编程语言,它更接近机器代码,但仍包含一些助记符,以便于人类理解和编写。 - 编译:
编译是将高级编程语言(如C++或Java)代码转换为机器代码的过程。编译器会进行语法和语义分析,生成可执行文件。 - 解释:
解释是直接执行源代码的过程,而不需要将其转换为机器代码。解释器逐行读取源代码,并立即执行相应的操作。Python和JavaScript是使用解释器的编程语言的例子。 - 执行:
执行是计算机运行机器代码的过程。在执行过程中,CPU会逐条读取指令,并执行它们。
《C语言程序设计》第7章
- 函数的分类和定义
- 函数分类:
库函数:C语言标准库中预定义的函数,如printf、scanf等。
用户自定义函数:用户根据需要编写的函数,用于执行特定的任务。 - 函数定义:
函数定义包括返回类型、函数名、参数列表和函数体。
返回类型 函数名(参数类型 参数名, ...){ 函数体 }
- 向函数传递值和从函数返回值
- 函数调用:
调用函数时,需要提供与函数定义匹配的参数列表。
函数名(实参1, 实参2, ...);
- 函数原型:
函数原型是函数定义的声明,它告诉编译器函数的返回类型、名称和参数类型。
返回类型 函数名(参数类型 参数名, ...);
- 函数的封装与防御性程序设计
封装:封装是将数据(变量)和操作数据的代码(函数)组合在一起,对外隐藏内部实现细节。
防御性程序设计:编写代码时考虑异常情况和错误处理,确保程序的健壮性。 - 函数设计的基本原则
模块化:将程序分解成独立的、可重用的模块,每个模块完成一个特定的功能。
单一职责原则:每个函数应该只做一件事,并且做好这件事。
开放/封闭原则:软件实体应该对扩展开放,对修改封闭。
- 函数的递归调用和递归函数
- 递归调用:函数直接或间接地调用自身,直到满足某个条件停止。
- 递归函数:递归函数必须有一个明确的结束条件,以避免无限递归。
- 变量的作用域和生存周期
- 作用域:
局部变量:在函数内部定义,只在该函数内部可见。
全局变量:在函数外部定义,在整个程序中可见。 - 生存周期:
局部变量:在函数调用时创建,在函数返回时销毁。
全局变量:在程序开始时创建,在程序结束时销毁。
- 模块化程序设计
- 模块化:将程序分解成模块,每个模块完成一个特定的功能,通过函数接口与其他模块交互。
- 头文件:使用头文件(.h)来声明函数原型和全局变量,实现模块间的接口定义。
- 源文件:包含函数定义的文件(.c),每个模块一个源文件。
- 编译和链接:编译每个模块的源文件,然后将它们链接在一起生成可执行文件。
教材学习中的问题和解决过程
问题:递归函数和循环结构有什么区别和共同点吗
- 区别
- 实现方式:
递归函数:递归是通过函数自己调用自己来实现重复操作的。每次递归调用都会创建一个新的函数调用栈帧,用于存储局部变量和返回地址。
循环结构:循环是通过重复执行一段代码块来实现重复操作的,通常使用for、while或do-while循环。 - 内存使用:
递归函数:每次递归调用都会占用新的栈空间,如果递归深度过大,可能会导致栈溢出。
循环结构:循环不涉及额外的栈空间分配,通常只使用循环变量和条件判断所需的内存。 - 适用场景:
递归函数:适用于可以分解为相似子问题的问题,如树的遍历、分治算法等。
循环结构:适用于需要重复执行固定次数的操作,或者直到满足某个条件为止。 - 性能:
递归函数:递归函数可能会有额外的性能开销,因为每次递归调用都涉及到函数调用的开销,以及可能的栈空间分配和回收。
循环结构:循环通常性能更好,因为它们避免了函数调用的开销。 - 可读性和复杂性:
递归函数:递归函数的代码通常更简洁,易于理解,特别是对于自然适合递归的问题。
循环结构:循环结构可能需要更多的代码来处理迭代和条件判断,但它们通常更容易调试和优化。
- 共同点
- 重复执行:递归函数和循环结构都可以用于重复执行一段代码。
- 条件控制:两者都需要一个明确的结束条件,以避免无限递归或无限循环。
- 代码块执行:递归函数和循环结构都可以执行一段代码块。
- 可替代性:在某些情况下,递归函数可以用循环结构替代,反之亦然,尽管这可能会影响代码的可读性和性能。
基于AI的学习
参考资料
- 《计算机科学概论(第七版)》
- 《C语言程序设计》