线性表的设计与实现

线性表的设计与实现
线性表的设计与实现

┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊

目录

一、设计目的 (1)

二、程序流程 (2)

三、功能介绍 (3)

四、设计步骤 (4)

五、设计总结 (7)

六、参考文献 (8)

七、附录 (9)

┊┊

┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊一.设计目的

掌握数据结构的基础技术,学会分析研究计算机加工的数据结构的特性,以便为应用涉及的数据选择适当的逻辑结构、存储结构及其相应的算法,应用相关知识设计设散列表实现电话号码查找系统。

二.程序流程

┊┊

┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊三、功能介绍

1)设每个记录有下列数据项:电话号码、用户名、地址;

2)从键盘输入各记录,分别以电话号码和用户名为关键字建立散列表;

3)采用一定的方法解决冲突;

4)查找并显示给定电话号码的记录;

5)查找并显示给定用户名的记录。

本设计所采用的数据结构(如:链表、栈、树、图等)

核心数据结构用到的结构体要采用动态内存分配和存放记录的散列表.

功能模块详细设计

本程序功能模块根据程序设计的需求,综合程序的实用性、人性化、智能化的考虑,将程序划分为几个部分分别编写:

键盘输入各人的信息: void getin()

显示输入的用户信息: void ShowInformation()

除留余数法构造哈希函数: int Hash1()

构造把字符串转换成整型数哈希函数: int Hash2()

冲突处理函数: Status collision()

以姓名为关键字建表: void CreateHash1()

以姓名为关键字查表: void SearchHash1()

以电话号码为关键字建表: void CreateHash2()

以电话号码为关键字查表: void SearchHash2()

输出菜单函数: int main()

┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊四、设计步骤

1算法思想分析

要用散列表设计实现电话号码查询系统,对存入的联系人的名字电话以及地址进行存储,并在输入电话号码或姓名后得出此记录的所有信息,要求有菜单界面和清屏功能.首先,此程序,多次用到哈希函数,此处先用除留余数法对折叠后的数构造哈希函数,再用二次探测再散列法建立冲突处理函数解决冲突,再以电话号码和姓名为关键字建立散列表(若哈西地址冲突进行冲突处理),在此之前,必须先用一系列输出函数输出一个菜单.整个程序的设计思路到此结束。

2系统测试

1初始界面

图(1)

┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊

2:输入1添加用户信息,输入2读取

图(2)3:以姓名建立哈希表,再哈希表法解决冲突

:

图(3)

┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊4:以电话号码建立哈希表,再哈希表法解决冲突

图(4)

5:给定用户名查找记录

图(5)

┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊6:给定电话号码查找记录

图(6)

五、设计总结

1)通过这次数据结构的编程题目,使我对数据结构有了更深的了解,熟悉了

查找和排序在散列表程序设计中的应用。

2)对查找和排序的时间复杂度和空间复杂度有了进一步了解.从最初的不知

道从何入手到最后编写程序的完成,虽然耗费了我们一定的时间跟精力,

但同时我们也收获硕果累累,一方面使我对函数的运用有了更加深刻的了

解,对面向对象语言更深层次的掌握和应用。

3)在编程过程中,出现了许多的错误,但通过改正,反复思考,对程序的运

行方式有了进一步体会, 对数据结构设计程序有了进一步体会。

4)我更加懂得,对一个手足无措的程序,不要慌慢慢查阅慢慢体会,心静,努力

就有成果.天道酬勤.

┊┊

┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊六、参考文献

[1]《数据结构》(C语言版),严蔚敏,清华大学出版社,2005.

[2]《算法设计与分析》,王晓东主编,清华大学出版社,2005

[3]汪诗林等译,《数据结构、算法与应用》,(美)Sartaj Sahni著,机械工业出版社, 1999

[4]《数据结构与算法分析》,CLIFFORD A. SHAFFER著,张铭、刘晓丹译,电子工业出版社,1998

[5]谭浩强 .C程序设计[Z].北京:清华大学出版社,2001.

[6]薛万鹏.C语言程序设计教程[Z].北京:机械工业出版社,2000.

[7]鲁岩.实用C语言及其程序设计[Z].大连:大连理工大学出版社,1993. [8]袁征.C语言编程序技巧程序集[Z].北京:电子工业出版社,1993.

┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊七、附录

程序设计代码

#include

#include

#include

#include

#define MAXSIZE 20 //电话薄记录数量

#define MAX_SIZE 20 //人名的最大长度

#define HASHSIZE 53 //定义表长

#define SUCCESS 1

#define UNSUCCESS -1

#define LEN sizeof(HashTable)

typedef int Status;

typedef char NA[MAX_SIZE];

typedef struct{//记录

NA name;

NA tel;

NA add;

}Record;

typedef struct{//哈希表

Record *elem[HASHSIZE]; //数据元素存储基址

int count; //当前数据元素个数

int size; //当前容量

}HashTable;

Status eq(NA x,NA y){//关键字比较,相等返回SUCCESS;否则返回UNSUCCESS if(strcmp(x,y)==0)

return SUCCESS;

else return UNSUCCESS;

}

Status NUM_BER; //记录的个数

┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊void getin(Record* a){//键盘输入各人的信息

printf("输入要添加的个数:\n");

scanf("%d",&NUM_BER);

int i;

for(i=0;i

printf("请输入第%d个记录的用户名:\n",i+1);

scanf("%s",a[i].name);

printf("请输入%d个记录的电话号码:\n",i+1);

scanf("%s",a[i].tel);

printf("请输入第%d个记录的地址:\n",i+1);

scanf("%s",a[i].add); //gets(str2);??????

}

}

void ShowInformation(Record* a)//显示输入的用户信息

{

int i;

for( i=0;i

printf("\n第%d个用户信息:\n 姓名:%s\n 电话号码:%s\n 联系地址:%s\n",i+1,a[i].name,a[i].tel,a[i].add);

}

void Cls(Record* a){

printf("*");

system("cls");

}

long fold(NA s){//人名的折叠处理

char *p;

long sum=0;

NA ss;

strcpy(ss,s);//复制字符串,不改变原字符串的大小写

strupr(ss);//将字符串ss转换为大写形式

p=ss;

while(*p!='\0')

sum+=*p++;

printf("\nsum====================%d",sum);

return sum;

}

┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊int Hash1(NA str){//哈希函数

long n;

int m;

n=fold(str);//先将用户名进行折叠处理

m=n%HASHSIZE; //折叠处理后的数,用除留余数法构造哈希函数

return m; //并返回模值

}

int Hash2(NA str){//哈希函数

long n;

int m;

n = atoi(str);//把字符串转换成整型数.

m=n%HASHSIZE; //用除留余数法构造哈希函数

return m; //并返回模值

}

Status collision(int p,int &c){//冲突处理函数,采用二次探测再散列法解决冲突 int i,q;

i=c/2+1;

while(i

if(c%2==0){

c++;

q=(p+i*i)%HASHSIZE;

if(q>=0) return q;

else i=c/2+1;

}

else{

q=(p-i*i)%HASHSIZE;

c++;

if(q>=0) return q;

else i=c/2+1;

}

}

return UNSUCCESS;

}

void benGetTime();

┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊void CreateHash1(HashTable* H,Record* a){//建表,以人的姓名为关键字,建立相应的散列表

//若哈希地址冲突,进行冲突处理

benGetTime();

int i,p=-1,c,pp;

for(i=0;i

c=0;

p=Hash1(a[i].name);

pp=p;

while(H->elem[pp]!=NULL) {

pp=collision(p,c);

if(pp<0){

printf("第%d记录无法解决冲突",i+1);//需要显示冲突次数时输出

continue;

}//无法解决冲突,跳入下一循环

}

H->elem[pp]=&(a[i]); //求得哈希地址,将信息存入

H->count++;

printf("第%d个记录冲突次数为%d。\n",i+1,c);//需要显示冲突次数时输出

}

printf("\n建表完成!\n此哈希表容量为%d,当前表内存储的记录个数为%d.\n",HASHSIZE,H->count);

benGetTime();

}

void SearchHash1(HashTable* H,int &c){//在通讯录里查找姓名关键字,若查找成功,显示信息

//c用来记录冲突次数,查找成功时显示冲突次数 benGetTime();

NA str;

printf("\n请输入要查找记录的姓名:\n");

scanf("%s",str);

int p,pp;

p=Hash1(str);

pp=p;

while((H->elem[pp]!=NULL)&&(eq(str,H->elem[pp]->name)==-1))

pp=collision(p,c);

if(H->elem[pp]!=NULL&&eq(str,H->elem[pp]->name)==1){

printf("\n查找成功!\n查找过程冲突次数为%d.以下是您需要要查找的信息:\n\n",c);

printf("姓名:%s\n电话号码:%s\n联系地址:%s\n",H->elem[pp]->name,H->elem[pp]->tel,H->elem[pp]->add);

┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊ }

else printf("\n此人不存在,查找不成功!\n");

benGetTime();

}

void benGetTime(){

SYSTEMTIME sys;

GetLocalTime( &sys );

printf( "%4d/%02d/%02d %02d:%02d:%02d.%03d \n",sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute, sys.wSecond,sys.wMilliseconds);

}

void CreateHash2(HashTable* H,Record* a){//建表,以电话号码为关键字,建立相应的散列表

//若哈希地址冲突,进行冲突处理

benGetTime();

int i,p=-1,c,pp;

for(i=0;i

c=0;

p=Hash2(a[i].tel);

pp=p;

while(H->elem[pp]!=NULL) {

pp=collision(p,c);

if(pp<0){

printf("第%d记录无法解决冲突",i+1);//需要显示冲突次数时输出

continue;

}//无法解决冲突,跳入下一循环

}

H->elem[pp]=&(a[i]); //求得哈希地址,将信息存入

H->count++;

printf("第%d个记录冲突次数为%d。\n",i+1,c);//需要显示冲突次数时输出

}

printf("\n建表完成!\n此哈希表容量为%d,当前表内存储的记录个数为%d.\n",HASHSIZE,H->count);

benGetTime();

}

void SearchHash2(HashTable* H,int &c){//在通讯录里查找电话号码关键字,若查找成功,显示信息 //c用来记录冲突次数,查找成功时显示冲突次数 benGetTime();

┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊ NA tele;

printf("\n请输入要查找记录的电话号码:\n");

scanf("%s",tele);

int p,pp;

p=Hash2(tele);

pp=p;

while((H->elem[pp]!=NULL)&&(eq(tele,H->elem[pp]->tel)==-1))

pp=collision(p,c);

if(H->elem[pp]!=NULL&&eq(tele,H->elem[pp]->tel)==1){

printf("\n查找成功!\n查找过程冲突次数为%d.以下是您需要要查找的信息:\n\n",c);

printf("姓名:%s\n电话号码:%s\n联系地址:%s\n",H->elem[pp]->name,H->elem[pp]->tel,H->elem[pp]->add);

}

else printf("\n此人不存在,查找不成功!\n");

benGetTime();

}

void Save(){

FILE *fp;

if((fp=fopen("c:\test.txt", "w"))==NULL){

printf("\nERROR opening customet file");

}

fclose(fp);

}

int main(int argc, char* argv[]){

int c,flag=1;

HashTable *H;

H=(HashTable*)malloc(LEN);

for(int i=0;i

H->elem[i]=NULL;

H->size=HASHSIZE;

H->count=0;

Record a[MAXSIZE];

while (1){

printf("\n ┏━━━━━━━━━━━━━┓ ");

printf("\n ┃电话号码查找系统┃ ");

printf("\n ★★★★★≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡★★★★★★");

printf("\n ‖〓哈希表的设计与实现〓‖");

printf("\n ‖≮1≯. 添加用户信息‖");

printf("\n ‖≮2≯. 读取所有用户信息‖");

┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊ printf("\n ‖≮3≯. 以姓名建立哈希表(再哈希法解决冲突) ‖");

printf("\n ‖≮4≯. 以电话号码建立哈希表(再哈希法解决冲突) ‖");

printf("\n ‖≮5≯. 查找并显示给定用户名的记录‖");

printf("\n ‖≮6≯. 查找并显示给定电话号码的记录‖");

printf("\n ‖≮7≯. 清屏‖");

printf("\n ‖≮8≯. 保存‖"); printf("\n ‖≮9≯. 退出程序‖"); printf("\n ‖温馨提示:‖"); printf("\n ‖Ⅰ.进行5操作前请先输出3 ‖"); printf("\n ‖Ⅱ.进行6操作前请先输出4 ‖"); printf("\n ★★★★★≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡★★★★★★");

printf("\n");

printf("请输入一个任务选项>>>");

printf("\n");

int num;

scanf("%d",&num);

switch(num){

case 1:

getin(a);

break;

case 2:

ShowInformation(a);

break;

case 3:

CreateHash1(H,a); /* 以姓名建立哈希表 */

break;

case 4:

CreateHash2(H,a); /* 以电话号码建立哈希表 */

break;

case 5:

c=0;

SearchHash1(H,c);

break;

case 6:

c=0;

SearchHash2(H,c);

break;

case 7:

Cls(a);

break;

┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊ case 8:

Save();

break;

case 9:

return 0;

break;

default:

printf("你输错了,请重新输入!"); printf("\n");

}

}

system("pause");

return 0;

}

基于神经网络的非线性自适应控制研究毕业设计论文

摘要 神经网络自适应控制是基于自适应的基本原理,利用神经网络的特点设计而成的。它发挥了自适应与神经网络的各自长处,为非线性控制的研究提供了一种新方法。 本文基于Lyapunov稳定性理论,采用神经网络直接自适应控制的思想设计控制器,研究了一类带干扰的不确定非线性系统的控制问题。控制器主要是针对不确定非线性系统中存在的两类未知项——未知函数和未知外界干扰而设计,其中未知函数利用径向基函数神经网络来近似,外界干扰利用非线性阻尼项来抑制,这样可以充分利用神经网络的逼近特性,克服复杂系统难以建模等困难,并且系统稳定性和收敛性在给出的假设的条件下均能得到保证。最后设计程序进行仿真验证,在程序设计中,以高斯函数作为基函数,仿真结果表明在权值和控制的有界性方面取得了一定的效果。 本文第一章到第三章详细介绍了人工神经网络及神经网络控制的发展和研究现状;第四章主要介绍了径向基函数神经网络,并对其逼近能力进行仿真; 在结束语中展望了神经网络控制的发展前景,提出以后的研究方向。 关键词:RBF神经网络,自适应控制,不确定非线性系统 Abstract Neural network adaptive control is proposed combining adaptive control's advantages with neural network's characters and provides a new method for nonlinear control. Based on Lyapunov stability theorem and neural network direct adaptive control idea the control problem of a class of uncertain nonlinear system with disturbance is researched. The controller is designed arming at two kinds of uncertainties existing in nonlinear system--the unknown functions and the uncertain disturbance. In controller. the radial basis function neural network is used as approximation model for the unknown functions. and nonlinear damping term is used to counteract the disturbances. so neural network's better approximation capabilities can be utilized richly and the modeling difficulties can be avoided. Meanwhile. the controlled system's stability and convergence can be guaranteed under some assumptions. At last the program is designed to verify the effectiveness of the controller. In presented programs. Guassian function is used as basis function. Simulation results show that

哈希表的设计与实现 课程设计报告

一: 需求分析 (2) 三: 详细设计(含代码分析) (4) 1.程序描述: (4) 2具体步骤 (4) 四调试分析和测试结果 (7) 五,总结 (9) 六.参考文献; (10) 七.致谢 (10) 八.附录 (11)

一: 需求分析 问题描述:设计哈希表实现电话号码查询系统。 基本要求 1、设每个记录有下列数据项:电话号码、用户名、地址 2、从键盘输入各记录,分别以电话号码和用户名为关键字建立哈希表; 3、采用再哈希法解决冲突; 4、查找并显示给定电话号码的记录; 5、查找并显示给定用户名的记录。 6、在哈希函数确定的前提下,尝试各种不同类型处理冲突的方法(至少 两种),考察平均查找长度的变化。 二: 概要设计 进入主函数,用户输入1或者2,进入分支选择结构:选1:以链式方法建立哈希表,选2:以再哈希的方法建立哈希表,然后用户输入用户信息,分别以上述确定的方法分别以用户名为检索以及以以电话号码为检索将用户信息添加到哈希表,.当添加一定量的用户信息后,用户接着输入用户名或者电话号码分别以用户名或者电话号码的方式从以用户名或电话号码为检索的哈希表查找用户信息.程序用链表的方式存储信息以及构造哈希表。 具体流程图如下所示:

三: 详细设计(含代码分析) 1.程序描述: 本程序以要求使用哈希表为工具快速快速查询学生信息,学生信息包括电话号码、用户名、地址;用结构体存储 struct node { string phone; //电话号码 string name; //姓名 string address;//地址 node *next; //链接下一个地址的指针 }; 2具体步骤 1. 要求主要用在哈希法解决冲突,并且至少尝试用两种方法解决冲突,定义两个指针数组存储信息node *infor_phone[MAX]; node *infor_name[MAX];前者以电话号码为关键字检索哈希表中的信息,后者以姓名为关键字检索哈希表中的信息 用链式法和再哈希法解决冲突: int hash(string key) //以姓名或者电话号码的前四位运算结果作为哈{ //希码 int result=1,cur=0,i; if(key.size()<=4) i=key.size()-1; else i=4; for(;i>=0;i--) { cur=key[i]-'0'; result=result*9+cur; } result%=(MOD); return result;

计算机模拟控制系统 建模设计

1绪论 1.1计算机控制系统 计算机控制系统是在自动化控制技术和计算机技术的飞速发展的基础上产生的,20世纪50年代中期,经典控制理论已经发展成熟,并在不少工程技术领域得到了成功的应用。随着复杂系统的设计和复杂控制规律的实现上很难满足更高的要求。现代控制理论的发展为自动控制系统的分析、设计与综合增添了理论基础,而计算机技术的发展为新型控制方法的实现提供了非常有效的手段,两者的结合极大的推动了自动控制技术的发展。进而计算机控制系统广泛的应用于工厂生产,逐渐融入于生产中,各类大型工厂均离不开计算机控制系统。 1.1.1系统的分类 按系统性能分:线性系统和非线性系统;连续系统和离散系统;定常系统和时变系统;确定系统和不确定系统。 1、线性连续系统:用线性微分方程式来描述,如果微分方程的系数为常数,则为定常系统;如果系数随时间而变化,则为时变系统。今后我们所讨论的系统主要以线性定常连续系统为主。 2、线性定常离散系统:离散系统指系统的某处或多处的信号为脉冲序列或数码形式。这类系统用差分方程来描述。 3、非线性系统:系统中有一个元部件的输入输出特性为非线性的系统。 1.1.2系统的数学模型 在线性系统理论中,一般常用的数学模型形式有:传递函数模型(系统的外部模型)、状态方程模型(系统的内部模型)、零极点增益模型和部分分式模型等。这些模型之间都有着内在的联系,可以相互进行转换。 1.2计算机模拟控制系统 模拟控制系统由给定输入、模糊控制器、控制对象、检测变送装置、反馈信号与给定输入的相加环节等组成。模拟控制系统的各处均为连续信号,在模拟系统中,给定值与反馈值经过比较器比较产生偏差,控制器对偏差进行调节计算,产生控制信号驱动执行机构,从而被控参数的值达到预期值。其典型结构如下图所示:

数据结构课程设计哈希表设计问题复习过程

数据结构课程设计哈希表设计问题

目录 1 前言 (1) 2 需求分析 (1) 2.1 任务和要求 (1) 2.2 运行环境 (1) 2.3 开发工具 (1) 3 分析和设计 (2) 3.1 系统分析及设计思路 (2) 3.2 主要数据结构及算法 (2) 3.3 函数流程图 (2) (1)哈希表的创建及初始化流程图 (2) 5 课程设计总结 (13) 5.1 程序运行结果或预期运行结果 (13) 说明:输入的数为30个姓的拼音,查找的为“pan”,输出的如上图所示。 (14) 5.2 设计结论 (15) 参考文献 (15) 致谢 (15)

1 前言 从C语言产生到现在,它已经成为最重要和最流行的编程语言之一。在各种流行编程语言中,都能看到C语言的影子,如Java的语法与C语言基本相同。学习、掌握C语言是每一个计算机技术人员的基本功之一。 根据本次课程设计的要求,我设计小组将编写一个C语言程序来处理哈希表问题,通过这个程序,将针对自己的班集体中的“人名”设计一个哈希表,使得平均查找长度不超过R,完成相应的建表和查表程序。 2 需求分析 2.1 任务和要求 针对自己的班集体中的“人名”设计一个哈希表,使得平均查找长度不超过R,完成相应的建表和查表程序。 要求:假设人名为中国姓名的汉语拼音形式。待填入哈希表的人名共有30个,取平均查找长度的上限为2。哈希函数用除留余数法构造,用链表法处理冲突。 2.2 运行环境 (1)WINDOWS2000/XP系统 (2)Visual C++ 6.0编译环境或TC编译环境 2.3 开发工具 C语言

3 分析和设计 3.1 系统分析及设计思路 (1)创建哈希表 (2)姓名(结构体数组)初始化 (1)用除留余数法构建哈希函数 (2)用链表法处理冲突 (3)查找哈希表 在哈希表中进行查找,输出查找的结果和关键字,并计算和输出查找成功的平均查找长度 (4) 显示哈希表 显示哈希表的的格式: 3.2 主要数据结构及算法 定义结构体typedef struct hashtable创建哈希表 定义函数Hash_Init(HashTable ht)来对哈希表初始化 定义函数Hash_Insert(HashTable ht, Node *node)来为哈希表分配地址 定义函数Hash_Init(ht)输入30个名字 定义函数Hash_Create(HashTable ht)来求哈希表长度 定义函数hash_output(HashTable h)来输出哈希表 定义函数Hash_Link()构造链表函数 定义函数int hash_search(int h[],int key)查找输入的名字 3.3 函数流程图 (1)哈希表的创建及初始化流程图

哈希表查询设计及实现

/* (1)设计哈希表,该表应能够容纳50个英文单词。 (2)对该哈希表进行查询,实现对特定单词的快速查询,并显示经过的节点内容 已经发到你邮箱里了enochwills@https://www.360docs.net/doc/9311558514.html, */ #include #include #include #include #include #define szNAME 80 #define HASH_ROOT 47 /*用于计算哈希地址的随机数*/ #define szHASH 50 /*哈希表总长度*/ #define POPULATION 30 /*学生总数*/ /*哈希表结构体*/ struct THash { int key; /*钥匙码*/ char name[10]; /*姓名*/ int depth; /*检索深度*/ }; /*根据钥匙码和哈希根计算哈希地址*/ int GetHashAddress(int key, int root) { return key % root; }/*end GetHashAddress*/ /*冲突地址计算,如果发现地址冲突,则用当前地址和钥匙码、哈希根重新生成一个新地址*/ int GetConflictAddress(int key, int address, int root) { int addr = address + key % 5 + 1; return addr % root; }/*end GetConflictAddress*/ /*根据字符串生成哈希钥匙码,这里的方法是将串内所有字符以数值形式求累加和*/ int CreateKey(char * name) { int key = 0; unsigned char * n = (unsigned char *)name; while(*n) key += *n++; return key; }/*end CreateKey*/ /*输入一个名字,并返回哈希钥匙码*/ int GetName(char * name) { scanf("%s", name); return CreateKey(name); }/*end CreateKey*/ /*根据学生人数、长度和哈希根构造哈希表*/ struct THash * CreateNames(int size, int root, int population) { int i =0, key = 0, addr = 0, depth = 0; char name[10]; struct THash * h = 0, *hash = 0; /*哈希根和长度不能太小*/ if(size < root || root < 2) return 0; /*根据哈希表长度构造一个空的哈希表*/ hash = (struct THash *)malloc(sizeof(struct THash) * size); /*将整个表清空*/ memset(hash, 0, sizeof(struct THash) * size); for(i = 0; i < population; i++) { /*首先产生一个随机的学生姓名,并根据姓名计算哈希钥匙码,再根据钥匙码计算地址*/ key = GetName(name); addr = GetHashAddress(key, root); h = hash + addr; if (h->depth == 0) { /*如果当前哈希地址没有被占用,则存入数据*/ h->key = key; strcpy(h->name , name); h->depth ++; continue; }/*end if*/ /*如果哈希地址已经被占用了,就是说有冲突,则寻找一个新地址,直到没有被占用*/ depth = 0; while(h->depth ) { addr = GetConflictAddress(key, addr, root); h = hash + addr; depth ++; }/*end while*/ /*按照新地址存放数据,同时记录检索深度*/ h->key = key; strcpy(h->name , name); h->depth = depth + 1; }/*next*/ return hash; }/*end CreateNames*/ /*在哈希表中以特定哈希根查找一个学生的记录*/ struct THash * Lookup(struct THash * hash, char * name, int root) { int key = 0, addr = 0; struct THash * h = 0; /*不接受空表和空名称*/ if(!name || !hash) return 0; key = CreateKey(name); addr = GetHashAddress(key, root); h = hash + addr; /*如果结果不正确表示按照冲突规则继续寻找*/ while(strcmp(h->name , name)) { addr = GetConflictAddress(key, addr, root); h = hash + addr; if(h->key == 0) return 0; }/*end while*/ return hash + addr; }/*end Lookup*/ /*根据一条哈希表记录打印该记录的学生信息*/ void Print(struct THash * record) { if (!record) { printf("【查无此人】\n"); return ; }/*end if*/ if(record->depth) printf("【钥匙码】%04d\t【姓名】%s\t【检索深度】%d\n", record->key, record->name, record->depth ); else printf("【空记录】\n"); /*end if*/ }/*end Print*/ /*打印学生花名册*/ void Display(struct THash * hash, int size) { struct THash * h = 0; if (!hash || size < 1) return ; printf("学生花名册:\n"); printf("--------------------\n"); for(h = hash; h < hash + size; h++) { printf("【地址】%d\t", h - hash); Print(h); }/*next*/ printf("--------------------\n"); }/*end Display*/ /*主函数,程序入口*/ int main(void) { /*哈希表变量声明*/ struct THash * hash = 0, * h = 0; int cmd = 0; /*命令*/ char name[10]; /*学生姓名*/ /*生成30个学生用的哈希表*/ hash =

弹簧 质量 阻尼系统的建模与控制系统设计

分数: ___________ 任课教师签字:___________ 华北电力大学研究生结课作业 学年学期:第一学年第一学期 课程名称:线性系统理论 学生姓名: 学号:

提交时间:目录

弹簧-质量-阻尼系统的建模与控制系统设计 1 研究背景及意义 弹簧、阻尼器、质量块是组成机械系统的理想元件。由它们组成的弹簧-质量-阻尼系统是最常见的机械振动系统,在生活中具有相当广泛的用途,缓冲器就是其中的一种。缓冲装置是吸收和耗散过程产生能量的主要部件,其吸收耗散能量的能力大小直接关系到系统的安全与稳定。缓冲器在生活中处处可见,例如我们的汽车减震装置和用来消耗碰撞能量的缓冲器,其缓冲系统的性能直接影响着汽车的稳定与驾驶员安全;另外,天宫一号在太空实现交会对接时缓冲系统的稳定与否直接影响着交会对接的成功。因此,对弹簧-质量-阻尼系统的研究有着非常深的现实意义。 2 弹簧-质量-阻尼模型 数学模型是定量地描述系统的动态特性,揭示系统的结构、参数与动态特性之间关系的数学表达式。其中,微分方程是基本的数学模型,不论是机械的、液压的、电气的或热力学的系统等都可以用微分方程来描述。微分方程的解就是系统在输入作用下的输出响应。所以,建立数学模型是研究系统、预测其动态响应的前提。通常情况下,列写机械振动系统的微分方程都是应用力学中的牛顿定律、质量守恒定律等。 弹簧-质量-阻尼系统是最常见的机械振动系统。机械系统如图所示,

图2-1弹簧-质量-阻尼系统机械结构简图 其中、表示小车的质量,表示缓冲器的粘滞摩擦系数,表示弹簧的弹性系数,表示小车所受的外力,是系统的输入即,表示小车的位移,是系统的输出,即,i=1,2。设缓冲器的摩擦力与活塞的速度成正比,其中,, ,,,。系统的建立 由图,根据牛顿第二定律,分别分析两个小车的受力情况,建立系统的动力学模型如下: 对有: 对有:

符号表简介

符号表简介 符号表的作用:连接声明与引用的桥梁,记住每个符号的相关信息,如作用域和绑定等,帮助编译的各个阶段正确有效地工作。 对符号表设计的基本要求:目标是合理存放信息和快速准确查找。 1.正确存储各类信息。 2.适应不同阶段的需求; 3.便于有效地进行查找、插入、删除和修改等操作; 4.空间可以动态扩充; 4.3.1 符号表条目 每个声明的名字在符号表中占据一栏,称为条目,用于存放名字的相关信息。 符号表中的内容:保留字、标识符、特殊符号(包括算符、分隔符等)等等。不同类别的符号存放在不同的子表中,如变量名表、过程名表、保留字表等。 存放方式:关键字+属性。 例:下述符号的关键字应是,名字+类型,称为组合关键字: int x; struct x { float y, z; }; 为C构造的符号表中,组合关键字至少应该包括三项:名字+作用域+类型。 当一个名字x在同一作用域中允许有多于一个的声明,则对x的引用时需要根据上下文确定x到底属于哪个对象。因此有些程序设计语言在语法上规定了不允许这样的声明,以简化编译时的处理。 4.3.2构成名字的字符串的存储 定长数据与变长数据,直接存放与间接存放。 名字(直接存储)名字(间接存储)属性 sort 101 proc, ... a 106 int, ... readarray 108 proc, ... 118 boolean, ... draw_a_red_line_for_o bject_a sort#a#readarray#draw_a_red_line_for_object_a # ↑100

间接存储的方法实际上解决了复杂信息的存储问题,将其推广到属性,则任何一个复杂的属性,均可以为其另辟空间(空间本身可以是复杂结构,如数组的内情向量等),而仅需要将指向此空间的指针放在此属性在符号表中的对应位置即可。 4.3.3 名字的作用域 程序设计语言的名字可以出现在不同的范围内,并且可以具有不同的意义。 两种划分范围的方式:并列的和嵌套的。 不同的语言采用不同的方式:如Pascal的过程定义可以是嵌套的,而C的过程定义是并列的,但是C允许程序块是嵌套的。 名字的作用域:名字在哪个范围内起作用。并列的两个范围内的名字作用域互不相干,但是分别在嵌套的两个范围内的名字,其作用域的问题就需要制定规则来限定,以使得任何一个名字在任何范围内涵义都是无二义的。 名字的作用域规则:规定一个名字在什么样的范围内应该表示什么意义。 <1> 静态作用域原则(static-scope rule):编译时就可以确定名字的作用域,也可以说,仅 从静态读程序就可确定名字的作用域。 <2> 最近嵌套原则(most closely nested):以程序块为例,也适用于过程。 ①程序块B中声明的作用域包括B; ②如果名字x不在B中声明,那么B中x的出现是在外围程序块B'的x声明的作用域中, 使得 (a) B'有x的声明,并且 (b) B'比其它任何含x声明的程序块更接近被嵌套的B。 ## 通俗地讲,名字的声明在离其最近的内层起作用,即在名字引用处从内向外看,它处在所遇到的第一个该名字声明的作用域。 4.3.4 线性表 为了正确反映名字的作用域,线性表应具有栈的性质,即符号的加入和删除,均在线性表的一端进行。 表4.2 线性表的符号表组织

RC有源带通滤波器设计与仿真

RC 有源带通滤波器设计与仿真 摘要:简要介绍Pspice10.5的特点以及其实现有源滤波器仿真的基本方法,实现了带通滤波器设计,用仿真软件Pspice 对设计结果进行了仿真。 关键词:有源模拟滤波器;Pspice;仿真;设计 引言 随着数字化进程的不断推进,数字滤波器越来越广泛的应用在各个领域之中。但是模拟滤波器凭借自身的优势仍然有很高的研究价值。所有数字系统的前端,一般需要一个对微弱信号预处理的部分;在抽样量化之前,还需要一个对信号最高频率进行限制的处理。这些都只能使用模拟滤波器。RC 有源滤波器是模拟滤波器中最实用、应用范围最广泛的滤波器。其标准化电路的种类很少,仅使用及R 、C 元件,因此非常便于集成,这给推广应用带来革命性影响。因为不使用电感、特别是大型电感,也因为运放在性能的飞速提高的同时价格却一降再降,所以在成本方面有源滤波器已经变得比无源滤波器还有优势。本文基于这一点简单介绍了RC 有源滤波器的结构,以基于实现带通波器设计为例,完成了其设计过程,并利用电子仿真软件Pspice 进行了仿真。 1、OrCAD/Pspice10.5简介 对于仿真技术而言,目前最流行的是以美国伯克利分校开发的Spice 为核心的仿真软件,而以Spice 为核心开发的最好的仿真软件是OrCAD/Pspice10.5。它之所以流行就是因为他能很好地运行在PC 平台上且能很好地进行模拟数字混合信号的仿真,而且能解决很多设计上的实际问题。OrCAD10.5在以前版本的基础上扩展了许多功能,包括供设计输入的OrCADCaptureR ,供类比与混合讯号模拟用的PspiceRA/DBasics ,供电路板设计的 OrCADLayoutR 以及供高密度电路板自动绕线的SPECCTRAR 4U 。新加入的SPECCTRA ,用以支援设计日益复杂的各种高速、高密度印刷电路板设计。 OrCAD/PSpice 10.5软件的功能特点有: (1)对模拟电路不仅可进行直流、交流、瞬态等基本电路特性分析,而且可进行参数扫描分析和统计分析。 (2)以OrCAD/Capture 作为前端,除了以利用Capture 的电路图输入这一基本功能外,还可以实现OrCAD 中设计项目统一管理。 (3)将电路模拟结果和波形显示分析两个模块集成在一起。Probe 只是其中的一个窗口,在屏幕上可同时显示波形和输出文本等内容,Probe 还具有电路性能分析功能。 (4)使用PSpice 优化器能调整电路,在一定的约束条件下,对电路的某些参数进行调整,直到电路的性能达到要求为止。 2、RC 有源滤波器的设计 根据线性系统理论,n 阶滤波器的传递函数的一般形式为 11 10 111)()()(a s a s a s b s b s b s b s U s U s A n n n m m m m i o ++++++++==---- (1) (1)式中,m ≤n ;一个复杂的传递函数可以分解成几个简单的传递函数的乘积。上式中, 若n 为偶数,可分解为n/2个二阶滤波器的级联;而若n 为奇数,则可分解成一个一阶滤波器和(n-1)/2个二阶滤波器的级联。一阶、二阶滤波器是构成高阶滤波器的基本单元,二阶 滤波器单元传递函数可以写为:0 120 122)(a s a s b s b s b s A ++++=,其中分子系数0b 、1b 、2b 决定了 传递函数的零点位置,即决定滤波器类型(低通、高通、带通、带阻),分母系数1a 、0a 决

1符号表的设计与实现

符号表的设计与实现 1.实验目的 了解符号表的作用、组织和数据结构,设计和实现一个符号表。 2.实验要求 a)合理有效地设计符号表可存储程序语言中的各种标识符(变量、常量、 数组、结构、指针、函数和过程)及其属性和作用域信息 b)列出关键算法的具体实现的思路 3.实验原理及内容 (1)符号表的作用 符号表用于登录名字(标识符)、相应对象的种类(常量、变量、数组、结构、文件、标号、指针、函数与过程等)、属性(整型、实型、字符型、布尔型与枚举型等)和作用域信息。 由于在编译的各个阶段都要对符号表进行频繁操作(查表和填表),在整个编译时间中占了较大比例,因此如何有效合理地组织符号表并选择好的填表和查表方式,对于提高编译器的工作效率有很大影响。 (2)符号表的组织 源程序中的每个标识符在符号表中都有1个条目,一般由两部分组成:名字栏和信息栏。 如果一个语言对标识符的最大长度有限制,可设计名字栏的域大小为最大长度来容纳整个标识符;若该语言对标识符最大长度无限制或最大长度较大(如:32),为节省存储空间,可另用一个字符数组存储标识符,在名字栏域中存储其起始地址和长度(字符个数)。 源程序中的标识符种类繁多,不同种类的标识符所需要存储的信息不同。如:变量需存储其类型、存储地址等,数组应存储其数组维数m、数组元素类型T、各维元素个数d i、起始地址base等,指针应存储其指向对象类型的位置,函数应存储其参数及类型、返回值类型等…… 源程序中的说明将标识符与具有某种类型属性的数据对象相关联。同一个标识符在不同程序位置被说明时代表不同的数据对象。当出现对一个标识符的引用时,需根据作用域规则查符号表获取正确的符号表条目。C语言采用静态作用域规则,按最近

数据结构课设-通讯录系统的设计与实现——哈希表

课程设计(论文)任务书 软件学院学院软件工程专业班 一、课程设计(论文)题目:通讯录管理系统的设计与实现——哈希表 二、课程设计(论文)工作自2016 年 1 月 4 日起至 2016 年 1 月 10 日止 三、课程设计(论文) 地点: 软件测试中心(北区测试二室) 四、课程设计(论文)内容要求: 1.本课程设计的目的 ⑴训练学生灵活应用所学数据结构知识,独立完成问题分析,结合课程的理论知识,编写程序求解指定问题; ⑵初步掌握软件开发过程的问题分析、系统设计、编码、测试等基本方法和技能; ⑶提高综合运用所学的理论知识和方法独立分析和解决问题的能力,巩固、深化学生的理论知识,提升编程水平。 2.课程设计的任务及要求 1)基本要求: ⑴要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象数据类型、编写上机程序和上机调试等若干步骤完成题目,最终写出完整的报告; ⑵在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率; ⑶程序设计语言推荐使用C/C++,程序书写规范,源程序需加必要的注释; ⑷每位同学需提交可独立运行的程序和规范的课程设计报告。 2)课程设计论文编写要求 ⑴理论设计部分以课程设计论文的形式提交,格式必须按照课程设计论文标准格式进行书写和装订; ⑵课程设计报告包括中文目录、设计任务、需求分析、概要设计、详细设计、编码实现、调试分析、课设总结、谢辞、参考文献、附录等; ⑶设计部分应包含系统功能模块图,调试分析应包括运行截图等。 3)课程设计评分标准: ⑴学习态度:10分; ⑵系统设计:20分; ⑶编程调试:20分; ⑷回答问题:20分; ⑸论文撰写:30分。

大学matlab课程设计图像的傅里叶变换及其应用

课程名称: MATLAB及在电子信息课程中的应用实验名称:图像的傅里叶变换及其应用 设计四图像的傅里叶变换及其应用

一、设计目的 通过该设计,掌握傅里叶变换的定义及含义。 二、设计内容及主要的MATLAB 函数 1、图像的离散傅里叶变换 假设),(n m f 是一个离散空间中的二维函数,则该函数的二维傅里叶变换定义为 n j m j e e n m f f 21),()2,1(ωωωω--∞∞-∞∞-∑∑= 其中21ωω和是频域变量,单位是弧度/采样单元。函数),(21ωωf 为函数),(n m f 的频谱。 二维傅里叶反变换的定义为21212121),(),(ωωωωωωπ πωππωd d e e f n m f n j m j ??-=-== 因此,函数),(n m f 可以用无数个不同频率的复指数信号的和表示,在频率),(21ωω处复指数信号的幅度和相位为),(21ωωf MATLAB 提供的快速傅里叶变换函数 1)fft2:用于计算二维快速傅里叶变换,其语法格式为 b=fft2(I),返回图像I 的二维傅里叶变换矩阵,输入图像I 和输出图像B 大小相同; b=fft2(I,m,n),通过对图像I 剪切或补零,按用户指定的点数计算二维傅里叶变换,返回矩阵B 的大小为m ?n 。 很多MATLAB 图像显示函数无法显示复数图像,为了观察图像傅里叶变换后的结果,应对变换后的结果求模,方法是对变换结果使用abs 函数。 2)fftn :用于计算n 维快速傅里叶变换,其语法格式为 b=fftn(I),计算图像的n 维傅里叶变换,输出图像B 和输入图像I 大小相同; b=fftn(I, size),通过对图像I 剪切或补零,按size 指定的点数计算n 维傅里叶变换,返回矩阵B 的大小为size 。 3) fftshift :用于将变换后的图像频谱中心从矩阵的原点移到矩阵的中心,其语法格式为 b=fftshift(I),将变换后的图像频谱中心从矩阵的原点移到矩阵的中心。

数据结构哈希表设计

一、问题描述 针对某个集体(比如你所在的班级)中的“人名”设计一个哈希表,使得平均查找长度均不超过R,完成相应的建表和查表顺序。 二、基本要求 假设人名为中国人姓名的汉语拼音形式。待填入哈希表的人名共有30个,取平均查找长度的上限为2。哈希函数用除留余数法构造,用伪随机探测再散列法处理冲突。 三、概要设计 1.构造结构体:typedef struct{}; 2.姓名表的初始化:void InitNameTable(); 3.建立哈希表:void CreateHashTable(); 4.显示姓名表:void DisplayNameTable(); 5.姓名查找:void FindName(); 6.主函数:void main() ; 四、详细设计 1.姓名表的初始化 void InitNameTable() { NameTable[0].py="louyuhong"; NameTable[1].py="shenyinghong"; NameTable[2].py="wangqi"; NameTable[3].py="zhuxiaotong"; NameTable[4].py="zhataotao"; NameTable[5].py="chenbinjie"; NameTable[6].py="chenchaoqun"; NameTable[7].py="chencheng"; NameTable[8].py="chenjie"; NameTable[9].py="chenweida";

NameTable[10].py="shanjianfeng"; NameTable[11].py="fangyixin"; NameTable[12].py="houfeng"; NameTable[13].py="hujiaming"; NameTable[14].py="huangjiaju"; NameTable[15].py="huanqingsong"; NameTable[16].py="jianghe"; NameTable[17].py="jinleicheng"; NameTable[18].py="libiao"; NameTable[19].py="liqi"; NameTable[20].py="lirenhua"; NameTable[21].py="liukai"; NameTable[22].py="louhanglin"; NameTable[23].py="luchaoming"; NameTable[24].py="luqiuwei"; NameTable[25].py="panhaijian"; NameTable[26].py="shuxiang"; NameTable[27].py="suxiaolei"; NameTable[28].py="sunyubo"; NameTable[29].py="wangwei"; for (i=0;i

实验一 符号表设计与实现

实验一符号表设计与实现 院系信息科学与工程学院 班级 学号 . 姓名 1.实验目的 了解符号表的作用、组织和数据结构,设计和实现一个符号表。 2.实验要求 a)针对四则运算,写出字符集∑、相应的词法单元集合、词法单元 对应的正则表达式集合 b)合理有效地设计符号表可存储四则运算中的各种词法单元及其 属性等信息 c)列出关键算法的具体实现的思路 3.实验原理及内容 (1)符号表的作用 符号表用于登记词法单元名字、属性等信息。 由于在编译的各个阶段都要对符号表进行频繁操作(查表和填表),在整个编译时间中占了较大比例,因此如何有效合理地组织符号表并选择好的填表和查表方式,对于提高编译器的工作效率有很大影响。 (2)符号表的组织 每个词法单元在符号表中都有1个条目,一般由两部分组成:名字栏和信息栏。

如果一个语言对标识符的最大长度有限制,可设计名字栏的域大小为最大长度来容纳整个标识符;若该语言对标识符最大长度无限制或最大长度较大(如:32),为节省存储空间,可另用一个字符数组存储标识符,在名字栏域中存储其起始地址和长度(字符个数)。 运算表达式中的词法单元与具有某种类型属性的数据对象相关联。同一个标识符在不同位置被说明时代表不同的数据对象。当出现对一个标识符的引用时,需根据运算规则查符号表获取正确的符号表条目。 (3)符号表的数据结构 由于线性表的访问复杂度为O(n),效率较低,符号表常采用效率更高的哈希技术进行实现:当出现标识符id的定义时,计算哈希函数H(id),获取其在哈希表的存储位置,如该位置为空,则直接存储,否则应用冲突消解方法来获取其存储位置;当出现对标识符id的引用时,计算哈希函数H(id),获取其在哈希表的存储位置。 4.实验软硬件环境 C++ Microsoft Visual Studio 6.0 5. 符号表的设计与实现的算法思想 由于线性表的访问复杂度为O(n),效率较低,符号表常采用效率更高的哈希技术进行实现:当出现标识符id的定义时,计算哈希函数H(id),获取其在哈希表的存储位置,如该位置为空,则直接存储,否则应用冲突消解方法来获取其存储位置;当出现对标识符id的引用时,计算哈希函数H(id),获取其在哈希表的存储位置。 (1)主程序示意图如图所示: 置初值 调用switch选择要进行的操作 调用不同case中的方法

哈希表的设计与实现-数据结构与算法课程设计报告

合肥学院 计算机科学与技术系 课程设计报告 2009 ~2010 学年第二学期 课程数据结构与算法 课程设计名称哈希表的设计与实现 学生姓名王东东 学号0804012030 专业班级08计本(2) 指导教师王昆仑、李贯虹 2010 年5 月

课程设计目的 “数据结构与算法课程设计”是计算机科学与技术专业学生的集中实践性环节之一, 是学习“数据结构与算法”理论和实验课程后进行的一次全面的综合练习。其目的是要达到 理论与实际应用相结合,提高学生组织数据及编写程序的能力,使学生能够根据问题要求和 数据对象的特性,学会数据组织的方法,把现实世界中的实际问题在计算机内部表示出来并 用软件解决问题,培养良好的程序设计技能。 一、问题分析和任务定义 1、问题分析 要完成如下要求:设计哈希表实现电话号码查询系统。 实现本程序需要解决以下几个问题: (1)如何定义一个包括电话号码、用户名、地址的节点。 (2)如何以电话号码和用户名为关键字建立哈希表。 (3)用什么方法解决冲突。 (4)如何查找并显示给定电话号码的记录。 (5)如何查找并显示给定用户名的记录。 2 任务定义 1、由问题分析知,本设计要求分别以电话号码和用户名为关键字建立哈希表,z在此基 础上实现查找功能。本实验是要我们分析怎么样很好的解决散列问题,从而建立一比较合理 的哈希表。由于长度无法确定,并且如果采用线性探测法散列算法,删除结点会引起“信息 丢失”的问题。所以采用链地址法散列算法。采用链地址法,当出现同义词冲突时,可以使 用链表结构把同义词链接在一起,即同义词的存储地址不是散列表中其他的空地址。 根据问题分析,我们可以定义有3个域的节点,这三个域分别为电话号码char num[30],姓名char name[30],地址char address[30]。这种类型的每个节点对应链表中的每个节点,其中电话号码和姓名可分别作关键字实现哈希表的创建。 二、数据结构的选择和概要设计 1、数据结构的选择 数据结构:散列结构。 散列结构是使用散列函数建立数据结点关键词与存储地址之间的对应关系,并提供多 种当数据结点存储地址发生“冲突”时的处理方法而建立的一种数据结构。 散列结构基本思想,是以所需存储的结点中的关键词作为自变量,通过某种确定的函 数H(称作散列函数或者哈希函数)进行计算,把求出的函数值作为该结点的存储地址,并 将该结点或结点地址的关键字存储在这个地址中。 散列结构法(简称散列法)通过在结点的存储地址和关键字之间建立某种确定的函数 关系H,使得每个结点(或关键字)都有一个唯一的存储地址相对应。 当需要查找某一指定关键词的结点时,可以很方便地根据待查关键字K计算出对应的“映像”H(K),即结点的存储地址。从而一次存取便能得到待查结点,不再需要进行若干次的 比较运算,而可以通过关键词直接计算出该结点的所在位置。

全维状态观测器的设计

实 验 报 告 课程 线性系统理论基础 实验日期 2016年 6月 6 日 专业班级 学号 同组人 实 验 名 称 全 维 状 态 观 测 器 的 设 计 评分 批阅教师签字 一、实验目的 1. 学习用状态观测器获取系统状态估计值的方法,了解全维状态观测器的极点对状态的估计误差的影响; 2. 掌握全维状态观测器的设计方法; 3. 掌握带有状态观测器的状态反馈系统设计方法。 二、实验容 开环系统? ??=+=cx y bu Ax x ,其中 []0100001,0,10061161A b c ????????===????????--???? a) 用状态反馈配置系统的闭环极点:5,322-±-j ; b) 设计全维状态观测器,观测器的极点为:10,325-±-j ; c) 研究观测器极点位置对估计状态逼近被估计值的影响; d) 求系统的传递函数(带观测器及不带观测器时);

绘制系统的输出阶跃响应曲线。 三、实验环境 MATLAB6.5 四、实验原理(或程序框图)及步骤 利用状态反馈可以使闭环系统的极点配置在所希望的位置上,其条件是必须对全部状态变量都能进行测量,但在实际系统中,并不是所有状态变量都能测量的,这就给状态反馈的实现造成了困难。因此要设法利用已知的信息(输出量y和输入量x),通过一个模型重新构造系统状态以对状态变量进行估计。该模型就称为状态观测器。若状态观测器的阶次与系统的阶次是相同的,这样的状态观测器就称为全维状态观测器或全阶观测器。 设系统完全可观,则可构造如图4-1所示的状态观测器 图4-1 全维状态观测器 为求出状态观测器的反馈ke增益,与极点配置类似,也可有两种方法: 方法一:构造变换矩阵Q,使系统变成标准能观型,然后根据特征方程求出k e ; 方法二:是可采用Ackermann公式:

哈希表设计-数据结构课程设计

实习6、哈希表设计 一、需求分析 1. 问题描述 针对某个集体(比如你所在的班级)中的“人名”设计一个哈希表,使得平均查找长度均不超过R,完成相应的建表和查表顺序。 2. 基本要求 假设人名为中国人姓名的汉语拼音形式。待填入哈希表的人名共有30个,取平均查找长度的上限为2。哈希函数用除留余数法构造,用伪随机探测再散列法处理冲突。 3. 测试数据 取读者周围较熟悉的30个人的姓名。 4. 实现提示 如果随机数自行构造,则应首先调整好随机函数,使其分布均匀。人名的长度均不超过19个字符(最长的人名如:庄双双(Zhuang Shuangshuang))。字符的取码方法可直接利用C 语言中的toascii函数,并可先对过长的人名先作折叠处理。 二、概要设计 ADT Hash { 数据对象D:D是具有相同特征的数据元素的集合。各数据元素均含有类型相同,可唯一标识数据元素的关键字。 数据关系R:数据元素同属一个集合。 InitNameTable() 操作结果:初始化姓名表。 CreateHashTable() 操作结果:建立哈希表。 DisplayNameTable() 操作结果:显示姓名表。 DisplayHashTable() 操作结果:显示哈希表。 FindName() 操作结果:查找姓名。 }ADT Hash 三、详细设计(源代码) (使用C语言) #include #include//time用到的头文件 #include//随机数用到的头文件 #include//toascii()用到的头文件 #include//查找姓名时比较用的头文件 #define HASH_LEN 50//哈希表的长度 #define P 47//小于哈希表长度的P #define NAME_LEN 30//姓名表的长度 typedef struct {//姓名表 char *py; //名字的拼音 int m; //拼音所对应的 }NAME; NAME NameTable[HASH_LEN]; //全局定义姓名表 typedef struct {//哈希表 char *py; //名字的拼音

相关文档
最新文档