【程序设计】
程序流程图
起始框 椭圆形
输入输出框 平行四边形
判断框 菱形
处理框 长方形
程序设计风格(清晰第一,效率第二)
良好的程序设计风格
- 1.源程序文档化
- 2.数据说明风格
- 3.语句的结构
- 4.输入输出
结构化程序设计
- 自顶向下
- 模块化
- 逐步求精
- 限制使用goto语句
面向对象的程序设计
面向对象方法的优点
- 与人类习惯的思维方式一致
- 稳定性好
- 可重用性好
- 容易开发大型软件产品
- 可维护性好
对象的基本特点
- 标识唯一性
- 分类性
- 多态性
- 封装性
- 模块独立性好
对象
由数据和方法组成
类和实例
类是具有共同属性,共同方法的对象的集合,是关于对象的抽象描述,反映了该对象类型的所有对象的性质。
实例 一个具体对象
消息
消息传递是对象间通信的手段,一个对象通过向另一个对象发送消息来请求服务。
继承
一个子类可以继承父类的全部描述,并且还可以定义自己的属性和操作
多态性
子类对象既可以像父类对象那样用,同样的消息既可以发送给父类也可以发送给子类
【软件工程】
软件的特点
- 一种逻辑实体具有抽象性
- 没有明显的制作过程
- 使用期间不存在磨损老化问题
- 对硬件和环境具有依赖性
- 复杂性高成本昂贵
- 软件开发设计诸多社会因素
软件的分类
系统软件
是管理计算机资源,提高计算机的使用效率,为用户提高各种服务的软件,如操作系统,数据库管理系统,编译程序,汇编程序,和网络软件应用软件
为了应用与特定的领域而开发的支撑软件
介于系统如何和应用软件之间,协助用户开发软件的工具型软件
软件工程三要素
- 方法
- 工具
- 过程
软件工程的原则
- 抽象
- 信息隐蔽
- 模块化
- 局部化
- 确定性
- 一致性
- 完备性
- 可验证性
软件过程 是把输入转化为输出的一组彼此相关的资源和活动
软件生命周期 是软件产品从提出实现
,使用
,维护
,停止使用
,退役
的过程
软件生命周期个阶段的主要任务
- 问题定义
- 可行性研究
- 需求分析(编写软件规格说明书及初步的用户手册,提交评审)
- 软件设计
- 软件实现
- 软件测试
- 运行维护
需求分析的任务
发现需求
求精 建模 定义需求
需求分析将创建数据模型 功能模型 控制模型
需求规格说明书
是需求分析阶段的最后成果
需求规格说明书 重点是描述软件的目标
软件的功能需求
性能需求
外部接口
属性以及约束条件
需求分析的方法
- 结构化分析方法
- 面向对象分析方法
结构化分析是使用数据流图
数据字典
结构化英语
判定表
和判定树
等工具
结构化分析方法的常用工具是数据流图(DFD)
Date Flow Diagram
选择题
------------------------------------数据结构基础------------------------------------
时间复杂度:算法的时间复杂度指的是算法在执行过程中基本的运算次数
线性结构
- 有且只有一个根结点
- 每一个结点最多一个前件和一个后件
队列
1.队列的顺序结构一般采用循环队列的形式当循环队列队满或队空时,
队尾指针=队头指针
链队为空的条件 队尾指针=队头指针=NULL
2.循环队列
是一种顺序存储结构
- 存储空间为Q(1:m)的循环队列
- rear-front>0 则队列中的元素个数为
rear-front
个 - rear-front<0 则队列中的元素个数为
rear-front+m
个
堆排序:在最坏情况下,堆排序的时间复杂度为o(nlog2n)
冒泡排序,快速排序,直接插入排序:在最坏情况下,堆排序的时间复杂度为o(n^2)
比较次数为n(n-1)/2
二分法排序在最坏情况下,对于长度为n的顺序表,比较次数为log2n
二分法查找线性表的条件
- 顺序储存结构
- 线性表是顺序表
二叉树
n:总结点
n0:叶子结点
n1:度为1的结点
n2:度为2的结点
结点数关系:
n=n0+n1+n2
n0=n2+1
1.完全二叉树的性质具有n个结点的完全二叉树的深度为[logn2]+1
,例如具有256个结点的完全二叉树的深度为9
2.非线性结构也可以采用顺序存储满二叉树和完全二叉树均为非线性结构,但可以按照层次进行顺序存储。
------------------------------------软件工程基础------------------------------------
需求分析的主要任务是确定软件系统的功能
白盒测试
- 逻辑覆盖测试
- 基本路径测试
黑盒测试
- 等价类划分法
- 边界值分析法
- 错误推测法
- 因果图
单元测试
- 模块接口测试
- 局部数据接口测试
- 重要的执行路径检查
- 模块的错误处理能力
- 其他的边界条件测试
扇入数:调用一个给定模块的模块个数
扇出数:一个模块直接调用其他模块数(一个模块直接调用下层模块)
将数据和操作置于对象统一体中的方法是封装
程序测试的目的:是发现程序中的错误
计算机软件: 是由程序数据及相关文档构成的集合
------------------------------------数据库基础------------------------------------
范式
- 第一范式:要求数据库表的每一列都是
不可分割的原子数据项
。 - 第二范式:需要确保数据库表中的
每一列都和主键相关
,而不能只与主键的某一部分相关(主要针对联合主键而言)。 - 第三范式: 需要确保数据表中的
每一列数据都和主键直接相关
,而不能间接相关。
关系模型 采用表结构来表示数据及数据间的联系
层次模型
概念模型
网状模型
数据库系统的三级模式结构
- 概念模式(
模式
):是数据库系统中的全局数据逻辑结构的描述,全体用户的公共数据视图
。对它的定义可用DBMS中的DLL语言定义。 - 内模式(
物理模式
):是数据结构
与储存方式
的描述,是数据在数据库内部的表示方式。 - 外模式(
子模式/用户模式
):是用户的数据视图
,也就是用户所能看见和使用的局部数据的逻辑结构和特征的描述,是与某一应用有关的数据逻辑表示,外模式通常是概念模式的子集。
逻辑设计阶段 将ER图转换成关系数据模型的过程
填空题
在结构体数组中找出两门成绩最大的一组并返回下标值
typedef struct stu
{
char ID[30];
char name[20];
int score[2];
} STU;
int fun(STU *d,int n)
{
int i,m;
/******found******/
__1__; //m=0
for(i=1;i<n;i++)
/******found******/
if(d[i].score[0]+d[i].score[1]>__2__)//d[m].score[0]+d[m].score[1]
m=i;
/******found******/
__3__; //return m
}
在升序的数组中插入一个数使数组依然保持升序
void func(int xx[], int num)
{
int n1,n2,pos,i,j;
pos=xx[9];
if (num > pos)
/**********found**********/
xx[10] = __1__; //num
else {
for(i=0;i<10;i++)
{
if(xx[i]>num){
n1=xx[i];
xx[i]=num;
for(j=i+1;j<11;j++){
n2=xx[j];
xx[j] = n1;
/**********found**********/
__2__; //n1=n2
}
/**********found**********/
__3__; //break
}
}
}
}
找出低于平均成绩的人的成绩,并算出平均值
double fun(double x[], int n)
{
int i,k=0;
double avg = 0.0,sum=0.0;
for(i=0;i<n;i++)
/***********found**********/
avg+=__1__; //x[i]
/***********found**********/
__2__/=n; //avg
for(i=0;i<n;i++)
if(x[i]<avg)
{
/***********found**********/
__3__+=x[i]; //sum
k++;
}
return sum/k;
}
将二进制字符串转换为十进制整型数
#define N 16
/**********************found***********************/
int fun( char __1__) //s[]
{ int i, n = 0;
/**********************found***********************/
for (i=0; __2__ ; ++i) //s[i]!='\0'&&i<N
/**********************found***********************/
n = n*2 + (s[i] -__3__); //48
return n;
}
找出高于平均成绩的人的成绩,并算出平均值
double fun(double x[], int n)
{ int i, k=0;
double avg=0.0, sum=0.0;
for (i=0; i<n; i++)
__1__+= x[i]; //avg
/**********************found***********************/
avg /= n;
for (i=0; i<n; i++)
if (x[i] > avg)
{
/**********************found***********************/
__2__+= x[i]; //sum
k++;
}
/**********************found***********************/
return __3__; //sum/k
}
打印字母后指定个数字母
void fun(char c, int d) {
int i;
char A[26], a[26], *ptr;
/**********found**********/
for (i=0; i<__1__; i++) { //26
A[i] = 'A' + i;
a[i] = 'a' + i;
}
/**********found**********/
if ((c >= 'a') && (c __2__ 'z')) ptr = a; //<=
else ptr = A;
/**********found**********/
for (i=1; i<=d; i++)
printf("%c", ptr[(c-ptr[0]+i) % __3__] ); //26
}
链表数据域中找出最大值
/**********found**********/
int func(__1__head) //struct list *
{ int pmax = head->data;
struct list *p = head->next;
while(p != NULL)
{ if(p->data > pmax) pmax = p->data;
/**********found**********/
p = __2__; //p->next
}
/**********found**********/
return __3__; //pmax
}
统计输入字符串中的大小写字母和数字个数
void fun(int *cd, int *cu, int *cs )
{ char c;
printf("用回车键结束输入!\n");
while ((c=getchar()) != '\n')
{
/**********************found***********************/
if (c>='0' && __1__) ++*cd; //c<='9'
/**********************found***********************/
if (__2__ && c<='Z') ++*cu; //c>='A'
/**********************found***********************/
if (c>='a' && __3__) ++*cs; //c<='z'
}
}
利用静态变量类型计算阶乘
long fun(int n)
{
static struct Ord old={0,1};
int i;
if(n==old.n)
/**********************found***********************/
return (__1__); //old.ordor
if(n>old.n)
for(i=old.n+1;i<=n;i++)
old.ordor*=i;
else
for(i=old.n;i>n;i--)
old.ordor/=i;
/**********************found***********************/
old.n=__2__; //n
/**********************found***********************/
return (__3__); //old.ordor
}
输出与字母ch左右相邻的字符包含ch
void fun(char ch)
{ char t[3];
int i;
t[1]=ch;
/**********************found***********************/
if (ch=='Z'){ t[2]='A'; t[0]= __1__ ; } //'Y'
/**********************found***********************/
else if (ch=='A') {t[2]='B'; t[0]= __2__; } //'Z'
/**********************found***********************/
else { t[0]=ch-1; t[2]= __3__;} //ch+1
for(i=0;i<3; i++) putchar(t[i]);
putchar('\n');
}
找出数组中的最小值,并与第一个元素交换
void fun(int *dt,int n)
{
int i,m,t;
/**********************found***********************/
__1__; //m=0
for(i=1;i<n;i++)
/**********************found***********************/
if(__2__) //dt[i]<dt[m]
m=i;
t=dt[0];
/**********************found***********************/
__3__; //dt[0]=dt[m]
dt[m]=t;
}
改错题
自定义数据结构
int func(int (*p)[4], int m, int n, int *pRow, int *pCol)
{
int i, j, max;
/**********found**********/
max = *p; //**p
*pRow = 0;
*pCol = 0;
for (i=0;i<m;i++)
{
for (j=0;j<n;j++)
{
if ( *(*(p+i)+j) > max)
{
max = *(*(p+i) + j);
*pRow = i;
/**********found**********/
*pCol =i+j; //j
}
}
}
/**********found**********/
return *max; //max
}
输出不含删除标记的数
typedef struct dat
{
char deleted; //是否删除:0-未删除,1-删除
int data;
struct dat* next;
} MYDATA;
void list(MYDATA *h)
{
/******found******/
MYDATA p; //*p
p=h->next;
while(p!=NULL)
{
/******found******/
if(p->data==0) //p->deleted==0
{
printf("%d ",p->data);
}
/******found******/
p=next; //p->next
}
}