当前位置:文档之家› 南航计算机软件数据结构上机实践报告

南航计算机软件数据结构上机实践报告

南航计算机软件数据结构上机实践报告
南航计算机软件数据结构上机实践报告

数据结构实践报告整理

031040102 刘玉

●简述每一部分的对象、目的和要求;

●画出程序流程图;另附A4纸手绘;

●附源程序清单;

●实验的收获:遇到的问题以及解决

的办法、方法的优缺点。

实验一单链表的基本操作与运算

题目一:单链表的定义、创建、插入和删除操作,将数据元素显示出来。

本题目针对单链表。联表示通过一组任意的存储单元来存储线性表格中的数据元素。为了建立起数据元素之间的存储关系,设置每一个结点,结点既存放数据data,又存放其后继地址的部分next。而每个结点中只有一个指向后继的指针,所以称其为单链表。本题目的要求是创建一个新的链表,并且完成链表的创建定义。链表是一种动态管理的存储结构,链表中的每一个结点所占用的空间是根据运行是的实际需要的空间生成的。因此建立单链表是从空链表开始的,每次读入一个数据元素就申请一个结点链表的一段。在单链表中插入一个结点不需要移动元素指针的指向。而删除则需要找到木比啊偶元素的前驱结点,并且修改指针的指向。题目一需要的操作就是,对于一个新建的空链表,以其为对象进行具体的数据的插入填写。待链表中存有数据后,再进行数据的整理查找,然后删除目标数据。

//031040102单链表

#include

#define SLNODE struct node

SLNODE

//定义一个链表

{

int data;

SLNODE *next;

};

void CREATE_SL(SLNODE *h) //创建一个单链表

{

SLNODE *p,*s;

int x;

h->next=NULL;

cout<<"输入以-1结尾的一组数"<

cin>>x;

//开始输入数据

while(x!=-1)

{

s=new SLNODE[sizeof(SLNODE)]; //申请一个动态新空间

s->data=x;

if(h->next==NULL)

h->next=s;

else

p->next=s;

p=s;

cin>>x;

}

p->next=NULL;

//链表最后指向空

};

int Insert_LinkList(SLNODE *h,int i,int x) //在单链表第i个位置插入x

{

SLNODE *p,*s;

int j=0;

p=h;

while(p->next!=NULL&&j

{

p=p->next;

j++;

}

if(j!=i-1)

{

cout<<"i is invalid!"<

return 0;

}

else

{

s=new SLNODE[sizeof(SLNODE)];

s->data=x;

s->next=p->next;

p->next=s;

return 1;

}

};

int Del_LinkList(SLNODE *h,int i) //删除单链表上第i个结点

{

SLNODE *p,*s;

int j=0;

p=h;

while(p->next!=NULL&&j

{

p=p->next;

j++;

}

if(j!=i-1)

{

cout<<"i is invalid!"<

return 0;

}

else

{

if(p->next==NULL)

{

cout<<"第i个结点不存在"<

return 0;

}

else

{s=p->next;p->next=s->next;

//删除结点

Deletes;

//释放结点空间

return 1;

}

}

};

void Print_LinkList(SLNODE *h) //输出链表中所有元素

{

SLNODE *p;

p=h->next;

cout<<"链表数据如下"<

for(;p->next!=NULL;p=p->next)

{

cout<data<<'\t';

}

cout<data<

};

void main()

{

SLNODE *h;

int i,x;

h=new SLNODE[sizeof(SLNODE)];

h->next=NULL;

CREATE_SL(h);

Print_LinkList(h);

cout<<"输入需插入的数据"<

cin>>x;

cout<<"输入需插入的结点"<

cin>>i;

if(Insert_LinkList(h,i,x))

cout<<"插入成功"<

else

cout<<"插入失败"<

Print_LinkList(h);

cout<<"输入需删除的结点"<

cin>>i;

if(Del_LinkList(h,i))

cout<<"删除成功"<

else

cout<<"删除失败"<

Print_LinkList(h);

}

/

/*输入以-1结尾的一组数4 6 8 9 7 2 6 9 7 5 -1

链表数据如下

4 6 8 9 7 2 6 9 7 5

输入需插入的数据8

输入需插入的结点3

插入成功

链表数据如下

4 6 8 8 9 7 2 6 9 7

输入需删除的结点 4

删除成功

链表数据如下

4 6 8 9 7 2 6 9 7 */

实验一的收获

实验一让我对于链表的创建于定义有了更多的接触与认识。之前的学习经验里主要是VC++,涉及链表的内容,我学的不够扎实,所以这次在软件基础时间里重新再次学习。题目一比较简单,设仅是创建和插入以及删除的基本操作。实验一的困难较小,我也是比较顺利参照课本,完成体题目一,也让我对于进一步学习链表有了兴趣和动力。由浅入深,我会一点点开展学习。在图书馆借阅一本《数据结构教程上机实验指导》,里面对于实验的指导比较全面而且有很多实例可以参考。

上机实践二

题目二:栈、队列的顺序存储结构、链式存储结构的定义、创建、插入和删除操作,将数据元素显示出来。

本题目要求掌握栈和列队。栈和列队是两种常见的数据结构。它们的逻辑结构和线性表相同。其特点是,插入和删除等运算的位置有所限制:栈是按照先进后出的规则进行操作,而是按照先进先出的规则进行操作。堆栈技术现在的应用非常广泛,不管是编译软件还是程序设计,在操作系统和事务管理中则是广泛应用了队列技术。

栈是限制在一段进行插入和删除的线性表,允许插入删除的这一端称为栈顶,固定端称为栈底。栈是运算受到限制的一种线性表,采用顺序存储的是顺序栈,采用链式存储的是链栈。题目要求对于两种存储结构

的栈进行定义创建。对于顺序栈,首先需要申请共享的一位数组空间。即为先置空栈,然后入栈插入元素(特别要注意栈满不能插入),删除出栈(特别要注意栈空不能出栈)。对于链栈,采用带头指针的单链表来实现.

队列操作的顺序队列,插入在表的队尾一端,删除在表的另外的队头一端。队的队头和队尾都是活动的,特别地需要设置队头和队尾两个指针。需要实现置空队、入队、出对、以及判别队列是否为空的运算。对于链式队列,通常是用带头结点的单链表实现的,并且设置一个队头指针(始终指向头结点)和一个队尾指针(指向当前的最后一个元素),特别地,当队列为空时队头和队尾指针均指向头结点。显示创建一个带头结点的空队,申请头尾结点,然后进行如对操作不断申请新的结点,还需要进行队列是否为空的判断操作,队空则出队失败。

//031040102 顺序栈

#include

#define MaxSize 1024

#define ElemType int

Typedef struct stack //定义一个栈

{

ElemType data[MaxSize];

int top;

}SqStack;

SqStack *Init_SeqStack() //栈的初始化

{

SqStack *s;

s=new SqStack[sizeof(SqStack)];

s->top=-1;

return s;

};

int IsEmpty_SeqStack(SqStack *s) //判空栈

{

if(s->top==-1)

return 1;

else

return 0;

};

int Push_SeqStack(SqStack *s,ElemType x) //入栈

{

if(s->top==MaxSize-1)

return 0;

else

{

s->top++;

s->data[s->top]=x;

return 1;

}

};

int Pop_SeqStack(SqStack *s,ElemType x) //出栈

{

if(IsEmpty_SeqStack(s))

return 0;

else

{

x=s->data[s->top];

s->top--;

return 1;

}

};

ElemType Top_SeqStack(SqStack *s) //取出栈顶元素

{

if(IsEmpty_SeqStack(s))

return 0;

else

return(s->data[s->top]);

};

void Print(SqStack *s) //输出栈内所有元素

{

if(IsEmpty_SeqStack(s))

cout<<"此栈为空"<

else

{

cout<<"栈内元素为"<

for(int i=s->top;i>-1;i--)

cout<data[i]<<'\t';

cout<

}

};

void main()

{

SqStack *s;

int x;

s=Init_SeqStack();

cout<<"输入一组以-1结尾的数"<

cin>>x;

while(x!=-1)

{

s->top++;

s->data[s->top]=x;

cin>>x;

}

Print(s);

cout<<"输入需插入的数"<

cin>>x;

if(Push_SeqStack(s,x))

cout<<"插入成功"<

else

cout<<"插入失败"<

Print(s);

if(Pop_SeqStack(s,x))

cout<<"删除成功"<

else

cout<<"删除失败"<

Print(s);

}

输入一组以-1结尾的数

5 8 9 7 3

6 2 1 8 -1

栈内元素为

8 1 2 6 3 7 9 8 5

输入需插入的数4

插入成功

栈内元素为

4 8 1 2 6 3 7 9 8 5

删除成功

栈内元素为

8 1 2 6 3 7 9 8 5

//031040102 链栈

#include

#define LinkStack struct linkstack

#define elemtype int

LinkStack //定义一个链栈

{

elemtype data;

LinkStack *next;

};

LinkStack *Init_LinkStack() //链栈的初始化

{

LinkStack *top;

top=new LinkStack[sizeof(LinkStack)];

top=NULL;

return top;

};

LinkStack *Push_LinkStack(LinkStack *top,elemtype x) //数据入栈

{

LinkStack *s;

s=new LinkStack[sizeof(LinkStack)];

s->data=x;

s->next=top;

top=s;

return top;

};

LinkStack *Pop_LinkStack(LinkStack *top,elemtype x) //数据出栈

{

LinkStack *p;

if(top==NULL)

return NULL;

else

{

x=top->data;

p=top;

top=top->next;

delete p;

return top;

}

};

void Print(LinkStack *top) //输出栈内所有元素

{

LinkStack *p;

p=top;

if(p==NULL)

cout<<"此栈为空"<

else

{

cout<<"栈内元素为"<

for(;p->next!=NULL;p=p->next)

cout<data<<'\t';

cout<data<

}

};

void main()

{

LinkStack *top,*s;

int x;

top=Init_LinkStack();

cout<<"输入一组以-1结尾的数"<

cin>>x;

while(x!=-1)

{

s=new

LinkStack[sizeof(LinkStack)];

s->data=x;

s->next=top;

top=s;

cin>>x;

}

Print(top);

cout<<"输入需插入的数"<

cin>>x;

top=Push_LinkStack(top,x);

Print(top);

top=Pop_LinkStack(top,x);

Print(top);

}

输入一组以-1结尾的数

7 9 8 4 3 6 1 23 65 -1

栈内元素为

65 23 1 6 3 4 8 9 7

输入需插入的数15

栈内元素为

15 65 23 1 6 3 4 8 9 7

栈内元素为

65 23 1 6 3 4 8 9 7

//031040102 顺序队列

#include

#define MaxSize 1024

#define ElemType int

typedef struct queue //定义一个顺序队列{

ElemType data[MaxSize];

int rear,front;

}SeQueue;

SeQueue*Init_Queue() //队列的初始化{

SeQueue *sq;

sq=new SeQueue[sizeof(SeQueue)];

sq->front=sq->rear=-1;

return sq;

};

int IsEmpty_Queue(SeQueue *sq) //判空队列

{

if(sq->rear==-1)

return 1;

else

return 0;

};

int In_Queue(SeQueue *sq,ElemType x) //入队

{

if(sq->rear==MaxSize-1)

return 0;

else

{

sq->rear++;

sq->data[sq->rear]=x;

return 1;

}

};

int Out_Queue(SeQueue*sq) //出队

{

if(IsEmpty_Queue(sq))

return 0;

else

{

sq->front++;

return(sq->data[sq->front]);

}

};

int Front_Queue(SeQueue *sq) //读队头元素{

if(IsEmpty_Queue(sq))

return 0;

else

{

return(sq->data[sq->front+1]);

}

};

void Print(SeQueue *sq) //输出队列所有元素{

if(IsEmpty_Queue(sq))

cout<<"此队列为空"<

else

{

cout<<"队列内元素为"<

for(int

i=sq->front+1;i<=sq->rear;i++)

cout<data[i]<<'\t';

cout<

}

};

void main()

{

SeQueue *sq;

int x;

sq=Init_Queue();

cout<<"输入一组以-1结尾的数"<

cin>>x;

while(x!=-1)

{

sq->rear++;

sq->data[sq->rear]=x;

cin>>x;

}

Print(sq);

cout<<"输入需插入的数"<

cin>>x;

if(In_Queue(sq,x))

cout<<"插入成功"<

else

cout<<"插入失败"<

Print(sq);

if(Out_Queue(sq))

cout<<"删除成功"<

else

cout<<"删除失败"<

Print(sq);

}

输入一组以-1结尾的数

4 7 9 6 3

5

6 4 2 1 -1

队列内元素为

4 7 9 6 3

5

6 4 2 1

请输入需插入的数

11

插入成功

队列内元素为

4 7 9 6 3

5

6 4 2 1

11

删除成功

队列内元素为

7 9 6 3 5 6 4 2 1 11

//031040102 链式队列

#include

#define QNODE struct QNODE

#define ElemType int

QNODE

//定义链队的结点类型

{

ElemType data;

QNODE *next;

};

typedef struct linkqueue //封装头尾指针

{

QNODE *front,*rear;

}LinkQueue;

LinkQueue *Init_LQueue() //创建一个带头结点的空队

{

LinkQueue *q;

QNODE *p;

q=new LinkQueue[sizeof(LinkQueue)]; //申请头尾节点

p=new QNODE[sizeof(QNODE)]; //申请链队头结点

p->next=NULL;

q->front=q->rear=p;

return q;

};

void In_LQueue(LinkQueue *q,ElemType x) //入队操作

{

QNODE *p;

p=new QNODE[sizeof(QNODE)]; //申请新结点

p->data=x;

p->next=NULL;

q->rear->next=p;

q->rear=p;

};

int IsEmpty_LQueue(LinkQueue *q) //判队空

{

if(q->front==q->rear)

return 1;

else

return 0;

};

int Out_LQueue(LinkQueue *q,ElemType x) //出队操作

{

QNODE *p;

if(IsEmpty_LQueue(q))

return 0;

else

{

p=q->front->next;

q->front->next=p->next;

x=p->data;

delete p;

if(q->front->next==NULL)

//一个元素时,出队后队空还要改队尾指针

q->rear=q->front;

return 1;

}

};

void Print(LinkQueue *q)

{

QNODE *p;

p=q->front->next;

if(IsEmpty_LQueue(q))

cout<<"此栈为空"<

else

{

cout<<"队列内元素为"<

for(;p->next!=q->rear->next;p=p->next)

cout<data<<'\t';

cout<data<

}

};

void main()

{

LinkQueue *q;

QNODE *s;

int x;

q=Init_LQueue();

cout<<"输入一组以-1结尾的数"<

cin>>x;

while(x!=-1)

{

s=new QNODE[sizeof(QNODE)];

s->data=x;

s->next=NULL;

q->rear->next=s;

q->rear=s;

cin>>x;

}

Print(q);

cout<<"输入需插入的数"<

cin>>x;

In_LQueue(q,x);

Print(q);

if(Out_LQueue(q,x))

cout<<"删除成功"<

else

cout<<"删除失败"<

Print(q);

}

输入一组以-1结尾的数

6 8 9 4 5 3 2 1 14 69 -1

队列内元素为

6 8 9 4 5 3 2 1 14 69

输入需插入的数15

队列内元素为

6 8 9 4 5 3 2 1 14 69 15

删除成功

队列内元素为

8 9 4 5 3 2 1 14 69 15

实验二的收获

实验二是全新的知识需要理解。在之前的学习经历中没有接触到栈和队列。所以这

次是从概念开始学习的。在具体程序的学习应用时候,我对于书上提到的,首先需要的是为栈申请共享空间,有了理解和认识。特别地,在栈空的时候有s->top[0]==-1;

s->top[1]==Maxsize。再有就是栈满的时候不可以入栈操作,未满的入栈操作则是先移动再赋入值。例如语句(两句的顺序不可以颠倒)s->top++;s->data[s->top]=x;

由于栈的主要运算是在栈顶插入、删除。因此我在链表的头部作为栈顶,这样方便了程序,而且不需要像单链表一样为了运算方便附加一个头结点。在联系队列的相关程序时候,我理解了,列队单向空间无法利用,即为前面的已经被指针制动过的空间不能释放也无法利用。除此,队列的操作里面。有可能出现“队满”“队空”的条件相同,front==rear;需要具体区分。

上机实践三

题目三:二叉树的链式存储结构的数据结构定义、创建、先序和后序遍历,并将结果序列输出。

二叉树是有限个元素的集合,该集合或者为空、或者由一个称为根的元素以及两个不相交的、被称为左子树右子树的二叉树组成。二叉树的脸是存储结构是指,用链表来表示一颗二叉树,即用链表来表示元素的逻辑关系。二叉树的链表存储的结点有三个域组成,除了数据域外,还有两个指针域,分别用来指向该节点的左子结点和右子结点的存储地址。当左子结点或者右子结点不存在的时候,相应的指针值域为空。二叉树的遍历是指按照某种顺序结构访问二叉树的每个结点,使每个结点仅被访问一次。限定先左后右,只有三种方式即为先序遍历、中序遍历、后序遍历。遍历其实是一个递归的过程,若二叉树为空,则遍历结束,不然就按照顺序依次访问根结点、左结点、右结点。

//031040102 二叉树

#include

#define elemtype char

typedef struct BiTNode //定义二叉树结点{

elemtype data;

BiTNode *lchild,*rchild; //两结点指针}BiTree;

BiTree *Create() //二叉树的创建,递归算法{

BiTree *bt;

elemtype ch;

cin>>ch;

if(ch=='0')

{

bt=NULL;

}

else

{

bt=new BiTNode[sizeof(BiTNode)];

bt->data=ch;

bt->lchild=Create();

bt->rchild=Create();

}

return bt;

};

void PreOrder(BiTree *bt) //先序遍历二叉树,递归算法

{

if(bt==NULL)

return;

cout<data<<'\t';

PreOrder(bt->lchild);

PreOrder(bt->rchild);

};

void PostOrder(BiTree *bt) //先序遍历二叉树,递归算法

{

if(bt==NULL)

return;

PostOrder(bt->lchild);

PostOrder(bt->rchild);

cout<data<<'\t';

};

void main()

{

BiTree *bt;

cout<<"输入所需字符(空结点以零代替)"<

bt=Create();

cout<<"先序遍历可得二叉树元素为"<

PreOrder(bt);

cout<

cout<<"后序遍历可得二叉树元素为"<

PostOrder(bt);

cout<

}

输入所需字符(空结点以零代替)

frt0e000qj00m00

先序遍历可得二叉树元素为

f r t e q j m

后序遍历可得二叉树元素为

e t r j m q f

实验三的收获

二叉树可以用计算机语言来读取,通过遍历可以恢复二叉树。通过这次试验更加深刻理解二叉树。本体操作不断调用函数,递归实现遍历。实际需要的时候对于已知的二叉树的每个结点逐一访问。一次完整的便利科室的一个二叉树的结点信息由非线性排列转变为意义上的线性排列。在二叉树的链表中无法根据结点找到其父结点。不过,二叉树的链表结构灵巧简便、操作方便。特别地还节省空间。对于一个庞大的工程型程序的话,空间与简便十分重要。同样的目的,同样的结果,需要比较选择,肯定是精巧简单操作性强等等优势作为判断取舍。

上机实践四

题目四:查找:顺序查找、二分查找

查找是许多程序中最为耗费时间的部分。因此需要方法提高运行的速度和效率。顺序查找又称为线性查找,也是最为基本的查找方法之一。具体实现为:从表的一端开始,依次将关键码与给定的值比较,若找到查找成功,并且给出数据元素在表中的位置,若整个表查找完成仍未找到相同的关键码,则查找失败给出失败信息。

二分法查找只适用于顺序存储的有序表。有序表即是表中数据元素按照关键码的升序或者降序排列。去中间元素作为比较对象,若给定值与中间元素的关键码相等,则为查找成功;若给定值小于中间元素的关键码,则在中间元素的左半区继续查找,若给定值大于中间元素的关键码,则在中间元素的右半区继续查找。不断重复上述的查找过程直到查找成功,或者所查找的区域,没有该元素查找失败。

//031040102顺序查找

#include

#define KeyType int

#define ElemType int #define MaxSize 1024

typedef struct

{

KeyType key; //定义关键码字段

ElemType elem; //定义其他字段

}elemtype;

typedef struct //顺序存储结构定义

{

elemtype elem[MaxSize]; //定义数组

int length; //表长度

}S_TBL;

S_TBL *Init_S_TBL() //顺序表的初始化{

S_TBL *s;

s=new S_TBL[sizeof(S_TBL)];

s->length=-1;

return s;

};

int s_search(S_TBL *tbl,KeyType kx) //在表tbl中查找关键码为kx的数据元素{

tbl->elem[0].key=kx;

//存放检测

for(int

i=tbl->length;tbl->elem[i].key!=kx;i--);

//从表尾向前查找

return i;

};

void main()

{

S_TBL *tbl;

tbl=Init_S_TBL();

int i,k;

cout<<"输入一组以-1结尾的数(关键码字段)"<

cin>>k;

while(k!=-1)

{

tbl->length++;

i=tbl->length+1;

tbl->elem[i].key=k;

cin>>k;

}

i=1;

cout<<"输入一组以-1结尾的数(数据元素)"<

cin>>k;

while(k!=-1)

{

tbl->elem[i].elem=k;

i++;

cin>>k;

}

cout<<"请输入所需查找数的关键码字段:"<

cin>>k;

i=s_search(tbl,k);

if(i)

{

cout<<"查找成功"<

cout<<"所查找的数为"<elem[i].elem<

}

else

cout<<"查找失败"<

}

输入一组以-1结尾的数(关键码字段)

2 3 6 4 8 9 7 1 -1

输入一组以-1结尾的数(数据元素)

22 33 11 44 66 55 88 99 77-1

请输入所需查找数的关键码字段:

3

查找成功

所查找的数为33

//031040102二分法查找

#include

#define KeyType int

#define ElemType int

#define MaxSize 1024

typedef struct

{

KeyType key; //定义关键码字段

ElemType elem; //定义其他字段

}elemtype;

typedef struct //顺序存储结构定义{

elemtype elem[MaxSize]; //定义数组

int length; //表长度

}S_TBL;

S_TBL *Init_S_TBL() //顺序表的初始化{

S_TBL *s;

s=new S_TBL[sizeof(S_TBL)];

s->length=-1;

return s;

};

int Binary_search(S_TBL *tbl,KeyType kx) //在表tbl中查找关键码为kx的数据元素{

int mid,flag=0,low=1,high=tbl->length; //1.设置初始区间

while(low<=high)

//2.表空测试

{

//非空,进行比较测试

mid=(low+high)/2;

//3.得到中间点

if(kxelem[mid].key)

high=mid-1;

//调整到左半区

else if(kx>tbl->elem[mid].key)

low=mid+1;

//调整到右半区

else

{

flag=mid;

break;

//查找成功,元素位置设置到flag中

}

}

return flag; //返回该元素在表中的位置,或返回0

};

void main()

{

S_TBL *tbl;

tbl=Init_S_TBL();

int i,k;

cout<<"输入一组以-1结尾的数(关键码字段)"<

cin>>k;

while(k!=-1)

{

tbl->length++;

i=tbl->length+1;

tbl->elem[i].key=k;

cin>>k;

}

i=1;

cout<<"输入一组以-1结尾的数(数据元素)"<

cin>>k;

while(k!=-1)

{

tbl->elem[i].elem=k;

i++;

cin>>k;

}

cout<<"输入所需查找数的关键码字段"<

cin>>k;

i=Binary_search(tbl,k);

if(i)

{

cout<<"查找成功"<

cout<<"所查找的数为"<elem[i].elem<

}

else

cout<<"查找失败"<

}

输入一组以-1结尾的数(关键码字段)

3 6 9 8 7 1 2

4

5 -1

输入一组以-1结尾的数(数据元素)

33 22 11 55 99 77 88 66 44 -1

输入所需查找数的关键码字段3

查找成功

所查找的数为33

实验四的收获

查找的程序对我来说不陌生。两种基本方法的比较和应用里,我留意了最大查找次

数的不同。顺序查找的进行,如果查找不成功那么会议共比较N+1次。当数据量很大的时候,平均查找长度过大,当然顺序查找对于数据的存贮方式没有任何的要求。折半查找会有一个平均查找长度以及查找的最大长度。

我比较倾向于这本查找,其查找的效率明显会高于顺序查找。特别地,我还留意到对于单链表结构,无法进行二分法的查找,因为全部的元素的定位只能从指针开始。对于线性列表只能采取顺序查找的方式。

上机实践五

题目五:排序(插入排序选择排序冒泡排序) 排序是数据处理中经常使用的一种重要的运算,其目的就是将一组数据按照规定的顺序进行排列。排序的目的是便于查询和处理。插入排序的基本思想是每一步将一个待排序的元素,按照其关键字吗的大小,插入到前面已经排序号的一组元素的适当的位置上,知道所有的元素都插入为止。一般地认为插入排序是一个稳定的排序方法。选择排序,每次从当前待排序的记录中,通过依次地进行关键字妈的比较从中选择一个关键字最小的记录,并且把它与当前待排序的第一个记录进行交换。直接选择排序是一个不稳定的排序方法。冒泡排序是一种简单的交换排序的方法。一次地比较相邻两个记录的关键字,若发现两个记录的次序相反(即位前一个记录的关键字大雨后有一个记录的关键字),进行记录的交换一直到没有反序为止。极端情况下,冒泡排序会有最短与最长时间,整个队列越是接近有序,则冒泡排序的进行次数越少。

//031040102 插入排序

#include

#define KeyType int

#define ElemType int

#define MaxSize 1024

typedef struct

{

KeyType key; //定义关键码字段

ElemType elem; //定义其他字段

}elemtype; typedef struct //顺序存储结构定义{

elemtype elem[MaxSize]; //定义数组

int length; //表长度

}S_TBL;

S_TBL *Init_S_TBL() //顺序表的初始化{

S_TBL *s;

s=new S_TBL[sizeof(S_TBL)];

s->length=-1;

return s;

};

int Binary_search(S_TBL *tbl,KeyType kx) //在表tbl中查找关键码为kx的数据元素{

int mid,flag=0,low=1,high=tbl->length; //1.设置初始区间

while(low<=high)

//2.表空测试

{

//非空,进行比较测试

mid=(low+high)/2;

//3.得到中间点

if(kxelem[mid].key)

high=mid-1;

//调整到左半区

else if(kx>tbl->elem[mid].key)

low=mid+1;

//调整到右半区

else

{

flag=mid;

break;

//查找成功,元素位置设置到flag中

}

}

Return flag; //返回该元素在表中的位置,或返回0

};

void main()

{

S_TBL *tbl;

tbl=Init_S_TBL();

int i,k;

cout<<"输入一组以-1结尾的数(关键码字段)"<

cin>>k;

while(k!=-1)

{

tbl->length++;

i=tbl->length+1;

tbl->elem[i].key=k;

cin>>k;

}

i=1;

cout<<"输入一组以-1结尾的数(数据元素)"<

cin>>k;

while(k!=-1)

{

tbl->elem[i].elem=k;

i++;

cin>>k;

}

cout<<"输入所需查找数的关键码字段"<

cin>>k;

i=Binary_search(tbl,k);

if(i)

{

cout<<"查找成功"<

cout<<"所查找的数为"<elem[i].elem<

}

else

cout<<"查找失败"<

}

输入一组以-1结尾的数(关键码字段)

3 6 9 8 7 1 2

4

5 -1

输入一组以-1结尾的数(数据元素)

33 22 11 55 99 77 88 66 44 -1

输入所需查找数的关键码字段

3

查找成功

所查找的数为33

//031040102选择排序

#include

#define keytype int

#define itemtype int

#define MaxSize 50

typedef struct RecType //定义排序记录的形式

{

keytype key;

itemtype otherinfo;

}RecType;

void SelectSort(RecType R[],int n) //选择排序函数

{

int i,j,k;

for(i=1;i

{

k=i;

for(j=i+1;j<=n;j++)

if(R[j].key

k=j;

if(k!=i)

{

R[0]=R[k];

R[k]=R[i];

R[i]=R[0];

}

} };

void Print(RecType R[],int n) //输出数组内所有元素

{

cout<<"关键字段为:"<

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

cout<

cout<

cout<<"所有元素为:"<

for(i=1;i<=n;i++)

cout<

cout<

};

void main()

{

RecType R[MaxSize];

int n=0,x;

cout<<"请输入一组以-1结尾的数(关键码字段):"<

cin>>x;

while(x!=-1)

{

R[++n].key=x;

cin>>x;

}

n=0;

cout<<"请输入一组以-1结尾的数(数据元素):"<

cin>>x;

while(x!=-1)

{

R[++n].otherinfo=x;

cin>>x;

}

cout<<"排序前"<

Print(R,n);

SelectSort(R,n);

cout<<"排序后"<

Print(R,n);

}

请输入一组以-1结尾的数(关键码字段):

6 9

7 4 1 5 6

8 3 -1

请输入一组以-1结尾的数(数据元素):

33 22 11 44 55 66 99 88 77 -1

排序前

关键字段为:

6 9

7 4 1 5 6

8 3

所有元素为:

33 22 11 44 55 66 99 88 排序后

关键字段为:

1 3 4 5 6 6 7 8 9

所有元素为:

55 44 66 33 99 11 88 22

//031040102 冒泡排序

#include

#define keytype int

#define itemtype int

#define MaxSize 50

typedef struct RecType //定义排序记录的形式

{

keytype key;

itemtype otherinfo;

}RecType;

void BubbleSort(RecType R[],int n) //选择排序函数

{

int i,j,flag;

for(i=1;i

{

flag=1;

for(j=1;j<=n-i;j++)

if(R[j+1].key

{

flag=0;

R[0]=R[j];

R[j]=R[j+1];

R[j+1]=R[0];

}

if(flag==1)

return;

}

};

void Print(RecType R[],int n) //输出数组内所有元素

{

cout<<"关键字段为:"<

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

cout<

cout<

cout<<"所有元素为:"<

for(i=1;i<=n;i++)

cout<

cout<

};

void main()

{

RecType R[MaxSize];

int n=0,x;

cout<<"请输入一组以-1结尾的数(关键码字段):"<

cin>>x;

while(x!=-1)

{

R[++n].key=x;

cin>>x;

}

n=0;

cout<<"请输入一组以-1结尾的数(数据元素):"<

cin>>x;

while(x!=-1)

{

R[++n].otherinfo=x;

cin>>x;

}

cout<<"排序前:"<

Print(R,n);

BubbleSort(R,n);

cout<<"排序后:"<

Print(R,n);

}

请输入一组以-1结尾的数(关键码字段):

6 9 8

7 4 1 5 6 -1

请输入一组以-1结尾的数(数据元素):

11 22 33 44 66 55 77 88 -1

排序前:

关键字段为:

6 9 8

7 4 1 5 6

所有元素为:

11 22 33 44 66 55 77 88

排序后:

关键字段为:

1 4 5 6 6 7 8 9

所有元素为:

55 66 77 11 88 44 33 22

实验五的收获

三种不同的排序方式,都是之前C++学习时候的重点掌握内容。直接插入排序的算法很简洁,也很容易实现。从空间看,它只需要一个元素的辅助,从实践看该算法的主程序运行次数只比元素的个数少一。当然由于原列表的排序状况未知,其总比较次数和总的移动次数也是未定的,取平均数约为0.25N^2。对于直接选择排序,比较次数与原表元素的排列顺序无关,移动次数有关。根据冒泡排序的思想,待排序的记录有序之后,则在下一趟的排序时候不会再有记录的交换位置,由此,我增加了一个标记flag,来直观表示每一次的排序是否需要发生交换,无交换则已经完成可以结束冒泡。特别地冒泡排序需要增加一个附加的单元来实现元素的交换。在交换时需要留意免得出错。

·

数据结构实验报告格式

《数据结构课程实验》大纲 一、《数据结构课程实验》的地位与作用 “数据结构”是计算机专业一门重要的专业技术基础课程,是计算机专业的一门核心的关键性课程。本课程较系统地介绍了软件设计中常用的数据结构以及相应的存储结构和实现算法,介绍了常用的多种查找和排序技术,并做了性能分析和比较,内容非常丰富。本课程的学习将为后续课程的学习以及软件设计水平的提高打下良好的基础。 由于以下原因,使得掌握这门课程具有较大的难度: (1)内容丰富,学习量大,给学习带来困难; (2)贯穿全书的动态链表存储结构和递归技术是学习中的重点也是难点; (3)所用到的技术多,而在此之前的各门课程中所介绍的专业性知识又不多,因而加大了学习难度; (4)隐含在各部分的技术和方法丰富,也是学习的重点和难点。 根据《数据结构课程》课程本身的技术特性,设置《数据结构课程实验》实践环节十分重要。通过实验实践内容的训练,突出构造性思维训练的特征, 目的是提高学生组织数据及编写大型程序的能力。实验学时为18。 二、《数据结构课程实验》的目的和要求 不少学生在解答习题尤其是算法设计题时,觉得无从下手,做起来特别费劲。实验中的内容和教科书的内容是密切相关的,解决题目要求所需的各种技术大多可从教科书中找到,只不过其出现的形式呈多样化,因此需要仔细体会,在反复实践的过程中才能掌握。 为了帮助学生更好地学习本课程,理解和掌握算法设计所需的技术,为整个专业学习打好基础,要求运用所学知识,上机解决一些典型问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握所用到的一些技术。数据结构中稍微复杂一些的算法设计中可能同时要用到多种技术和方法,如算法设计的构思方法,动态链表,算法的编码,递归技术,与特定问题相关的技术等,要求重点掌握线性链表、二叉树和树、图结构、数组结构相关算法的设计。在掌握基本算法的基础上,掌握分析、解决实际问题的能力。 三、《数据结构课程实验》内容 课程实验共18学时,要求完成以下六个题目: 实习一约瑟夫环问题(2学时)

SQL-Server数据库上机实验报告

SQL-Server数据库上机实验报告

《数据库系统原理》上机实验报告 学号:1120131743 姓名:谈兆年 班级:07111301

一、实验目的与要求: ●熟练使用SQL语句 ●掌握关系模型上的完整性约束机制 二、实验内容 1:利用SQL语句创建Employee数据库 CREATE DATABASE Employee; 结果: 2:利用SQL语句在Employee数据库中创建人员表person、月薪表salary及部门表dept。 做法:按表1、表2、表3中的字段说明创建 表1 person表结构 字段名数据 类型 字段 长度 允许空 否 字段说明 P_no Char 6 Not Null 工号,主键P_na Varch10 Not 姓名

me ar Null Sex Char 2 Not Null 性别 Birth date Dateti me Null 出生日期 Prof Varch ar 10 Null 职称 Dept no Char 4 Not Null 部门代码,外键 (参照dept表)表2 salary表结构 字段名数据 类型 字段 长度 允许空 否 字段说明 P_no Char 6 Not Null 工号,主键,外键(参照person表) Base Dec 5 Null 基本工资Bonu s Dec 5 Null 奖金,要求>50 Fact Dec 5 Null 实发工资=基本工 资+奖金 Mont h Int 2 Not Null 月份

表3 dept表结构 字段名数据 类型 字段 长度 允许空 否 字段说明 Dept no Char 4 Not Null 部门代码,主键, Dna me Varch ar 10 Not Null 部门名称 程序为: CREATE TABLE dept( deptno CHAR(4) PRIMARY KEY NOT NULL, dname V ARCHAR(10) NOT NULL) CREATE TABLE Person( P_no CHAR(6) PRIMARY KEY Not Null, P_name V ARCHAR(10) Not Null, Sex CHAR(2) Not Null, Birthdate Datetime Null, Prof V ARCHAR(10) Null, Deptno CHAR(4) Not Null, FOREIGN KEY(Deptno) REFERENCES

结构力学求解器求解示例

结构力学(二)上机试验结构力学求解器的使用 上机报告 班级: 姓名: 学号: 日期:

实验三、计算结构的影响线 1.实验任务 (1)作以下图示梁中截面D 的内力D M 、QD F 的影响线。 观览器:D M 的影响线 观览器:QD F 的影响线 D |F=1 3 365

编辑器: 结点,1,0,0 结点,2,3,0 结点,3,6,0 结点,4,12,0 结点,6,6,1 结点,5,17,1 单元,1,2,1,1,0,1,1,1 单元,2,3,1,1,1,1,1,1 单元,3,4,1,1,1,1,1,0 单元,3,6,1,1,0,1,1,0 单元,6,5,1,1,0,1,1,0 结点支承,1,3,0,0,0 结点支承,4,1,0,0 结点支承,5,3,0,0,0 影响线参数,-2,1,1,3 影响线参数,-2,1,1,2 End

作以下图示梁中截面D 的内力D M 、QD F 的影响线。 观览器: D M 的影响线 QD F 的影响线

编辑器: 结点,1,0,0 结点,2,2,0 结点,3,4,0 结点,4,6,0 结点,5,8,0 结点,6,0,1 结点,7,8,1 结点,8,2,1 结点,9,4,1 结点,10,6,1 单元,1,2,1,1,0,1,1,1 单元,2,3,1,1,1,1,1,1 单元,3,4,1,1,1,1,1,1 单元,4,5,1,1,1,1,1,0 单元,1,6,1,1,1,1,1,0 单元,6,8,1,1,0,1,1,0 单元,8,9,1,1,0,1,1,0 单元,9,10,1,1,0,1,1,0 单元,10,7,1,1,0,1,1,0 单元,7,5,1,1,0,1,1,0

数据分析实验报告

数据分析实验报告 文稿归稿存档编号:[KKUY-KKIO69-OTM243-OLUI129-G00I-FDQS58-

第一次试验报告 习题1.3 1建立数据集,定义变量并输入数据并保存。 2数据的描述,包括求均值、方差、中位数等统计量。 分析—描述统计—频率,选择如下: 输出: 统计量 全国居民 农村居民 城镇居民 N 有效 22 22 22 缺失 均值 1116.82 747.86 2336.41 中值 727.50 530.50 1499.50 方差 1031026.918 399673.838 4536136.444 百分位数 25 304.25 239.75 596.25 50 727.50 530.50 1499.50 75 1893.50 1197.00 4136.75 3画直方图,茎叶图,QQ 图。(全国居民) 分析—描述统计—探索,选择如下: 输出: 全国居民 Stem-and-Leaf Plot Frequency Stem & Leaf 5.00 0 . 56788 数据分析实验报告 【最新资料,WORD 文档,可编辑修改】

2.00 1 . 03 1.00 1 . 7 1.00 2 . 3 3.00 2 . 689 1.00 3 . 1 Stem width: 1000 Each leaf: 1 case(s) 分析—描述统计—QQ图,选择如下: 输出: 习题1.1 4数据正态性的检验:K—S检验,W检验数据: 取显着性水平为0.05 分析—描述统计—探索,选择如下:(1)K—S检验

结果:p=0.735 大于0.05 接受原假设,即数据来自正太总体。 (2 )W 检验 结果:在Shapiro-Wilk 检验结果972.00 w ,p=0.174大于0.05 接受原假设,即数据来自正太总体。 习题1.5 5 多维正态数据的统计量 数据:

数据结构实验报告

数据结构实验报告 一.题目要求 1)编程实现二叉排序树,包括生成、插入,删除; 2)对二叉排序树进行先根、中根、和后根非递归遍历; 3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。 4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信息(至少包括学号、姓名、成绩3项),对比查找效率,并说明在什么情况下二叉排序树效率高,为什么? 二.解决方案 对于前三个题目要求,我们用一个程序实现代码如下 #include #include #include #include "Stack.h"//栈的头文件,没有用上 typedefintElemType; //数据类型 typedefint Status; //返回值类型 //定义二叉树结构 typedefstructBiTNode{ ElemType data; //数据域 structBiTNode *lChild, *rChild;//左右子树域 }BiTNode, *BiTree; intInsertBST(BiTree&T,int key){//插入二叉树函数 if(T==NULL) { T = (BiTree)malloc(sizeof(BiTNode)); T->data=key; T->lChild=T->rChild=NULL; return 1; } else if(keydata){ InsertBST(T->lChild,key); } else if(key>T->data){ InsertBST(T->rChild,key); } else return 0; } BiTreeCreateBST(int a[],int n){//创建二叉树函数 BiTreebst=NULL; inti=0; while(i

数据库上机实验报告

数据库实验 (第三次) 题目1 实验内容: 1. 检索上海产的零件的工程名称; 2. 检索供应工程J1零件P1的供应商号SNO; 3. 检索供应工程J1零件为红色的供应商号SNO; 4. 检索没有使用天津生产的红色零件的工程号JNO; 5. 检索至少用了供应商S1所供应的全部零件的工程号JNO; 6. 检索购买了零件P1的工程项目号JNO及数量QTY,并要求对查询的结果按数 量QTY降序排列。

1 select jname from j where jno in (select jno from spj where sno in (select sno from s where city ='上海' ) ); 2 select sno from spj where jno ='j1'and pno ='p1' 3

selectdistinct sno from spj where pno in (select pno from p where color='红'and pno in (select pno from spj where jno ='j1' ) ); 4 selectdistinct jno from spj where pno notin (select pno from p where color ='红'and pno in (select pno from spj where sno in (select sno from s where city ='天津' ) ) )

5 select jno from spj where sno ='s1' 6 select jno,qty from spj where pno ='p1' orderby qty desc 四﹑思考题 1.如何提高数据查询和连接速度。 建立视图 2. 试比较连接查询和嵌套查询 有些嵌套查询是可以用连接来代替的,而且使用连接的方式,性能要比 嵌套查询高出很多 当查询涉及多个关系时,用嵌套查询逐步求解结构层次清楚,易于构造,具有结构化程序设计的优点。但是相比于连接运算,目前商用关系数据库管理系统对嵌套查询的优化做的还不够完善,所以在实际应用中,能够用连接运算表达的查询尽可能采用连接运算。

结构力学求解器学习报告

结构力学求解器学习报告 一、实习目的 结构力学上机实习使训练学生使用计算机进行结构计算的重要环节。通过实习,学生可以掌握如何使用计算机程序进行杆系结构的分析计算,进一步掌握结构力学课程的基本理论和基本概念。在此基础上,通过阅读有关程序设计框图,编写、调试结构力学程序,学生进一步提高运用计算机进行计算的能力,为后续课程的学习、毕业设计及今后工作中使用计算机进行计算打下良好的基础。 二、实习时间 大三上学期第19周星期一至星期五。 三、实习内容 本次实习以自学为主,学习如何使用结构力学求解器进行结构力学问题的求解,包括:二维平面结构(体系)的几何组成、静定、超静定、位移、内力、影响线、自由振动、弹性稳定、极限荷载等。对所有这些问题,求解器全部采用精确算法给出精确解答。 四、心得体会 第一天上机时,张老师对结构力学求解器的使用方法进行了简单的介绍,然后就是学生自己自学的时间了。每个学生都有自己对应的题目要完成,在完成这些题目的同时,我也逐渐对结构力学求解器的运用更加自如。 从刚开始的生疏到最后的熟练运用,我遇到了不少问题:①第一次使用在有些问题上拿不定注意,例如,在材料性质那一栏,我不知

道是EA和EI的取值②第一次接触这个软件,在使用过程中不知道该如何下手,题目条件的输入顺序也很模糊。③经常会忘记添加荷载的单位,导致计算结果出现问题。④对于有些命令不能很明确的知道其用法,致使在使用时经常出错。在面对这些问题时,我一般都会向同学和老师寻求帮助,直到最终将问题解决。 通过这几天的上机实习,不仅让我进一步掌握了结构力学的知识,同时,还使我对结构力学求解器有了更深入的了解: 1. 结构力学求解器首先是一个计算求解的强有效的工具。对于任意平面的结构,只要将参数输进求解器,就可以得到变形图和内力图,甚至还可以求得临界荷载等问题。 2.即便是结构力学的初学者,只要会用求解器,也可以用求解器来方便地求解许多结构的各类问题,以增强对结构受力特性的直观感受和切实体验。 3.书本中的方法并非所有类型的问题都可以解决,例如,不规则分布的荷载以及超静定结构用传统方法比较困难,但用求解器就较为简单。而且,用求解器求解问题时可以不忽略轴向变形等书本中忽略的条件,与实际更加相符。 4.求解器可以用静态图形显示结构简图、变形图、内力图,还可以用动画显示机构模态、振型等动态图形。利用复制到剪贴板的功能,可以将结构简图、变形图、内力图以点阵图或矢量图的形式粘贴到word文档中,并可以方便地进行再编辑。

数据结构实验报告全集

数据结构实验报告全集 实验一线性表基本操作和简单程序 1.实验目的 (1)掌握使用Visual C++ 6.0上机调试程序的基本方法; (2)掌握线性表的基本操作:初始化、插入、删除、取数据元素等运算在顺序存储结构和链表存储结构上的程序设计方法。 2.实验要求 (1)认真阅读和掌握和本实验相关的教材内容。 (2)认真阅读和掌握本章相关内容的程序。 (3)上机运行程序。 (4)保存和打印出程序的运行结果,并结合程序进行分析。 (5)按照你对线性表的操作需要,重新改写主程序并运行,打印出文件清单和运行结果 实验代码: 1)头文件模块 #include iostream.h>//头文件 #include//库头文件-----动态分配内存空间 typedef int elemtype;//定义数据域的类型 typedef struct linknode//定义结点类型 { elemtype data;//定义数据域 struct linknode *next;//定义结点指针 }nodetype; 2)创建单链表

nodetype *create()//建立单链表,由用户输入各结点data域之值,//以0表示输入结束 { elemtype d;//定义数据元素d nodetype *h=NULL,*s,*t;//定义结点指针 int i=1; cout<<"建立一个单链表"<> d; if(d==0) break;//以0表示输入结束 if(i==1)//建立第一个结点 { h=(nodetype*)malloc(sizeof(nodetype));//表示指针h h->data=d;h->next=NULL;t=h;//h是头指针 } else//建立其余结点 { s=(nodetype*) malloc(sizeof(nodetype)); s->data=d;s->next=NULL;t->next=s; t=s;//t始终指向生成的单链表的最后一个节点

数据库上机实验报告正式版

For the things that have been done in a certain period, the general inspection of the system is also a specific general analysis to find out the shortcomings and deficiencies 数据库上机实验报告正式 版

数据库上机实验报告正式版 下载提示:此报告资料适用于某一时期已经做过的事情,进行一次全面系统的总检查、总评价,同时也是一次具体的总分析、总研究,找出成绩、缺点和不足,并找出可提升点和教训记录成文,为以后遇到同类事项提供借鉴的经验。文档可以直接使用,也可根据实际需要修订后使用。 数据库上机实验报告 试验内容 1、数据表的建立 基本表《简单的》带有主键 带有外码约束的(外码来自其他表或者本表) 2、数据表的修改 添加删除列 修改列属性类型 添加删除约束(约束名) 元组的添加,修改,删除 删除数据表

试验过程 1、createtablestudent ( snochar(9)primarykey,/*sno是主码列级完整性约束条件*/ snamechar(20)unique,/*sname取唯一值*/ ssexchar(2), sagesmallint,/*类型为smallint*/ sdeptchar(20)/*所在系*/ ); createtablecourse ( cnochar(4)primarykey,/*列级完整性约束条件,cno是主码*/

cnamechar(40), cpnochar(4),/*cpno的含义是先行课*/ ccreditsmallint, foreignkey(cpno)referencescourse(cno) /*表级完整性约束条件,cpno是外码,被参照表是course,被参照列是 cno*/ ); createtablesc ( snochar(9), cnochar(4), gradesmallint,

结构力学实验报告模板1

结构力学实验报告 班级12土木2班 姓名 学号

实验报告一 实验名称 在求解器中输入平面结构体系 一实验目的 1、了解如何在求解器中输入结构体系 2、学习并掌握计算模型的交互式输入方法; 3、建立任意体系的计算模型并做几何组成分析; 4、计算平面静定结构的内力。 二实验仪器 计算机,软件:结构力学求解器 三实验步骤 图2-4-3 是刚结点的连接示例,其中图2-4-3a 中定义了一个虚拟刚结点和杆端的连接码;各个杆端与虚拟刚结点连接后成为图2-4-3b 的形式,去除虚拟刚结点后的效果为图2-4-3c 所示的刚结点;求解器中显示的是最后的图2-4-3c。图2-4-4 是组合结点的连接示例,同理,无需重复。铰结点是最常见的结点之一,其连接示例在图2-4-5 中给出。这里,共有四种连接方式,都等效于图2-4-5e 中的铰结点,通常采用图2-4-5a 所示方式即可。值得一提的是,如果将三个杆件固定住,图2-4-5b~d 中的虚拟刚结点也随之被固定不动,而图2-4-5a 中的虚拟刚结点仍然存在一个转动自由度,可以绕结点自由转动。这是一种结点转动机构,在求解器中会自动将其排除不计①。结点机构实际上也潜存于经典的结构力学之中,如将一个集中力矩加在铰结点上,便可以理解为加在了结点机构上(犹如加在可自由转动的销钉上),是无意义的。 综上所述,求解器中单元对话框中的“连接方式”是指各杆端与虚拟刚结点的连接方式,而不是杆件之间的连接方式。这样,各杆件通过虚拟刚结点这一中介再和其他杆件间接地连接。这种处理的好处是可以避免结点的重复编码(如本书中矩阵位移法中所介绍的),同时可以方便地构造各种

C上机实验报告实验四

实验四数组、指针与字符串 1.实验目的 1.学习使用数组 2.学习字符串数据的组织和处理 3.学习标准C++库的使用 4.掌握指针的使用方法 5.练习通过Debug观察指针的内容及其所指的对象的内容 6.联系通过动态内存分配实现动态数组,并体会指针在其中的作用 7.分别使用字符数组和标准C++库练习处理字符串的方法 2.实验要求 1.编写并测试3*3矩阵转置函数,使用数组保存3*3矩阵。 2.使用动态内存分配生成动态数组来重新完成上题,使用指针实现函数的功能。 3.编程实现两字符串的连接。要求使用字符数组保存字符串,不要使用系统函数。 4.使用string类定义字符串对象,重新实现上一小题。 5.定义一个Employee类,其中包括姓名、街道地址、城市和邮编等属性,以及change_name()和display()等函数。Display()显示姓名、街道地址、城市和邮编等属性,change_name()改变对象的姓名属性。实现并测试这个类。 6.定义包含5个元素的对象数组,每个元素都是Employee类型的对象。 7. (选做)修改实验4中的选做实验中的people(人员)类。具有的属性如下:姓名char name[11]、编号char number[7]、性别char sex[3]、生日birthday、身份证号char id[16]。其中“出生日期”定义为一个“日期”类内嵌对象。用成员函数实现对人员信息的录入和显示。要求包括:构造函数和析构函数、拷贝构造函数、内联成员函数、聚集。在测试程序中定义people类的对象数组,录入数据并显示。 3.实验内容及实验步骤 1.编写矩阵转置函数,输入参数为3*3整形数组,使用循环语句实现矩阵元素的行列对调,注意在循环语句中究竟需要对哪些元素进行操作,编写main()函数实现输入、输出。程序名:lab6_1.cpp。 2.改写矩阵转置函数,参数为整型指针,使用指针对数组元素进行操作,在main()函数中使用new操作符分配内存生成动态数组。通过Debug观察指针的内容及其所指的对象中的内容。程序名:lab6_2.cpp。 3.编程实现两字符串的连接。定义字符数组保存字符串,在程序中提示用户输入两个字符串,实现两个字符串的连接,最后用cout语句显示输出。程序名:lab6_3.cpp。用cin实现输入,注意,字符串的结束标志是ASCII码0,使用循环语句进行字符串间的字符拷贝。 4.使用string类定义字符串对象,编程实现两字符串的连接。在string类中已重载了运算符“+=”实现字符串的连接,可以使用这个功能。程序名:lab6_4.cpp。 5.在employee.h文件中定义Employee类。Employee类具有姓名、街道地址、城市和邮编等私有数据成员,在成员函数中,构造函数用来初始化所有数据成员;display()中使用cout显示

数据结构实验报告模板

2009级数据结构实验报告 实验名称:约瑟夫问题 学生姓名:李凯 班级:21班 班内序号:06 学号:09210609 日期:2010年11月5日 1.实验要求 1)功能描述:有n个人围城一个圆圈,给任意一个正整数m,从第一个人开始依次报数,数到m时则第m个人出列,重复进行,直到所有人均出列为止。请输出n个人的出列顺序。 2)输入描述:从源文件中读取。 输出描述:依次从显示屏上输出出列顺序。 2. 程序分析 1)存储结构的选择 单循环链表 2)链表的ADT定义 ADT List{ 数据对象:D={a i|a i∈ElemSet,i=1,2,3,…n,n≧0} 数据关系:R={< a i-1, a i>| a i-1 ,a i∈D,i=1,2,3,4….,n} 基本操作: ListInit(&L);//构造一个空的单链表表L ListEmpty(L); //判断单链表L是否是空表,若是,则返回1,否则返回0. ListLength(L); //求单链表L的长度 GetElem(L,i);//返回链表L中第i个数据元素的值; ListSort(LinkList&List) //单链表排序 ListClear(&L); //将单链表L中的所有元素删除,使单链表变为空表 ListDestroy(&L);//将单链表销毁 }ADT List 其他函数: 主函数; 结点类; 约瑟夫函数 2.1 存储结构

[内容要求] 1、存储结构:顺序表、单链表或其他存储结构,需要画示意图,可参考书上P59 页图2-9 2.2 关键算法分析 结点类: template class CirList;//声明单链表类 template class ListNode{//结点类定义; friend class CirList;//声明链表类LinkList为友元类; Type data;//结点的数据域; ListNode*next;//结点的指针域; public: ListNode():next(NULL){}//默认构造函数; ListNode(const Type &e):data(e),next(NULL){}//构造函数 Type & GetNodeData(){return data;}//返回结点的数据值; ListNode*GetNodePtr(){return next;}//返回结点的指针域的值; void SetNodeData(Type&e){data=e;}//设置结点的数据值; void SetNodePtr(ListNode*ptr){next=ptr;} //设置结点的指针值; }; 单循环链表类: templateclass CirList { ListNode*head;//循环链表头指针 public: CirList(){head=new ListNode();head->next=head;}//构造函数,建立带头节点的空循环链表 ~CirList(){CirListClear();delete head;}//析构函数,删除循环链表 void Clear();//将线性链表置为空表 void AddElem(Type &e);//添加元素 ListNode *GetElem(int i)const;//返回单链表第i个结点的地址 void CirListClear();//将循环链表置为空表 int Length()const;//求线性链表的长度 ListNode*ListNextElem(ListNode*p=NULL);//返回循环链表p指针指向节点的直接后继,若不输入参数,则返回头指针 ListNode*CirListRemove(ListNode*p);//在循环链表中删除p指针指向节点的直接后继,且将其地址通过函数值返回 CirList&operator=(CirList&List);//重载赋

数据库上机实验报告4

数据库上机实验报告 4 学号:姓名:日期:年月日 实验目的:(1)练习连接查询;(2)练习视图的创建与使用;(3)学习使用ODBC的方法;(4)体验T-SQL的功能;体验存储过程的功能;体验表值函数、标量值函数的作用;体验ranking等功能。 1 练习视图及连接查询。 (1)创建一个视图,视图名为viNF,视图内容为select id,count(*) as nf from friends group by id。执行成功后,将SQL语句复制到下方。 (2)基于viNF视图,查找拥有最多好友的用户、最少好友的用户。执行成功后,将SQL语句复制到下方。 (3)基于users表和viNF视图进行连接查询。分别进行内连接、全外连接、左外连接、右外连接四种操作。执行成功后,将SQL语句复制到下方,并回答:四种结果表,哪两个的结果是一致的,为什么? (4)将题(3)中全外连接保存为一个新的视图viUAF。 2 通过ODBC用Excel打开users表。 3 体验T-SQL。 回顾实验2中的题目: 定义最低价格为成本价;依据此成本价做如下计算: 连接Goods,Goods_Extent,Sellers表,按照总利润,输出前10名;要求输出表的格式为(商品名称,卖家名称,商品价格,运费,卖家信誉,卖家好评率,历史销量,历史利润,期内销量,期内利润,总销量,总利润) 利用如下语句进行查询,体会和之前有什么不同。如感兴趣,自己可以仿照写一个变量定义、赋值及应用的例子。 declare @cost as float; select @cost=min(good_price)from goods; select top 10 good_name as商品名称, goods.seller_name as卖家名称, good_price as商品价格, good_shipping as运费,

结构力学上机考试答案

中国矿业大学力学与建筑工程学院 2013~2014学年度第二学期 《结构力学A1》上机实验报告 学号 班级 姓名 2014年5月26日

一、单跨超静定梁计算(50分) 1. 计算并绘制下面单跨超静定梁的弯矩图和剪力图。(20分) q =12N/m q =8N/m q =8N/m q=?8m 1 2 3 2. 如果按照梁跨中弯矩相等的原则,将梁上的荷载换算成均布荷载,则均布荷载应为多少?(10分) 2m 1m 1m 1m 1m 1m q=? 8m 3. 如果按照梁端部弯矩相等的原则,将梁上的荷载换算成均布荷载,则均布荷载应为多少?(10分) 4. 如果按照梁端部剪力相等的原则,将梁上的荷载换算成均布荷载,则均布荷载应为多少?(10分) 二、超静定刚架计算(50分) 1.刚架各杆EI 如图所示,计算刚架的弯矩图,剪力图和轴力图。(30分)

2. 若EI=106 (Nm 2 ),计算刚架一层梁和二层梁的水平位移。(20分)

弯矩图: y x 12345678 ( 1 )( 2 )( 3 )( 4 )( 5 )( 6 )( 7 ) -40.96 -16.29 3.04 19.04 25.04 19.04 3.04 -16.29 -40.96 剪力图: y x 12345678 ( 1 )( 2 )( 3 )( 4 )( 5 )( 6 )( 7 ) 26.00 22.00 18.00 12.00 -12.00 -18.00 -22.00 -26.00

解:跨中弯矩M1=25.04Nm(下部受拉)均布荷载q作用在梁上时,跨中弯矩为 M2=1/24*q*(l^2)(下部受拉) ∵M1=M2, ∴q=9.39N/m 如图所示: y x 12 ( 1 ) -50.08-50.08

结构力学 上机实验报告

实验报告一 平面刚架内力计算程序APF 实验目的:(1)分析构件刚度与外界温度对结构位移的影响,如各杆刚度改变对内力分布的影响、温度因数对内力分布的影响。 (2)观察并分析刚架在静力荷载及温度作用下的内力和变形规律,包括刚度的变化,结构形式的改变,荷载的作用位置变化等因素对内力及变形的影响。对结构静力分析的矩阵位移法的计算机应用有直观的了解 (3)掌握杆系结构计算的《结构力学求解器》的使用方法。通过实验加深对静定、超静定结构特性的认识。 实验设计1: 计算图示刚架当梁柱刚度12I I 分别为15、11、15、1 10时结构的内力和位移,由此分析当刚架在水平荷 载作用下横梁的水平位移与刚架梁柱 比(1 2I I )之间的关系。(计算时忽略轴向变形)。 数据文件: (1)变量定义,EI1=1,EI2=0.2(1,5,10) 结点,1,0,0 结点,2,0,4 结点,3,6,4 结点,4,6,0 单元,1,2,1,1,1,1,1,1 单元,2,3,1,1,1,1,1,1 单元,3,4,1,1,1,1,1,1 结点支承,1,6,0,0,0,0 结点支承,4,6,0,0,0,0 结点荷载,2,1,100,0 单元材料性质,1,1,-1,EI1,0,0,-1 单元材料性质,2,2,-1,EI2,0,0,-1 单元材料性质,3,3,-1,EI1,0,0,-1 (2)变量定义,EI1=5(1,0.2,0.1),EI2=1 结点,1,0,0 结点,2,0,4 结点,3,6,4 结点,4,6,0 单元,1,2,1,1,1,1,1,1 单元,2,3,1,1,1,1,1,1 单元,3,4,1,1,1,1,1,1 结点支承,1,6,0,0,0,0 结点支承,4,6,0,0,0,0 结点荷载,2,1,100,0 单元材料性质,1,1,-1,EI1,0,0,-1 单元材料性质,2,2,-1,EI2,0,0,-1 单元材料性质,3,3,-1,EI1,0,0,-1 主要计算结果: 位移:

数据分析实验报告

数据分析实验报告 【最新资料,WORD文档,可编辑修改】 第一次试验报告 习题1.3 1建立数据集,定义变量并输入数据并保存。 2数据的描述,包括求均值、方差、中位数等统计量。 分析—描述统计—频率,选择如下: 输出:

方差1031026.918399673.8384536136.444百分位数25304.25239.75596.25 50727.50530.501499.50 751893.501197.004136.75 3画直方图,茎叶图,QQ图。(全国居民) 分析—描述统计—探索,选择如下: 输出: 全国居民Stem-and-Leaf Plot Frequency Stem & Leaf 9.00 0 . 122223344 5.00 0 . 56788 2.00 1 . 03 1.00 1 . 7 1.00 2 . 3 3.00 2 . 689

1.00 3 . 1 Stem width: 1000 Each leaf: 1 case(s) 分析—描述统计—QQ图,选择如下: 输出: 习题1.1 4数据正态性的检验:K—S检验,W检验数据: 取显着性水平为0.05 分析—描述统计—探索,选择如下:(1)K—S检验 单样本Kolmogorov-Smirnov 检验 身高N60正态参数a,,b均值139.00

标准差7.064 最极端差别绝对值.089 正.045 负-.089 Kolmogorov-Smirnov Z.686 渐近显着性(双侧).735 a. 检验分布为正态分布。 b. 根据数据计算得到。 结果:p=0.735 大于0.05 接受原假设,即数据来自正太总体。(2)W检验

数据库上机实验报告 总结

重庆邮电大学移通学院 数据库集中上机报告 学生:马志鹏 学号: 022******* 班级: 02210901 专业:计算机应用技术 重庆邮电大学移通学院 2011年6月

第一天:Access数据库基本操作 1 实验目的 1、熟悉的掌握Access数据库结构与创建 2、了解创建、修改、删除、查询、保存等操作 3、输入数据创建、设计器创建、向导创建。 2 实验内容 3 实验结果 1. 2. 2

重庆邮电大学移通学院 3 2 Access 数据表的编辑 第二天 数据表基本操作 1 表关系与编辑数据 1 实验目的: 1、实现一对一,一对多,多对多的实体关系 2、对“学生基本信息”表中的记录进行排序,按出生日期降序排列 3、从“学生基本信息”表中筛选出所有计算机系男生的记录 4、从“学生基本信息”表中筛选出回族和蒙古族的所有学生记录

2 实验内容 1. SELECT 学生基本信息表.学生姓名, 成绩档案表.* FROM 成绩档案表INNER JOIN 学生基本信息表ON 成绩档案表.学生学号= 学生基本信息表.学生学号 WHERE (((学生基本信息表.学生姓名)="张冰冰")); 2 SELECT 学生基本信息表.* FROM 学生基本信息表 WHERE (((学生基本信息表.性别)="男") AND ((学生基本信息表.班级名称)="计算机系")); 3 SELECT 成绩档案表.C语言, 课程表.* FROM 成绩档案表, 课程表; 4 SELECT 学生基本信息表.*, 学生基本信息表.性别, 学生基本信息表.班级名称FROM 学生基本信息表WHERE (((学生基本信息表.性别)<>"男") AND ((学生基本信息表.班级名称)<>"计算机系")); 5 SELECT 学生基本信息表.*, 学生基本信息表.出生日期 FROM 学生基本信息表WHERE (((Month([出生日期]))=9) AND ((Day([出生日期]))=1)); 6 SELECT 学生基本信息表.* FROM 学生基本信息表WHERE (((学生基本信息表.学生姓名) Like "李*")); 3 实验结果 4

结构力学实验

结构力学 桁架结构受力性能实验报告 学号:1153377 姓名:周璇 专业:土木工程 实验时间:2016年05月04日周三,中午12:30-13:30 实验指导教师:陈涛 理论课任课教师:陈涛

一、实验目的 (1)参加并完成规定的实验项目内容,理解和掌握结构的实验方法和实验结果,通过 实践掌握试件的设计、实验结果整理的方法。 (2)进行静定、超静定结构受力的测定和影响线的绘制。 二、结构实验 (一)空间桁架受力性能概述 桁架在受结点荷载时,两边支座处产生反力,桁架中各杆件产生轴力,如图1.1为在抛物线桁架结点分别加载时结构示意图。用Q235钢材,桁架跨度6?260=1560mm ,最大高度260mm 。杆件之间为铰接相连。杆件直径为8mm 。 图1.1 (二)实验装置 图1.2为框架结构侧向受力实验采用的加载装置,25kg 挂钩和25kg 砝码。采用单结点集中力加载,由砝码、挂钩施加拉力,应变片测算待测杆件应变。结构尺寸如图1.2所示。 图1.2 (三)加载方式 简单多次加载,将挂钩和砝码依次施加在各个结点,待应变片返回数据稳定后,进行采集。采集结束后卸下重物,等待应变片数值降回初始值后再向下一节点施加荷载,重复采集操作。 (四)量测内容 需要量测桁架待测杆件的应变值在前后四对桁架杆布置单向应变片,具体布置位置如图 1.2 所示,即加粗杆件上黏贴应变片。 三、实验原理 对桁架上的5个位置分别施加相同荷载,记录不同条件下各杆件的应变值。 由公式 2 4 F A E d A σσεπ? ?=? =???=?

可以得到 24 d E F πε = 其中: F ——杆件轴力 E ——Q235钢弹性模量 d ——杆件直径 ε ——杆件应变值 σ ——杆件应力 A ——杆件横截面积 因而可以求得各杆件轴力,进而得到不同杆件的轴力影响线。 四、实验步骤 (1)将载荷挂在加载位置1,待应变片返回数据稳定后,采集相应应变数据。 (2)待应变片数值降回初始值后,重复(1)中操作,将荷载分别挂在加载位置2,3,4,5,分别采集记录各自对应的各杆件应变数据。 五、实验结果与整理 将对应位置杆件应变值取平均值,得到所示一榀桁架四根杆件的应变值如表2.2所示。

数据结构实验报告及心得体会

2011~2012第一学期数据结构实验报告 班级:信管一班 学号:201051018 姓名:史孟晨

实验报告题目及要求 一、实验题目 设某班级有M(6)名学生,本学期共开设N(3)门课程,要求实现并修改如下程序(算法)。 1. 输入学生的学号、姓名和 N 门课程的成绩(输入提示和输出显示使用汉字系统), 输出实验结果。(15分) 2. 计算每个学生本学期 N 门课程的总分,输出总分和N门课程成绩排在前 3 名学 生的学号、姓名和成绩。 3. 按学生总分和 N 门课程成绩关键字升序排列名次,总分相同者同名次。 二、实验要求 1.修改算法。将奇偶排序算法升序改为降序。(15分) 2.用选择排序、冒泡排序、插入排序分别替换奇偶排序算法,并将升序算法修改为降序算法;。(45分)) 3.编译、链接以上算法,按要求写出实验报告(25)。 4. 修改后算法的所有语句必须加下划线,没做修改语句保持按原样不动。 5.用A4纸打印输出实验报告。 三、实验报告说明 实验数据可自定义,每种排序算法数据要求均不重复。 (1) 实验题目:《N门课程学生成绩名次排序算法实现》; (2) 实验目的:掌握各种排序算法的基本思想、实验方法和验证算法的准确性; (3) 实验要求:对算法进行上机编译、链接、运行; (4) 实验环境(Windows XP-sp3,Visual c++); (5) 实验算法(给出四种排序算法修改后的全部清单); (6) 实验结果(四种排序算法模拟运行后的实验结果); (7) 实验体会(文字说明本实验成功或不足之处)。

三、实验源程序(算法) Score.c #include "stdio.h" #include "string.h" #define M 6 #define N 3 struct student { char name[10]; int number; int score[N+1]; /*score[N]为总分,score[0]-score[2]为学科成绩*/ }stu[M]; void changesort(struct student a[],int n,int j) {int flag=1,i; struct student temp; while(flag) { flag=0; for(i=1;ia[i+1].score[j]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; flag=1; } for(i=0;ia[i+1].score[j]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; flag=1;

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