2024-2025-1 20241319 《计算机基础与程序设计》第八周学习总结
作业信息
这个作业属于哪个课程 | 2024-2025-1-计算机基础与程序设计 |
---|---|
这个作业要求在哪里 | https://www.cnblogs.com/rocedu/p/9577842.html#WEEK08 |
这个作业的目标 | 功能设计与面向对象设计 面向对象设计过程 面向对象语言三要素 汇编、编译、解释、执行 |
作业正文 | https://www.cnblogs.com/wchxx/p/18550964 |
教材学习内容总结
功能设计与面向对象设计
功能设计:
- 功能设计主要关注于系统的功能需求,即系统应该做什么。它涉及到确定系统需要实现的功能和操作,以及这些功能如何满足用户的需求。
- 功能设计通常包括用例分析、功能模块划分、接口定义等。
- 它强调的是“做什么”,而不是“怎么做”。
面向对象设计:
- 面向对象设计(OOD)是一种软件设计范式,它使用对象来设计系统。对象是数据和操作数据的方法的封装。
- 面向对象设计强调的是“怎么做”,即如何通过对象之间的交互来实现系统的功能。
- 它包括类的设计、继承、封装和多态等概念的应用。
面向对象设计过程
- 需求分析:确定系统的需求,包括功能性和非功能性需求。
- 概念性设计:定义系统的高层次结构,包括主要的类和对象。
- 详细设计:细化概念性设计,定义类的具体属性和方法。
- 实现:根据设计文档编写代码。
- 测试:确保代码符合设计要求,并且能够正确执行。
- 维护:对系统进行必要的更新和修复。
面向对象语言三要素
- 封装:将数据(属性)和操作数据的方法(行为)封装在对象中,隐藏内部实现细节。
- 继承:允许新类(子类)继承现有类(父类)的属性和方法,减少代码重复。
- 多态:允许不同类的对象对同一消息做出响应,即同一个接口可以被不同的对象以不同的方式实现。
汇编、编译、解释、执行
汇编:
- 汇编语言是一种低级编程语言,它比机器码更易于人类阅读和编写。
- 汇编器(Assembler)将汇编语言代码转换成机器码。
编译:
- 编译是一种将高级编程语言代码转换成机器码的过程。
- 编译器(Compiler)执行这一过程,它通常包括词法分析、语法分析、语义分析和代码生成等步骤。
解释:
- 解释是一种执行源代码的方式,解释器(Interpreter)在运行时逐行读取和执行代码,不需要事先编译成机器码。
- 解释执行通常比编译执行慢,因为它缺少编译代码的优化。
执行:
- 执行是指计算机硬件运行机器码的过程。
- 执行可以是直接在硬件上运行编译后的机器码,也可以是通过解释器运行解释后的代码。
数组
-
数组定义:
- 数组是一种数据结构,用于存储相同类型的多个元素。
- 在C语言中,数组可以是一维或多维的。
-
数组声明:
- 一维数组声明:
type arrayName[size];
- 多维数组声明:
type arrayName[size1][size2]...;
- 一维数组声明:
-
数组初始化:
- 静态初始化:在声明时初始化,如
int arr[] = {1, 2, 3};
- 动态初始化:声明后使用循环或赋值语句初始化。
- 静态初始化:在声明时初始化,如
-
数组访问:
- 通过索引访问数组元素,索引从0开始。
-
数组大小:
- 数组的大小在声明时确定,且不可改变。
-
指针与数组:
- 数组名可以作为指向数组首元素的指针使用。
-
多维数组:
- 多维数组可以看作是数组的数组,访问时需要多个索引。
-
数组作为函数参数:
- 数组可以作为参数传递给函数,通常是通过指针。
算法基础
-
算法概念:
- 算法是解决问题的明确步骤集合。
-
算法特性:
- 输入:一个或多个输入值或数据集合。
- 输出:一个或多个输出值或数据集合。
- 确定性:算法的每一步都必须有明确的定义。
- 有限性:算法必须在有限的步骤后结束。
- 可行性:算法的每一步都必须足够基本,以至于可以准确地执行。
-
算法复杂度:
- 时间复杂度:算法执行所需的时间。
- 空间复杂度:算法执行所需的存储空间。
-
基本算法结构:
- 顺序结构:按顺序执行指令。
- 选择结构:基于条件选择执行不同的代码块。
- 循环结构:重复执行一段代码直到满足特定条件。
-
排序算法:
- 冒泡排序、选择排序、插入排序、快速排序等。
-
搜索算法:
- 线性搜索、二分搜索等。
-
递归:
- 递归是一种算法设计技巧,函数直接或间接地调用自身。
-
算法设计原则:
- 抽象:忽略细节,关注主要问题。
- 模式识别:识别问题中的通用模式。
- 递归思维:将问题分解为更小的子问题。
-
算法分析:
- 分析算法的效率,包括时间复杂度和空间复杂度。
教材学习中的问题和解决过程
问题:二维数组如何用指针传递?
解答:
方法1:传递指向数组首元素的指针
当有一个二维数组 array[row][col]
时,可以传递一个指向数组首元素的指针,即 array[0]
的地址。在函数中,需要知道数组的列数,以便正确地访问数组元素。
#include <stdio.h>
void printArray(int *array, int rows, int cols) {
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
printf("%d ", array[i * cols + j]);
}
printf("\n");
}
}
int main() {
int array[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
int rows = 3, cols = 4;
printArray((int *)array, rows, cols);
return 0;
}
在这个例子中,printArray
函数接受一个指向 int
类型的指针 array
,以及行数 rows
和列数 cols
。在函数内部,我们通过计算 i * cols + j
来访问二维数组的元素。
方法2:传递指向数组第一行首元素的指针
另一种方法是传递一个指向数组第一行首元素的指针,即 array[0]
的地址。这种方法在函数内部不需要知道数组的列数,因为可以通过指针运算来获取。
#include <stdio.h>
void printArray(int (*array)[4], int rows) {
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < 4; ++j) {
printf("%d ", array[i][j]);
}
printf("\n");
}
}
int main() {
int array[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
int rows = 3;
printArray(array, rows);
return 0;
}
在这个例子中,printArray
函数接受一个指向包含4个整数的数组的指针 array
,以及行数 rows
。这里,array
被声明为 int (*array)[4]
,表示一个指向有4个整数的数组的指针。在函数内部,我们可以直接使用二维数组的语法 array[i][j]
来访问元素。
两种方法都可以有效地将二维数组传递给函数。第一种方法更灵活,因为它可以在不知道列数的情况下处理不同大小的二维数组;而第二种方法在语法上更接近于传统的二维数组访问方式。
基于AI的学习
计划学习时间:
2小时
实际学习时间:
2小时
改进情况: