一、结构化分析与设计
在实际使用 DFD 进行数据流建模时,需要注意以下原则。
(1)加工和数据流的正确使用。如一个加工必须既有输入又有输出;数据流只能和加工相关,即从加工流向加工、数据源流向加工或加工流向数据源。
(2)每个数据流和数据存储都要在数据字典中有定义,数据字典包括各层数据流图中数据元素的定义。
(3) 数据流图中最底层的加工必须有加工说明。
(4)父图和子图必须平衡。即父图中某加工的输入/输出(数据流) 和分解这个加工的子图的输入/输出数据流必须完全一致。这种一致性不一定要求数据流的名称和个数一一对应,但它们在数据字典中的定义必须一致,数据流或数据项既不能多也不能少。
(5) 加工处理说明和数据流图中加工涉及的元素保持一致。例如,在加工处理说明中,输入数据流必须说明其如何使用,输出数据流说明如何产生或选取,数据存储说明如何选取、使用或修改。
(6) 一幅图中的图元个数控制在 7士2 以内。
二、数据库分析与设计
1、E-R图关系模式转换
(1)实体向关系模式的转换
将 E-R 图中的实体逐一转换成为一个关系模式,实体名对应关系模式的名称,实体的属性换成关系模式的属性,实体标识符就是关系的码(键)。
(2)联系向关系模式的转换
E-R图中的联系有3 种:一对一联系 (1:1)、一对多联系 (1:m) 和多对多联系 (m:n)。
【1】一对一联系的转换
方式一:将联系转换成一个独立的关系模式,关系模式的名称取联系的名称,关系模式的属性包括该联系所关联的两个实体的码及联系的属性,关系的码取自任一方实体的码;
方式二:将联系归并到关联的两个实体的任一方,给待归并的一方实体属性集中增加另一方实体的码和该联系的属性即可,归并后的实体码保持不变。
【2】一对多联系的转换
方式一:将联系转换成一个独立的关系模式,关系模式的名称取联系的名称,关系模式的属性取该联系所关联的两个实体的码及联系的属性,关系的码是多方实体的码;
方式二:将联系归并到关联的两个实体的多方,给待归并的多方实体属性集中增加一方实体的码和该联系的属性即可,归并 后的多方实体码保持不变。
【3】多对多联系的转换
多对多联系只能转换成一个独立的关系模式,关系模式的名称取联系的名称,关系模式的属性取该联系所关联的两个多方实体的码及联系的属性,关系的码是多方实体的码构成的属性组。
三、面向对象分析与设计
1、关键步骤
(1)建模系统功能。
【1】产生用例图。产生用例步骤:
确定参与者;确定需求用例;构造用例模型;记录需求用例描述。
【2】建模用例活动。用UML活动图构建系统活动。
(2)定义领域模型
(3)定义交互、行为和状态
(4)定义设计类图
2、经典案例
四、算法分析与设计(C语言)
1、变量与指针
在程序中定义或说明的变量,编译系统为其分配相应的内存单元,也就是说,每个变量都有具体的地址。变量的本质是程序中用来存放数据的一段存储空间。
在访问变量时,首先应找到其在内存的地址。如果在程序中将变量的地址保存在另一个变量中,则形成指针变量,通过指针对所肯向变量的访问是一种对变量的“间接访问”。
若指针变量指向的对象仍然是一个指针变量,则称为多级指针。
2、指针访问数组
(1)指针与一维数组
(1) 指针变量与一维数组。C 语言中定义一个指向数组元素的指针变量的方法如下。例如,定义一个整型数组 st 和指向数组元素的指针 ptr。
int st[10]; /*定义 st 为包念 10 个整型数据的数组*/
int *ptr = &st[0];/*定义 ptr 为指向整型变量 st[0]的指针,等价于 int *ptr = st*/
若 ptr 指向数组的第一个元素(即下标为 0 的元素),则*(p+i)指向数组的第 1 个元素(即下标为之的元素)。
(2)指针与二维数组
int (*p)[4]; /*p 是一个指针变量,它指向包含 4 个元素的一维数组*/
(3)指针与函数
【1】函数参数为指针。参数使用指针类型的作用是将一个变量的地址传送到另一个函数中
【2】函数返回值为指针。函数类型是指函数返回值的类型。在C语言中允许一个函数的返回值是一个指针 (即地址),这种返回指针值的函数称为指针型函数。
【3】指针变量。程序中的一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址。可以把函数的首地址(或称入口地址)赋给一个指针变量,使指针变量指向该函数,然后通过指针变量就可以找到并调用这个函数。指向函数的指针变量称为“函数指针变量”。函数指针变量定义的一般形式为: 类型说明符 (* 指针变量名)0; 其中,“类型说明符”表示被指函数的返回值的类型;“(* 指针变量名)”表示“*”后面的变量是指针变量;最后的一对空括号表示指针变量所指向的对象是一个函数。
2、指针与数据结构
(1)单链表实现和应用
(2)二叉链表和多叉链表的设计与应用
【1】二叉树的存储结构设计
【2】其他树结构的存储结构设计
【3】其他链表的设计与应用
五、面向对象的程序设计与实现(java)
1、接口
接口是一种特殊的类。
(1)接口的概念
接口只是说明类应该做什么,但并不指定应该如何去做。在实际开发过程中,通过类来实现接口。接口一般只有方法名,没有方法体。实现接口就是让其既有方法名又有方法体。
(2)接口的声明
接口用关键字“interface”来声明。接口的形式跟类很相似。例1 格式如下:
interface [接口名]{
……
}
(3)接口的实现
实现接口的类表示例 2 如下:(接例 1 接口的声明)
class [类名] implements [接口名]{
……
}
(4)接口中的方法
接口中的方法只有方法名没有方法体。(注意:没有花括号)例 3 如下:
interface [接口名]{
[返回类型 void/String/…] [方法名] (参数列表);
}
(5)接口类与其实现类的对应关系
接口的用处就是让类通过实现它来执行一定的功能。因此实现接口的类,要实现接口的类。对于实现类或接口类有方法或属性的缺失,则可以根据二者的对应关系进行补充。一般实现类的方法是对接口类方法的具体实现。
2、继承
(1)继承的概念
继承,就是在已有类(父类)的基础上进行扩展,从而产生新的类(子类)。父类拥有自己的属性和方法,这些子类都可以继承。子类除了拥有父类的属性和方法外,还可以有自己的特性。
(2)继承的表示
继承通过关键字“extends”表示。结构例 4 如下:
class [子类名] extends [父类名]{
……
}
(3)父类与子类之间的对应关系
子类的属性和方法有部分是从父类继承而来,一般而言,父类和子类之间同名的属性和方法具有一定的对应关系,子类也可以对父类的方法进行重写。
(4)super 和 this 的使用
在继承关系中为了区分父类和子类,会用 super 代替父类指针,this 代替子类指针。举例如下:
class [父类名] {
[属性 1];
[父类名]([属性 1]){
属性 1=1;
}
}
class [子类名]{
[属性 2];
[子类名]([属性 1],[属性 2]){
super([属性 1]*);**//这里的 super([属性 1])是父类带属性1 参数的构造函数
this.[属性2]=[属性2]; //这里的 this 是当前类指针加上 this 和 super 可以区分同名的属性或方法。子类可以利用 super 指针调用父类的属性和方法。
}
}
3、类的结构
(1)默认构造函数和非默认的构造函数:对类实例化创建对象时,系统会调用构造函数对其所属成员进行初始化。
在 JAVA 中,一般以与类名同名的方法作为构造函数。在实际开发过程中,系统会默认不带参数的构造函数,如果需要带参数的构造函数,需要明确写出该构造函数。
(2)继承中的构造函数:实际上,在创建子类对象时,会先执行其父类的构造函数,然后执行子类的构造函数,最后完成对象的创建。即创建子类对象时,先调用父类构造函数,初始化继承自父类的成员,随后调用子类构造函数,初始化子类的成员。
(3)get 方法和 set 方法
在 JAVA 中会有对类中属性的 get 和 set 方法。在实际开发过程中,会对类的属性设定私有 private 限定,只有本类中的方法可以访问,拒绝其他类的访问。同时,会在本类中设定 get()和 set()方法,对相关属性进行操作。这些在开发工具中,有时候会默认自动给出。
(4)其他函数:类中函数成员格式如下所示:
[访问控制符] [返回类型] [方法名] (形参 1 类型 形参名 1,形参 2 类型 形参名2,…){…}
访问控制符可以为:private/public/default/protected/abstract
返回类型为该方法返回数据的数据类型。
返回语句 return [返回参数]
如果返回类型为 void,即返回类型为空时,不需要 return 语句。
4、类修饰符
【1】private
(1)用 private 修饰的成员变量与成员方法只能在类的内部被访问,类的外部不能访问。
【2】public
(1)用 public 修饰数据表示所有的类都可以访问。
(2)用 public 修饰类,也表示所有类中可以访问。
【3】default
(1)用 default 修饰成员数据表示只有用一个包里的类才能访问。
(2)用 default 修饰类也表示只有一个包里的类才能访问。当在类前不加任何控制符时,默认就是 default。
【4】protected
(1)用 protected 修饰成员数据表示不仅同一个包中的类可以访问,位于其他包中的子类也可以访问。
【5】abstract
(1)abstract 可以用来修饰方法或类。具有一个或多个抽象方法的类,本身需要被定义为抽象类。抽象类不仅可以有抽象方法,还可以有具体方法。
(2)抽象类可以被继承,如果其子类没有实现抽象类全部的抽象方法,则子类也是抽象类,需要用 abstract 修饰。
(3)含有抽象方法的一定是抽象类,但抽象类可以没有抽象方法。抽象类不能实例化,不能 new 一个对象,但可以声明一个抽象类的变量指向具体的子类对象。
5、对象实例化
(1)new 一个对象。在主函数中,需要对类进行实例化才能够调用。而我们对类的实例化,一般用的是 new。结构如下:
[类名] [对象名] = new [类名](参数列表);
(2)与超类相关的实例化
//创建子类对象并转到父类
[父类名] [对象名] = new [ 子类名 ](参数列表);
//此时以对象名调用某方法(子类从父类直接继承而来的方法),虽然将父类对象句柄指向了子类对象,实际上操作的还是子类对象,只不过将对象句柄声明为父类的数据类型,此时编译器根据实际情况选择了子类的函数。
6、方法的调用
[对象名] . [方法名] ;
7、接口List(表单)
(1)将元素放到指定集合的结尾[表单名]. add([元素名]);
(2)将集合 2 放到指定集合 1 指定位置 [表单名 1].addAll([位置序号],[表单名 2]);
(3)清除集合 [表单名].clear();Iterator(迭代器)--用迭代器访问表单
六、总 结
笔记总结不易,如果喜欢,请关注、点赞、收藏。
完整笔记下载地址:(后续完成后更新)
基础精讲课件地址:(请关注、点赞、收藏后,私信我)
基础精讲视频地址:(请私信我)