南京大学-计算机基础02-可读性、维护性与模块化设计
在本节课中, 深入讨论了如何编写大型C语言项目,强调了代码的可读性和可维护性的重要性。通过实例讲解,展示了如何使用结构体、宏定义和指针优化代码,使其更加简洁易懂且易于维护。此外,还探讨了数字逻辑电路模拟器和简易计算机系统模拟器的实现,特别强调了模块化设计和合理的编程模式,以降低复杂度和维护成本。
1. 编写大型C语言项目的原则
在编写大型C语言项目时,代码的可读性和可维护性至关重要。遵循以下原则可以提高代码质量:
模块化设计:将项目分为多个模块,每个模块执行单一功能。使用函数和结构体,使代码具有较高的内聚性,避免冗余代码。
清晰的命名规范:变量、函数、结构体命名应能清楚反映其含义,使用标准命名约定。
注释:合理使用注释解释代码的逻辑和目的,避免过度依赖注释解释代码本身。
例如,以下是模块化设计的示例代码:
12345678910111213141516171819202122232425#include <stdio.h>// 结构体定义typedef struct { int id; char name[50]; float salary; ...
南京大学-计算机基础01-C语言的编译与链接
主要讲解了计算机基础中的编译过程,特别是 C语言的编译与链接。通过学习如何将源代码转换为可执行文件, 将深入了解编译器的工作机制、命令行工具的使用,以及如何在实际开发中优化代码。下面详细介绍视频中的关键内容,并对一些重要概念进行补充和详细说明。
编译过程概述
编译过程是将高层次的源代码转换为机器可以执行的二进制代码的过程。这个过程包括多个步骤,分别是:预处理、编译、汇编、链接。
预处理(Preprocessing):
预处理器负责处理源代码中的指令,如#include和#define。通过引入头文件和宏定义,预处理器生成纯粹的C语言代码。
预处理是编译过程的第一步。执行命令:1gcc -E program.c -o program.i
可以得到预处理后的代码。
编译(Compilation):
编译器将预处理过的代码转化为汇编代码。这一步不会生成可执行文件,而是生成对应平台的汇编代码。执行命令:1gcc -S program.i -o program.s
得到的文件中包含了汇编指令。
汇编(Assembly):
汇编器将汇编代码翻译成目标代码(也称为机器代码), ...
MIT-Missing Semester02-Shell 工具与脚本编写
本节课主要讨论了如何使用Shell工具进行脚本编写,重点是Bash脚本语言。 将学习变量的定义、字符串处理、命令替换、进程替换,以及如何使用特殊的Shell工具来提高工作效率。
1. 变量定义与使用
在Bash中,定义变量不需要使用关键字,只需要使用赋值符号=。需要注意的是,变量赋值时等号两边不能有空格,否则会导致语法错误。例如:
12NAME="Alice"AGE=30
字符串处理与引号
当变量包含空格时,必须使用引号将其包裹,以确保变量的值被正确处理。单引号 ' 和双引号 " 的区别在于:单引号会将所有内容视为普通字符,而双引号允许变量替换。示例:
12GREETING='Hello, $NAME' # 输出 Hello, $NAMEGREETING="Hello, $NAME" # 输出 Hello, Alice
2. 控制流与函数
条件判断
Bash支持条件判断语句,例如if语句来执行不同的分支。格式如下:
12345if [ 条件 ]; then # 如果条件为真,执行此处的代码else # ...
MIT-Missing Semester03-文本编辑器(Vim)
本次讲座重点介绍了文本编辑器 Vim 的基本使用。Vim 是一个强大的模态编辑器,专为编程任务的高效编辑与快速导航设计。对于程序员而言,掌握Vim可以显著提高工作效率,节省大量时间。 介绍了 Vim 的基本操作模式,包括常规命令的使用,如何快速编辑文件,并鼓励通过实践来提升技巧。
文本编辑器的重要性
亮点:
文本编辑器是程序员日常工作中的重要工具。通过熟练掌握文本编辑器,尤其是 Vim,程序员能够更快速地编写、阅读和修改代码,进而提升生产力。
Vim 的学习是一个渐进的过程,尽管初期可能不太习惯,但随着不断练习,用户会发现效率逐步提高。Vim 的模态设计允许用户根据不同的编辑任务在不同模式间切换,极大地提升了工作流的效率。
Vim 的基本模式
Vim 的核心优势在于它的模态结构。主要模式包括:
正常模式(Normal Mode):
用于文本导航和小的修改操作。
可以通过快捷键快速移动光标、删除文本、复制文本等。
常见操作:
光标移动:h、j、k、l 分别用于左、下、上、右移动。
单词跳转:w 向前跳到下一个单词开头,b 向后跳到上一个单词开头。
删除:d 删除光标位置的字符 ...
MIT-Missing Semester01-课程概述 + Shell
这节课来自MIT的The Missing Semester of Your CS Education (2020),旨在教会学生如何更有效地使用计算机工具,以改善开发工作流程。
课程亮点
本课程将涵盖广泛的工具和技术,帮助学生更高效地工作。重点不仅仅是软件开发,还包括如何将计算机作为学习和研究的工具。关键点包括:
Shell 和终端基础:课程将介绍如何使用Shell和终端与计算机交互,逐步掌握更高级的工具和技术。
命令行的重要性:命令行工具和基于文本的界面能够提供极大的灵活性和效率,课程对此进行了重点强调。
Shell 概述
Shell提供了一个基于文本的接口,用户可以通过输入命令来执行程序。以下是一些简单的命令示例:
1234# 输出文本echo "Hello, World!"# 显示日期date
命令参数与参数传递
命令可以接受参数和选项来改变其行为,例如:
1echo "这是一个测试"
对于包含空格的参数,可以使用引号确保参数作为一个整体被传递:
1echo "This is a string with spaces" ...
算法导论-吃灰中
属于早就买了但是没有看下去的欲望,记录下,留个flag
计算几何-算法与应用-阅读总结?
邓俊辉老师的计算几何课程的教材,也是他自己翻译的,翻了下没有看下去的欲望,也比较老了,有缘再看。
清华大学-计算几何-总结
邓老师在他的数据结构课堂就安利了他的这门计算几何课程,这个课程是数据结构课程的延申,可以说是数形结合版的数据结构和算法课。
趁着疫情在家,写毕业论文的同时也听了邓老师的这门课。收获颇多:
计算几何自上世纪七十年代由Shamos和Hoey发表的一篇计算平面点集Voronoi图的论文开始,现在已经发展为了独立的学科。
计算几何研究中最主要的目的就是开发出高效的算法以及数据结构来解决一些关于基本几何基元(geometric primitives):点,线段,多边形,多面体等的问题。其中一些问题看起来是如此的简单,以至于它们直到计算机出现后才被认为是个问题。例如二维中典型的相交问题:给定平面上n条直线段,确定所有的相交点。如果暴力的逐个计算所有$n(n一1)/2$对线段对它们两两之间的相交,其计算复杂度是$O(n^2)$。幸运的是,计算几何中的经典算法可以将复杂度降到$O(nlogn)$。需要注意的是,计算复杂度是计算几何中的核心问题。尤其是在现实中,假如一个数据集中有上百万条线段,计算复杂度为$O(n^2)$和$O(nlogn)$的算法对比,他们的求解时间是几周和几秒之间的区别。典型的计算几 ...
清华大学-计算几何-点集三角化
1、Point Set Triangulation
目标:对一系列的点进行三角化(网格化)
当我们有一系列点集时,我们需要对这些点集数据进行结构化。对点集进行结构化的一个重要的方法就是对这些点进行三角化。
这里的对角线分为两类,如上图所示,深绿色的外面的边对应于原来的凸包,另外一些内部的浅绿色的线则是凸包的内对角线。
所谓的点集的三角化,其实就是对这个点集所对应的凸包的区域进行剖分。
对于点集的三角化并不唯一
如果一个点集的点数目是n,如果凸包的size记做h,那么任意一个极大的对角线的集合都是由3(n-1)-h条对角线组成;这些对角线剖分出来的三角形的数目为2(n-1)-h。
每新增一个点,大致就增加三条对角线,两个三角形。
边翻转(Edge Flipping):如上面不唯一的剖分所示,从左边的竖着的那条红色的内对角线变成右边横着的内对角线的这个操作称作边翻转。每进行一次边翻转就会得到一个不同的剖分方案。
剖分算法的界
如图所示,若我们已经有两个做好剖分的子集,那么根据第一章凸包算法找上下边界的Zigzag方法,我们就可以得到两个子集连接后的三角化,时间复杂度为O( ...
清华大学-计算几何-维诺图
本周目标:对空间进行剖分,然后对这个几何体进行探究。
Voronoi图(维诺图)
1、Terminologies
几个概念
基点Site:具有一些几何意义的点
细胞Cell:这个Cell中的任何一个点到Cell中基点中的距离都是最近的,离其他Site比离内部Site的距离都要远。
Cell的划分:基点Site与其它的n-1个点所对应的那个平分线所确定的那个离它更近的那个半平面。把所有这些半平面公共的交集求出来就是这个cell.
因此每个Cell都是凸的,图中一定会有一些Cell是无界的
在本课程中只讨论二维平面上的Voronoi图,并且我们存储Voronoi图时只需要存储点和边界信息。
Voronoi图中包括Voronoi点(线段与线段之间的交点)、线段Segment、射线Ray或直线,这些线都被称为Voronoi edge。
2、Properties
(1)非空性:每个Site都拥有一个非空的Site
(2)空圆性:在任何一个Site所对应的Cell中,任何一个点以这个点为圆心,以到这个Site的距离为半径的圆必然是空的。
这里的空指的是:圆其中它的内部不包含任何的Si ...
