当前位置:文档之家› 课程设计报告—稀疏矩阵的完全链表表示及其运算

课程设计报告—稀疏矩阵的完全链表表示及其运算

课程设计报告—稀疏矩阵的完全链表表示及其运算
课程设计报告—稀疏矩阵的完全链表表示及其运算

合肥学院

计算机科学与技术系

课程设计报告

2014 ~2015 学年第2 学期

课程数据结构与算法

稀疏矩阵的完全链表表示及其运算课程设计名称

学生姓名

学号

专业班级13软件工程(2)班

指导教师陈老师

20 15 年1 月

稀疏矩阵的完全链表表示及其运算

【问题描述】

稀疏矩阵的每个结点包含down,right,row,col和value五个域。用单独一个结点表示一个非零项,并将所有结点连接在一起,形成两个循环链表。使得第一个表即行表,把所有结点按照行序(同一行内按列序)用right域链接起来。使得第二个表即列表,把所有结点按照列序(同一列内按行序)用down链接起来。这两个表共用一个头结点。另外,增加一个包含矩阵维数的结点。稀疏矩阵的这种存储表示称为完全链表表式。

实现一个完全链表系统进行稀疏矩阵运算,并分析下列操作函数的计算时间和额外存储空间的开销。

【设计目的】

认识和掌握稀疏矩阵的完全链表表示;能够建立并运用这种存储结构

【基本要求】

建立一个用户友好、菜单式系统进行下列操作,并使用合当的测试数据测试该系统。

读取一个稀疏矩阵建立其完全链表表示

输出一个稀疏矩阵的内容

删除一个稀疏矩阵

两个稀疏矩阵相加

两个稀疏矩阵相减

两个稀疏矩阵相乘

稀疏矩阵的转置

【实现提示]

链表上的操作。

二、数据结构的选择和概要设计

(一)、问题分析

1、功能要求:根据用户输入的矩阵,实现稀疏矩阵的求和运算,并输出结果。

2、输入要求:矩阵的数据在程序运行的时候由用户提供,先由用户输入稀疏矩阵的行数、列数和非零元个数。再根据非零元个数,输入这些非零元,还需要用户为这些非零元输入行、列和非零元的值。这样,一个稀疏矩阵就输入完成。

3、用单链表存储非零元素的结点信息,并且将之用矩阵的形式打印出来(二)、概要设计

1、结构体的定义

typedef int ElemType;

struct OLNode

{

int i,j; //非零元所在行、列

ElemType e;//非零元值

OLNode *right,*down;

};

typedef OLNode *OLink;

struct CrossList

{

OLink *rhead,*chead;//行、列表头的头节点

int mu,nu,tu;//矩阵的行、列和非零元个数

};

2、存储结构选择

采用十字链表存储稀疏矩阵,它是稀疏矩阵链式表示的一种较好的表示方法。在十字链表中,每一个非零矩阵元素存储在一个结点内。每一个节点除了存储非零元素的三元组以外,还设置了right和down两个指针,分别指向同一行的下一个非零元素结点和同一列的下一个非零元的结点。

3、主函数

主函数包括相加、相减、相乘的各个子函数。

4、菜单

具有选择功能的用户友好、菜单式系统,可以选择相应的功能来处理输入的数据。

三、详细设计和编码

1.设计表示

(1)函数调用关系图

主函数

1、相加

2、相减

3、相乘非零元OVERFLOW

(2)算法思想

稀疏矩阵的每个结点包含down,right,row,col和value五个域。用单独一个结点表示一个非零项,并将所有结点连接在一起,形成两个循环链表。使得第一

个表即行表,把所有结点按照行序(同一行内按列序)用right域链接起来。使得

第二个表即列表,把所有结点按照列序(同一列内按行序)用down链接起来。这

两个表共用一个头结点。另外,增加一个包含矩阵维数的结点。稀疏矩阵的这种存

储表示称为完全链表表式。

(3)主要编码

int Create(CrossList &M)

{

int i,j,k,m,n,t;

ElemType e;

OLNode *p,*q;

printf("请输入稀疏距阵的行数列数非零元的个数:");

scanf("%d%d%d",&m,&n,&t);

M.mu=m;

M.nu=n;

M.tu=t;

M.rhead=(OLink*)malloc((m+1)*sizeof(OLink));

if(!M.rhead)

exit(OVERFLOW);

M.chead=(OLink*)malloc((n+1)*sizeof(OLink));

if(!M.chead)

exit(OVERFLOW);

for(k=0;k!=m;k++)//初始化行头指针

M.rhead[k]=NULL;

for(k=0;k!=n;k++)//初始化列头指针

M.chead[k]=NULL;

printf("请按任意次序输入%d个非零元的行列元素值:\n",M.tu); for(k=0;k

{

scanf("%d%d%d",&i,&j,&e);

if(i>m||j>n)

{

printf("你输入的元素不在矩阵中请检查重输:\n");

exit(OVERFLOW);

}

else

{

p=(OLNode*)malloc(sizeof(OLNode));

if(!p)

exit(OVERFLOW);

p->i=i;

p->j=j;

p->e=e;

if(M.rhead[i]==NULL||M.rhead[i]->j>j)//p插入该行第一节点处{

p->right=M.rhead[i];

M.rhead[i]=p;

}

else//寻找行表插入位置

{

for(q=M.rhead[i];q->right&&q->right->jright);

p->right=q->right;//完成行插入

q->right=p;

}

if(M.chead[j]==NULL||M.chead[j]->i>i)//p插入该列第一节点处{

p->down=M.chead[j];

M.chead[j]=p;

}

else//寻找列表插入位置

{

for(q=M.chead[j];q->down&&q->down->idown);

p->down=q->down;//完成列插入

q->down=p;

}

}

}

return OK;

}

int Print(CrossList M)

{

int i,j,k;

OLink p;

int array[100][100];

for(i=0;i!=M.mu;i++)

{

for(j=0;j!=M.nu;j++)

{

array[i][j]=0;//初始化数组所需部分

}

}

for(k=0;k!=M.nu;k++)

{

p=M.chead[k];

while(p)

{

array[p->i][p->j]=p->e;//将非零元存入数组中

p=p->down;

}

}

for(i=0;i!=M.mu;i++)

{

for(j=0;j!=M.nu;j++)

{

if(j==M.nu-1)

cout<

else

cout<

}

return OK;

}

int Add(CrossList M,CrossList N,CrossList &Q)

{

int i,k;

OLink p,pq,pm,pn;

OLink *col;

Q.mu=M.mu;//初始化Q

Q.nu=M.nu;

Q.tu=0;

Q.rhead=(OLink*)malloc((Q.mu+1)*sizeof(OLink));

if(!Q.rhead)

exit(OVERFLOW);

Q.chead=(OLink*)malloc((Q.nu+1)*sizeof(OLink));

if(!Q.chead)

exit(OVERFLOW);

for(k=0;k!=Q.mu;k++)//初始化行

Q.rhead[k]=NULL;

for(k=0;k!=Q.nu;k++)//初始化列

Q.chead[k]=NULL;

col=(OLink*)malloc((Q.nu+1)*sizeof(OLink));//生成指向列的最后节点的数组if(!col)

exit(OVERFLOW);

for(k=0;k!=Q.nu;k++)//赋初始值

col[k]=NULL;

for(i=0;i!=M.mu;i++)//按行序相加

{

pm=M.rhead[i];

pn=N.rhead[i];

while(pm&&pn)

{

if(pm->jj)//矩阵M当情前结点的列小于矩阵N当前结点的列

{

p=(OLink)malloc(sizeof(OLNode));//生成Q的结点

if(!p)

exit(OVERFLOW);

Q.tu++; //非零元个数+1

p->i=i; //赋值

p->j=pm->j;

p->e=pm->e;

p->right=NULL;

pm=pm->right; //pm右移

}

else if(pm->j>pn->j)

{

p=(OLink)malloc(sizeof(OLNode));

if(!p)

exit(OVERFLOW);

Q.tu++;

p->i=i;

p->j=pn->j;

p->e=pn->e;

p->right=NULL;

pn=pn->right;

}

else if(pm->e+pn->e)//M,N当前结点的列相同并且两元素之和非零{

p=(OLink)malloc(sizeof(OLNode));

if(!p)

exit(OVERFLOW);

Q.tu++;

p->i=i;

p->j=pn->j;

p->e=pm->e+pn->e;

p->right=NULL;

pm=pm->right;//pm右移

pn=pn->right;//pn右移

}

else//两元素相加为零

{

pm=pm->right;

pn=pn->right;

continue;

}

if(Q.rhead[i]==NULL)

Q.rhead[i]=pq=p;

else

{

pq->right=p;//完成行插入

pq=pq->right;

}

if(Q.chead[p->j]==NULL)

Q.chead[p->j]=col[p->j]=p;

else

{

col[p->j]->down=p;//完成列插入

col[p->j]=col[p->j]->down;

}

}

while(pm)//将矩阵M该行的剩余元素插入矩阵Q

{

p=(OLink)malloc(sizeof(OLNode));

if(!p)

exit(OVERFLOW);

Q.tu++;

p->i=i;

p->j=pm->j;

p->e=pm->e;

p->right=NULL;

pm=pm->right;

if(Q.rhead[i]==NULL)

Q.rhead[i]=pq=p;

else

{

pq->right=p;

pq=pq->right;

}

if(Q.chead[p->j]==NULL)

Q.chead[p->j]=col[p->j]=p;

else

{

col[p->j]->down=p;

col[p->j]=col[p->j]->down;

}

}

while(pn)//将矩阵N该行的剩余元素插入矩阵Q {

p=(OLink)malloc(sizeof(OLNode));

if(!p)

exit(OVERFLOW);

Q.tu++;

p->i=i;

p->j=pn->j;

p->e=pn->e;

p->right=NULL;

pn=pn->right;

if(Q.rhead[i]==NULL)

Q.rhead[i]=pq=p;

else

{

pq->right=p;

pq=pq->right;

}

if(Q.chead[p->j]==NULL)

Q.chead[p->j]=col[p->j]=p;

else

{

col[p->j]->down=p;

col[p->j]=col[p->j]->down;

}

}

}

for(k=0;k!=Q.nu;k++)

if(col[k])

col[k]->down=NULL;

free(col);

return OK;

}

CrossList Negative(CrossList M)

{

OLink p;

for(int j=0;j!=M.mu;j++)

{

p=M.rhead[j];

while(p)

{

p->e=-p->e;//将非零元的值反号

p=p->right;

}

}

return (M);

}

int Mult(CrossList M,CrossList N,CrossList &Q) {

int i,j,e;

OLink q,p0,q0,q1,q2;

if(M.nu!=N.mu)

{

printf("你输入的两个距阵不能进行此操作\n"); exit(OVERFLOW);

}

else

{

Q.mu=M.mu;

Q.nu=N.nu;

Q.tu=0;

Q.rhead=(OLink*)malloc((Q.mu+1)*sizeof(OLink)); if(!Q.rhead)

exit(OVERFLOW);

Q.chead=(OLink*)malloc((Q.nu+1)*sizeof(OLink)); if(!Q.chead)

exit(OVERFLOW);

for(i=0;i!=Q.mu;i++)//初始化行

Q.rhead[i]=NULL;

for(i=0;i!=Q.nu;i++)//初始化列

Q.chead[i]=NULL;

for(i=0;i!=Q.mu;i++)

for(j=0;j!=Q.nu;j++)

{

p0=M.rhead[i];

q0=N.chead[j];

e=0;

while(p0&&q0)

{

if(q0->ij)

q0=q0->down;//列后移

else if(q0->i>p0->j)

p0=p0->right;//行后移

else

{

e=e+p0->e*q0->e;//乘积累加

q0=q0->down;

p0=p0->right;//行列后移

}

}

if(e)//e不为零则插入Q

{

Q.tu++;

q=(OLink)malloc(sizeof(OLNode));

if(!q)

exit(OVERFLOW);

q->i=i;

q->j=j;

q->e=e;

q->right=NULL;

q->down=NULL;

if(!Q.rhead[i])

Q.rhead[i]=q1=q;

else

q1=q1->right=q;

if(!Q.chead[j])

Q.chead[j]=q;

else

{

q2=Q.chead[j];

while(q2->down)

q2=q2->down;

q2->down=q;

}

}

}

return OK;

}

}

四、上机调试过程

1.调试过程中遇到的主要问题是如何解决的:

由于代码是仿照网上代码参照而写出来的,网上代码是c++编写的,所以部分代码需要改写成C语言,由于C++我们没学过,所以还要通过查询书籍和网络了解C++语言如何改写成C语言,1、cout endl;语句等价于printf 例:cout<<"你输入的是"<>Select;等价于scanf("%d",&Select); 其中Select是int型3、c语言中变量的定义必须在函数的首部:

像这种的要把int j;提出来

2.对设计和编码的回顾讨论和分析:

在设计方面,主要就是算法思想的设计,以及具体函数的设计运行。在这方面,主要的算法设计思想倒不是特别的难想,主要是具体函数例如加法的函数的具体设计比较繁琐,耗费了较多时间。而在编码方面,由于c语言的学习还是在大一下学期,所以对于相关知识已经有所遗忘,所以在编码的过程遇到了不少问题需要查阅书籍,尤其涉及到具体代码的编写,更是花费了不少时间来修正调试。

五、测试结果及其分析

1、改进设想:

对于运算的界面可以更加精美有条理性一些;除此以外,可以给运算设计一个选择界面,用户可以选择进行计算和退出;

由于部分代码是参考网上案列c++编码的,我想把它改成C语言代码,丹改过来后,他总是报错,调试也找不来原因,null指没有声明,但在头文件stdio.h中已有null值得申明,最后自定义个null值得声明,还是不行,所以导致我的部分代码有些不理解,这好似一部分遗憾,希望通过以后的学习和学习中明白这些原因。

2、经验和体会:

十字链表作为存储结构表示随机稀疏矩阵,进行两矩阵的相加运算,所以首先要定义一个十字链表作为存储结构。仅有此还是不够的,还需要定义指针来指向链表中的元素。在开始的时候,老是得不到想象中的结果,通过几次的检查才发现问题出在对矩阵中的元素指向没有弄清楚,所以即使是相位置上的元素也没有处理好它们的相加问题。这个实验从最初的设计到完成,出现了很多错误,通过最终的修正发现,其实犯的都是小错误,都是些指针的问题。因为指针是我比较薄弱的环节。我发现了这些问题,所以我就要进行弥补、查缺补漏。

通过这次课程设计,敦促我将过去学习过的知识进行了温习,知识只有多巩固,才能真正的理解与领悟。

六、用户使用说明

按提示进行相关操作。

1、先运行出来:出现主界面

2、先选择你将要运算的功能,列如1、相加,然后输入你第一个稀疏矩阵的行、列、非

零元的个数,接着输入非零元素的行、列和值;

输入第二个稀疏矩阵的行、列、非零元的个数,接着输入非零元素的行、列和值;3、输入完成后,点击回车,它会显示出你所输入的第一个稀疏矩阵、第二个稀疏矩阵,

以及它们相加后得到的稀疏矩阵。

一、源程序

#include

#include

#include

#include

#define OK 1

#define ERROR 0

#define OVERFLOW -2

typedef int ElemType;

struct OLNode

{

int i,j; //非零元所在行、列

ElemType e;//非零元值

OLNode *right,*down;

};

typedef OLNode *OLink;

struct CrossList

{

OLink *rhead,*chead;//行、列表头的头节点

int mu,nu,tu;//矩阵的行、列和非零元个数

};

int Create(CrossList &M)

{

int i,j,k,m,n,t;

ElemType e;

OLNode *p,*q;

printf("请输入稀疏距阵的行数列数非零元的个数:");

scanf("%d%d%d",&m,&n,&t);

M.mu=m;

M.nu=n;

M.tu=t;

M.rhead=(OLink*)malloc((m+1)*sizeof(OLink));

if(!M.rhead)

exit(OVERFLOW);

M.chead=(OLink*)malloc((n+1)*sizeof(OLink));

if(!M.chead)

exit(OVERFLOW);

for(k=0;k!=m;k++)//初始化行头指针

M.rhead[k]=NULL;

for(k=0;k!=n;k++)//初始化列头指针

M.chead[k]=NULL;

printf("请按任意次序输入%d个非零元的行列元素值:\n",M.tu); for(k=0;k

{

scanf("%d%d%d",&i,&j,&e);

if(i>m||j>n)

{

printf("你输入的元素不在矩阵中请检查重输:\n");

exit(OVERFLOW);

}

else

{

p=(OLNode*)malloc(sizeof(OLNode));

if(!p)

exit(OVERFLOW);

p->i=i;

p->j=j;

p->e=e;

if(M.rhead[i]==NULL||M.rhead[i]->j>j)//p插入该行第一节点处{

p->right=M.rhead[i];

M.rhead[i]=p;

}

else//寻找行表插入位置

{

for(q=M.rhead[i];q->right&&q->right->jright);

p->right=q->right;//完成行插入

q->right=p;

}

if(M.chead[j]==NULL||M.chead[j]->i>i)//p插入该列第一节点处{

p->down=M.chead[j];

M.chead[j]=p;

}

else//寻找列表插入位置

{

for(q=M.chead[j];q->down&&q->down->idown);

p->down=q->down;//完成列插入

q->down=p;

}

}

}

return OK;

}

int Print(CrossList M)

{

int i,j,k;

OLink p;

int array[100][100];

for(i=0;i!=M.mu;i++)

{

for(j=0;j!=M.nu;j++)

{

array[i][j]=0;//初始化数组所需部分

}

}

for(k=0;k!=M.nu;k++)

{

p=M.chead[k];

while(p)

{

array[p->i][p->j]=p->e;//将非零元存入数组中

p=p->down;

}

}

for(i=0;i!=M.mu;i++)

{

for(j=0;j!=M.nu;j++)

{

if(j==M.nu-1)

cout<

else

cout<

}

}

return OK;

}

int Add(CrossList M,CrossList N,CrossList &Q)

{

int i,k;

OLink p,pq,pm,pn;

OLink *col;

Q.mu=M.mu;//初始化Q

Q.nu=M.nu;

Q.tu=0;

Q.rhead=(OLink*)malloc((Q.mu+1)*sizeof(OLink));

if(!Q.rhead)

exit(OVERFLOW);

Q.chead=(OLink*)malloc((Q.nu+1)*sizeof(OLink));

if(!Q.chead)

exit(OVERFLOW);

for(k=0;k!=Q.mu;k++)//初始化行

Q.rhead[k]=NULL;

for(k=0;k!=Q.nu;k++)//初始化列

Q.chead[k]=NULL;

col=(OLink*)malloc((Q.nu+1)*sizeof(OLink));//生成指向列的最后节点的数组if(!col)

exit(OVERFLOW);

for(k=0;k!=Q.nu;k++)//赋初始值

col[k]=NULL;

for(i=0;i!=M.mu;i++)//按行序相加

{

pm=M.rhead[i];

pn=N.rhead[i];

while(pm&&pn)

{

if(pm->jj)//矩阵M当情前结点的列小于矩阵N当前结点的列{

p=(OLink)malloc(sizeof(OLNode));//生成Q的结点

if(!p)

exit(OVERFLOW);

Q.tu++; //非零元个数+1

p->i=i; //赋值

p->j=pm->j;

p->e=pm->e;

p->right=NULL;

pm=pm->right; //pm右移

}

else if(pm->j>pn->j)

{

p=(OLink)malloc(sizeof(OLNode));

if(!p)

exit(OVERFLOW);

Q.tu++;

p->i=i;

p->j=pn->j;

p->e=pn->e;

p->right=NULL;

pn=pn->right;

}

else if(pm->e+pn->e)//M,N当前结点的列相同并且两元素之和非零{

p=(OLink)malloc(sizeof(OLNode));

if(!p)

exit(OVERFLOW);

Q.tu++;

p->i=i;

p->j=pn->j;

p->e=pm->e+pn->e;

p->right=NULL;

pm=pm->right;//pm右移

pn=pn->right;//pn右移

}

else//两元素相加为零

{

pm=pm->right;

pn=pn->right;

continue;

}

if(Q.rhead[i]==NULL)

Q.rhead[i]=pq=p;

else

{

pq->right=p;//完成行插入

pq=pq->right;

}

if(Q.chead[p->j]==NULL)

Q.chead[p->j]=col[p->j]=p;

else

{

col[p->j]->down=p;//完成列插入

col[p->j]=col[p->j]->down;

}

}

while(pm)//将矩阵M该行的剩余元素插入矩阵Q {

p=(OLink)malloc(sizeof(OLNode));

if(!p)

exit(OVERFLOW);

Q.tu++;

p->i=i;

p->j=pm->j;

p->e=pm->e;

p->right=NULL;

pm=pm->right;

if(Q.rhead[i]==NULL)

Q.rhead[i]=pq=p;

else

{

pq->right=p;

pq=pq->right;

}

if(Q.chead[p->j]==NULL)

Q.chead[p->j]=col[p->j]=p;

else

{

col[p->j]->down=p;

col[p->j]=col[p->j]->down;

}

}

while(pn)//将矩阵N该行的剩余元素插入矩阵Q {

p=(OLink)malloc(sizeof(OLNode));

if(!p)

exit(OVERFLOW);

Q.tu++;

p->i=i;

p->j=pn->j;

p->e=pn->e;

p->right=NULL;

pn=pn->right;

if(Q.rhead[i]==NULL)

Q.rhead[i]=pq=p;

else

{

pq->right=p;

pq=pq->right;

}

if(Q.chead[p->j]==NULL)

Q.chead[p->j]=col[p->j]=p;

else

{

col[p->j]->down=p;

col[p->j]=col[p->j]->down;

}

}

}

for(k=0;k!=Q.nu;k++)

if(col[k])

col[k]->down=NULL;

free(col);

return OK;

}

CrossList Negative(CrossList M)

{

OLink p;

for(int j=0;j!=M.mu;j++)

{

p=M.rhead[j];

while(p)

{

p->e=-p->e;//将非零元的值反号

p=p->right;

}

}

return (M);

}

int Mult(CrossList M,CrossList N,CrossList &Q) {

int i,j,e;

OLink q,p0,q0,q1,q2;

if(M.nu!=N.mu)

{

printf("你输入的两个距阵不能进行此操作\n"); exit(OVERFLOW);

}

else

{

Q.mu=M.mu;

Q.nu=N.nu;

Q.tu=0;

Q.rhead=(OLink*)malloc((Q.mu+1)*sizeof(OLink)); if(!Q.rhead)

exit(OVERFLOW);

Q.chead=(OLink*)malloc((Q.nu+1)*sizeof(OLink)); if(!Q.chead)

exit(OVERFLOW);

for(i=0;i!=Q.mu;i++)//初始化行

Q.rhead[i]=NULL;

for(i=0;i!=Q.nu;i++)//初始化列

Q.chead[i]=NULL;

for(i=0;i!=Q.mu;i++)

for(j=0;j!=Q.nu;j++)

{

p0=M.rhead[i];

q0=N.chead[j];

e=0;

while(p0&&q0)

{

if(q0->ij)

q0=q0->down;//列后移

else if(q0->i>p0->j)

理论力学实验报告

实验一求不规则物体的重心 一、实验目的:用悬吊法和称重法求出不规则物体的重心的位置。 二、实验设备仪器:ZME-1型理论力学多功能实验台,直尺、积木、磅秤、胶带、白纸等。 三、实验原理方法简述 (一)悬吊法求不规则物体的重心 适用于薄板形状的物体,先将纸贴于板上,再在纸上描出物体轮廓,把物体悬挂于任意一点A,如图1-1(a)所示,根据二力平衡公理,重心必然在过悬吊点的铅直线上,于是可在与板贴在一起的纸上画出此线。然后将板悬挂于另外一点B,同样可以画出另外一条直线。两直线的交点C就是重心,如图1-1(b)所示。 A (a) 图1-1 (二)称重法求轴对称物体的重心 对于由纵向对称面且纵向对称面内有对称轴的均质物体,其重心必在对称轴上。

图1-2 首先将物体支于纵向对称面内的两点,测出两个支点间的距离l ,其中一点置于磅秤上,由此可测得B 处的支反力N1F 的大小,再将连杆旋转180O ,仍然保持中轴线水平,可测得N2F 的大小。重心距离连杆大头端支点的距离C x 。根据平面平行力系,可以得到下面的两个方程: C 1N N21N =?-?=+x W l F W F F 根据上面的方程,可以求出重心的位置: N2 N11N F F l F x C +?= 四、实验数据及处理 (一)悬吊法求不规则物体的重心 (二)称重法求对称连杆的重心。 a.将磅秤和支架放置于多功能台面上。将连杆的一断放于支架上,另一端放于支架上,使连杆的曲轴中心对准磅秤的中心位置。并利用积木块调节连杆的中心位置使它成水平。记录此时磅秤的读数 F N1=1375g b.取下连杆,记录磅秤上积木的重量F J1=385g c.将连杆转?180,重复a 步骤,测出此时磅秤读数F N2=1560g d.取下连杆,记录磅秤上积木的重量F J1=0g

链表实验报告

C语言程序设计实验报告 实验一:链表的基本操作一·实验目的 1.掌握链表的建立方法 2.掌握链表中节点的查找与删除 3.掌握输出链表节点的方法 4.掌握链表节点排序的一种方法 5.掌握C语言创建菜单的方法 6.掌握结构化程序设计的方法 二·实验环境 1.硬件环境:当前所有电脑硬件环境均支持 2.软件环境:Visual C++6.0 三.函数功能 1. CreateList // 声明创建链表函数 2.TraverseList // 声明遍历链表函数 3. InsertList // 声明链表插入函数 4.DeleteTheList // 声明删除整个链表函数 5. FindList // 声明链表查询函数 四.程序流程图 五.程序代码 #include #include typedef int Elemtype; typedef int Status; typedef struct node//定义存储节点 { int data;//数据域 struct node *next;//结构体指针 } *linklist,node;//结构体变量,结构体名称 linklist creat (int n)//创建单链表 { linklist head,r,p;//定义头指针r,p,指针 int x,i; head=(node *)malloc(sizeof(node));//生成头结点

r=head;//r指向头结点 printf("输入数字:\n"); for(i=n;i>0;i--)//for 循环用于生成第一个节点并读入数据{ scanf("%d",&x); p=(node *)malloc(sizeof(node)); p->data=x;//读入第一个节点的数据 r->next=p;//把第一个节点连在头结点的后面 r=p;//循环以便于生成第二个节点 } r->next=0;//生成链表后的断开符 return head;//返回头指针 } void output (linklist head)//输出链表 { linklist p; p=head->next; do { printf("%3d",p->data); p=p->next; } while(p); printf("\n") } Status insert ( linklist &l,int i, Elemtype e)//插入操作 { int j=0; linklist p=l,s; while(jnext; ++j; } if(!p || j>i-1) return -1; else { s=(node *)malloc(sizeof(node)); s->data=e; s->next=p->next; p->next=s; return 1; } } Status delect ( linklist &l,int i, Elemtype &e)//删除操作 { int j=0; linklist p=l,q; while(jnext) { p=p->next; ++j; } if(!p->next || j>i-1) return -1;

数值计算方法课程设计(C语言)

数值计算方法课程设计 姓名 学号 成绩

课程实际报告 实验一:秦九韶算法 题目 用选列主元高斯消去法解线性方程组 ???????=+- =-+-=-+-=--02 02 0 21 34343232121x x x x x x x x x x 算法语言: 利用c 语言的知识编写该算法程序 算法步骤叙述: 秦九昭算法的基思路是v[0]=a[0]*x+a[1] v[i]=v[i-1]*x+a[i+1];利用秦九昭算法计算多项式函数。 程序清单: #include void main() { float a[5],x,sum; int i; printf("presase input the value of x="); scanf("%f",&x); for (i =5;i >=0;i --) { printf("please input the value of a%d=",i); scanf("%f",&a[i]); } sum =a[5];

for(i=5;i>=1;i--) {sum=sum*x+a[i-1]; } printf("f(x)=%f/n",sum); } 输出结果计算:

实验总结: 通过运用C 语言,解决了秦九韶算法手写的复杂。为以后的雪地打下基础。 实验二:用选列主元高斯消去法解线性方程组 题目 用选列主元高斯消去法解线性方程组 ???????=+- =-+-=-+-=--02 0 2 0 21 34343232121x x x x x x x x x x 算法步骤叙述 第一步消元——在增广矩阵(A,b )第一列中找到绝对值最大的元素,将其所在行与第一行交换,再对(A,b )做初等行变换使原方程组的第一列元素除了第一行的全变为0; 第二步消元——在增广矩阵(A,b )中第二列中(从第二行开始)找到绝对值最大的元素,将其所在行与第二行交换,再对(A,b )做初等行变换使原方程组的第二列元素除了第一和第二行的全变为0; 第三步消元——在增广矩阵(A,b )中第三列中(从第三行开始)找到绝对值最大的元素,将其所在行与第三行交换,再对(A,b )做初等行变换使原方程组的第三列第四行元素为0; 第四,按x4-x3-x2-x1的顺序回代求解出方程组的解,x[n]=b[n]/a[n][n],x[i]=(b[i]-Σa[i][j]x[j])/a[i][i],i=n-1,…,2,1 程序清单: #include #include #define N 4 static double A[N][N] = {-3,-1,0,0,-1,2,-1,0,0,-1,2,-1,0,0,-1,2}; static double B[N]={1,0,0,0};

数据结构课程设计之稀疏矩阵实现与应用1

数据结构课程设计报告 题目:十字链表成为存储结构,实现稀疏矩阵的求和运算 学生姓名:张旋 班级:软件三班学号:201213040304 指导教师: 吴小平

一、需求分析 1.问题描述: 要求:十字链表下的稀疏矩阵的加、转、乘的实现。 2.基本功能 实现十字链表下的转置,乘法,加法运算。 3.输入输出 (1)设计函数建立稀疏矩阵,初始化值。 (2)设计函数输出稀疏矩阵的值。 (3)构造函数进行两个稀疏矩阵相加,输出最终的稀疏矩阵。 (4)构造函数进行两个稀疏矩阵的相乘,输出最终的稀疏矩阵。 (5)构造函数进行稀疏矩阵的转置,并输出结果。 (6)退出系统。 二、概要设计 1.设计思路: 本实验要求在三元组,十字链表下实现稀疏矩阵的加、转、乘。首先要进行矩阵的初始化操作,定义三元组和十字链表的元素对象。写出转置,加法,乘法的操作函数。通过主函数调用实现在一个程序下进行矩阵的运算操作。 2.数据结构设计: 抽象数据类型稀疏矩阵的定义如下: ADT SparseMatrix{ 数据对象:D={aij | i=1,2,…,m; j=1,2,..,n; aij∈Elemset, m和n分别称为矩阵的行数和列数。} 数据关系:R={Row,Col} Row={ | 1<=i<=m, 1<=j<=n-1} Col= { | 1<=i<=m-1, 1<=j<=n} 基本操作: CreateSMatrix(&M); 操作结果:创建稀疏矩阵M。 DestroySMatrix(&M); 初始条件:稀疏矩阵M存在。操作结果:销毁稀疏矩阵M。 PrintSMatrix(M); 初始条件:稀疏矩阵M存在。操作结果:输出稀疏矩阵M。 AddSMatrix(M,N,&Q); 初始条件:稀疏矩阵M与N的行数和列数对应相等操作结果:求稀疏矩阵的和Q=M+N。 MultSMatrix(M,N,&Q); 初始条件:稀疏矩阵M的列数等于N的行数。操作结果:求稀疏矩阵乘积Q=M*N。 TransposeSMatrix(M,&T); 初始条件:稀疏矩阵M存在。操作结果:求稀疏矩阵M的转置矩阵T。 }ADT SparseMatrix 3.软件结构设计:

结构力学课程设计报告

一. 课程设计的目的 1. 通过实验及数据分析熟练掌握结构力学求解器的使用方法,了解求解器的主要 功能,了解数据输入和输出的基本操作过程,主要参数的意义和编辑方法。 2. 通过实践进一步了解结构在广义荷载作用下内力和位移的分布状态和变化规 律,从而指导我们探索和发现更合理的结构形式,为将来的学习和科研工作打 下坚实的基础 二. 课程设计的内容 (1).对图示两类桁架进行分析 在相同荷载作用下,比较各类桁架的受力特点; 讨论各种杆件(上弦杆,下弦杆,竖杆,斜杆)内力随 随高跨比变化的规律; 若增加杆件使其成为超静定桁架,内力有何变化。 (2).两种结构在静力等效荷载作用下,内力有哪些不同? 平行弦桁架 1/2 1 1 1 1 1 1/2 三角桁1/2 1 1 1 1 1 1/2

(3)、用求解器自动求解功能求a=2和a=1.0时的各杆内力。比较两种情况内力分布,试用试算法调整a 的大小,确定使弯矩变号的临界点a 0,当a=a 0时结构是否处于无弯矩状态? (4) 、图示为一个两跨连续梁,两跨有关参数相同(l =6m ,E =1.5*106kPa ,截面0.5*0.6m 2,线膨胀系数1.0*10-5)。第一跨底部温度升高60oC ,分析变形和内力图的特点。 (4) 、计算下支撑式五角形组合屋架的内力,并分析随跨高 比变化内力变化规律。当高度确定后内力随f 1,f 2的比例不同的变化规律(四个以上算例)。 1/4 11×(1/2) 1/4 1/2 1 1 1 1 1 1/2 a a a a 3 6m 6m

一. 课程设计的数据 1. 第(1)题数据 1) 平行弦桁架 a) 高跨比1:4(每小格比例2:3) 输出图形: 输出内力值: 内力计算 杆端内力值 ( 乘子 = 1) ----------------------------------------------------------------------------------------------- 3m 3m 3m 3m f 2 f 1 f =1.2m q =1kN/m

单链表实验报告

计算机与信息技术学院综合性、设计性实验报告 一、实验目的 (1)熟悉顺序表的创建、取值、查找、插入、删除等算法,模块化程序设计方法。 二、实验仪器或设备 (1)硬件设备:CPU为Pentium 4 以上的计算机,内存2G以上 (2)配置软件:Microsoft Windows 7 与VC++6.0 三、总体设计(设计原理、设计方案及流程等) 设计原理: 单链表属于线性表,线性表的存储结构的特点是:用一组任意存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的。因此,对于某个元素来说,不仅需要存储其本身的信息,还需要存储一个指示其直接后继的信息。 设计方案: 采用模块化设计的方法,设计各个程序段,最终通过主函数实现各个程序段的功能。设计时,需要考虑用户输入非法数值,所以要在程序中写入说可以处理非法数值的代码。 设计流程: 1. 引入所需的头文件; 2. 定义状态值; 3. 写入顺序表的各种操作的代码; 写入主函数,分别调用各个函数。在调用函数时,采用if结构进行判断输 入值是否非法,从而执行相应的程序 四、实验步骤(包括主要步骤、代码分析等) #include // EOF(=A Z 或F6),NULL #in clude // srand( ) ,rand( ),exit (n) #in clude // malloc( ),alloc( ),realloc() 等 #in clude // INT_MAX 等 #in clude #in clude #in clude // floor(),ceil( ),abs() #in clude // cout,ci n #in clude // clock( ),CLK_TCK,clock_t #defi ne TRUE 1 #defi ne FALSE 0 #defi ne OK 1 #defi ne ERROR 0 #defi ne INFEASIBLE -1

数值计算方法课程设计

重庆邮电大学 数学与应用数学 专业 《数值计算方法》课程设计 姓名: 李金徽 王莹 刘姝楠 班级: 1131001 1131002 1131002 学号: 2010213542 2010213570 2010213571 设计时间: 2012-6-4 指导教师: 朱伟

一、课程设计目的 在科学计算与工程设计中,我们常会遇到求解线性方程组的问题,对于系数矩阵为低阶稠密矩阵的线性方程组,可以用直接法进行消元,而对于系数矩阵为大型稀疏矩阵的情况,直接法就显得比较繁琐,而迭代法比较适用。比较常用的迭代法有Jacobi 迭代与Gauss - seidel 迭代。本文基于两种方法设计算法,并比较他们的优劣。 二、课程设计内容 给出Jacobi 迭代法和Gauss-Seidel 迭代法求解线性方程组的算法思想和MATLAB 程序实现,并对比分析这两种算法的优劣。 三、问题的分析(含涉及的理论知识、算法等) Jacobi 迭代法 方程组迭代法的基本思想和求根的迭代法思想类似,即对于线性 方程组Ax = b( 其中n n n R b R R A ∈?∈,),即方程组 )1(2211222221211 1212111?? ???? ?=+?++??=+?++=+?++n n nn n n n n n n b x a x a x a b x a x a x a b x a x a x a 将系数矩阵A 写为 )2(000000 21122 12122 11U L D a a a a a a a a a A n n n n nn --≡??? ?? ? ? ??---- ??????? ??----??????? ??= 若选取D M =,则U L A M N +=-=,方程组)1(转化为等价方程组 b x U L Dx ++=)(

三元组顺序表稀疏矩阵课程设计报告(不完整)

1.稀疏矩阵运算器

数据结构课程设计任务书 针对本课程设计,完成以下课程设计任务: 1、熟悉系统实现工具和上机环境。 2、根据课程设计任务,查阅相关资料。 3、针对所选课题完成以下工作: (1)需求分析 (2)概要分析 (3)详细设计 (4)编写源程序 (5)静态走查程序和上机调试程序 4、书写上述文档和撰写课程设计报告。

3.课程设计报告目录

4.正文 (1)问题描述 稀疏矩阵是指那些多数元素为零的矩阵。利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算频率。实现一个能进行稀疏矩阵基本运算的运算器。 (2)需求分析 本课程设计的稀疏矩阵运算器在visual studio 2013下运行调试成功,可以实现的功能有: 1.矩阵运算方式选择 2.根据提示输入相应数据 3.显示最终结果 使用的主要存储结构为三元组,并用三元组形式进行运算。所有参与运算数据类型为整形,因此输入的数据应为整形数据。为了节省存储空间使用三元组数据进行运算,可以通过多次扫描三元组数据来实现,即使用嵌套循环函数。输出结果为通常的阵列形式,因此使用了右对齐,保证输出形式的整齐。 (3)概要分析 本次课程设计中定义的结构体 typedef struct { int i, j;//矩阵元素所在行列 int v;//元素的值 }triple; typedef struct { triple data[MAXSIZE]; triple cop[MAXSIZE];//辅助数组 int m, n, t;//矩阵的行列数 }tripletable; Main函数调用子函数时输入1为调用 int Push_juzhen(int m, int n, int count)函数,可以实现矩阵相加功能 输入2为调用 int Dec_juzhen(int m, int n, int count)函数,可实现矩阵相减功能 输入3为调用 int Mul_juzhen()函数,可以实现矩阵相乘功能 (4)详细分析(流程图伪代码) 加法函数 int Push_juzhen(int m, int n, int count)//矩阵相加(行,列,矩阵数) { // p行,q列,s非零元素个数,v元素值 //ucount对数组下标计数的变量,与变量x实现多个矩阵相加 for (int c = 0; c < count; c++) { int x = 0; cout << "请输入第" << c + 1 << "个矩阵的非零元素个数" << endl; cin >> s; cout << "请依次输入非零元素所在行和列以及该非零元素的值并以空格隔开" << endl; for (; x< s; x++)//传递行列及元素值

力学实验报告汇总

力学实验报告 年月日学院(系)姓名 专业和班级组学号 实验名称低碳钢、铸铁拉伸、压缩时力学性能的测定 实验目的 实验设备和试样 试件尺寸(材料拉伸数据) 实验前材料截面I do(mm) 截面Ⅱ do(mm) 截面Ⅲ do(mm) 最小 直径do 最小横截 A (mm2) 原始标距长 度L (mm)低 铸 实验后 断口(颈缩)出最小直径d 1 (mm) 断口(颈 缩) 最小面积 A 1 断后标距长 度L 1 (mm) 低 铸 机械性实验记录及计算结果低碳钢铸铁屈服载荷 P s (KN) 能最大载荷 P b (KN) 屈服极限ζ s (MP a )

强度极限ζ b (MP a ) 塑性指标延伸率δ%截面收缩率ψ% 材 料 低碳钢铸铁 拉 伸 图 P L P L 断 口 形 状 材料压缩数据 试件尺寸低碳钢铸铁 机 械 性 能实验记录及计算结果低碳钢铸铁 直径d 0(mm) 屈服载荷 P s (KN) 最大载荷 P b (KN) 高度h 0(mm) 屈服极限ζ s (MP a ) 面积A (mm2) 强度极限ζ b (MP a )

材料低碳钢铸铁 压 缩 图 P L P L 断 口 形 状 思考讨论题 1.参考试验机绘出的拉伸图,分析从试件加力至断裂的过程可分为几个阶段? 相应于每一阶段的拉伸曲线的特点和物理意义是什么? 2.由拉伸实验测定的材料机械性能在工程上有何实用价值? 3.为什么铸铁试件压缩时沿450的方向破裂? 4.由低碳钢和铸铁拉伸与压缩的试验结果,归纳整理塑性材料和脆性材料的力学 性能及破坏形式?

年月日学院(系)姓名 专业和班级组学号 实验名称扭转实验 实验目的 实验设备和试样 试件尺寸 机 械 性 能实验纪录及计算结果低碳钢铸铁 材料低碳钢铸铁屈服扭矩T S (N.M) 直径 d 0(mm) 最大扭矩T b (N.M) 屈服扭转角0 截面积 A 0(mm) 最大扭转角0 屈服极限η s (Mp a ) 标距长度L0(mm) 强度极限η b (Mp a ) 材料低碳钢铸铁 断口 形状 思考题 1.试分析两种材料的破坏断口为何不同?

链表实验报告

链表实验报告

————————————————————————————————作者: ————————————————————————————————日期:

《数据结构》实验报告二 系别:嵌入式系统工程系班级:嵌入式11003班 学号:11160400314姓名:孙立阔 日期:2012年4月9日指导教师:申华 一、上机实验的问题和要求: 单链表的查找、插入与删除。设计算法,实现线性结构上的单链表的产生以及元素的查找、插入与删除。具体实现要求: 1.从键盘输入10个字符,产生不带表头的单链表,并输入结点值。 2.从键盘输入1个字符,在单链表中查找该结点的位置。若找到,则显示“找到了”;否则, 则显示“找不到”。 3.从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插 入在对应位置上,输出单链表所有结点值,观察输出结果。 4.从键盘输入1个整数,表示欲删除结点的位置,输出单链表所有结点值,观察输出结果。 5.将单链表中值重复的结点删除,使所得的结果表中个结点值均不相同,输出单链表所有结 点值,观察输出结果。 6.删除其中所有数据值为偶数的结点,输出单链表所有结点值,观察输出结果。 7.(★)将单链表分解成两个单链表A和B,使A链表中含有原链表中序号为奇数的元素, 而B链表中含有原链表中序号为偶数的元素,且保持原来的相对顺序,分别输出单链表A和单链表B的所有结点值,观察输出结果。 二、程序设计的基本思想,原理和算法描述: (包括程序的结构,数据结构,输入/输出设计,符号名说明等) 创建一个空的单链表,实现对单链表的查找,插入,删除的功能。 三、源程序及注释: #defineOK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 #define TRUE 1

JAVA实现计算器课程设计

JAVA实现计算器课程设计 计算机科学系 计应0701班 指导老师:刘其昌 设计人员:陈秀桃 设计日期:2009年11月10日——2009年12月20日 计算器的设计 目录 第一章绪 论 ..................................................................... .. (2)

1.1 开发环 境 ..................................................................... . (2) 1.2 基本功能介 绍 ..................................................................... ......... 2 第二章系统设 计 ..................................................................... (3) 2.1 系统流程 图 ..................................................................... . (3) 2.2 系统功能框 图 ..................................................................... (3) 2.3 需求分 析 ..................................................................... ................ 4 第三章软件设 计 ..................................................................... (5) 3.1 界面设 计 ..................................................................... . (5) 3.2 代码设 计 .....................................................................

数据结构----稀疏矩阵运算器课程设计报告书

科技大学 数据结构课程设计说明书 题目:稀疏矩阵运算器设计 学生: 学号: 专业:计算机科学与技术 班级:计09-1班 指导教师:月峰 2011 年 6 月 24 日

稀疏矩阵运算器设计 摘要 摘要:设计一稀疏矩阵运算器。实现转置,相加,相乘的功能。用“带行逻辑信息”的三元组顺序表表示稀疏矩阵,实现两个矩阵相转置、相加和相乘的运算,采用分级的设计方法,分别设计出转置、加、乘运算器的子程序,相加运算时只要依次扫描两矩阵的行号和列号,若相等则相加后存入结果矩阵,不等时则存入较小的。相减运算与相加运算相同,同样比较两矩阵的行号和列号,只是不等时,若第一个小,则存入第一个的元素,若第二个小,则存入其相反数。相乘运算要先判断两矩阵能否相乘。通过给顶的行号和列号找出原矩阵对应的元素值。当在三元组表示中找到时返回其元素值,找不到时,说明该位置为0,因此返回0。然后利用该函数计算出C的行号i和列号j 处的元素值,若该值不为0,则存入矩阵,否则不存入。通过实验表明本程序能够进行稀疏矩阵的相加,相减,相乘运算。具备矩阵的加、减、乘功能。 关键词:转置运算器;相加运算器;相乘运算器

目录 稀疏矩阵运算器设计........................................................ I 摘要................................................................... II 第一章需求分析. (1) 第二章概要设计 (2) 第三章设计步骤 (6) 3.1 函数说明 (6) 3.2 设计步骤 (7) 第四章设计理论分析方法 (20) 4.1 算法一:矩阵转置 (20) 4.2 算法二:矩阵加法 (20) 4.3 算法三:矩阵乘法 (21) 第五章程序调试 (23) 第六章心得体会 (25) 参考文献 (26)

振动力学课程设计报告

振动力学课程设计报告 课设题目: 单位: 专业/班级: 姓名: 指导教师: 2011年12月22日

一、前言 1、课题目的或意义 振动力学课程设计是以培养我们综合运用所学知识解决实际问题为目的,通过实践,实现了从理论到实践再到理论的飞跃。增强了认识问题,分析问题,解决问题的能力。带着理论知识真正用到实践中,在实践中巩固理论并发现不足,从而更好的提高专业素养。为认识社会,了解社会,步入社会打下了良好的基础。 通过对GZ电磁振动给料机的振动分析与减振设计,了解机械振动的原理,巩固所学振动力学基本知识,通过分析问题,建立振动模型,在通过软件计算,培养了我们独立分析问题和运用所学理论知识解决问题的能力。 2、课题背景: 随着科学技术发展的日新月异,电磁振动给料机已经成为当今工程应用中空前活跃的领域,在生活中可以说是使用的广泛,因此掌握电磁振动给料机技术是很有必要的和重要的。 GZ系列电磁振动给料机广泛应用于矿山、冶金、煤炭、建材、轻工、化工、电力、机械、粮食等各行各业中,用于把块状、颗粒状及粉状物料从贮料仓或漏斗中均匀连续或定量地给到受料装置中去。特别适用于自动配料、定量包装、给料精度要求高的场合。例如,向带式输送机、斗式提升机,筛分设备等给料;向破碎机、粉碎机等喂料,以及用于自动配料,定量包装等,并可用于自动控制的流程中,实现生产流程的自动化。 GZ电磁振动给料机的工作原理: GZ电磁振动给料机的给料过程是利用电磁振动器驱动给料槽沿倾斜方向做直线往复运动来实现的,当给料机振动的速度垂直分量大于策略加速度时,槽中的物料将被抛起,并按照抛物线的轨迹向前进行跳跃运动,抛起和下落在1/50秒完成,料槽每振动一次槽中的物料被抛起向前跳跃一次,这样槽体以每分钟3000次的频率往复振动,物料相应地被连续抛起向前移动以达到给料目的。 GZ系列电磁振动给料机主要用途:

数据结构 稀疏矩阵运算器课程设计

数据结构----稀疏矩阵运算器课程设计 目录 稀疏矩阵运算器设计............................................................................................ I 摘要................................................................................................................ ... II 第一章需求分析 (1) 第二章概要设计 (2) 第三章设计步骤 (6) 3.1 函数说明 (6) 3.2 设计步骤 (7) 第四章设计理论分析方法 (20) 4.1 算法一:矩阵转置.....................................................................

20 4.2 算法二:矩阵加法..................................................................... 20 4.3 算法三:矩阵乘法 (21) 第五章程序调试 (23) 第六章心得体会 (25) 参考文献 (26) 第一章需求分析 1.稀疏矩阵是指那些多数元素为零的矩阵。利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。实现一个能进行稀疏矩阵基本运算的运算器。

2.以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现矩阵转置,求逆,实现两个矩阵相加、相减和相乘的运算。稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则以通常的阵列形式列出。 3.演示程序以用户和计算机的对话方式执行,数组的建立方式为边输入边建立。 4.由题目要求可知:首先应输入矩阵的行数和列数,并判别给出的两个矩阵的行、列数对于所要求作的运算是否相匹配。 5.程序可以对三元组的输入顺序不加以限制;根据对矩阵的行列,三元组作直接插入排序,从而进行运算时,不会产生错误。 6.在用三元组表示稀疏矩阵时,相加、乘积和相减所得结果矩阵应该另生成;矩阵求逆时,为了算法方便,使用二维数组存放。 7.程序在VC6.0环境下设计。 程序执行的命令为:1.稀疏矩阵转置; 2.稀疏矩阵加法; ;3. 稀疏矩阵乘法; 4.退出 的工作。 第二章概要设计 1.抽象数据类型稀疏矩阵的定义如下: ADT SparseMatrix{ 数据对象:D={a|i=1,2,…,m; j=1,2,…,n;

结构力学课程设计

结构力学课程设计报告 系别:() 专业:() 班级:() 姓名:() 指导教师:()

一、绪言 1、课程设计目的或意义: 1、通过实验及数据分析熟练掌握结构力学求解器的使用方法,了解求解器的主要功能,了解数据输入和输出的基本操作过程,主要参数的意义和编辑方法。 2、通过实践进一步了解结构在广义荷载作用下内力和位移的分布状态和变化规律,从而指导我们探索和发现更合理的结构形式,为将来的学习和科研工作打下坚实的基础 2、结构的工程应用背景简介: 此次设计的结构是桥梁结构,在生活中桥梁在交通运输中起着重要的作用,比如架在江湖、峡谷之间的桥梁起着连接两地的纽带作用。桥梁之上可以过行人、汽车、火车。极大的缩短了两地之间的距离,方便又快捷。 3、课程设计的主要内容: 一:了解明确课程设计的目的,查找工程实际中的桥梁结构 二:参考实际结构设计自己的桥梁结构。 三:估计轴力,初步选择桥梁的钢材。 四:做出内力图。 五:校核,再择钢材。 六:总结优化。

二、结构设计与荷载简化 1、结构简介 此结构形状主要由三角形组成的的下承式组合结构 2、结构参数: 本次设计的桥梁结构跨度为四十米,高二十米。结构中杆件间主要以铰接连接。根据桥梁及承载要求,材料为Q235刚,极限压应力为300MPa,E=210GPa 选择20b号工字型刚,截面面积为46.5平方厘米 3、荷载简化与分析: 设计的结构为火车通道,主要承受火车的质量。将火车看作质量分布均匀的,所受均布荷载为50KN/m

三、结构内力和变形分析 1、结构计算简图 2、内力分析 结构轴力图 结构剪力图 1 11

C语言链表实验报告

链表实验报告 一、实验名称 链表操作的实现--学生信息库的构建 二、实验目的 (1)理解单链表的存储结构及基本操作的定义 (2)掌握单链表存储基本操作 (3)学会设计实验数据验证程序 【实验仪器及环境】计算机 Window XP操作系统 三、实验内容 1、建立一个学生成绩信息(学号,姓名,成绩)的单链表,按学号排序 2、对链表进行插入、删除、遍历、修改操作。 3、对链表进行读取(读文件)、存储(写文件) 四、实验要求 (1)给出终结报告(包括设计过程,程序)-打印版 (2)对程序进行答辩

五、实验过程、详细内容 1、概念及过程中需要调用的函数 (1)链表的概念结点定义 结构的递归定义 struct stud_node{ int num; char name[20]; int score; struct stud_node *next; }; (2)链表的建立 1、手动输入 struct stud_node*Create_Stu_Doc() { struct stud_node *head,*p; int num,score; char name[20]; int size=sizeof(struct stud_node); 【链表建立流程图】

2、从文件中直接获取 先建立一个 (3)链表的遍历 (4 )插入结点 (5)删除结点 (6)动态储存分配函数malloc () void *malloc(unsigned size) ①在内存的动态存储区中分配一连续空间,其长度为size ②若申请成功,则返回一个指向所分配内存空间的起始地址的指针 ③若申请不成功,则返回NULL (值为0) ④返回值类型:(void *) ·通用指针的一个重要用途 ·将malloc 的返回值转换到特定指针类型,赋给一个指针 【链表建立流程图】 ptr ptr ptr->num ptr->score ptr=ptr->next head pt r s s->next = ptr->next ptr->next = s 先连后断 ptr2=ptr1->next ptr1->next=ptr2->next free (ptr2)

计算方法课程设计

数理学院2014级信息与计算科学 课程设计 姓名:刘金玉 学号: 3141301240 班级: 1402 成绩:

实验要求 1.应用自己熟悉的算法语言编写程序,使之尽可能具有通用性。2.上机前充分准备,复习有关算法,写出计算步骤,反复检查,调试程序。(注:在练习本上写,不上交) 3.完成计算后写出实验报告,内容包括:算法步骤叙述,变量说明,程序清单,输出计算结果,结构分析和小结等。(注:具体题目 具体分析,并不是所有的题目的实验报告都包含上述内容!)4.独立完成,如有雷同,一律判为零分! 5.上机期间不允许做其他任何与课程设计无关的事情,否则被发现一次扣10分,被发现三次判为不及格!非特殊情况,不能请 假。旷课3个半天及以上者,直接判为不及格。

目录 一、基本技能训练 (4) 1、误差分析 (4) 2、求解非线性方程 (6) 3、插值 (12) 4、数值积分 (12) 二、提高技能训练 (16) 1、 (16) 2、 (18) 三、本课程设计的心得体会(500字左右) (21)

一、基本技能训练 1、误差分析 实验1.3 求一元二次方程的根 实验目的: 研究误差传播的原因与解决对策。 问题提出:求解一元二次方程20ax bx c ++= 实验内容: 一元二次方程的求根公式为 1,22b x a -+= 用求根公式求解下面两个方程: 2210(1)320(2)1010 x x x x +-=-+= 实验要求: (1) 考察单精度计算结果(与真解对比); (2) 若计算结果与真解相差很大,分析其原因,提出新的算法(如先求1x 再 根据根与系数关系求2x )以改进计算结果。 实验步骤: 方程(1): 根据求根公式,写出程序: format long a=1;b=3;c=-2; x1=((-1)*b+sqrt(b^2-4*a*c))/2*a x2=((-1)*b-sqrt(b^2-4*a*c))/2*a

稀疏矩阵的运算课程设计

数据结构 课程设计说明书题目: 稀疏矩阵的运算 院系:计算机科学与工程学院 专业班级:计算机10-**班 学号: 201030**** 学生姓名: ****** 指导教师: ****** 2011年 12 月 28 日

安徽理工大学课程设计(论文)任务书 计算机科学与工程学院 2011年 11 月 8 日

安徽理工大学课程设计(论文)成绩评定表

目录 1 问题描述 (1) 2 需求分析 (1) 3 总体设计 (2) 3.1 Matrix结构的定义 (2) 3.2 系统流程图 (3) 4 详细设计 (4) 4.1 “菜单”界面 (4) 4.2 建立矩阵 (4) 4.3 显示矩阵 (6) 4.4 矩阵的转置 (7) 4.5 矩阵的加法运算 (8) 4.6 矩阵的减法运算 (9) 4.7 矩阵的乘法运算 (9) 5 程序运行 (11) 5.1 输入矩阵 (11) 5.2 矩阵转置 (11) 5.3 矩阵加法 (12) 5.4 矩阵减法 (12) 5.5 矩阵乘法 (12) 5.6 退出及错误提示 (13) 6 总结 (13) 参考文献 (14)

1 问题描述 (1)题目内容:设计稀疏矩阵运算系统实现两个稀疏矩阵的加法、减法、乘法以 及转置操作。 (2)基本要求: ①存储结构选择三元组存储方式; ②实现一个稀疏矩阵的转置运算; ③实现两个稀疏矩阵的加法运算; ④实现两个稀疏矩阵的减法运算; ⑤实现两个稀疏矩阵的乘法运算。 (3)设计目的:通过本次课程设计,了解稀疏矩阵的一些基本运算操作,并通过 相关的程序代码实现。 2 需求分析 经过本次的课程设计,我认为稀疏矩阵运算系统主要实现的功能如下:(1)建立矩阵:只有先建立了矩阵,才能够对矩阵进行运算操作,包括建立矩阵 A和矩阵B; (2)转置运算操作:对矩阵A或者矩阵B进行转置运算,输出相应的转置矩阵; (3)四则运算操作:该步骤由两个矩阵同时参与,对其进行加法运算(A+B)、减 法运算(A-B)以及乘法运算(A*B和B*A); (4)退出:当做完矩阵的运算操作之后,就可以点击它退出该界面。 在这次设计中用到了一些变量和函数,例如:void Display(Matrix M);int Max(int i,int j);Matrix Zero(Matrix M)等,下面会做进一步详细的介绍。

工程力学拉伸实验报告

试验目的: 1. 测定低碳钢(塑性材料)的弹性摸量E;屈服极限σs 等机械性能。 2.测定灰铸铁(脆性材料)的强度极限σb 3.了解塑性材料和脆性材料压缩时的力学性能。 材料拉伸与压缩实验指导书 低碳钢拉伸试验 拉伸试验的意义: 单向拉伸试验是在常温下以缓慢均匀的速度对专门制备的试件施加轴向载荷,在试件加载过程中观测载荷与变形的关系,从而决定材料有关力学性能。通过拉伸试验可以测定材料在单向拉应力作用下的弹性模量及屈服强度、抗拉强度、延伸率、截面收缩率等指标。其试验方法简单且易于得到较可靠的试验数据,所以是研究材料力学性能最基本、应用最广泛的试验。 操作步骤: 1.试验设备:WDW-3050电子万能试验机 2.试件准备:用游标卡尺测量试件试验段长度l0和截面直径d0,并作记录。 3.打开试验机主机及计算机等相关设备。 4.试件安装(详见WDW3050电子万能试验机使用与操作三.拉伸试件的安装)。 5.引伸计安装(用于测量E, 详见WDW3050电子万能试验机使用与操作四.引伸计安装)。 6.测量参数的设定: 7.再认真检查一遍试件安装等试验准备工作。 8.负荷清零,轴向变形清零,位移清零。 9.开始进行试验,点击试验开始。 10.根据提示摘除引伸计。 11.进入强化阶段以后,进行冷作硬化试验,按主机控制面板停止,再按▼,先卸载到10kN,再加载,按▲,接下来计算机控制,一直到试件断裂(此过程中计算机一直工作,注意观察负荷位移曲线所显示的冷作硬化现象.). 12.断裂以后记录力峰值。 13.点击试验结束(不要点击停止)。

14.材料刚度特征值中的弹性模量E的测定 试验结束后,在试验程序界面选定本试验的试验编号,并选择应力─应变曲线。在曲线上较均匀地选择若干点,记录各点的值,分别为及 (如i =0,1,2,3,4),并计算出相应的 计算E i的平均值,得到该材料的弹性模量E的值。 15.材料强度特征值屈服极限和强度极限的测定 试验结束后,在试验程序界面选定本试验的试验编号,并选择负荷─位移曲线,找到的曲线屈服阶段的下屈服点,即为屈服载荷F s, 找到的曲线上最大载荷值,即为极限载荷P b. 计算屈服极限:;计算强度极限:; 16.材料的塑性特征值延伸率及截面收缩率的测定 试件拉断后,取下试件,沿断裂面拼合,用游标卡尺测定试验段长度,和颈缩断裂处截面直径。 计算材料延伸率 计算截面收缩率 低碳钢拉伸试验报告 试验目的: 1. 掌握电子万能试验机操作; 2. 理解塑性材料拉伸时的力学性能; 3. 观察低碳钢拉伸时的变形特点; 4. 观察低碳钢材料的冷作硬化现象; 5. 测定低碳钢材料弹性模量E ; 6. 测定材料屈服极限和强度极限; 7. 测定材料伸长率δ和截面收缩率Ψ 试验设备:

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