数据结构C语言版-稀疏矩阵三元组的基本操作讲解学习

数据结构C语言版-稀疏矩阵三元组的基本操作讲解学习
数据结构C语言版-稀疏矩阵三元组的基本操作讲解学习

数据结构C语言版-稀疏矩阵三元组的基

本操作

数据结构

课程设计实验报告

内容名称:稀疏矩阵的基本操作成员1: 09213020-陈东

成员2: 09213040-蔡丹

班级: 09数31

教师:李晓翠

江苏师范大学

数学科学学院

目录

1.序

言……………………...............................................................................................

(3)

1.1数据结构背

景 (3)

1.2课程设计目

的 (3)

1.3 课程名

称 (3)

1.4设计要

求 (3)

1.5设计说

明 (3)

2.课程任务设计说明书 (5)

3.需求分析 (6)

3.1题目名称 (6)

3.2题目内容 (6)

3.3题目分析 (6)

4.概要设计 (7)

4.1稀疏矩阵存储结构 (7)

4.2.稀疏矩阵的基本操作 (7)

4.3各模块设计要求 (8)

4.4总体功能流程图 (9)

4.4.1存储结构流程图 (9)

4.4.2稀疏矩阵基本操作流程图 (10)

5.详细设计 (11)

5.1设计原理 (11)

5.2基本函数实现流程图 (13)

6.主要函数代码 (21)

7.调试与操作说明 (27)

7.1操作说

明 (27)

7.2调试结

果………………………………………………………………………………. ..28

7.3结果分

析 (31)

8.设计体会 (32)

9.参考文献 (32)

10.分工说明 (33)

1.序言

1.1数据结构背景

数据结构是一门理论性强、思维抽象、难度较大的课程,是基础课和专业课之间的桥梁。该课程的先行课程是计算机基础、程序设计语言、离散数学等,后续课程有操作系统、编译原理、数据库原理、软件工程等。通过本门

课程的学习,我们应该能透彻地理解各种数据对象的特点,学会数据的组织方法和实现方法,并进一步培养良好的程序设计能力和解决实际问题的能力,而且该课程的研究方法对我们学生在校和离校后的学习和工作,也有着重要的意义。

数据结构是计算机科学与技术专业的一门核心专业基础课程,在该专业的课程体系中起着承上启下的作用,学好数据结构对于提高理论认知水平和实践能力有着极为重要的作用。学习数据结构的最终目的是为了获得求解问题的能力。对于现实世界中的问题,应该能从中抽象出一个适当的数学模型,该数学模型在计算机内部用相应的数据结构来表示,然后设计一个解此数学模型的算法,再进行编程调试,最后获得问题的解答。

基于此原因,我们开设了数据结构课程设计。针对数据结构课程的特点,着眼于培养我们的实践能力。实习课程是为了加强编程能力的培养,鼓励学生使用新兴的编程语言。相信通过数据结构课程实践,无论是理论知识,还是实践动手能力,同学们都会有不同程度上的提高。

1.2课程设计的目的

巩固和深刻理解“数据结构(C语言版)”课程所讲解的C语言作为数据结构的算法的描述,掌握对数据的存储结构和算法进行描述时,尽量考

虑C语言的特色。培养学生独立工作和创新思维的能力,取得设计与调试

的实践经验。提高和加强计算机应用及软件开发能力。通过课程设计题目

的练习,强化学生对所学知识的掌握及对问题分析和任务定义的理解,对

每到题目作出了相应的逻辑分析和数据结构的选择,通过对任务的分析,

为操作对象定义相应的数据结构,以过程化程序设计的思想方法为原则划分各个模块,定义数据的抽象数据类型。分模块对题目进行设计,强化学生对C语言的掌握和对数据结构的选择及掌握。通过程序的编译掌握对程序的调试方法及思想,并且让学生学会使用一些编程技巧。促使学生养成良好的编程习惯,以及让学生对书本上的知识进行了实践。算法与数据结构这门课是计算机科学中一门综合性的专业基础课

1.2课程名称:数据结构

1.3设计要求

学会分析研究计算机加工的数据结构的特性,以便为应用涉及的数据选择适当的逻辑结构,存储结构及其相应的算法,算法要求用C语言完成。学生独立思考解决问题为主,教师指导为辅,结合上机操作,完成指定的任务,撰写课程设计报告。要求源代码有足够的注释,能达到题目要求,并使人能看得懂你的代码。

1.5设计说明

此课程设计着重在于让我们理解如何利用C语言来实现稀疏矩阵的一些具体操作,里面代码完全采用C语言描述,包括了稀疏矩阵的建立,稀疏矩阵的输出,两个稀疏矩阵的相加,以及如何求出相应矩阵的转置矩阵。由于在我们课本中除了学习了稀疏矩阵的建立,相加,转置外,我们还接触了稀疏矩阵的销毁,稀疏矩阵的复制,稀疏矩阵的相减,稀疏矩阵的相乘,为了将有关稀疏矩阵的几个基本操作全部实现一遍,我们在完成原有题目的要求下,拓展了下题目内容,将稀疏矩阵的销毁,稀疏矩阵的复制,稀疏矩阵的相减,稀疏矩阵的相乘补充进去,这样我们更觉得此次课程设计的完整性。而且,为了使读者

更容易理解代码含义,程序的源代码基本与书本同步,思想方法也基本与书本介绍的吻合!

2.课程设计任务书

3.需求分析

3.1题目名称:稀疏矩阵的操作

3.2题目内容:

1.稀疏矩阵采用三元组表示;

2.求两个具有相同行列数的稀疏矩阵A和B的相加矩阵C,并输出C;

3.求出A的转置矩阵D,输出D;

题目拓展:

4.稀疏矩阵的销毁

5.稀疏矩阵的快速转置

6.求两个具有相同行列数的稀疏矩阵A和B的相减矩阵C,并输出C;

7.求两个具有相同行列数的稀疏矩阵A和B的相乘矩阵C,并输出C;

3.3题目分析:

通常,用高级语言编制程序时,都是用二维数组来存储矩阵元。有的程序设计语言中还提供了各种矩阵运算,用户使用时都很方便。

然而,在数值分析中经常出现一些阶数很高的矩阵,同时在矩阵中有许多值相同的元素或者零元素。有的为了节省存储空间,可以对这类矩阵进行压缩存储。所谓压缩存储是指:为多个值相同的元只分配一个存储空间;对零元不分配空间。

我们可以运用压缩存储的方式来实现稀疏矩阵的几个基本操作。

4.概要设计

4.1稀疏矩阵存储结构

#define MAXSIZE 12500 //假设非零元个数的最大值为12500

typedef struct

{

int i ,j; //该非零元的行下标和列下标

ElemeType e;

}Triple;

Typedef struct

{

Triple data[MAXSIZE+1];//非零元三元组表,data[0]未用 int mu ,nu,tu;//矩阵的行数,列数和非零元个数

}TSMatrix;

4.2.稀疏矩阵的基本操作

CreateSMatrix(&M);

操作结果:创建稀疏矩阵M。

DestroySMatrix(&M);

初始条件:稀疏矩阵M存在;

操作结果:销毁稀疏矩阵M。

PrintSMatrix( M)

初始条件:稀疏矩阵M存在。

操作结果:输出稀疏矩阵M。

CopySMatrix(TSMatrix M,TSMatrix *T)

初始条件:稀疏矩阵M存在

操作结果:由稀疏矩阵M复制得到T。

AddSMatrix(TSMatrix M,TSMatrix N,TSMatrix *Q)

初始条件:稀疏矩阵M与N的行数和列数对应相等。

操作结果:求稀疏矩阵的和Q=M+N.

SubtSMatrix(TSMatrix M,TSMatrix N,TSMatrix *Q)

初始条件:稀疏矩阵M与N的行数和列数对应相等。

操作结果:求稀疏矩阵的和Q=M-N.

MultSMatrix(TSMatrix M,TSMatrix N,TSMatrix *Q)

初始条件:稀疏矩阵M与N的行数和列数对应相等。

操作结果:求稀疏矩阵的和Q=M*N.

TransposeSMatrix(TSMatrix M,TSMatrix *T)

初始条件:稀疏矩阵M存在

操作结果:由稀疏矩阵M的转置矩阵T

4.3.各模块设计要求

1.初始函数建立稀疏矩阵及初始化稀疏矩阵

本模块要求设计函数在三元组顺序表中建立稀疏矩阵并初始化。首先要定义三元组表结构体类型,在输入出现错误时,能够对错误进行判别处理,初始化稀疏矩阵都为空值,特别需要注意在三元组表存储稀疏矩阵的时候,要对变量进行动态的地址分配

2.转置函数进行稀疏矩阵的转置

本模块要求设计函数进行稀疏矩阵的转置并输出转置后的结果,由于对稀疏矩阵的转置只对一个矩阵进行操作,所以实现起来难度并不是很大,函数也

比较容易编写。在编写函数时,首先定义一个相应的结构体变量用于存放转置后的矩阵,最后把此矩阵输出。

3.和运算函数进行两个稀疏矩阵相加运算

本模块要求设计加法对两个矩阵进行运算,并输出最终运算后的稀疏矩阵,在进行运算前,要对两个矩阵进行检查,看是不是相同类型的矩阵,因为两个矩阵相加要求两个矩阵一定是同一类型的矩阵,定义相应的矩阵类型用于存放两个矩阵相加的结果矩阵,这个结果矩阵的行数列数要综合多方面来确定。

4.积运算函数进行两个稀疏矩阵的乘法运算

本模块要求设计乘法对两个矩阵进行运算,并输出最终运算后的稀疏矩阵,在进行运算前,要对两个矩阵进行检查,如果A矩阵的行(列)和B矩阵列(行)数值相等,则能完成相应的乘法运算,定义相应的矩阵类型用于存放两个稀疏矩阵相乘之后的结果矩阵,并且调用输出函数完成乘积的输出

5输出函数完成矩阵的输出

本模块要求完成对稀疏矩阵的输出功能,实现起来比较简单,完成矩阵的转置输出,矩阵的加法,减法,乘法运算输出相应的和,差,积,都要调用输出函数。

4.4总体功能流程图

4.4.1存储结构流程图:

4.4.2稀疏矩阵基本操作流程图:

5.详细设计5.1设计原理

1.三元组顺序表:假设以顺序存储结构来表示三元组表,则可得稀疏矩阵的一种压缩存储方式——我们称之为三元组顺序表。因此,data域中表示非零的三元组是以行序为主序顺序排列的。按照压缩存储的概念,只存储稀疏矩阵的非零元。因此,除了存储非零元的值外,还必须同时记下它所在行和列的位置(i,j)。反之,一个三元组(i,j,aij)唯一确定了矩阵A的一个非零元。由此,稀疏矩阵可由表示非零元的三元组及其行列数唯一确定。例如,下列三元组表:

((1,2,1),(1,3,9),(3,1,3),(3,6,14),(4,3,4),(5,2,8),(6,1,5),(6,4,7)),于是稀疏矩阵A可以描述为:

0 1 9 0 0 0 0

0 0 0 0 0 0 0

A= 3 0 0 0 0 4 0

0 0 4 0 0 0 0

0 8 0 0 0 0 0

5 0 0 7 0 0 0

2.矩阵转置:转置运算是一种简单的矩阵运算。对于一个m*n的矩阵M,它的转置矩阵T是一个n*m的矩阵,且 T(i,j)=M(j,i)。显然,一个稀疏矩阵的转置仍为稀疏矩阵:要想实现矩阵之间的转置,只要做到:(1)将矩阵的行列值相互交换;(2)将每个三元组中的i和j相互调换;(3)重排三元组之间的次序便可实现矩阵的转置。前二条内容是容易做到的,关键是如何实现第三条,我们有2种方法,在这我们使用以下方法实现:我们按照矩阵M的列序来进行转置,为了找到M的每一列中所有的非零元素,需要对其三元组

表a.data从第一行起整个扫描一遍,由于a.data是以M的行序为主序来存放每个非零元的,由此得到的恰是b.data应用的顺序。

a.data

b.data

3 .两个稀疏矩阵相加:比较满足条件(行数及列数都相同的2个矩阵)的两个稀疏矩阵中不为0的元素的行数及列数(即i与j),将i与j都相等的前后两个元素e相加,保持i,j不变存储在新的三元组中,不等的则分别储存在此新三元组中。最后得到的这个新三元组表就是两个矩阵的和矩阵的三元组表。例如:

3 0 0 5 0 2 1 0

M= 0 – 1 0 0 , N= 0 0 2 0

2 0 0 0 -2 0 0 1

那么则Q=M+N为

3 2 1 5

Q= 0 -1 2 0

0 0 0 1

则它们三元组M.data,N.data,Q.data分别为

M.data N.data Q.data

4.两个稀疏矩阵相减:知道两个稀疏矩阵相加原理后,要想实现两个稀疏矩阵相减就很容易了,只需将要减的那个稀疏矩阵所有元素乘以-1后,看成两个稀疏矩阵的相加,然后再利用两个稀疏矩阵相加的方法,就能实现两个稀疏矩阵的相减了。

5.快速转置:矩阵A中三元组的存放顺序是先行后列,对同一行来说,必定先遇到列号小的元素,这样只需扫描一遍A.data 。所以需引入两个向量来实现:num[n+1]和position [n+1],num[col]表示矩阵A中第col列的非零元素的个数(为了方便均从1单元用起),position [col]初始值表示矩阵A中的第col列的第一个非零元素在B.data中的位置。于是position的初始值为:position [1]=1;position [col]= position [col-1]+num[col-1]; 2≤col≤n 依次扫描A.data,当扫

描到一个col列元素时,直接将其存放在B.data的position [col]位置上,position [col]加1,position [col]中始终是下一个col列元素在B.data中的位置。

6两个稀疏矩阵的相乘:两个矩阵相乘的金典算法也是大家所熟悉的。若设

Q=M*N

其中,M是m1*n1矩阵,N是m2*n2矩阵。当n1=m2时有:

for(i=1,i<=m1;++i)

for(j=1;j<=n2;++j)

{

Q[i][j]=0;

for(k=1;k<=n1;++k)Q[i][j]+=M[i][k]*N[k][j];

}

此算法的时间复杂度是O(m1*n1*n2)。

当M和N是稀疏矩阵并用三元组表示存储结构时,就不能套用上述算法。假设M和N分别为

3 0 0 5 0 2

M= 0 – 1 0 0 , N= 1 0

2 0 0 0 -2 4

0 0

则Q=M*N为

0 6

Q= -1 0

0 4

它们的三元组M.data,N.data 分别为:

M.data N.data Q.data

那么如何从M 和N 求得Q 呢? (1) 乘积矩阵Q 中元素

1

1(,)(,)*(,)n k Q i j M i k N k j ==∑ 1<=i<=m1,1<=j<=n2; (5-6)

在经典算法中,不论M (i ,k )和N (k ,j )的值是否为零,都要进行一次乘法运算,而实际上,这两者有一个值为零时,其乘积也为零。因此,在对稀疏矩阵进行运算时,应免去这种无效操作,换句话说,为求Q 的值,只需在M.dtat 和N.data 中找到相应的各对元素(即M.data 中的j 值和N.data 中的i 值相等的各对元素)相乘即可。

例如,M.data[1]1表示的矩阵元(1,1,3)只要和N.data[1]表示的矩阵元(1,2,2)相乘;而M.data[2]表示的矩阵元(1,4,5)则不需要和N 中任何元素相乘,因为N.data 中没有i 为4的元素。由此可见,为了得到非零的乘积,只要对M.data[1. .M.tu]中的每个元素(i ,k ,M (i ,k ))(1<=i<=m1,1<=k<=n1),找到N.data 中所有相应的元素(k ,j ,N (k ,j ))(1<=k<=m2,1<=j<=n2)相乘

数据结构与算法 特殊矩阵和稀疏矩阵

常熟理工学院 《数据结构与算法》实验指导与报告书 _2017-2018_____学年第__1__ 学期 专业:物联网工程 实验名称:特殊矩阵和稀疏矩阵 实验地点: N6-210 指导教师:聂盼红 计算机科学与工程学院 2017

实验五特殊矩阵和稀疏矩阵 【实验目的】 1、掌握数组的结构类型(静态的内存空间配置);通过数组的引用下标转换成该数据在内存中的地址; 2、掌握对称矩阵的压缩存储表示; 3、掌握稀疏矩阵的压缩存储-三元组表表示,以及稀疏矩阵的转置算法。 【实验学时】 2学时 【实验预习】 回答以下问题: 1、什么是对称矩阵?写出对称矩阵压缩存储sa[k]与aij之间的对应关系。 若n阶矩阵A中的元素满足下述性质:a ij=a ji,则称为n阶对称矩阵。 sa[k]与矩阵元素a ij之间存在着一一对应的关系: 若i>=j,k=i*(i+1)/2+j; 若i=j。 对称矩阵为3,9,1,4,7 9,5,2,5,8 1,2,5,2,4 4,5,2,1,7 7,8,4,7,9

数据结构C语言版期末考试试题(有答案)

“数据结构”期末考试试题 一、单选题(每小题2分,共12分) 1.在一个单链表HL中,若要向表头插入一个由指针p指向的结点,则执行( )。 A. HL=ps p一>next=HL B. p一>next=HL;HL=p3 C. p一>next=Hl;p=HL; D. p一>next=HL一>next;HL一>next=p; 2.n个顶点的强连通图中至少含有( )。 A.n—l条有向边 B.n条有向边 C.n(n—1)/2条有向边 D.n(n一1)条有向边 3.从一棵二叉搜索树中查找一个元素时,其时间复杂度大致为( )。 A.O(1) B.O(n) C.O(1Ogzn) D.O(n2) 4.由权值分别为3,8,6,2,5的叶子结点生成一棵哈夫曼树,它的带权路径长度为( )。 A.24 B.48 C. 72 D. 53 5.当一个作为实际传递的对象占用的存储空间较大并可能需要修改时,应最好把它说明为( )参数,以节省参数值的传输时间和存储参数的空间。 A.整形 B.引用型 C.指针型 D.常值引用型· 6.向一个长度为n的顺序表中插人一个新元素的平均时间复杂度为( )。 A.O(n) B.O(1) C.O(n2) D.O(10g2n) 二、填空题(每空1分,共28分) 1.数据的存储结构被分为——、——、——和——四种。 2.在广义表的存储结构中,单元素结点与表元素结点有一个域对应不同,各自分别为——域和——域。 3.——中缀表达式 3十x*(2.4/5—6)所对应的后缀表达式为————。 4.在一棵高度为h的3叉树中,最多含有——结点。 5.假定一棵二叉树的结点数为18,则它的最小深度为——,最大深度为——· 6.在一棵二叉搜索树中,每个分支结点的左子树上所有结点的值一定——该结点的值,右子树上所有结点的值一定——该结点的值。 7.当向一个小根堆插入一个具有最小值的元素时,该元素需要逐层——调整,直到被调整到——位置为止。 8.表示图的三种存储结构为——、——和———。 9.对用邻接矩阵表示的具有n个顶点和e条边的图进行任一种遍历时,其时间复杂度为——,对用邻接表表示的图进行任一种遍历时,其时间复杂度为——。 10.从有序表(12,18,30,43,56,78,82,95)中依次二分查找43和56元素时,其查找长度分别为——和——· 11.假定对长度n=144的线性表进行索引顺序查找,并假定每个子表的长度均

数据结构稀疏矩阵基本运算实验报告

课程设计 课程:数据结构 题目:稀疏矩阵4 三元组单链表结构体(行数、列数、头) 矩阵运算重载运算符优 班级: 姓名: 学号: 设计时间:2010年1月17日——2010年5月XX日 成绩: 指导教师:楼建华

一、题目 二、概要设计 1.存储结构 typedef struct{ int row,col;//行,列 datatype v;//非0数值 }Node; typedef struct{ Node data[max];//稀疏矩阵 int m,n,t;//m 行,n 列,t 非0数个数 … … 2.基本操作 ⑴istream& operator >>(istream& input,Matrix *A)//输入 ⑵ostream& operator <<(ostream& output,Matrix *A){//输出 ⑶Matrix operator ~(Matrix a,Matrix b)//转置 ⑷Matrix operator +(Matrix a,Matrix b)//加法 ⑸Matrix operator -(Matrix a,Matrix b)//减法 ⑹Matrix operator *(Matrix a,Matrix b)//乘法 ⑺Matrix operator !(Matrix a,Matrix b)//求逆 三、详细设计 (1)存储要点 position[col]=position[col-1]+num[col-1]; 三元组表(row ,col ,v) 稀疏矩阵((行数m ,列数n ,非零元素个数t ),三元组,...,三元组) 1 2 3 4 max-1

数据结构实验稀疏矩阵计算器

‘ 实验报告 题目:稀疏矩阵运算器 班级:14电子商务平台建设班完成日期:2015.11.2 学号:姓名:孙少辉 学号:姓名:杨德龙 学号:姓名:柴益新 一:需求分析 稀疏矩阵是指那些多数元素为零的矩阵。利用“稀疏“特点进行存储和计算可以大大节省存储空间,提高计算效率。实现一个能进行稀疏矩阵基本运算的运算器。 【基本要求】 以“带行逻辑链接信息“的三元组顺序表示稀疏矩阵,实现两个矩阵相加、相减和相乘运算。稀疏矩阵的输入采用三元组表示,而运算结果的矩阵则以通常阵列形式列出。 【项目约束】 1.首先应输入矩阵的行数和列数,并判断给出的两个矩阵 行、列数对于所要求作的运算是否相匹配。可设矩阵的行数和 列数均不超过20。 2.程序可以对三元组的输入顺序加以限制,例如,按行优 先。注意研究教科书5.3.2节中的算法,以便提高计算效率。

3.在用三元组稀疏矩阵时,相加或相减所得结果矩阵应该另生 成,乘积矩阵也可用二维数组存放。 三:详细设计 1:数据结构的定义 元素类型、变量、指针类型 (1)项目数据表: 3.2子函数 3:函数调用关系 无函数调用关系,只有一个主函数 四:调试分析 三元组顺序的输入规则。以0 0 0 作为输入的结束信号。完成实现稀疏矩阵的相加、相减、相乘的运算。 五:用户使用说明 (1)首先运行文件系统 1.首先定义要运算的第一个稀疏矩阵的行列数

定义完成之后输入另一个要运算的稀疏矩阵的行列。 (2)输入信息: 如下图所示输入两个矩阵的元素

所有输入信息以及运算方法输入完成之后。回车直接算出结果(3)输出信息:

六、源代码 /** ***项目名称:稀疏矩阵的运算 ***设计者:杨德龙,柴益新,孙少辉 ***时间:2015.11.02 ***实现目标:实现矩阵的加法,减法,乘法;***/ #include #include int main() { //定义二维数组及用到的各种变量 int a[20][20];

数据结构三元组完成版

#include #include typedef int ElemType; // 稀疏矩阵的三元组顺序表存储表示 #define MAXSIZE 100 // 非零元个数的最大值 typedef struct { int i,j; // 行下标,列下标 ElemType e; // 非零元素值 }Triple; typedef struct { Triple data[MAXSIZE+1]; // 非零元三元组表,data[0]未用 int mu,nu,tu; // 矩阵的行数、列数和非零元个数 }TSMatrix; // 创建稀疏矩阵M int CreateSMatrix(TSMatrix *M) { int i,m,n; ElemType e; int k; printf("请输入矩阵的行数,列数,非零元素个数:(逗号)\n"); scanf("%d,%d,%d",&(*M).mu,&(*M).nu,&(*M).tu); (*M).data[0].i=0; // 为以下比较顺序做准备 for(i = 1; i <= (*M).tu; i++) { do { printf("请按行序顺序输入第%d个非零元素所在的行(1~%d)," "列(1~%d),元素值:(逗号)\n", i,(*M).mu,(*M).nu); scanf("%d,%d,%d",&m,&n,&e); k=0; // 行或列超出范围

if(m < 1 || m > (*M).mu || n < 1 || n > (*M).nu) k=1; if(m < (*M).data[i-1].i || m == (*M).data[i-1].i && n <= (*M).data[i-1].j) // 行或列的顺序有错 k=1; }while(k); (*M).data[i].i = m; //行下标 (*M).data[i].j = n; //列下标 (*M).data[i].e = e; //该下标所对应的值 } return 1; } // 销毁稀疏矩阵M,所有元素置空 void DestroySMatrix(TSMatrix *M) { (*M).mu=0; (*M).nu=0; (*M).tu=0; } // 输出稀疏矩阵M void PrintSMatrix(TSMatrix M) { int i; printf("\n%d行%d列%d个非零元素。\n",M.mu,M.nu,M.tu); printf("%4s%4s%8s\n", "行", "列", "元素值"); for(i=1;i<=M.tu;i++) printf("%4d%4d%8d\n",M.data[i].i,M.data[i].j,M.data[i].e); } // 由稀疏矩阵M复制得到T int CopySMatrix(TSMatrix M,TSMatrix *T) { (*T)=M; return 1; } // AddSMatrix函数要用到 int comp(int c1,int c2) { int i; if(c1

数据结构课程设计之稀疏矩阵实现与应用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.软件结构设计:

数据结构c语言版期末考试复习试题

《数据结构与算法》复习题 一、选择题。 1在数据结构中,从逻辑上可以把数据结构分为 C 。 A ?动态结构和静态结构B.紧凑结构和非紧凑结构 C.线性结构和非线性结构 D.内部结构和外部结构 2?数据结构在计算机内存中的表示是指_A_。 A .数据的存储结构B.数据结构 C .数据的逻辑结构 D .数据元素之间的关系 3.在数据结构中,与所使用的计算机无关的是数据的A结构。 A .逻辑 B .存储C.逻辑和存储 D .物理 4.在存储数据时,通常不仅要存储各数据元素的值,而且还要存储_C A .数据的处理方法 B .数据元素的类型 C.数据元素之间的关系 D .数据的存储方法 5.在决定选取何种存储结构时,一般不考虑A A .各结点的值如何C.对数据有哪些运算 B .结点个数的多少 D .所用的编程语言实现这种结构是否方 6.以下说法正确的是D A .数据项是数据的基本单位 B .数据元素是数据的最小单位 C.数据结构是带结构的数据项的集合 D .一些表面上很不相同的数据可以有相同的逻辑结构 7.算法分析的目的是 C ,算法分析的两个主要方面是 A 。 (1) A .找出数据结构的合理性B.研究算法中的输入和输出的关系 C .分析算法的效率以求改进C.分析算法的易读性和文档性 (2) A .空间复杂度和时间复杂度B.正确性和简明性 &下面程序段的时间复杂度是0( n2) s =0; for( I =0; i

稀疏矩阵(算法与数据结构课程设计)

稀疏矩阵 一、问题描述 假若在n m ?阶中,有t 个元素不为零,令n m t ?=δ称为矩阵的稀疏因子。通常认为≤δ0.05时称为稀疏矩阵。稀疏矩阵的研究大大的减少了数据在计算机中存储所需的空间,然而,它们的运算却与普通矩阵有所差异。通过本次实验实现稀疏矩阵的转置、加法和乘法等多种运算。 二、基本要求 1、稀疏矩阵采用三元组表示,建立稀疏矩阵,并能按矩阵和三元组方式输出; 2、编写算法,完成稀疏矩阵的转置操作; 3、编写算法,完成对两个具有相同行列数的稀疏矩阵进行求和操作; 4、编写算法,对前一矩阵行数与后一矩阵列数相等的两个矩阵,完成两个稀疏矩阵的相乘操作。 三、测试数据 1、转置操作的测试数据: ??????? ? ?00200013000010020100 2、相加操作的测试数据: ??????? ? ?002000130000100 20100 ??????? ??00200010000210030300 3、相乘操作的测试数据: ?????? ? ??000000030040 0021 ??????? ??001002000021 四、算法思想 1、三元组结构类型为Triple ,用i 表示元素的行,j 表示元素的列,e 表示元素值。稀疏矩阵的结构类型为TSMatrix ,用数组data[]表示三元组,mu 表示行数,nu 表示列数,tu 表示非零元个数。 2、稀疏矩阵转置的算法思想 将需要转置的矩阵a 所有元素存储在三元组表a.data 中,按照矩阵a 的列序来转置。

为了找到a的每一列中所有非零元素,需要对其三元组表a.data扫描一遍,由于a.data 是以a的行需序为主序来存放每个非零元的,由此得到的就是a的转置矩阵的三元组表,将其储存在b.data中。 3、稀疏矩阵相加的算法思想 比较满足条件(行数及列数都相同的两个矩阵)的两个稀疏矩阵中不为0的元素的行数及列数(即i与j),将i与j都相等的前后两个元素值e相加,保持i,j不变储存在新的三元组中,不等的则分别储存在此新三元组中。最后得到的这个新三元组表就是两个矩阵的和矩阵的三元组表。 4、稀疏矩阵相乘的算法思想 两个相乘的矩阵为M与N,对M中每个元素M.data[p](p=1,2,…,M.tu),找到N中所有满足条件M.data[p].j=N.data[q].i的元素N.data[q],求得M.data[p].v和N.data[q].v 的乘积,又T(i,j)=∑M(i,k)×N(k,j),乘积矩阵T中每个元素的值是个累计和,这个乘积M.data[p].v×N.data[q].v只是T[i][j]中的一部分。为便于操作,应对每个元素设一累计和的变量,其初值是零,然后扫描数组M,求得相应元素的乘积并累加到适当的求累计和的变量上。由于T中元素的行号和M中元素的行号一致,又M中元素排列是以M的行序为主序的,由此可对T进行逐行处理,先求得累计求和的中间结果(T的一行),然后再压缩存储到Q.data中去。 五、模块划分 1、Status CreateM(TSMatrix *M, int a[],int row, int col),创立三元组; 2、void PrintM(TSMatrix M),按数组方式输出; 3、void PrintM3(TSMatrix M),按三元组方式输出; 4、Status TransposeSMatrix(TSMatrix M, TSMatrix *T),稀疏矩阵的转置; 5、Status MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix *Q),稀疏矩阵加法; 6、Status MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix *Q),稀疏矩阵相乘; 7、main(),主函数。 六、数据结构//(ADT) 1、三元组结构类型 typedef struct { int i,j; ElemType e; } Triple; 2、稀疏矩阵 typedef struct { Triple data[MAXSIZE+1];

数据结构 创建一个三元组程序 C语言

数据结构创建一个三元组程序C语言 #include #include #define OK 1 #define ERROR 0 typedef int Status; typedef int ElemType; typedef ElemType *Triplet; Status InitTriplet(Triplet &T,ElemType v1,ElemType v2,ElemType v3); Status DestroyTriplet(Triplet &T); Status get(Triplet T,int i,ElemType &e); Status put(Triplet &T,int i,ElemType e); Status IsAscending(Triplet T); Status IsDescending(Triplet T); Status Max(Triplet T,ElemType &e); Status Min(Triplet T,ElemType &e); void PrintE(ElemType e); void PrintT(Triplet T); int main() { Triplet T; int e; Status flag; flag = InitTriplet(T,90,95,100); if(flag) { printf("初始化成功!\nT中元素是:"); PrintT(T); } else { printf("初始化失败!"); } flag = get(T,1,e); if(flag) { printf("第1个元素的值为:%d\n",e);

数据结构实验报告稀疏矩阵运算

教学单位计算机科学与技术 学生学号 5 数据结构 课程设计报告书 题目稀疏矩阵运算器 学生豹 专业名称软件工程 指导教师志敏

实验目的:深入研究数组的存储表示和实现技术,熟悉广义表存储结构的特性。 需要分析:稀疏矩阵是指那些多数元素为零的矩阵。利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。实现一个能进行稀疏矩阵基本运算的运算器。要求以带“行逻辑信息”的三元组顺序表存储稀疏矩阵,实现两矩阵的相加、相减、相乘等运算。输入以三元组表示,输出以通常的阵列形式列出。 软件平台:Windows 2000,Visual C++ 6.0或WINTC 概要设计:ADT Array { 数据对象: D = {aij | 0≤i≤b1-1, 0 ≤j≤b2-1} 数据关系: R = { ROW, COL } ROW = {| 0≤i≤b1-2, 0≤j≤b2-1} COL = {| 0≤i≤b1-1, 0≤ j≤b2-2} 基本操作: CreateSMatrix(&M); //操作结果:创建稀疏矩阵M. Print SMatrix(M); //初始化条件: 稀疏矩阵M存在. //操作结果:输出稀疏矩阵M. AddSMatrix(M,N,&Q); //初始化条件: 稀疏矩阵M与N的行数和列数对应相等. //操作结果:求稀疏矩阵的和Q=M+N. SubSMatrix(M,N,&Q); //初始化条件: 稀疏矩阵M与N的行数和列数对应相等. //操作结果:求稀疏矩阵的差Q=M-N. MultSMatrix(M,N,&Q); //初始化条件: 稀疏矩阵M的列数等于N的行数. //操作结果:求稀疏矩阵的乘积Q=M*N. } ADT Array

数据结构(c语言版)期末考试复习试题

《数据结构与算法》(c语言版)期末考复习题 一、选择题。 1.在数据结构中,从逻辑上可以把数据结构分为 C 。 A.动态结构和静态结构B.紧凑结构和非紧凑结构 C.线性结构和非线性结构D.内部结构和外部结构 2.数据结构在计算机内存中的表示是指 A 。 A.数据的存储结构B.数据结构C.数据的逻辑结构D.数据元素之间的关系 3.在数据结构中,与所使用的计算机无关的是数据的 A 结构。 A.逻辑B.存储C.逻辑和存储D.物理 4.在存储数据时,通常不仅要存储各数据元素的值,而且还要存储 C 。A.数据的处理方法B.数据元素的类型 C.数据元素之间的关系D.数据的存储方法 5.在决定选取何种存储结构时,一般不考虑 A 。 A.各结点的值如何B.结点个数的多少 C.对数据有哪些运算D.所用的编程语言实现这种结构是否方便。 6.以下说法正确的是 D 。 A.数据项是数据的基本单位

B.数据元素是数据的最小单位 C.数据结构是带结构的数据项的集合 D.一些表面上很不相同的数据可以有相同的逻辑结构 7.算法分析的目的是 C ,算法分析的两个主要方面是 A 。(1)A.找出数据结构的合理性B.研究算法中的输入和输出的关系C.分析算法的效率以求改进C.分析算法的易读性和文档性(2)A.空间复杂度和时间复杂度B.正确性和简明性 C.可读性和文档性D.数据复杂性和程序复杂性 8.下面程序段的时间复杂度是O(n2) 。 s =0; for( I =0; i

数据结构课后习题及解

数据结构课后习题及解析第五章

第五章习题 5.1 假设有6行8列的二维数组A,每个元素占用6个字节,存储器按字节编址。已知A的基地址为 1000,计算: 数组A共占用多少字节; 数组A的最后一个元素的地址; 按行存储时元素A 36 的地址; 按列存储时元素A 36 的地址; 5.2 设有三对角矩阵A n×n ,将其三条对角线上的元素逐行地存于数组B(1:3n-2)中,使得B[k]= a ij , 求: (1)用i,j表示k的下标变换公式; (2)用k表示i,j的下标变换公式。 5.3假设稀疏矩阵A和B均以三元组表作为存储结构。试写出矩阵相加的算法,另设三元组表C存放 结果矩阵。 5.4在稀疏矩阵的快速转置算法5.2中,将计算position[col]的方法稍加改动,使算法只占用一个 辅助向量空间。 5.5写一个在十字链表中删除非零元素a ij 的算法。 5.6画出下面广义表的两种存储结构图示: ((((a), b)), ((( ), d), (e, f))) 5.7求下列广义表运算的结果: (1)HEAD[((a,b),(c,d))]; (2)TAIL[((a,b),(c,d))]; (3)TAIL[HEAD[((a,b),(c,d))]]; (4)HEAD[TAIL[HEAD[((a,b),(c,d))]]]; (5)TAIL[HEAD[TAIL[((a,b),(c,d))]]];

实习题 若矩阵A m×n 中的某个元素a ij 是第i行中的最小值,同时又是第j列中的最大值,则称此元素为该 矩阵中的一个马鞍点。假设以二维数组存储矩阵,试编写算法求出矩阵中的所有马鞍点。 第五章答案 5.2设有三对角矩阵A n×n,将其三条对角线上的元素逐行的存于数组B[1..3n-2]中,使得B[k]=a ij,求:(1)用i,j表示k的下标变换公式;(2)用k表示i、j的下标变换公式。 【解答】(1)k=2(i-1)+j (2) i=[k/3]+1, j=[k/3]+k%3 ([ ]取整,%取余) 5.4在稀疏矩阵的快速转置算法5.2中,将计算position[col]的方法稍加改动,使算法只占用一个辅助向量空间。 【解答】算法(一) FastTransposeTSMatrix(TSMartrix A, TSMatrix *B) {/*把矩阵A转置到B所指向的矩阵中去,矩阵用三元组表表示*/ int col,t,p,q; int position[MAXSIZE]; B->len=A.len; B->n=A.m; B->m=A.n; if(B->len>0) { position[1]=1; for(t=1;t<=A.len;t++) position[A.data[t].col+1]++; /*position[col]存放第col-1列非零元素的个数, 即利用pos[col]来记录第col-1列中非零元素的个数*/ /*求col列中第一个非零元素在B.data[ ]的位置,存放在position[col]中*/ for(col=2;col<=A.n;col++) position[col]=position[col]+position[col-1]; for(p=1;p

数据结构三元组项目报告

数据结构项目报告 项目题目:三元组 项目成员: 日期:2012年4月1号 1.题目与要求 1.1问题提出 详细叙述本项目所要实现的问题是创建一个三元组并且实现一些有关三元组的操作。 1.2 本项目涉及的知识点 指针,数值,函数的调用 1.3功能要求 1创建一个三元组并且给它们赋值。 2如果三元组存在,把三元组释放并且赋空。 3根据给的一个位置,来找出三元组里面这个位置的值并且返回。 4判断三元组里面的值是否按递增排列. 5判断三元组里面的值是否按递减排列。 6求三元组里面数值的最大值. 7求三元组里面数值的最小值。 8根据给的一个位置,改变三元组这个位置的值。 2.功能设计 2.1总体设计 运用函数调用的方式将整个程序连接起来,使其变得完整,具体见代码。 2.2详细设计 本程序可分八个小模块。第1个小模块实现创建一个三元组并且给它们赋值;第2个小模块实现如果三元组存在,把三元组释放并且赋空;第3个小模块实现根据给的一个位置,来找出三元组里面这个位置的值并且返回;第个4小模块实现判断三元组里面的值是否按递增排列;第5个小模块实现判断三元组里面的值是否按递减排列;第个6小模块实现求三元组里面数值的最大值;第7个小模块实现求三元组里面数值的最小值;第8个小模块实现根据给的一个位置,改变三元组这个位置的值。 模块一:创建一个三元组并且给它们赋值,函数为Status InitTriplet(Triplet *T,ElemType v1,ElemType v2,ElemType v3)

T是个整形二级指针,v1,v2,v3整形变量,通过(ElemType *)malloc(3*sizeof(ElemType))申请一个连续的空间给(*T),然后v1,v2,v3的值分别赋给它们。 模块二:如果三元组存在,把三元组释放并且赋空,函数为Status DestroyTriplet(Triplet *T) T是个整形二级指针,如果(*T)存在,则通过free()把它释放并且把它赋空。 模块三:根据给的一个位置,来找出三元组里面这个位置的值并且返回,函数为Status Get(Triplet T,int i,ElemType *e) T是个整形二级指针,整形i表示那个位置,*e表示要返回i位置的值,把(*T)【i-1】赋给*e。 模块四:判断三元组里面的值是否按递增排列,函数为Status IsAscending(Triplet T) T是个整形二级指针,判断它们一个是否比一个大。 模块五:判断三元组里面的值是否按递减排列,函数为Status IsDescending(Triplet T) T是个整形二级指针,判断它们一个是否比一个小。 模块六:求三元组里面数值的最大值,函数为Status Max(Triplet T,ElemType *e) T是个整形二级指针,*e是用来返回最大的值,通过一个一个的比较来实现 模块七:求三元组里面数值的最小值,函数为Status Min(Triplet T,ElemType *e) T是个整形二级指针,*e是用来返回最小的值,通过一个一个的比较来实现 模块八:根据给的一个位置,改变三元组这个位置的值,函数为Status Put(Triplet T,int i,ElemType e) T是个整形二级指针,整形i表示那个位置,*e表示要赋值给i位置的值,把*e赋给(*T)【i-1】。 3.项目总结与思考 完成这个项目,让我发现自己很容易犯一些小错误,例如用一个指针表示它所指向的值,容易丢失*,通过这项目让我了解二级指针的使用。 源程序如下: #include #include #include #define OVERFLOW -2 #define OK 1 #define ERROR 0 typedef int Status; typedef int ElemType; typedef int *Triplet; Status InitTriplet(Triplet *T,ElemType v1,ElemType v2,ElemType v3) { (*T)=(ElemType *)malloc(3*sizeof(ElemType)); if(!(*T)) exit(OVERFLOW); (*T)[0]=v1;(*T)[1]=v2;(*T)[2]=v3; return OK; } Status DestroyTriplet(Triplet *T) { free((*T));

数据结构(C语言版)期末复习

数据结构(C语言版)期末复习汇总 第一章绪论 数据结构:是一门研究非数值计算程序设计中的操作对象,以及这些对象之间的关系和操作的学科。 数据结构分为:逻辑结构、物理结构、操作三部分 逻辑结构:集合、线性结构、树形结构、图(网)状结构 物理结构(存储结构):顺序存储结构、链式存储结构 算法:是为了解决某类问题而规定的一个有限长的操作序列。 算法五个特性:有穷性、确定性、可行性、输入、输出 评价算法优劣的基本标准(4个):正确性、可读性、健壮性、高效性及低存储量 语句频度的计算。 算法的时间复杂度: 常见有:O(1),O(n),O(n2),O(log2n),O(nlog2n),O(2n) 第二章线性表 线性表的定义和特点: 线性表:由n(n≥0)个数据特性相同的元素构成的有限序列。线性表中元素个数n(n≥0)定义为线性表的长度,n=0时称为空表。 非空线性表或线性结构,其特点: (1)存在唯一的一个被称作“第一个”的数据元素; (2)存在唯一的一个被称作“最有一个”的数据元素; (3)除第一个之外,结构中的每个数据元素均只有一个前驱; (4)除最后一个之外,结构中的每个数据元素均只有一个后继。 顺序表的插入:共计n个元素,在第i位插入,应移动(n-i+1)位元素。 顺序表的删除:共计n个元素,删除第i位,应移动(n-i)位元素。 线性表的两种存储方式:顺序存储、链式存储。 顺序存储 概念:以一组连续的存储空间存放线性表; 优点:逻辑相邻,物理相邻;可随机存取任一元素;存储空间使用紧凑; 缺点:插入、删除操作需要移动大量的元素;预先分配空间需按最大空间分配,利用不充分;表容量难以扩充; 操作:查找、插入、删除等 查找: ListSearch(SqlList L,ElemType x,int n) { int i; for (i=0;i

数据结构C语言版-稀疏矩阵的三元组顺序表存储表示和实现

typedef int ElemType; // 稀疏矩阵的三元组顺序表存储表示 #define MAXSIZE 100 // 非零元个数的最大值 typedef struct { int i,j; // 行下标,列下标 ElemType e; // 非零元素值 }Triple; typedef struct { Triple data[MAXSIZE+1]; // 非零元三元组表,data[0]未用 int mu,nu,tu; // 矩阵的行数、列数和非零元个数 }TSMatrix; // 创建稀疏矩阵M int CreateSMatrix(TSMatrix *M) { int i,m,n; ElemType e; int k; printf("请输入矩阵的行数,列数,非零元素个数:(逗号)\n"); scanf("%d,%d,%d",&(*M).mu,&(*M).nu,&(*M).tu); (*M).data[0].i=0; // 为以下比较顺序做准备 for(i = 1; i <= (*M).tu; i++) { do { printf("请按行序顺序输入第%d个非零元素所在的行(1~%d)," "列(1~%d),元素值:(逗号)\n", i,(*M).mu,(*M).nu); scanf("%d,%d,%d",&m,&n,&e); k=0; // 行或列超出范围 if(m < 1 || m > (*M).mu || n < 1 || n > (*M).nu) k=1; if(m < (*M).data[i-1].i || m == (*M).data[i-1].i && n <= (*M).data[i-1].j) // 行或列的顺序有错 k=1; }while(k);

数据结构(C语言版)第三版__清华大学出版社_习题参考答案

附录习题参考答案 习题1参考答案 1.1.选择题 (1). A. (2). A. (3). A. (4). B.,C. (5). A. (6). A. (7). C. (8). A. (9). B. (10.) A. 1.2.填空题 (1). 数据关系 (2). 逻辑结构物理结构 (3). 线性数据结构树型结构图结构 (4). 顺序存储链式存储索引存储散列表(Hash)存储 (5). 变量的取值范围操作的类别 (6). 数据元素间的逻辑关系数据元素存储方式或者数据元素的物理关系 (7). 关系网状结构树结构 (8). 空间复杂度和时间复杂度 (9). 空间时间 (10). Ο(n) 1.3 名词解释如下: 数据:数据是信息的载体,是计算机程序加工和处理的对象,包括数值数据和非数值数据。数据项:数据项指不可分割的、具有独立意义的最小数据单位,数据项有时也称为字段或域。数据元素:数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理,一个数据元素可由若干个数据项组成。 数据逻辑结构:数据的逻辑结构就是指数据元素间的关系。 数据存储结构:数据的物理结构表示数据元素的存储方式或者数据元素的物理关系。 数据类型:是指变量的取值范围和所能够进行的操作的总和。 算法:是对特定问题求解步骤的一种描述,是指令的有限序列。 1.4 语句的时间复杂度为: (1) Ο(n2) (2) Ο(n2) (3) Ο(n2) (4) Ο(n-1) (5) Ο(n3) 1.5 参考程序: main() { int X,Y,Z; scanf(“%d, %d, %d”,&X,&Y,Z); if (X>=Y) if(X>=Z) if (Y>=Z) { printf(“%d, %d, %d”,X,Y,Z);} else { printf(“%d, %d, %d”,X,Z,Y);}

数据结构三元组表存储结构实现稀疏矩阵应用课程方案实验报告

高二《数系的扩充与复数的概念》说课稿 高二《数系的扩充与复数的概念》说稿 《数系的扩充与复数的概念》是北师大版普通高中程标准数学实验教材选修1-2第四第一节的内容,大纲时安排一时。主要包括数系概念的发展简介,数系的扩充,复数相关概念、分类、相等条,代数表示和几何意义。 复数的引入是中学阶段数系的又一次扩充,引入复数以后,这不仅可以使学生对于数的概念有一个初步的、完整的认识,也为进一步学习数学打下了基础。通过本节学习,要使学生在问题情境中了解数系扩充的过程以及引入复数的必要性,学习复数的一些基本知识,体会人类理性思维在数系扩充中的作用。 在学习了这节以后,学生首先能知道数系是怎么扩充的,并且这种扩充是必要的,虚数单位公开《数系的扩充与复数的概念》说稿在数系扩充过程中的作用,而复数就是一个实数加上一个实数乘以公开《数系的扩充与复数的概念》说稿。学生能清楚的知道一个复数什么时候是虚数,什么时候是纯虚数,两个复数相等的充要条是什么。让学生在经历一系列的活动后,完成对知识的探索,变被动地“接受问题”为主动地“发现问题”,加强学生对知识应用的灵活性,深化学生对复数的认识,从而提高分析问题和解决问题的能力。 教学目标为:1.在问题情境中了解数系的扩充过程。体会实际需求与数学内部的矛盾(数的运算规则、方程求根)在数系扩充过程中的

作用,感受人类理性思维的作用以及数与现实世界的联系。. 2.理解复数的有关概念、数系间的关系、和几何表示。 3.掌握复数的分类和复数相等的条。 4体会类比、转化、数形结合思想在数学发现和解决数学问题中的作用。 教学重点为认识i的意义、复数的有关概念以及复数相等的条. 教学难点为复数相关概念的理解和复数的几何意义的理解 复数的概念是整个复数内容的基础,复数的有关概念都是围绕复数的代数表示形式展开的。虚数单位、实部、虚部的命名,复数想等的充要条,以及虚数、纯虚数等概念的理解,都应促进对复数实质的理解,即复数实际上是一有序实数对。类比实数可以用数轴表示,把复数在直角坐标系中表示出,就得到了复数的几何表示,这就把数和形有机的结合了起。 在学习本节的过程中,复数的概念如果单纯地讲解或介绍会显得较为枯燥无味,学生不易接受,教学时,采用讲解已学过的数集的扩充的历史,让学生体会到数系的扩充是生产实践的需要,也是数学学科自身发展的需要;介绍数的概念的发展过程,使学生对数的形成、发展的历史和规律,各种数集中之间的关系有着比较清晰、完整的认识从而让学生积极主动地建构虚数的概念、复数的概念、复数的分类。由于学生对数系扩充的知识不熟悉,对了解实数系扩充到复数系的过程有困难,也就是对虚数单位公开《数系的扩充与复数的概念》说稿的引入难以理解。另外虚数单位公开《数系的扩充与复数的概念》说

数据结构(C语言版)三元组的基本操作

#include #include "h1.h" void main() { Triplet p; ElemType e,v1,v2,v3; int i; char select; printf("输入三个数,建立一个三元组\n"); scanf("%d%d%d",&v1,&v2,&v3); if (InitTriplet(p,v1,v2,v3)==OVERFLOW) printf("分配失败,退出程序!"); else do { printf("1:取三元组第i个元素\n"); printf("2:判断三元组元素是否递增\n"); printf("3:求最大值\n"); printf("4:置换第i个元素\n"); printf("0:结束!\n"); printf("请输入选择!\n"); getchar(); scanf("%c",&select); switch (select) {case '1': printf("\ni="); scanf("%d",&i); if (get(p,i,e)==ERROR) printf("i值不合法\n"); else printf("第%d个元素的值为:%d\n",i,e); break; case '2': if (IsAscend(p)==1) printf("三元组递增有序\n"); else printf("三元组非递增有序\n"); break; case '3': Max(p,e); printf("最大值是:%d\n",e);break; case '4': printf("\ni="); scanf("%d",&i); printf("\nx="); scanf("%d",&e); if (put(p,i,e)==ERROR) printf("i值不合法\n"); else printf("置换第%d个元素后的3个元素分别为:%d,%d,%d\n",i,p[0],p[1],p[2]);break; case '0':

相关文档
最新文档