当前位置:文档之家› (软考软件设计师)数据结构学习(C++)(合集)

(软考软件设计师)数据结构学习(C++)(合集)

(软考软件设计师)数据结构学习(C++)(合集)
(软考软件设计师)数据结构学习(C++)(合集)

数据结构学习(C++)(合集)

题外话:先前有一篇文章叫《用C++模板描述的链表、栈、队列(声明与实现)》,当时是第一次发表文章(我才注册没几天),很不成熟,改了又改不说,还弄的老长,不利于阅读。于是我重写了一下,并且想做成一个系列,这从我的标题可以看出来。好,言归正传。

本篇为后面一系列文章的序言,旨在说明写作的目的,以及写作的风格;或者说是为自己可能的错误,预先给个托词。如果您不想听我在这废话,请跳过本篇,直接阅读后面的文章。但是这样,我不能保证,您在阅读的同时,不会骂我白痴。

为什么写这些文章

这些文章可以说是《数据结构(用面向对象方法与C++描述)》这本书的读书笔记,但也不完全是。数据结构是计算机专业必修课——几乎每个计算机专业的学生都会推崇他的重要;同时,也是其他专业转修计算机专业的一个难点。

从学习的角度来说,严蔚敏的《数据结构(C语言版)》是本不错的书。但是,C语言不是描述的理想工具。《数据结构(C语言版)》的前言里是这样说的:“虽然C语言不是抽象数据类型的理想描述工具,但鉴于目前和近一、二年内,……并增添了C++语言的引用调用参数传递方式等,构成了一个类C描述语言。”

从抽象数据类型的定义——一个数学模型以及定义在该模型上的一组操作——可以看出,面向对象语言中类的概念和这个定义很接近,加之C语言的普及,用C++来描述于是就成了顺理成章的事情。

于是,清华在2002年的考研参考书目中对《数据结构》的参考书做了改变,使用《数据结构(用面向对象方法与C++描述)》(殷人昆等编著,ISBN

7-302-03405-2/TP1845)作为参考书,而实际上考的也是(废话,不是那叫误导)。坦白的讲,原书把教学目的和提供实例的目的搞混了,结果是个四不象:作为教科书,条理不清晰;提供各个方法的实现,也不是很实用,相反,重复建设太多。至于错误,可能有些是笔误,比如少个友元声明了,不是继承而使用别的类的成员函数没有指明了;还有一些,就是考虑不够周全。

不管怎么说,现在不是挑书的时候,你想考清华的计算机专业研究生吗,这本书是你不二的选择。我发现读懂此书的最好方法,就是自己按照书上的思路,以及实际应用的分析,自己重新实现各种抽象数据类型。这样做还有一个好处,为自己将来积累一点财富。

我的写作风格

编译器我选用的是VC6,因此,我不保证我提供的代码在别的编译器也能通过——从头到尾只使用了iostream.h,没有任何别的库,当然更没有MFC,标准的C++代码应该没什么问题。全部是手工完成的代码,没有使用ClassWizard,主要是不喜欢那些乱七八糟的预处理和注释。这样完成之后,发现C++的声明和实现分开xx.h+https://www.doczj.com/doc/ec4029767.html,p这种文档结构并不招人喜欢——很乱。

于是我采用了单工程单cpp的结构,就是一个工程只有一个cpp文件,放main(),其他的部分都是头文件,声明和实现放在一起——其实这是违反C++规范的,C++要求函数必须声明原型,实际上,我觉得这很罗嗦(我这是典型的C 后遗症,以前用TC时为了不声明原型,把函数都放到main()前面),声明一下原型,我认为这和设定密码需要确认一个道理。由于使用的IDE环境,把声明单独集中起来作为一个文件已经没有必要——ClassView窗口很好用,就因为如此,我几乎从来不去看类的声明文件。除非你提供的是一个库,在你的工程中单独的声明文件已经不是必须的了。当然,这里的前提是从一个空的工程建立你的项目。如果你使用了AppWizard,我很难想象不使用ClassWizard的。因为这时文档的结构已经确定了,你所做的实际上是在修修补补。

什么人适合读这些文章

●刚开始从C过渡到C++的人,看完这些后,会体会到C++的新特性。

●和我一样研读那本黄皮书的人,希望看完之后能更好的理解和学习。

●从未编写过超过1000行代码程序的人,这样我们才能达到共鸣。因为

我们从来不使用工具和库文件,做的事都是在编程老手看来很蠢的事。

一些约定

假定你使用的是VC6,先建立一个Win32 Console Application的empty project。后面将陆续往这个工程中添加文件(就是将后面介绍的每一个文件都添加进去,不然到时候找不到xx.h不要埋怨),每一个#ifndef xx_H~#endif 和其中的部分为一个头文件,文件名为xx.h。例如:

#ifndef List_H

#define List_H

……

#endif

这一大块为一个文件,文件名为List.h

我看的两本教科书(《数据结构(C语言版)》还有这本黄皮书)都是以这个讲解队列应用的,而且都是银行营业模拟(太没新意了)。细比较,这两本书模拟的银行营业的方式还是不同的。1997版的《数据结构(C语言版)》的银行还是老式的营业模式(毕竟是1997年的事了),现在的很多地方还是这种营业模式——几个窗口同时排队。这种方式其实不太合理,经常会出现先来的还没有后来的先办理业务(常常前面一个人磨磨蹭蹭,别的队越来越短,让你恨不得把前面那人干掉)。1999版的这本黄皮书的银行改成了一种挂牌的营业方式,每个来到的顾客发一个号码,如果哪个柜台空闲了,就叫号码最靠前的顾客来办理业务;如果同时几个柜台空闲,就按照一种法则来决定这几个柜台叫号的顺序(最简单的是按柜台号码顺序)。这样,就能保证顾客按照先来后到的顺序接受服务——因为大家排在一个队里。这样的营业模式我在北京的西直门工商银行见过,应该说这是比较合理的一种营业模式。不过,在本文中最重要的是,这样的营业模式比较好模拟(一个队列总比N个队列好操作)。

原书的这部分太难看了,我看的晕晕的,我也不知道按照原书的方法能不能做出来,因为我没看懂(旁白:靠,你小子这样还来现眼)。我按照实际情况模拟,实现如下:

#ifndef Simulation_H

#define Simulation_H

#include

#include

#include

class Teller

{

public:

int totalCustomerCount;

int totalServiceTime;

int finishServiceTime;

Teller() :totalCustomerCount(0), totalServiceTime(0),

finishServiceTime(0) {}

};

//#define PRINTPROCESS

class Simulation

{

public:

Simulation()

{

cout << endl << "输入模拟参数" << endl;

cout << "柜台数量:"; cin >> tellerNum;

cout << "营业时间:"; cin >> simuTime;

cout << "两个顾客来到的最小间隔时间:"; cin >> arrivalLow;

cout << "两个顾客来到的最大间隔时间:"; cin >> arrivalHigh;

cout << "柜台服务最短时间:"; cin >> serviceLow;

cout << "柜台服务最长时间:"; cin >> serviceHigh;

arrivalRange = arrivalHigh - arrivalLow + 1;

serviceRange = serviceHigh - serviceLow + 1;

srand((unsigned)time(NULL));

}

Simulation(int tellerNum, int simuTime, int arrivalLow, int arrivalHigh, int serviceLow, int serviceHigh)

: tellerNum(tellerNum), simuTime(simuTime),

arrivalLow(arrivalLow), arrivalHigh(arrivalHigh),

serviceLow(serviceLow), serviceHigh(serviceHigh),

arrivalRange(arrivalHigh - arrivalLow + 1), serviceRange(serviceHigh - serviceLow + 1)

{ srand((unsigned)time(NULL)); }

void Initialize()

{

curTime = nextTime = 0;

customerNum = customerTime = 0;

for (int i = 1; i <= tellerNum; i++)

{

tellers[i].totalCustomerCount = 0;

tellers[i].totalServiceTime = 0;

tellers[i].finishServiceTime = 0;

}

customer.MakeEmpty();

}

void Run()

{

Initialize();

NextArrived();

#ifdef PRINTPROCESS

cout << endl;

cout << "tellerID";

for (int k = 1; k <= tellerNum; k++) cout << " TELLER " << k;

cout << endl;

#endif

for (curTime = 0; curTime <= simuTime; curTime++)

{

if (curTime >= nextTime)

{

CustomerArrived();

NextArrived();

}

#ifdef PRINTPROCESS

cout << "Time: " << curTime << " ";

#endif

for (int i = 1; i <= tellerNum; i++)

{

if (tellers[i].finishServiceTime < curTime)

tellers[i].finishServiceTime = curTime;

if (tellers[i].finishServiceTime == curTime

&& !customer.IsEmpty())

{

int t = NextService();

#ifdef PRINTPROCESS

cout << ' ' << customerNum + 1 << '(' << customer.GetFront() << ',' << t << ')';

#endif

CustomerDeparture();

tellers[i].totalCustomerCount++;

tellers[i].totalServiceTime += t;

tellers[i].finishServiceTime += t;

}

#ifdef PRINTPROCESS

else cout << " ";

#endif

}

#ifdef PRINTPROCESS

cout << endl;

#endif

}

PrintResult();

}

void PtintSimuPara()

{

cout << endl << "模拟参数" << endl;

cout << "柜台数量: " << tellerNum << " 营业时间:" << simuTime << endl;

cout << "两个顾客来到的最小间隔时间:" << arrivalLow << endl;

cout << "两个顾客来到的最大间隔时间:" << arrivalHigh << endl;;

cout << "柜台服务最短时间:" << serviceLow << endl;

cout << "柜台服务最长时间:" << serviceHigh << endl;

}

void PrintResult()

{

int tSN = 0;

long tST = 0;

cout << endl;

cout << "-------------模拟结果-------------------";

cout << endl << "tellerID ServiceNum ServiceTime AverageTime" << endl;

for (int i = 1; i <= tellerNum; i++)

{

cout << "TELLER " << i;

cout << ' ' << tellers[i].totalCustomerCount << " "; tSN += tellers[i].totalCustomerCount;

cout << ' ' << tellers[i].totalServiceTime << " "; tST += (long)tellers[i].totalServiceTime;

cout << ' ';

if (tellers[i].totalCustomerCount)

cout <<

(float)tellers[i].totalServiceTime/(float)tellers[i].totalCustomerCou nt;

else cout << 0;

cout << " " << endl;

}

cout << "TOTAL " << tSN << " " << tST << " ";

if (tSN) cout << (float)tST/(float)tSN; else cout << 0;

cout << " " << endl;

cout << "Customer Number: " << customerNum << " no Service: " << customerNum - tSN << endl;

cout << "Customer WaitTime: " << customerTime << " AvgWaitTime: ";

if (tSN) cout << (float)customerTime/(float)tSN; else cout << 0;

cout << endl;

}

private:

int tellerNum;

int simuTime;

int curTime, nextTime;

int customerNum;

long customerTime;

int arrivalLow, arrivalHigh, arrivalRange;

int serviceLow, serviceHigh, serviceRange;

Teller tellers[21];

Queue customer;

void NextArrived()

{

nextTime += arrivalLow + rand() % arrivalRange;

}

int NextService()

{

return serviceLow + rand() % serviceRange;

}

void CustomerArrived()

{

customerNum++;

customer.EnQueue(nextTime);

}

void CustomerDeparture()

{

customerTime += (long)curTime - (long)customer.DeQueue();

}

};

#endif

几点说明

●Run()的过程是这样的:curTime是时钟,从开始营业计时,自然流逝到停

止营业。当顾客到的事件发生时(顾客到时间等于当前时间,小于判定是因为个别时候顾客同时到达——输入arrivalLow=0的情况,而在同一时间,只给一个顾客发号码),给这个顾客发号码(用顾客到时间标示这个顾客,入队,来到顾客数增1)。当柜台服务完毕时(柜台服务完时间等于当前时间),该柜台服务人数增1,服务时间累加,顾客离开事件发生,下一个顾客到该柜台。因为柜台开始都是空闲的,所以实际代码和这个有点出入。最后,停止营业的时候,停止发号码,还在接受服务的顾客继续到服务完,其他还在排队的就散伙了。

●模拟结果分别是:各个柜台的服务人数、服务时间、平均服务时间,总的

服务人数、服务时间、平均服务时间,来的顾客总数、没被服务的数目(来的太晚了)、接受服务顾客总等待时间、平均等待时间。

●这个算法效率是比较低的,实际上可以不用队列完成这个模拟(用顾客到

时间推动当前时钟,柜台直接公告服务完成时间),但这样就和实际情况有很大差别了——出纳员没等看见人就知道什么时候完?虽然结果是一样的,但是理解起来很莫名其妙,尤其是作为教学目的讲解的时候。当然了,实际中为了提高模拟效率,本文的这个算法是不值得提倡的。

●注释掉的#define PRINTPROCESS,去掉注释符后,在运行模拟的时候,能

打印出每个时刻柜台的服务情况(第几个顾客,顾客到达时间,接受服务时间),但只限4个柜台以下,多了的话屏幕就满了(格式就乱了)。

【后记】本来我没打算写这篇,后来,当我开始实现模拟的时候,竟欲罢不能了。这是数据结构这本书中第一个实际应用的例子,而且也有现实意义。你可以看出各个柜台在不同的业务密度下的工作强度(要么给哪个柜台出纳员发奖金,要么轮换柜台),各种情况下顾客的等待时间(人都是轮到自己就不着急了),还有各种情况下设立几个柜台合理(很少的空闲时间,很短的等待时间,几乎为零的未服务人数)。例如这样:

for (int i = 1; i < 16; i++)

{

Simulation a(i,240,1,4,8,15);

a.Run();

}

你模拟一下就会得出,在不太繁忙的银行,4~5个柜台是合适的——现在的银行大部分都是这样的。

节点类

#ifndef Node_H

#define Node_H

template class Node //单链节点类

{

public:

Type data;

Node *link;

Node() : data(Type()), link(NULL) {}

Node(const Type &item) : data(item), link(NULL) {}

Node(const Type &item, Node *p) : data(item), link(p) {}

};

#endif

【说明】因为数据结构里用到这个结构的地方太多了,如果用原书那种声明友元的做法,那声明不知道要比这个类的本身长多少。不如开放成员,事实上,这种结构只是C中的struct,除了为了方便初始化一下,不需要任何的方法,原书

那是画蛇添足。下面可以看到,链表的public部分没有返回Node或者Node*的函数,所以,别的类不可能用这个开放的接口对链表中的节点操作。

【重要修改】原书的缺省构造函数是这样的Node() : data(NULL), link(NULL) {} 。我原来也是照着写的,结果当我做扩充时发现这样是不对的。当Type为结构而不是简单类型(int、……),不能简单赋NULL值。这样做使得定义的模板只能用于很少的简单类型。显然,这里应该调用Type的缺省构造函数。这也要求,用在这里的类一定要有缺省构造函数。在下面可以看到构造链表时,使用了这个缺省构造函数。当然,这里是约定带表头节点的链表,不带头节点的情况请大家自己思考。

【闲话】请不要对int *p = new int(1);这种语法有什么怀疑,实际上int也可以看成一种class。

单链表类

#ifndef List_H

#define List_H

#ifndef TURE

#define TURE 1

#endif

#ifndef FALSE

#define FALSE 0

#endif

typedef int BOOL;

#include "Node.h"

template class List //单链表定义

{

//基本上无参数的成员函数操作的都是当前节点,即current指的节点

//认为表中“第1个节点”是第0个节点,请注意,即表长为1时,最后一个节点是第0个节点

public:

List() { first = current = last = new Node; prior = NULL; }

~List() { MakeEmpty(); delete first; }

void MakeEmpty() //置空表

{

Node *q;

while (first->link != NULL)

{

q = first->link;

first->link = q->link;

delete q;

}

Initialize();

}

BOOL IsEmpty()

{

if (first->link == NULL)

{

Initialize();

return TURE;

}

else return FALSE;

}

int Length() const //计算带表头节点的单链表长度{

Node *p = first->link;

int count = 0;

while (p != NULL)

{

p = p->link;

count++;

}

return count;

}

Type *Get()//返回当前节点的数据域的地址

{

if (current != NULL) return ¤t->data;

else return NULL;

}

BOOL Put(Type const &value)//改变当前节点的data,使其为value

{

if (current != NULL)

{

current->data = value;

return TURE;

}

else return FALSE;

}

Type *GetNext()//返回当前节点的下一个节点的数据域的地址,不改变current

{

if (current->link != NULL) return ¤t->link->data;

else return NULL;

}

Type *Next()//移动current到下一个节点,返回节点数据域的地址

{

if (current != NULL && current->link != NULL)

{

prior = current;

current = current->link;

return ¤t->data;

}

else

{

return NULL;

}

}

void Insert(const Type &value)//在当前节点的后面插入节点,不改变current {

Node *p = new Node(value, current->link);

current->link = p;

}

BOOL InsertBefore(const Type &value)//在当前节点的前面插入一节点,不改变current,改变prior

{

Node *p = new Node(value);

if (prior != NULL)

{

p->link = current;

prior->link = p;

prior = p;

return TURE;

}

else return FALSE;

}

BOOL Locate(int i)//移动current到第i个节点

{

if (i <= -1) return FALSE;

current = first->link;

for (int j = 0; current != NULL && j < i; j++, current = current->link) prior = current;

if (current != NULL) return TURE;

else return FALSE;

}

void First()//移动current到表头

{

current = first;

prior = NULL;

}

void End()//移动current到表尾

{

if (last->link != NULL)

{

for ( ;current->link != NULL; current = current->link)

prior = current;

last = current;

}

current = last;

}

BOOLFind(const Type&value)//移动current到数据等于value的节点

{

if (IsEmpty()) return FALSE;

for (current = first->link, prior = first; current != NULL&¤t->data != value; current =current->link)

prior =current;

if (current != NULL) return TURE;

else return FALSE;

}

BOOL Remove()//删除当前节点,current指向下一个节点,如果current在表尾,执行后current = NULL

{

if (current != NULL && prior != NULL)

{

Node *p = current;

prior->link = p->link;

current = p->link;

delete p;

return TURE;

}

else return FALSE;

}

BOOL RemoveAfter()//删除当前节点的下一个节点,不改变current

{

if (current->link != NULL && current != NULL)

{

Node *p = current->link;

current->link = p->link;

delete p;

return TURE;

}

else return FALSE;

}

friend ostream & operator << (ostream & strm, List &l)

{

l.First();

while (l.current->link != NULL) strm << *l.Next() << " " ;

strm << endl;

l.First();

return strm;

}

protected:

/*主要是为了高效的入队算法所添加的。因为Insert(),Remove(),RemoveAfter()有可能改变last但没有改变last所以这个算法如果在public里除非不使用这些,否则不正确。但是last除了在队列中非常有用外,其他的时候很少用到,没有必要为了这个用途而降低Insert(),Remove()的效率所以把这部分放到protected,实际上主要是为了给队列继承*/ void LastInsert(const Type &value) {

Node *p = new Node(value, last->link);

last->link = p;

last = p;

}

void Initialize()//当表为空表时使指针复位

{

current = last = first;

prior = NULL;

}

//这部分函数返回类型为Node指针,是扩展List功能的接口

Node *pGet()

{

return current;

}

Node *pNext()

{

prior = current;

current = current->link;

return current;

}

Node *pGetNext()

{

return current->link;

}

&nb

数据结构学习(C++)——单链表应用(一元多项式)

总算到了这里,这时,你会很得意的说,辛辛苦苦学的单链表总算知道能干点什么了。但是很不幸,如果你和我一样看的是那本书,到这里,你可能比学双向链表时还要痛苦。如果你是按照书上的介绍一步一步做到这里,你能把书上的多项式加法函数调试出来,我对你致以十二分的敬意。说到这里,我想起来我发单链表的时候,有人给我建议说:最好把链表和链表位置这两个分开。没错,C++标准库是这么做的,而我也不是什么专家,也不能证明什么优劣;但是,对于初学者来说,一个类总比两个类好操作。我不清楚原书这部分的程序究竟调没调试,但这种语句我是绝对看不懂的:

ListNode *pa, *pb, *pc, *p;

ListIterator Aiter(ah.poly);

ListIterator Biter(ah.poly);

pa = pc = Aiter.First(); pb = p = Biter.First();

………………………..

pa->coef = pa->coef + pb->coef;

p = pb; pb = Biter.Next(); delete p;

如果你没有原书,我来解释一下。pa, pb, p 究竟指向什么?你说这很清楚,ListNode这样的节点呗。但按照原书的定义,ListIterator::First()等等函数返回是指向data域的指针,他们怎么能直接赋值?到了下面更乱了,pb指向的区域直接分解出了Term的数据成员,也就是说是指向Term结构的;然后让ListNode类型的指针p指向这个Term结构,最后,居然把这个结构delete了,天啊,ListNode这样的节点的data域被delete了!

如果从基本的节点操作入手,谁也不会弄的这么乱。但正因为又多了一个类,很多事就疏忽了。所以,我并不怀疑标准库的做法,只是对于初学者,同一时间最好只对一个类操作。我以我的定义为基础,重新完成了这段程序。我并不欣赏原位操作的多项式加法(+),PolyA+PolyB,

然后B就嗖的一下没了,A就多了一堆(也可能少了一堆);你作intJ+intK的时候怎么没见J 和K有什么变化。与其这样,重载“+”还不如写成PolyA.Add(PolyB)或者PolyAdd(PolyA,PolyB)。

一元多项式类定义与实现

#ifndef Polynomial_H

#define Polynomial_H

#include "List.h"

class Term

{

public:

int coef;

int exp;

Term() : coef(0), exp(0) {}

Term(int c, int e) : coef(c), exp(e) {}

Term(int c) : coef(c), exp(0) {}

};

class Polynomial : List

{

public:

void Input()

{

cout << endl << "输入多项式的各项系数和指数";

cout << endl << "注意:请按降序输入各项,输入系数0表示结束" << endl;

int coef, exp;

for(int i = 1; ; i++)

{

cout << "第" << i << "项的系数:";

cin >> coef;

if (coef)

{

cout << "指数:";

cin >> exp;

Term term(coef, exp);

Insert(term);

}

else break;

}

}

void Print()

{

cout << endl;

First();

if (!IsEmpty())

{

Term *p = Next();

cout << p->coef;

if (p->exp)

{

cout << "x";

if (p->exp != 1) cout << "^" << p->exp;

}

while (Next() != NULL)

{

p = Get();

if (p->coef > 0) cout << "+";

cout << p->coef;

if (p->exp)

{

cout << "x";

if (p->exp != 1) cout << "^" << p->exp;

}

}

}

cout << endl;

}

friend void PolyAdd (Polynomial &polyA, Polynomial &polyB) {

Node *pA, *pB;

polyA.First();polyB.First();

pA = polyA.pNext();pB = polyB.pNext();

while (pA != NULL && pB !=NULL)

{

if (pA->data.exp == pB->data.exp)

{

pA->data.coef = pA->data.coef + pB->data.coef;

polyB.Remove();

if (!pA->data.coef) polyA.Remove();

else polyA.pNext();

}

else

{

if (pA->data.exp > pB->data.exp)

{

polyB.pRemove();

polyA.InsertBefore(pB);

}

else if (pA->data.exp < pB->data.exp) polyA.pNext();

}

pA = polyA.pGet();pB = polyB.pGet();

}

if (pA == NULL)

{

polyA.pGetPrior()->link = pB;

polyB.pGetPrior()->link = NULL;

}

}

};

#endif

【说明】对于多项式,通常我们都是降序书写的,于是我就要求降序输入。但是对于做加法来说,确实升序的要方便一些,于是,实际上到了内部,就变成升序的了。对于输出格式(从C的时候我就不喜欢做这个),尽量照顾习惯,但是当非常数项系数为1的时候还是会输出系数的,我实在不想把一个实际应用中根本拿不出台的输出函数搞的很复杂。为我编起来方便,输出变成了升序的,请多包含。测试程序就不给了,很简单。在续篇中,我将完成一元多项式“+”“-”“×”“=”的重载——为什么没有“÷”,这种运算我拿笔算都不麻利,编起来就更闹心了,我还清楚的记得拿汇编写多字节除法程序时的痛苦。到了下一篇,你就可以这样写了

a=b+c*d;a.Print();

数据结构学习(C++)——单链表应用(一元多项式

【2】)

按照原书的安排,对多项式的讲解到上一篇就应该结束了,但我还想做一些延伸。比如说,你很清楚多项式的系数肯定不总是整数,但为什么用整型呢?我看到原书用的是整型,我也有这个疑问。但是,一旦动起手来,就会发现改成浮点不仅仅只是在定义Term时把int coef;改成float coef;很多的细节都要考虑到(给个提示,你知道浮点零是多少吗)。我试了一下,最后放弃了;理由是,写这些只是为了学习,没必要搞的那么复杂,能说明问题就可以了。

在下面将会有些重载运算符的例子,我们的工作将是使多项式的运算看起来更符合书写习惯。完成这些是我觉得我擅自将原书的“+”改成了PolyAdd(),总要给个交待吧。很快你就会看到原位运算的多项式加法在多项式运算中有多么重要,往下看之前,请确保弄懂了上一篇的内容。

准备工作

下面将完成单链表的赋值运算的重载,请把这部分加到List类的public部分。的确,这部分也可以放在多项式类里实现;但是,复制一个多项式实际上就是复制一个单链表,与其单单做一个多项式赋值,还不如完成单链表的赋值,让派生类都能共享。

operator = (const List &l)

{

MakeEmpty();

for (Node *p = l.first->link; p != NULL; p = p->link) LastInsert(p->data);

}

还记得List类的private里面的这个List(const List &l)吗?当初怕它惹祸,直接将它禁用了,既然现在=都能用了,为了这种语法List b = a;顺便也把它完成了吧。现在可以把它从private放到public了。

List(const List &l)

{

软考软件设计师必做练习题附答案

软考软件设计师必做练习题及答案 软件设计师考试属于全国计算机技术与软件专业技术资格考试(简称计算机软件资格考试)中的一个中级考试。考试不设学历与资历条件,也不论年龄和专业,考生可根据自己的技术水平选择合适的级别合适的资格,但一次考试只能报考一种资格。考试采用笔试形式,考试实行全国统一大纲、统一试题、统一时间、统一标准、统一证书的考试办法。下面是希 赛小编整理的软考软件设计师考前必做的练习题。 试题一分析 本题主要考查类图和顺序图。 【问题 1】 需要分析此门禁系统的体系结构,根据体系结构的描述来看什么数据放在什么类中最 为合适。题目中提到:系统中的每个电控锁都有一个唯一的编号。锁的状态有两种:“已锁住”和“未锁住”。所以Lock 中含有锁编号和锁状态这两个属性。又因为题中有:在主机 上可以设置每把锁的安全级别以及用户的开锁权限。只有当用户的开锁权限大于或等于锁的 安全级并且锁处于“已锁住”状态时,才能将锁打开。因此,Lock 中还有锁的安全级别。 【问题 2】 首先,( 1 )、( 2 )是 FingerReader和LockController之间的交互。所以我们看题 目中是如何描述他们的交互的。题目中有“指纹采集器将发送一个中断事件给锁控器,锁控器从指纹采集器读取用户的指纹”,所以(1)应填“中断事件”,( 2 )应填“读取指纹”。(3 )是主机与UserInfo的交互,从图2-35中可以看出,UserInfo中存储了用户的指纹信息和开锁权限,所以( 3 )应是从 UserInfo读取用户的指纹信息和开锁权限。(4)空应填“读取锁的安全级别”。( 5 )是 MainFrame向自己发送的一条消息,从题目中的“主 机根据数据库中存储的信息来判断用户是否具有开锁权限,若有且锁当前处于已锁住状态,

2017年下半年上午 软件设计师 试题及答案与解析-软考考试真题-基础知识

2017年下半年上午软件设计师 考试试题-答案与解析 一、单项选择题(共75分,每题1分。每题备选项中,只有1个最符合题意) ●第1题.以下关于防火墙功能特性的叙述中,不正确的是(1)。 A.控制进出网络的数据包和数据流向 B.提供流量信息的日志和审计 C.隐藏内部IP以及网络结构细节 D.提供漏洞扫描功能 【参考答案】D 【答案解析】一个防火墙(作为阻塞点、控制点)能极大地提高一个内部网络的安全性,并通过过滤不安全的服务而降低风险。由于只有经过精心选择的应用协议才能通过防火墙,所以网络环境变得更安全。如防火墙可以禁止诸如众所周知的不安全的NFS协议进出受保护网络,这样外部的攻击者就不可能利用这些脆弱的协议来攻击内部网络。防火墙同时可以保护网络免受基于路由的攻击,如IP选项中的源路由攻击和ICMP重定向中的重定向路径。防火墙应该可以拒绝所有以上类型攻击的报文并通知防火墙管理员。 强化网络安全策略 监控网络存取和访问 如果所有的访问都经过防火墙,那么,防火墙就能记录下这些访问并作出日志记录,防止内部信息的外泄 ●第2题.在程序执行过程中,Cache与主存的地址映射是由(2)完成的。 A.操作系统 B.程序员调度 C.硬件自动 D.用户软件 【参考答案】C 【答案解析】对于Cache,即高速缓存,是用来解决主存与CPU速度不匹配问题,Cache的出现使得CPU可以不直接访问主存而直接与高速Cache交换信息。由于程序访问的局部性原理可以很容易设想只要将 CPU近期要用到的程序和数据提前从主存送到Cache,那么就可以做到CPU在一定时间内只访问Cache,这样CPU与高速Cache进行通信,就大大提高了计算机的运行速度。 在Cache –主存的地址映射之前,首先要将主存与Cache都分成若干块,每块又包括若干个字,并使得它们的大小相同(即快内的字数相同)。在划分好块后,下面要做的就是将主存块与Cache块形成映射就行了。而这里的映射则是通过块的地址形成映射关系。对于地址映射,首先将主存地址分成两块,高n1位为主存的快地址,低n2位为快内地址。Cache

2020年软考《软件设计师》考前模拟练习题

2020年软考《软件设计师》考前模拟练习题 一. 从静态角度看,进程由 __(1)__ 、 __(2)__ 和 __(3)__ 三部分组成。用户可通过 __(4)__ 建立和撤消进程。通常,用户进程被建立后, __(5)__ 。 供选择的答案 (1)。 A.JCB B.DCB C.PCB D.PMT (2)。 A.程序段 B.文件体 C.I/O D.子程序 (3)。 A.文件描述块 B.数据空间 C.EOF D.I/O缓冲区 (4)。 A.函数调用 B.宏指令 C.系统调用 D.过程调用

(5)。 A.便一直存有于系统中,直到被操作人员撤消 B.随着作业运行正常或不正常结束而撤消 C.随着时间片轮转而撤消与建立 D.随着进程的阻塞或唤醒而撤消与建立 参考答案:(1) C (2) A (3) B (4) C (5) BD 二. 设相关系模式 W ( C,P,S,G,T,R ),其中各属性的含义是:C--课程,P--教师,S--学生,G--成绩,T--时间,R--教室,根 据语义有如下数据依赖集: D={ C→P,(S,C)→G,(T,R)→C,(T,P)→R,(T,S)→R } 关系模式 W 的一个码( 关键字 )是 __(6)__ ,W的规范化程序达到 __(7)__ 。若将关系模式 W 分解为 3 个关系模式 W1(C,P), W2(S,C,G),W3(S,T,R,C),则 W1 的规范化程序达到 __(8)__ ,W2 的规范化水准达到 __(9)_ ,W3 的规范化程序达到__(10)__ 。 供选择的答案 (6)A (S,C) B (T,R) C (T,P) D (T,S) (7)~(10) A.1NF B.2NF C.3NF D.BCNF E.4NF 参考答案:(6) D (7) B (8) E (9) E (10) B 三. 数据库是存储在一起的相关数据的集合,能为各种用户所共享,且[__(11)__]。在关系数据库中,若关系模式中的每个关系的属 性值均是不可分解的,则该关系模式属于[__(12)__]。

2018年下半年软件设计师考试下午真题(完整版)

2018年下半年软件设计师考试下午真题(专业解析+ 参考答案) 1、阅读下列说明和图,回答问题1至问题4,将解答填入答题纸的对应栏内。【说明】 某房产中介连锁企业欲开发一个基于Web的房屋中介信息系统,以有效管理房 源和客户,提高成交率。该系统的主要功能是: 1.房源采集与管理。系统自动采集外部网站的潜在房源信息,保存为潜在房源。由经纪人联系确认的潜在房源变为房源,并添加出售/出租房源的客户。由经纪人或客户登记的出售/出租房源,系统将其保存为房源。房源信息包括基本情况、配套设施、交易类型、委托方式、业主等。经纪人可以对房源进行更新等管理 操作。 2.客户管理。求租/求购客户进行注册、更新,推送客户需求给经纪人,或由经纪人对求租/求购客户进行登记、更新。客户信息包括身份证号、姓名、手机号、需求情况、委托方式等。 3.房源推荐。根据客户的需求情况(求购/求租需求情况以及出售/出租房源信息),向已登录的客户推荐房源。 4.交易管理。经纪人对租售客户双方进行交易信息管理,包括订单提交和取消,设置收取中介费比例。财务人员收取中介费之后,表示该订单已完成,系统更新订单状态和房源状态,向客户和经纪人发送交易反馈。 5.信息查询。客户根据自身查询需求查询房屋供需信息。 现采用结构化方法对房屋中介信息系统进行分析与设计,获得如图1-1 所示的 上下文数据流图和图1-2所示的0层数据流图。

问题内容:【问题 1】 (4分) 使用说明中的词语,给出图1-1中的实体E1-E4的名称。 【问题 2】 (4分) 使用说明中的词语,给出图1-2中的数据存储D1-D4的名称。 【问题 3】 (3 分) 根据说明和图中术语,补充图1-2中缺失的数据流及其起点和终点。

2020年计算机软考软件设计师知识点精选集

2020年计算机软考软件设计师知识点精选集 需求分析:开发人员准确地理解用户的要求,实行细致的调查分析,将用户非形式的需求陈述转化为完整的需求定义,再由需求定义转换到相对应的需求规格说明的过程。 它有以下几难点: ⑴问题的复杂性。由用用户需求涉及的因素繁多引起,如运行环境和系统功能 ⑵交流障碍。需求分析涉及人员较多,这些人具备不同的背景知识,处于不同角度,扮演不同角色,造成相互之间交流困难。 ⑶不完备性和不一致性。用户对问题的陈述往往是不完备的,各方面的需求可能还存有矛盾,需求分析要消除矛盾,形成完备及一致的定义。 ⑷需求易变性。 近几年来已提出多种分析和说明方法,但都必须适用以下原则: ⒈必须能够表达和理解问题的数据域和功能域。数据域包括数据流(数据通过一个系统时的变化方式)数据内容和数据结构,功能域反映上述三方面的控制信息。 ⒉能够把一个复杂问题按功能实行分解并可逐层细化。 ⒊建模。可更好地理解软件系统的信息,功能,行为。也是软件设计的基础。 需求分析的任务: ⒈问题识别:双方确定对问题的综合需求,这些需求包括功能需求,性能需求,环境需求,用户界面需求。 ⒉分析与综合,导出软件的逻辑模型

⒊编写文档:包括编写"需求规格说明书""初步用户使用手册""确认测试计划""修改完善软件开发计划" 结构化分析:简称SA,面向数据流实行数据分析的方法。采用自顶向下逐层分解的分析策略。顶层抽象地描述整个系统,底层具体地画出系统工程的每个细节。中间层则是从抽象到具体的过渡。使用数据流图,数据字典,作为描述工具,使用结构化语言,判定表,判定树描述加工逻辑。 结构化(SA)分析步骤: ⑴了解当前系统的工作流程,获得当前系统的物理模型。 ⑵抽象出当前系统的逻辑模型。 ⑶建立目标系统的逻辑模型。 ⑷作进一步补充和优化。 【篇二】2020年计算机软考软件设计师知识点:数据流图 以图形的方式描述数据在系统中流动和处理的过程。只反映系统必须完成的逻辑功能,是一种功能模型。 画数据流图的步骤: ⑴首先画系统的输入输出,即先画顶层数据流图。顶层图只包含一个加工,用以表示被开发的系统。 ⑵画系统内部,即画下层数据流图。将层号从0号开始编号,采用自顶向下,由外向内的原则。画更下层数据流图时,则分解上层图中的加工,一般沿着输出入流的方向,凡数据流的组成或值发生变化的地方则设置一个加工,一直实行到输出数据流。如果加工的内部还有数据流,则继续分解,直到每个加工充足简单,不能再分解为止。不能分解的加工称为基本加工。 ⑶注意事项:

下半年软件设计师下午试题以及标准答案

2014年下半年软件设计师下午试题 试题:i 阅读下列说明和图,回答问题1至问题3,将解答填入答题纸的对应栏内。 【说明】 某大型披萨加工和销售商为了有效管理生产和销售情况,欲开发一披萨信息系统,其主要功能如下: (1)销售。处理客户的订单信息,生成销售订单,并将其记录在销售订单表中。销售订单记录了订购者、所订购的披萨、期望的交付日期等信息。 (2 )生产控制。根据销售订单以及库存的披萨数量,制定披萨生产计划(包括生产哪些披萨、生产顺序和生产量等),并将其保存在生产计划表中。 (3)生产。根据生产计划和配方表中的披萨配方,向库存发岀原材料申领单,将制作好的披萨的信息存入库存表中,以便及时进行交付。 (4)采购。根据所需原材料及库存量,确定采购数量,向供应商发送采购订单,并将其记录在采购订单表中;得到供应商的供应量,将原材料数量记录在库存表中,在采购订单表中标记已完成采购的订单。 (5)运送。根据销售订单将披萨交付给客户,并记录在交付记录表中。 (6 )财务管理。在披萨交付后,为客户开具费用清单,收款并岀具收据;依据完成的采购订单给供应商支付原材料费用并岀具支付细节;将收款和支付记录存入收支记录表中。 (7)存储。检查库存的原材料、拔萨和未完成订单,确定所需原材料。 现采用结构化方法对披萨信息系统进行分析与设计,获得如图1-1所示的上下文数据流图和图1-2所示 的0层数据流图。 图1-1上下文数据流图

【问题1】(4分) 根据说明中的词语,给岀图【问题2】(5分) 根据说明中的词语,给岀图【问题3】(6分)1-1中的实体E1?E2的名称。 1-2中的数据存储D1?D5的名称。 图1-2 0层数数据流图 根据说明和图中词语,补充图1-2中缺失的数据流及其起点和终点

2020年软考《软件设计师》练习题及答案

2020年软考《软件设计师》练习题及答案 1.Multiple choices. (1)Software design may . a.be a creative process b.not be learned from a book c.be learned from a book d.require a certain amount of flair (2)Methodologies of software design can be classified into . a.down-top function design b.data-driven design c.top-down function design d.object-oriented design (3)A well-designed system should be . a.easily understood b.reliable c.straightforward to implement d.straightforward to maintain (4)A derivation process for designing a programming system includes stages. a.5 b.4

c.3 d.2 (5)In the early stage of software design we need . a.give a flowchart b.give a set of requirements c.top-down functional design only d.prepare an informal design (6)A good design of software depends on . a.establishing a definitive way b.the application c.the particular project requirements d.efficient code to be produced (7)Software design can be . a.represented in any single notation b.a multi-stage activity c.an iterative activity d.a single-stage activity (8)The tasks being performed by a software engineer are . a.to design communication mechanisms b.to design file structures c.to design data structures d.to derive the design of a programming system

2017年软考软件设计师考试培训指南与大纲

2017年软考软件设计师考试培训指南与大纲 考试内容说明: “(Ⅰ)”、“(Ⅱ)”和“(Ⅲ)”表示掌握或熟悉的程度。 “(Ⅰ)”是指对所列只是要理解其内容及含义理解。 “(Ⅱ)”是指在有关问题中能直接使用一般应用 “(Ⅲ)”是指对所列知识要理解其确切含义及与其它知识的联系,能够进行叙述和解释,并能在实际问题的分析、综合、推理和判断等过程中运用综合应用。 考试科目1 计算机与软件工程知识 1.计算机科学基础知识 1.1.数制及其转换 ●二进制、八进制、十进制和十六进制等常用数制及其相互转换(Ⅱ) 1.2.计算机内数据的表示 ●数的表示 带符号定点数据(纯整数和纯小数)的原码、反码、补码和移码表示(Ⅱ) 浮点数(实数)的表示(Ⅱ) 溢出的概念(Ⅱ) ●非数值表示(字符和汉字表示、声音表示、图像表示)(补充) 1.3.算数运算和逻辑运算 ●计算机中的二进制数运算方法 补码表示下定点数的加、减、乘、除运算方法(Ⅰ) ●逻辑代数的基本运算 基本的逻辑运算与、或、非、异或(Ⅱ) 1.4.其他数学基础知识 ●常用数值计算 矩阵和行列式、近似求解、插值、数值积分、常微分方程等常用的数值运算方法及运算误差的概念(Ⅰ) ●排列组合概率论应用应用统计(数据的统计分析)(Ⅰ) ●编码基础(ASCII码汉字编码奇偶校验海明码霍夫曼码、循环冗余码)奇偶校验码、 海明码、霍夫曼码、循环冗余码的编码方法及指定实例时校验码的计算(Ⅰ)

●命题逻辑、谓词逻辑、形式逻辑的基础知识(Ⅰ) ●运筹基本方法(补充) 2.计算机系统基础知识 2.1.计算机硬件基础知识 2.1.1.计算机系统的组成、体系结构分类及特性 ●CPU、存储器的组成、性能和基本工作原理 CPU的基本组成结构(Ⅰ) 存储器的组成及特点:内存、外存、缓存Cache、闪存(Ⅱ) 存储器的性能指标定义:存取周期、存储容量和可靠性(Ⅱ) ●常用I/O设备、通信设备的性能以及基本工作原理(Ⅰ) ●I/O接口的功能、类型和特性 CPU在与I/O设备进行数据交换时存在的主要问题:速度不匹配、时序不匹配、信息格式不匹配、信息类型不匹配(Ⅰ) CPU与外设之间的数据交换必须通过接口来完成,I/O接口的主要功能(Ⅱ) 接口的控制方式及特点:CPU通过接口对外设进行控制的方式程序查询方式、中断处理方式、DMA(直接存储器存取)传送方式(Ⅱ) ●CISC/RISC流水线操作多处理机并行处理 RISC(精简指令集计算机)和CISC(复杂指令集计算机)的定义和特点(Ⅰ) 流水线的定义及操作特点(Ⅱ) 多处理机的概念(Ⅰ) 单指令流单数据流(SISD)、单指令流多数据流(SIMD)、多指令流单数据流(MISD)、多指令流多数据流(MIMD)的概念和特点(Ⅱ) 并行处理的基本概念(Ⅰ) 2.1.2.存储系统 ●虚拟存储器基本工作原理多级存储体系 虚拟存储器的定义和管理方式(Ⅰ) 多级存储体系的组成及特点(Ⅱ) ●RAID类型和特性 RAID的定义和基本特点 RAID0、RAID7、RAID10、RAID53等规范的特征(Ⅰ)

2019上半年软件设计师下午真题及答案

2019上半年软件设计师下午真题及答案 试题一(共15分) 阅读下列说明和图,回答问题1至问题4,将解答填入答题纸的对应栏内。 【说明】 某学校欲开发一学生跟踪系统,以便更自动化、更全面地对学生在校情况(到课情况和健康状态等)进行管理和追踪,使家长能及时了解子女的到课情况和健康状态,并在有健康问题时及时与医护机构对接。该系统的主要功能是: (1)采集学生状态。通过学生卡传感器,采集学生心率、体温(摄氏度)等健康指标及其所在位置等信息并记录。每张学生卡有唯一的标识(ID)与一个学生对应。 (2)健康状态告警。在学生健康状态出问题时,系统向班主任、家长和医护机构健康服务系统发出健康状态警告,由医护机构健康服务系统通知相关医生进行处理。 (3)到课检查。综合比对学生状态、课表以及所处校园场所之间的信息对学生到课情况进行判定。对旷课学生,向其家长和班主任发送旷课警告。

(4)汇总在校情况。定期汇总在校情况,并将报告发送给家长和班主任。 (5)家长注册。家长注册使用该系统,指定自己子女,存入家长信息,待审核。 (6)基础信息管理。学校管理人员对学生及其所用学生卡和班主任、课表(班级、上课时间及场所等)、校园场所(名称和所在位置区域)等基础信息进行管理;对家长注册申请进行审核,更新家长状态,将家长ID加入学生信息记录中使家长与其子女进行关联,向家长发送注册结果。一个学生至少有一个家长,可以有多个家长。课表信息包括班级、班主任、时间和位置等。 现采用结构化方法对学生跟踪系统进行分析与设计,获得如图1-1所示的上下文数据流图和图1-2所示的0层数据流图。

【问题1】(5分) 使用说明中的词语,给出图1-1中的实体E1?E5的名称。【问题2】(4分) 使用说明中的词语,给出图1-2中的数据存储D1?D4的名称。

2020年全国计算机软考软件设计师英

2020年全国计算机软考软件设计师英 语试题●The Semantic Web is a web of dat a There is lots ofdata we all use every day,and its not part of the(1).I cansee my bank statements on the web,and my photographs,and Ican see my appoint. ments in a calendar.But can I see myphotos in a calendar to see what l was doing when I took them 9. Can I see bank statement lines in a calendar? Why not?Because we don’t have a web of dat a Becausedata is controlled b y (2),and each application keeps it toitself. The Semantic Web is about two things.It is about commonformats for interchange of(1 3),where01 the original Web weonly had interchange of documents.Also it is about languagefor recording how the data relates to real world(4).Thatallows a person,or a (5),to start off in one database,andthen move through an unending set of databases which areconnected not by wires but by being about the same thing. (1) A. life B. WWW C. page D. web (2) A. manager B. applications C. software D. computer (3) A. documents B. pages

历年软考软件设计师答案

2004年上半年软件设计师级答案 上午答案 下午答案 试题一 [问题1] A:传感器:B:报警器 [问题2) 监控传感器、显示信息和状态 [问题3] 1、“读传感器”添加输入数据流“传感器状态” 2、“显示格式”添加输出数据流“TV信号” 3、“拨号”添加输出数据流“电话拨号” [问题4] 逻辑数据流图说明应该具有哪些加工,而不关心这些加工是如何实现的:物理数据流图则要说明加工是如何实现的。 试题二 [问题1] (1)l(2)col(3)row(4)2(5)col(6)row(7)k [问题2] 判断条件1:b 判断条件2:e 判断条件3:f 试题三 [问题1] A:浏览客户信息B:修改个人信息C:登录D:删除客户信息

[问题2] (1)1(2)0..*(3)0..1(4)0..1 [问题3] (1)4种关系的含义: 依赖表示类之间的使用关系。 概括表示一般类和特殊类之间的关系。 关联和聚集都表示实例之间的结构关系。 (2)关联和聚集的区别: 关联指明一个类的对象与另一类的对象间的联系:两个类之间的关联表示了两个同等地位类之间的结构关系,这两个类在概念上是同级别的。 聚集是一种特殊的关联,它表示整体/部分关系。 试题四 (1)JMP LAST (2)SUB GRO,WDT,GR1 (3)ST GR2,BTASC,GR1 (4)ADD GR0,C48 (5)ST GR0,BTASC,GR1 试题五 (1)p&&p->data !=e 或p&&(*p).data !=e (2)p->Lchild 或(*p).Lchild (3)s->Rchild 或(*s).Rchild (4)p->Lchild 或(*p).Lchild (5)p==pp->Lchild 或p (*pp).Lchild 试题六 (1)classArray (2)new T[iRsz*iCsz] (3)throw 'e' (4)tBody,iCurrentRow=i (5)tBody(iRsz,iCs2) 2004下半年软件设计师级试题答案

软考软件设计师教程试题分析加答案

软考软件设计师教程试题分析加答案 软件设计师考试属于全国计算机技术与软件专业技术资格考试(简称计算机软件资格考试)中的一个中级考试。考试不设学历与资历条件,也不论年龄和专业,考生可根据自己的技术水平选择合适的级别合适的资格,但一次考试只能报考一种资格。考试采用笔试形式,考试实行全国统一大纲、统一试题、统一时间、统一标准、统一证书的考试办法。下面是希赛小编整理的软考软件设计师考前必做的练习题。 试题一分析 本题主要考查类图和顺序图。 【问题1】 需要分析此门禁系统的体系结构,根据体系结构的描述来看什么数据放在什么类中最为合适。题目中提到:系统中的每个电控锁都有一个唯一的编号。锁的状态有两种:“已锁住”和“未锁住”。所以Lock中含有锁编号和锁状态这两个属性。又因为题中有:在主机上可以设置每把锁的安全级别以及用户的开锁权限。只有当用户的开锁权限大于或等于锁的安全级并且锁处于“已锁住”状态时,才能将锁打开。因此,Lock中还有锁的安全级别。 【问题2】 首先,(1)、(2)是FingerReader和LockController之间的交互。所以我们看题目中是如何描述他们的交互的。题目中有“指纹采集器将发送一个中断事件给锁控器,锁控器从指纹采集器读取用户的指纹”,所以(1)应填“中断事件”,(2)应填“读取指纹”。(3)是主机与UserInfo的交互,从图2-35中可以看出,UserInfo中存储了用户的指纹信息和开锁权限,所以(3)应是从

UserInfo读取用户的指纹信息和开锁权限。(4)空应填“读取锁的安全级别”。(5)是MainFrame向自己发送的一条消息,从题目中的“主机根据数据库中存储的信息来判断用户是否具有开锁权限,若有且锁当前处于已锁住状态,则将锁打开;否则系统报警”可以看出,主机在得到所有信息后要判断用户是否能开锁,所以(5)应填“判断用户是否能开锁”。 【问题3】 这是纯理论题,请直接阅读参考答案。 试题一参考答案 【问题1】 锁的编号、安全级别、锁的当前状态。 【问题2】 (1)中断事件(2)读取用户指纹 (3)读取用户开锁权限(4)读取锁的安全级别 (5)判断用户是否有权限开锁,或用户是否可以开锁 【问题3】 组装和聚集都表示实例之间的整体/部分关系。组装是聚集的一种形式。 聚集是概念性的,只是区分整体与部分。 组装具有很强的归属关系,而且整体与部分的对象生存周期是一致的。 试题二分析 本题考查的是UML类图和顺序图的基本知识。 【问题1】 由于一个商品分类中可以有多个商品,而一个商品仅仅对应一个商品分类,

软件设计师试题(带答案)

烟台市“东方杯”计算机软件技能竞赛(试题共11页) 2007年月日软件设计师 (考试时间14:00~16:00共120 分钟) 请按下述要求正确填写答题纸 1.将问题答案写在答题纸上,并在指定位置填写准考证号和姓名。 2.答题纸上除填写上述内容外只能写解答。 3.本试卷总分75分,共包括两部分,第一部分为综合知识测试,共45分;第二部分,包括三个题目,共30分。 4.解答时字迹务必清楚,字迹不清时,将不评分。

第一部分:单向选择(每题1分共45分) 试题1、2 某机主存容量为16MB ,cache 容量为16KB ,主存与cache 每块都分为16B 主存与cache 地址变换采用直接映像方法。这种映像方法优点是算法简单,缺点是 (1) 。若访问主存单元为B4AF45H ,而且该单元已经装入cache,则cache 的地址是 (2) 。 供选择的答案: (1)、 A: 转换方法复杂 B: 转换速度较慢 C: cache 利用不充分 D: 转换方法不直观 (2)、 A: 34AFH B: 2F45H C: 4AF5H D: B4AFH 试题3、4 某计算机字长为32位,浮点表示时,阶码占8位,尾数占24位(各包含1位符号位),阶码用补码表示,尾码用原码表示,该浮点数能表示的最大正数是 (3) ,能表示的最小负数是 (4) 。 供选择的答案: (3)、A: ( )23 7122--? B: ()()2371221--?- C: ( )24 7 12 21--?- D: ()237122---? (4)、A: ( )23 7 122 ---? B: ( )()23 7 12 2 1--?- C: ( )24 7 122 --? D: ( )()23 7 12 21---?- 试题5、6 可维护性是评价软件质量的重要方面,系统的可维护性通常包括 (5) , (6) 维护是为了扩充软件的功能或提高原有软件的性能而进行的维护活动。 供选择的答案: (5)、 A: 可用性和可理解性 B:可修改性、数据独立性和数据一致性 C:可测试性和稳定性 D:可理解性、可修改性和可测试性 (6)、 A:改正性 B:完善性 C:适应性 D:合理性 试题7、8 形式语言是使用来描述模块具体 (7) 的非正式的比较灵活的语言,有点是接近 (8) 供选择的答案: (7)、 A:算法 B:结构 C:行为 D:状态 (8)、 A: 机器语言 B:汇编语言 C:高级语言 D:自然语言

2010年上半年软考软件设计师考试试题及答案

2010 年下半年软件设计师上午试卷 ●在输入输出控制方法中,采用(1)可以使得设备与主存间的数据块传送无需CPU 干预。 (1)A. 程序控制输入输出 B. 中断 C. DMA D. 总线控制 ●若某计算机采用8位整数补码表示数据,则运算(2) 将产生溢出。 (2)A. -127+1 B. -127-1 C. 127+1 D. 127-1 ●若内存容量为4GB,字长为32,则(3) 。 (3)A. 地址总线和数据总线的宽度都为32 B. 地址总线的宽度为30,数据总线的宽度为32 C. 地址总线的宽度为30,数据总线的宽度为8 D. 地址总线的宽度为32,数据总线的宽度为8 (地址单元为0000H~3FFFH, 每个芯片的地址空间连续),则地址单元 0B1FH 所在芯●设用2K×4 位的存储器芯片组成16K×8 位的存储器 片的最小地址编号为 (4) 。 (4)A. 0000H B. 0800 H C. 2000 H D. 2800 H ●编写汇编语言程序时,下列寄存器中程序员可访问的是(5) 。 (5)A. 程序计数器(PC) B. 指令寄存器(IR) C. 存储器数据寄存器(MDR) D. 存储器地址寄存器(MAR) ●正常情况下,操作系统对保存有大量有用数据的硬盘进行(6) 操作时,不会清除有用数据。 (6)A. 磁盘分区和格式化 B.磁盘格式化和碎片整理 C.磁盘清理和碎片整理 D.磁盘分区和磁盘清理 ●如果使用大量的连接请求攻击计算机,使得所有可用的系统资源都被消耗殆尽,最终计算机无法再处理合法用户的请求,这种手段属于(7) 攻击。 (7)A. 拒绝服务 B. 口令入侵 C. 网络监听 D. IP 欺骗 ●ARP 攻击造成网络无法跨网段通信的原因是(8) 。 (8)A. 发送大量A RP 报文造成网络拥塞 B. 伪造网关A RP 报文使得数据包无法发送到网关 C. ARP 攻击破坏了网络的物理连通性 D. ARP 攻击破坏了网关设备 ●下列选项中,防范网络监听最有效的方法是(9) 。 (9)A. 安装防火墙 B. 采用无线网络传输 C. 数据加密 D. 漏洞扫描 ●软件商标权的权利人是指(10) 。 (10)A. 软件商标设计人 B. 软件商标制作人 C. 软件商标使用人 D. 软件注册商标所有人 ●利用(11) 可以对软件的技术信息、经营信息提供保护。 (11)A. 著作权 B. 专利权 C. 商业秘密权 D. 商标权 ●李某在某软件公司兼职,为完成该公司交给的工作,做出了一项涉及计算机程序的发明。李某认为该发明是自己利用业余时间完成的,可以个人名义申请专利。关于此项发明的专利申请权应归属(12) 。 (12)A. 李某 B. 李某所在单位 C. 李某兼职的软件公司 D. 李某和软件公司约定的一方 ●一幅彩色图像(RGB),分辨率为256×512,每一种颜色用8bit 表示,则该彩色图像的数据量为(13) bit。 (13)A. 256×512×8 B. 256×512×3×8 C. 256×512×3/8 D. 256×512×3 ●10000 张分辨率为1024×768 的真彩(32 位)图片刻录到D VD 光盘上,假设每张光盘可以存放4GB 的信息,则需要(14) 张光盘。 (14)A. 7 B. 8 C. 70 D. 71 ●某项目组拟开发一个大规模系统,且具备了相关领域及类似规模系统的开发经验。下列过程模型中, (15) 最适合开发此项目。 (15)A. 原型模型 B. 瀑布模型 C. V 模型 D. 螺旋模型 ●使用PERT 图进行进度安排,不能清晰地描述(16) ,但可以给出哪些任务完成后才能开始另一些任务。下面P ERT 图所示工程从A到K 的关键路径是(17) ,(图中省略了任务的开始和结束时刻)。

软件设计师考试大纲

软考专家谈软考(六) 文章来源:中国计算机技术职业资格网时间:2010-03-18 软件设计师备考分析 软件设计师近几年的考试形式与考核内容已经完全趋于稳定,从2007年至2009年的考试情况分析来看,考核形式与内容变化不大,作为考生应该紧紧扣住2009新大纲,有针对性、有策略地复习。 本文将总结近几年考试的内容分布,给出软件设计师上、下午题目的组成,以帮助考生复习。 1、软件设计师上午试题 分析近三年的考试情况,上午试题的知识点分布如表1所示。 表1近三年上午试题考核内容分布情况 鉴于软件设计师上下午考试的侧重点不同,考生在准备上午考试的时候,需要注意掌握知识面的宽度,由于上午试题出题形式的局限性,必然不会出现

较深的分析与设计类考题,因此考生应该在基本知识上多下工夫。 以数据结构为例,在多次考试中出现了考察考生对栈的理解,其内容无非是栈的操作以及栈的后进先出的特性,上午试题将很难考察栈的具体实现问题。同样,对于面向对象基础知识,更多的是考察面向对象分析、面向对象设计、类、对象、封装、继承、消息等基本概念;而算法则考察各种不同算法的时间和空间复杂度问题。 当然,考生在掌握基本概念的同时,也需要关注基本应用题型,例如很多基本知识结合一些实际的应用小例子,如设计模式、数据结构、程序语言等考核点就曾多次出现。笔者推荐考生参照官方推荐的教材进行复习,因为该教材基本涵盖了所有上午试题内容。 2.软件设计师下午试题 软件设计师下午的考核内容分布如表2所示。 表2近三年下午试题考核内容分布情况 近三年来的下午考题一直都是试题一到试题四是必答题目,试题五至试题七是选答题目,考核形式一直都没有发生变化,但笔者在观察2009年的考试时候出现了两个不同点,值得引起考生的注意: (1)算法与C语言的结合 算法早期的出题多是以伪代码或者流程图的形式出现,但2009年算法已经和C语言结合在一起出题,分析考试大纲,C语言应该是软件设计师必须掌握的内容之一,相信这也是2009新大纲出来后考试出题所作的调整,考生需要注意不仅要掌握算法的原理,还需要掌握算法的具体实现,尤其是使用C语言实现。另外,由于C语言与算法结合出现,意味着C语言本身是否还需要单独考

软考系统架构设计师考试试题举例

软考系统架构设计师考试试题举例 系统架构设计师是软考中的一门高级资格考试,其考试题型有哪些,下面小编就三种不同类型的选题分别举例,希望考生们对考试题型的了解能有一定的帮助。 一选择题 1.在TCP/IP协议分层结构中,SNMP是在(1)协议之上的(2)请求/响应协议。在ISO/OSI/RM基础上的公共管理信息服务/公共管理信息协议CMIS/CMIP是一个完整的网络管理协议族,网络管理应用进程使用OSI参考模型的(3)。 (1) (2)A.异步 B.同步 C.主从 D.面向连接 (3)A.网络层B.传输层C.表示层D.应用层 2.软件产品线主要由(4)和产品集合两部分组成。 (4)A.构件库 B.核心资源 C.体系结构 D.开发组织 二案例分析问答题 阅读以下关于软件体系结构方面的叙述,回答问题1和问题2。 某集团公司要开发一个网络财务程序,使各地员工能在互联网络上进行财务处理和报销。在设计该财务程序的体系结构时,项目组产生了分歧: (1)张工程师认为应该采用客户机/服务器(C/S)结构。各分公司财务部要安装一个软件客户端,通过这个客户端连接到总公司财务部主机。如果员工在外地出差,需要报销帐务的,也需要安装这个客户端才能进行。 (2)李工程师认为应该采用浏览器/服务器(BS)结构,各分公司及出差员工直接通过Windows操作系统自带的IE浏览器就可以连接到总公司的财务部主机。 经过项目组的激烈讨论,最终选用了C/S和B/S混合结构。 [问题1] 请用200字以内的文字简要讨论C/S结构与B/S结构的区别及各自的优点和缺点。 [问题2] 请用200字以内的文字说明如何设计C/S和B/S混合结构,这样设计有什么好处

2018年软件设计师考试真题及答案

2018上半年软件设计师考试真题及答案-下午卷 试题一(共 15 分) 阅读下列说明,将解答填入题纸的对应栏内。 【说明】 某医疗护理机构为老年人或有护理需求者提供专业护理,现欲开发一基于 web 的医疗管理系统,以改善医疗护理效,该系统的主要要功能如下: (1)通用信息查询,客广提交通用信息查询请求,意而通用信表表,返回查询结果 (2)医生聘用。医生提出成/职中申,交由去前行用事事,更新医生表,并给医生反 聘用解聘结果:聊除解聘医生的出诊发排 (3)预约处理。医生安排出诊时向间,存入医生出诊时间表,根据客户提交的预约查询请求,查在职医生及其出诊时间等约所需数据并返同问:创建预约,提交预约请求,在在预约表中新增预约记录,更新所约医生出诊时间并给医生发送约通知给客户反馈预约结果。 (4)药品管理。医生提交处方,根据药品名称从药品数据中查询相关药品库存信息开出药品,更新对应药品的库存以及预约表中的治疗信息;给医生发送“药品已开出”反馈。 (5)报表创建。根据主管提交的报表查询请求(报表类型和时间段),从预的数、通 用信息、药品库存数据、医生以及医生出诊时间中进行查询,生成报表返回给主管. 现采用结构化方法对医疗管理系统进行分析与设计,获得如图 1-1 所示的上下文数据流图和图 1-2 所示的 0 层数据流图。

【问题 1】(3 分) 使用说明中的词语,给出图 1-1 中的实体 E1~E3 的名称。 【问题 2】(5 分) 使用说明中的词语,给出图 1-2 中的数据存储 D1~D5 的名称。 【问题 3)(4 分) 使用说明和图中术语,补充图 1-2 中缺失的数据流及其起点和终点。 【问题 4】(3 分) 使用说明中的词语,说明“预约处理”可以分解为哪些子加工,并说明建模图 1-1和图 1-2 是如何保持数据流图平衡。

历年软考软件设计师真题分析

历年软考软件设计师真题分析 软件设计师近几年的考试形式与考核内容已经完全趋于稳定,从2007年至2009年的考试情况分析来看,考核形式与内容变化不大,作为考生应该紧紧扣住2009新大纲,有针对性、有策略地复习。 本文将总结近几年考试的内容分布,给出软件设计师上、下午题目的组成,以帮助考生复习。 1、软件设计师上午试题 分析近三年的考试情况,上午试题的知识点分布如表1所示。 表1 近三年上午试题考核内容分布情况 鉴于软件设计师上下午考试的侧重点不同,考生在准备上午考试的时候,需要注意掌握知识面的宽度,由于上午试题出题形式的局限性,必然不会出现较深的分析与设计类考题,因此考生应该在基本知识上多下工夫。 以数据结构为例,在多次考试中出现了考察考生对栈的理解,其内容无非是

栈的操作以及栈的后进先出的特性,上午试题将很难考察栈的具体实现问题。同样,对于面向对象基础知识,更多的是考察面向对象分析、面向对象设计、类、对象、封装、继承、消息等基本概念;而算法则考察各种不同算法的时间和空间复杂度问题。 当然,考生在掌握基本概念的同时,也需要关注基本应用题型,例如很多基本知识结合一些实际的应用小例子,如设计模式、数据结构、程序语言等考核点就曾多次出现。笔者推荐考生参照官方推荐的教材进行复习,因为该教材基本涵盖了所有上午试题内容。 2.软件设计师下午试题 软件设计师下午的考核内容分布如表2所示。 表2 近三年下午试题考核内容分布情况 近三年来的下午考题一直都是试题一到试题四是必答题目,试题五至试题七

是选答题目,考核形式一直都没有发生变化,但笔者在观察2009年的考试时候出现了两个不同点,值得引起考生的注意: (1)算法与C语言的结合 算法早期的出题多是以伪代码或者流程图的形式出现,但2009年算法已经和C语言结合在一起出题,分析考试大纲,C语言应该是软件设计师必须掌握的内容之一,相信这也是2009新大纲出来后考试出题所作的调整,考生需要注意不仅要掌握算法的原理,还需要掌握算法的具体实现,尤其是使用C语言实现。另外,由于C语言与算法结合出现,意味着C语言本身是否还需要单独考核的问题,这就需要考生注意本文谈到的第二个注意点。 (2)C语言考题顺序的调整 2009年的考试中,出现了将C语言调整到第七题,而将C++与Java调整为第五题和第六题,笔者认为,顺序的调整应该不是一个随机性的事情,调整的目的极有可能是为了突出C++与Java的重要性,可能是希望考生注意C++与Java题目。如本文第一点所述,因为C已经与算法结合进行了考核,在后续的考题中,C语言单独出题的可能性会有所降低。这样的话,考生就需要在Java 和C++考题上多下工夫,需要详细理解并掌握设计模式与Java或者C++语言的结合问题。 如需了解更多软件设计师考试资讯,请看希赛软考学院!

2018软考软件设计师大纲

注: 2018年上半年考试软件设计师大纲为2009年版新版大纲。参考资料为2016年版修编教材。 大约考试时间为5月26日。 考试说明 1.考试目标 通过本考试的合格人员能根据软件开发项目管理和软件工程的要求,按照系统总体设计规格说明书进行软件设计,编写程序设计规格说明书等相应的文档,组织和指导程序员编写、调试程序,并对软件进行优化和集成测试,开发出符合系统总体设计要求的高质量软件;具有工程师的实际工作能力和业务水平。2.考试要求 (1) 掌握计算机内的数据表示、算术和逻辑运算方法; (2) 掌握相关的应用数学及离散数学基础知识; (3) 掌握计算机体系结构以及各主要部件的性能和基本工作原理; (4) 掌握操作系统、程序设计语言的基础知识,了解编译程序的基本知识; (5) 熟练掌握常用数据结构和常用算法; (6) 熟悉数据库、网络和多媒体的基础知识; (7) 掌握C程序设计语言,以及C++、Java中的一种程序设计语言;

(8) 熟悉软件工程、软件过程改进和软件开发项目管理的基础知识; (9) 掌握软件设计的方法和技术; (10) 了解信息化、常用信息技术标准、安全性,以及有关法律、法规的基础知识; (11) 正确阅读和理解计算机领域的英文资料。 3.考试科目 (1) 计算机与软件工程知识,考试时间为150分钟,笔试,选择题;(75 * 1) (2) 软件设计,考试时间为150分钟,笔试,问答题。(15 * 5) 1.数据流图 2.数据库设计 3.UML分析与设计 4.C语言算法 5.C++程序设计|| Java程序设计 考试科目1:计算机与软件工程知识 1.计算机科学基础知识 1.1 数制及其转换 ·二进制、八进制、十进制和十六进制等常用数制及其相互转换 1.2 计算机内数据的表示 ·数的表示(补码表示,整数和实数的表示,精度和溢出)

相关主题
文本预览
相关文档 最新文档