2024-2025-1 20241310 《计算机基础与程序设计》第八周学习总结
2024-2025-1 20241310 《计算机基础与程序设计》第八周学习总结
作业信息
这个作业属于哪个课程 | 2024-2025-1-计算机基础与程序设计 |
---|---|
这个作业要求在哪里 | 2024-2025-1计算机基础与程序设计第一周作业 |
这个作业的目标 | 自学教材《计算机科学概论》(第七版)第9章 并完成云班课测试 自学教材《C语言程序设计》第7章并完成云班课测试 |
作业正文 | 作业 |
教材学习中的问题和解决过程(先问 AI)
《C语言程序设计》第7章
一、函数的定义
在 C 语言中,函数是将若干条语句组合在一起以实现特定任务的代码块。每个函数都有以下几个主要特性:
函数标识符(名称):唯一标识函数,通常与其功能相关。
返回类型:指示函数返回值的数据类型,比如 int、float、char 等。如果函数不返回值,返回类型为 void。
参数列表:可选部分,包含输入参数的类型和名称,用于传递给函数的数据。
函数的基本结构
c
<返回类型> <函数名>(<参数类型1> <参数名1>, <参数类型2> <参数名2>, ...) {
// 函数体
// 代码逻辑
return <返回值>; // 可选,依赖于返回类型
}
二、函数的分类
根据不同的标准,C 语言的函数可以进行多种分类:
按返回值类型分类:
无返回值函数(void 类型):这些函数执行操作而不返回数据值。
有返回值函数:如返回整型、字符型、浮点型或自定义数据类型等。调用者可以使用返回值进行后续操作。
按参数类型分类:
无参数函数:没有参数列表,适合执行固定的任务。
有参数函数:接收一个或多个参数,可以根据外部输入进行操作。
按功能分类:
标准库函数:由 C 标准库提供,包括输入输出、数学计算和字符串处理函数等。
用户定义函数:根据具体需求设计的函数,便于复用和维护。
三、向函数传递参数
C 语言函数的参数传递主要有两种方式:
值传递:
在调用函数时,将参数的值复制到函数内部的局部变量中。函数可以使用这些值,但对参数的修改不会影响原始变量。适用于传递基本数据类型和小型结构体。
优点:
简单易用。
保护了调用函数的变量不被意外修改。
缺点:
对于大型数据结构,复制操作可能会浪费内存并影响性能。
引用传递(通过指针):
在调用函数时,传递变量的地址(指针)。函数可以通过指针直接操作传入的数据,这意味着函数可以修改调用者提供的变量。
优点:
适合处理大型结构体或数组,避免复制数据带来的职业。
调用函数可以直接修改原始数据。
缺点:
使用不当可能导致错误,增加代码的复杂性。
可能导致内存安全问题,如非法访问等。
四、函数返回值
函数可以返回数据,返回值类型通过函数定义中的返回类型确定。使用 return 语句来返回值,结构如下:
c
<返回类型> 函数名(<参数列表>) {
// 函数逻辑
return <值>; // 返回值,类型与返回类型相符
}
特点:
如果函数返回的是复合数据类型(如结构体、数组),则通常返回相应的指针。
void 函数不需要使用 return,但若有,可以不带返回值单独使用 return;。
五、递归函数
递归是函数自我调用的一种编程技术。递归函数通常包含两个主要部分:
基准情况:终止递归调用的条件。必须小心定义,以防止出现无限递归。
递归调用:解决较小问题的自我调用,通常在某种条件下触发。
递归的优缺点
优点:
代码简洁,逻辑清晰,特别适合处理数学问题、树和图的遍历。
通常比迭代实现更易于理解和编写。
缺点:
每次递归调用都会占用栈空间,过深的递归可能导致栈溢出。
性能上可能较慢,尤其是没有优化的简单递归(如斐波那契数列)。
六、变量的作用域和生存期
- 作用域
作用域决定了变量在程序中的可见性。 C 语言中的变量主要有以下两种作用域:
局部变量:在函数或代码块内定义,仅在该函数或代码块内可见。退出块后,局部变量将被销毁。
全局变量:在所有函数之外定义,在整个程序中可见,对所有函数可用。程序执行期间全局变量保持其值。
2. 生存期
生存期指的是变量的生命周期,即变量在内存中存活的时间。
局部变量的生存期:从声明开始,直到退出其作用域。其内存会在函数调用结束后被释放。
全局变量的生存期:从程序开始执行到结束,程序的整个生命周期都可以访问它。
七、模块化程序设计
模块化设计是一种将程序拆分为多个相对独立的模块的编程风格,每个模块负责特定的功能。这带来了几个优势:
可维护性:
每个模块独立更新和修复,限制了对程序其他部分的影响。
可重用性:
开发的模块可以在多个程序中复用,减少冗余代码。
团队合作:
多个开发者可以并行工作在不同的模块上,提高开发效率。
模块的组成
头文件(.h):通常包含函数的声明(原型)和所需的类型定义。通过 #include 指令在源文件中引用。
源文件(.c):实现具体的功能逻辑。
《计算机科学概论》第九章:
一、C语言面向对象的实现
C 语言本身是一种过程式语言,并不直接支持面向对象编程(OOP)的特性,但可以通过一些编程技巧来模拟面向对象的特性,如:
封装:
使用结构体(struct)来封装数据,并通过函数来操作这些数据。
示例:
c
typedef struct {
int x;
int y;
} Point;
void move(Point* p, int dx, int dy) {
p->x += dx;
p->y += dy;
}
继承:
C 语言没有直接的继承机制,但可以通过嵌套结构体(包含其他结构体)来模拟。
示例:
c
typedef struct {
int base_value;
} Base;
typedef struct {
Base base;
int derived_value;
} Derived;
多态:
可以使用函数指针在结构体中实现多态。
示例:
c
typedef struct {
void (*draw)(void);
} Shape;
void drawCircle() {
// 绘制圆形的逻辑
}
void drawRectangle() {
// 绘制矩形的逻辑
}
通过这些方式,虽然不能真正实现 OOP 语言那样的特性,但可以近似地实现一些由面向对象设计带来的好处。
二、设计方法
C 语言的设计方法主要包括:
函数驱动设计:
将主要工作分解为多个功能明确的函数,强调输入与输出。
模块化设计:
将程序分解为多个功能模块,通过接口进行通信,简化复杂性。
数据结构设计:
自定义数据类型(如结构体、联合体等)来组织和管理多种数据。
设计模式:
应用一些经典设计模式(如策略模式、观察者模式等)来解决特定问题。
三、翻译过程
C 语言的翻译过程主要包括以下几个步骤:
预处理(Preprocessing):
处理宏定义、条件编译和文件引用,生成中间代码。
主要指令包括 #include、#define 等。
编译(Compilation):
将预处理后的代码转换为汇编代码,进行语法分析和中间代码生成。
汇编(Assembly):
将汇编代码转换为机器代码,生成目标文件(如 .o 文件)。
链接(Linking):
将目标文件与库文件链接最终形成可执行文件。
整个翻译过程可以总结为:
源代码 (.c) -> 预处理 -> 编译 -> 汇编 (.s) -> 目标文件 (.o) -> 链接 -> 可执行文件 (./a.out)
四、程序设计语言范型
程序设计语言的范型主要包括:
命令式编程(Imperative):
通过明确的语句指示计算机执行操作。代表语言:C、Pascal。
函数式编程(Functional):
重视函数的定义和调用,通过函数的组合来实现程序逻辑。代表语言:Haskell、Lisp。
面向对象编程(OOP):
使用类和对象的概念来组织代码,强调数据与行为的封装。代表语言:C++、Java。
声明式编程(Declarative):
关注代码要实现什么,而非如何实现。代表语言:SQL、HTML。
五、高级程序设计语言的功能性
高级程序设计语言通常具备以下功能性:
抽象性:
提供了对复杂性的抽象,使得程序员能够集中关注程序的逻辑而非底层实现。
内存管理:
自动垃圾回收(如 Java)、智能指针(如 Rust)等功能,减少内存泄漏的风险。
类型系统:
静态和动态类型检查,确保类型安全性。
高阶特性:
支持如闭包、函数式编程、并发等高级编程特性。
丰富的库和支持工具:
提供大量的标准库和第三方库,方便快速开发。
六、面向对象语言的功能性
面向对象编程语言具备以下核心功能性:
封装:
数据和行为被封装在对象中,内部实现细节对外部隐藏。
继承:
允许新类从现有类继承属性和方法,促进代码重用。
多态:
通过同一接口调用不同实现,提供接口的灵活性和扩展性。
抽象:
通过接口和抽象类提供的能力,专注于设计模式和架构。
消息传递:
对象通过消息传递的方式交互,降低了模块之间的耦合性。
七、过程设计与面向对象设计的区别
过程设计(Procedural Design)和面向对象设计(Object-Oriented Design)的主要区别如下:
特性 过程设计 面向对象设计
基本单元 函数(过程) 对象(类)
数据处理 通过函数操作数据 数据和功能封装在对象中,内部实现隐藏
构建块 以过程为中心,强调函数调用 以对象为中心,强调对象间交互
状态管理 使用全局变量和局部变量管理状态 每个对象拥有自己的状态
模块化 数据和过程分开处理 模块化通过类和对象提升可重用性
设计思想 关注步骤和计算过程 关注对象间的交互和协作
维护性 代码耦合度高,维护困难
基于AI的学习
三个原则:
- 切勿原封不动地接受生成式人工智能工具的输出;确保对其进行评估、完善和修改(或提示),以适应您的目标。
- 切勿将任何个人数据(自己、同学、老师等)或版权材料纳入到你的提示词中。这个可以说是保护个人隐私的最起码的举措。
- 所有人工智能生成工具都容易产生幻觉,因此会生成不准确或误导性的信息,要学会甄别信息真假
选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容
“我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题”
核心是要求GPT:“请你以苏格拉底的方式对我进行提问”
然后GPT就会给你提问,如果不知道问题的答案,可以反问AI:“你的理解(回答)是什么?”
如果你觉得差不多了,可以先问问GPT:“针对我XXX知识点,我理解了吗?”
GPT会给出它的判断,如果你也觉得自己想清楚了,可以最后问GPT:“我的回答结束了,请对我的回答进行评价总结”,让它帮你总结一下。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 50/50 | 2/2 | 4/4 | |
第二周 | 200/200 | 1/3 | 12/12 | |
第三周 | 200/1000 | 1/4 | 10/10 | |
第四周 | 400/400 | 1/5 | 12/12 | |
第五周 | 200/1300 | 1/6 | 10/10 | |
第六周 | 600/1000 | 1/7 | 10/10 | |
第七周 | 400/500 | 1/8 | 9/9 | |
第八周 | 600/600 | 1/9 | 10/10 |
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)
参考资料
- 《计算机科学概论(第七版)》
- ...