稀疏矩阵的相关操作

更新时间:2024-06-20 23:37:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

数据结构课程设计

设计说明书

稀疏矩阵相关操作的实现

学生姓名 学班成

号 级 绩

指导教师

数学与计算机科学学院 2012 年 3 月 2 日

数据结构课程设计评阅书

题 目 学生姓名 指导教师评语及成绩 稀疏矩阵相关操作的实现 学号 成绩: 教师签名: 年 月 日 答辩教师评语及成绩 成绩: 教师签名: 年 月 日 教研室意见 总成绩: 室主任签名: 年 月 日 注:指导教师成绩60%,答辩成绩40%,总成绩合成后按五级制记入。

课程设计任务书

2011—2012学年第二学期

专业: __________________ 学号: __________ 姓名: _______ 课程设计名称: 数据结构课程设计 设 计 题 目: 稀疏矩阵相关操作的实现

完 成 期 限:自 ____ 年 _ 月 __ 日至 ____ 年 _月 _ 日共 _ 周 设计内容:

用C/C++编写程序实现稀疏矩阵创建、销毁、输出、复制、求和、求差、求乘积和转置等相关操作(详见数据结构教材P96),并进行算法分析。 设计要求:

1)问题分析和任务定义:根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么?(而不是怎么做?)限制条件是什么? 确定问题的输入数据集合。

2)逻辑设计:对问题描述中涉及的操作对象定义相应的数据类型,并按照以数据结构为中心的原则划分模块,定义主程序模块和各抽象数据类型。逻辑设计的结果应写出每个抽象数据类型的定义(包括数据结构的描述和每个基本操作的功能说明),各个主要模块的算法,并画出模块之间的调用关系图;

3)详细设计:定义相应的存储结构并写出各函数的伪码算法。在这个过程中,要综合考虑系统功能,使得系统结构清晰、合理、简单和易于调试,抽象数据类型的实现尽可能做到数据封装,基本操作的规格说明尽可能明确具体。详细设计的结果是对数据结构和基本操作做出进一步的求精,写出数据存储结构的类型定义,写出函数形式的算法框架;

4)程序编码:把详细设计的结果进一步求精为程序设计语言程序。同时加入一些注解和断言,使程序中逻辑概念清楚;

5)程序调试与测试:采用自底向上,分模块进行,即先调试低层函数。能够熟练掌握调试工具的各种功能,设计测试数据确定疑点,通过修改程序来证实它或绕过它。调试正确后,认真整理源程序及其注释,形成格式和风格良好的源程序清单和结果;

6)结果分析:程序运行结果包括正确的输入及其输出结果和含有错误的输入及其输出结果。算法的时间、空间复杂性分析;

7)编写课程设计报告;

以上要求中前三个阶段的任务完成后,先将设计说明数的草稿交指导老师面审,审查合格后方可进入后续阶段的工作。设计工作结束后,经指导老师验收合格后将设计说明书打印装订,并进行答辩。

指导教师(签字): 教研室主任(签字): 批准日期: 2012年2月 20 日

摘 要

矩阵是很多科学与工程计算问题中研究的数学对象,通常用高级语言编制程序时,都是用二维数组来存储矩阵元的,有的程序设计语言中还提供了各种矩阵运算,用户使用时都很方便,然而,在数值分析中经常出现一些阶数很高的矩阵,同时在矩阵中有许多值相同的元素或者是零元素,为了节省存储空间,可以对这类矩阵进行压缩存储。当值相同的元素或者零元素在矩阵中的分布有一定规律时,则称此类矩阵为特殊矩阵,反之称为稀疏矩阵。

这里设计了一个稀疏矩阵相关操作的软件,该软件具有简单的稀疏矩阵相关运算功能。本稀疏矩阵操作软件采用VC++作为软件开发环境,采用算数表达式处理算法来实现稀疏矩阵的加法、减法、乘法以及转置运算。操作简单,界面清晰,易于为用户所接受。

关键字:三元组、稀疏矩阵、数据结构

目 录

第一章 课题描述 ............................................................................................................................. 2

1.1 课程设计的目的 ······················· 2 1.2 问题描述 ·························· 2 1.3 基本要求 ·························· 2

第二章 问题分析和任务定义 ......................................................................................................... 3

2.1 结构设计 ·························· 3 2.2 算法思想 ·························· 3 第三章 逻辑设计 ............................................................................................................................. 4

3.1 模块划分·························· 4 3.2 函数调用图 ························· 4 3.3 流程图··························· 5 第四章 详细设计 ............................................................................................................................. 6

4.1 定义矩阵·························· 6 4.2 创建稀疏矩阵 ························ 6 4.3 求矩阵的转置 ························ 7 4.4 矩阵的相乘 ························· 7 4.5 矩阵的相加 ························· 9 第五章 程序编码 ........................................................................................................................... 13 第六章 程序调试与测试 ............................................................................................................... 22

6.1 运行该程序的操作平台 ···················· 22 6.2 错误分析 ·························· 22 第七章 结果分析 ........................................................................................................................... 23

7.1 程序运行结果 ························ 23 7.2 时间及空间复杂度分析 ···················· 25 第八章 总结 ................................................................................................................................... 26

第一章 课题描述

1.1 课程设计的目的

本课程设计是为了配合《数据结构》课程的开设,通过设计一完整的程序,使学生掌握数据结构的应用、算法的编写、类C语言的算法转换成C程序并用TC上机调试的基本方法。 利用三元组实现稀疏矩阵的有关算法。 1.2 问题描述

1.2.1 稀疏矩阵采用三元组表示,求两个具有相同行列数的稀疏矩阵M和N的相加矩阵Q,并输出Q。

1.2.2 求出M的转置矩阵T,输出T。 1.3 基本要求

稀疏矩阵是指那些多数元素为零的矩阵。利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。实现一个能进行稀疏矩阵基本运算的运算器。以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现两个矩阵相加、相减和相乘的运算。稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则通常以阵列形式列出。

第 2 页 共26页

第二章 问题分析和任务定义

2.1 结构设计

2.1.1 以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现两个矩阵相加、相减和相乘以及转置的运算。

2.1.2 稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则通常以阵列形式列出。

2.1.3 首先应输入矩阵的行数和列数,并判别给出的两个矩阵的行、列数对于所要求作的运算是否相匹配。可设矩阵的行数和列数均不超过20。

2.1.4 程序可以对三元组的输入顺序加以限制,例如,按行优先。注意研究教材的算法,以便提高计算效率。

2.1.5 在用三元组表示稀疏矩阵时,相加或相减所得结果矩阵应该另生成,乘积矩阵也可用二维数组存放 2.2 算法思想

2.2.1 主函数设置循环和选择语句进行运算循环和选择,进行稀疏矩阵的加法,减法,乘法,转置和是否继续运算5个分支开关进行运算选择。

2.2.2 设置函数分别实现稀疏矩阵的输入,输出,加法,减法,乘法以及转置。 2.2.3 在数组结构体中设置存放每行第一个非零元在其数组存储结构单元的位置的存储单元,若该行无非零元,则存为0。

第 3 页 共26页

第三章 逻辑设计

3.1 模块划分

3.1.1 Typedef struct存放各行第一个非零元在存储数组中的位置,若该行无非零元,则其rpos[]值为零

3.1.2 Greatesmatrix(RLSMatrix &M)矩阵输入函数,输入各行非零元及其在矩阵中的行列数

3.1.3 TransposeSMatrix(RLSMatrix M,RLSMatrix &T) 矩阵转置

3.1.4 HeRLSMatrix(RLSMatrix *M,RLSMatrix *N,RLSMatrix *Q) 矩阵求和 3.1.5 ChaRLSMatrix(RLSMatrix *M,RLSMatrix *N,RLSMatrix *Q) 矩阵求差 3.1.6 MultSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix &Q) 矩阵求积 3.2 函数调用图

开始用户选择计算类型键入Y继续运算键入A加法运算键入B减法运算键入C乘法运算键入D转置运算等待用户键入N结束运算图3.2 关系调用图

第 4 页 共26页

3.3 流程图

开始void TransposeSMatrix(RLSMatrix M,RLSMatrix &T){int q,p;T.mu=M.nu; T.nu=M.mu; T.tu=M.tu;if(T.tu)q=1for(int col=1;col<=M.nu;++col)for(p=1;p<=M.tu;++p)if(M.data[p].j==col)T.data[q].i=M.data[p].j;T.data[q].j=M.data[p].i;T.data[q].e=M.data[p].e; ++q;return i结 束

图3.3 流程

第 5 页 共26页

第四章 详细设计

4.1 定义矩阵

#include #include #define OK 1 #define ERROR 0

#define MAXSIZE 100 //非零元个数的最大值 #define MAXROW 100 typedef struct triple {

int i,j; //行下标,列下标 int e; //非零元素值 }triple;

typedef struct RLSMatrix {

triple data[MAXSIZE + 1]; //非零元三元组表

int rpos[MAXROW + 1]; //各行第一个非零元的位置表 int mu,nu,tu,num; //矩阵行数、列数和非零元个数

}RLSMatrix; 4.2 创建稀疏矩阵

Greatesmatrix(RLSMatrix &M) //创建稀疏矩阵 {

int e,i,m,n;

M.data[0].i=0; //为以下比较顺序做准备

printf(\请输入矩阵的行数,列数,和非零元素的个数:\ scanf(\ for(i=1;i<=M.tu;i++)

{

printf(\请按行序输入第%d个非零元素所在的行(1~%d),列(1~%d),元素值:\

第 6 页 共26页

scanf(\ if(m<1||m>M.mu||n<1||n>M.nu)

{printf(\行或列超出范围\

M.data[i].i=m; M.data[i].j=n; M.data[i].e=e;

} return OK;

}

4.3 求矩阵的转置

cpos为存放每列的第一个非零元素的地址,temp为中间变量对cpos对初始化,判断初值为0则为cpos赋值,然后进行转置。

void TransposeSMatrix(RLSMatrix M,RLSMatrix &T) {//采用三元组表存储表示,求稀疏矩阵M的转置矩阵T

int q,p;

T.mu=M.nu; T.nu=M.mu; T.tu=M.tu; if(T.tu) { {

T.data[q].i=M.data[p].j;

q=1;

for(int col=1;col<=M.nu;++col) for(p=1;p<=M.tu;++p)

if(M.data[p].j==col)

T.data[q].j=M.data[p].i;

T.data[q].e=M.data[p].e;

++q;

} return ;

}

}//TransposeRLSMatrix

4.4 矩阵的相乘

设置两个数组,分别存储M,N的第一个非零元位置,然后进行进行比较,得出相乘后的新矩阵非零元。

第 7 页 共26页

对于M中的每个元素M.data[p](p=1,2,?,M.tu)找到N中所有满足条件

M.data[p].j=N.data[q].i的元素N.data[q],球的M.data[p],求得M.data[p]和N.data[q]的乘积。乘积矩阵Q中每个元素的值是个累计和,这个乘积M.data[p] X N.data[q]只是Q[i][j]中的一部分,为便于操作,对应每个元素设一累计和的变量,其初置为零,然后扫描数组M,球的相应元素的乘积并累加到适当的求累计和的变量上

int MultSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix &Q) {//求矩阵乘积Q=MxN,采用行逻辑链接存储表示

int arow, tp, p, brow, t, q, ccol; int ctemp[MAXSIZE],num[MAXSIZE]; if(M.nu!=N.mu) return ERROR;

Q.mu=M.mu; Q.nu=N.nu; Q.tu=0; // Q 初始化 for(ccol=1;ccol<=M.nu;++ccol) num[ccol]=0;

for(t=1;t<=M.tu;++t) ++num[M.data[t].j]; //求M中每一列含非零元个数 M.rpos[1]=1;

for(ccol=2;ccol<=M.nu;++ccol)

M.rpos[ccol]=M.rpos[ccol-1]+num[ccol-1];

for(ccol=1;ccol<=N.nu;++ccol) num[ccol]=0;

for(t=1;t<=N.tu;++t) ++num[N.data[t].j]; //求N中每一列含非零元个数 N.rpos[1]=1;

for(ccol=2;ccol<=N.nu;++ccol)

N.rpos[ccol]=N.rpos[ccol-1]+num[ccol-1];

if(M.tu * N.tu != 0) {//Q是非零矩阵

for(arow=1;arow<=M.mu;++arow) {//处理M的每一行

for(ccol=1;ccol<=N.nu;ccol++)

ctemp[ccol]=0; //当前行各元素累加器清零

Q.rpos[arow]=Q.tu+1;

if(arow

for(p=M.rpos[arow];p

brow=M.data[p].j; //找到对应元在N中的行号 if(brow

else {t=N.tu+1;}

for(q=N.rpos[brow]; q

ccol=N.data[q].j; //乘积元素在Q中列号

第 8 页 共26页

ctemp[ccol]+=M.data[p].e*N.data[q].e;

}// for q

}// 求得Q中第crow( =arow)行的非零元

for(ccol=1; ccol<=Q.nu; ++ccol) //压缩存储该行非零元

if(ctemp[ccol]) {

if(++Q.tu>MAXSIZE) return ERROR;

Q.data[Q.tu].i=arow;

Q.data[Q.tu].j=ccol; Q.data[Q.tu].e=ctemp[ccol];

}// if

}// for arow

}// if return OK;

}// MultSMatrix

4.5 矩阵的相加

编写一个求两个对称矩阵相加运算的函数。设对称矩阵的数据元素为整数类型,对称矩阵采用压缩存储方法存储,要求和矩阵采用非压缩方法存储。设置两个指针,分别指向M,N的第一个非零元位置,移动指针进行比较,得出相加后的新矩阵非零元计算各行第一个非零元素在存储数组中的位置,若该行无非零元,则rpos[]值为零。

void HeRLSMatrix(RLSMatrix *M,RLSMatrix *N,RLSMatrix *Q) {//矩阵求和函数

int row;

if((*M).mu!=(*N).mu||(*M).nu!=(*N).nu)

{printf(\不满足矩阵相加的条件!\

int k=1; triple *p,*q;

//设置两个指针,分别指向M,N的第一个非零元位置,移动指针进行比较,得出相

加后的新矩阵非零元

p=&(*M).data[1]; q=&(*N).data[1];

while(p<(*M).data+(*M).tu+1&&q<(*N).data+(*N).tu+1)

第 9 页 共26页

if((*p).i<=(*q).i)

if((*p).i<(*q).i){

(*Q).data[k].i=(*p).i; (*Q).data[k].j=(*p).j; (*Q).data[k].e=(*p).e; k++;p++; }

else

if((*p).j<=(*q).j) if((*p).j<(*q).j){

(*Q).data[k].i=(*p).i; (*Q).data[k].j=(*p).j; (*Q).data[k].e=(*p).e; k++;p++; }

else

{

(*Q).data[k].i=(*p).i; (*Q).data[k].j=(*p).j; (*Q).data[k].e=(*p).e+(*q).e; k++;p++;q++; }

else {

(*Q).data[k].i=(*q).i; (*Q).data[k].j=(*q).j; (*Q).data[k].e=(*q).e; k++;q++; }

else

{

(*Q).data[k].i=(*q).i; (*Q).data[k].j=(*q).j; (*Q).data[k].e=(*q).e; k++;q++;

第 10 页 共26页

}

if(p<=(*M).data+(*M).tu) while(p<=(*M).data+(*M).tu){

(*Q).data[k].i=(*p).i; (*Q).data[k].j=(*p).j; (*Q).data[k].e=(*p).e; k++;p++; }

if(q<=(*N).data+(*N).tu) while(q<=(*N).data+(*N).tu){

(*Q).mu=(*M).mu;(*Q).nu=(*M).nu;(*Q).tu=k-1;

(*Q).data[k].i=(*q).i; (*Q).data[k].j=(*q).j; (*Q).data[k].e=(*q).e; k++;q++; }

//计算各行第一个非零元素在存储数组中的位置 //若该行无非零元,则rpos[]值为零

for(row=1;row<=(*Q).mu;row++){

if(cpot[row]<=(*Q).tu)

if((*Q).data[cpot[row]].i==row){

(*Q).rpos[row]=cpot[row];

for(k=1;k<=(*Q).tu;k++)

++num[(*Q).data[k].i];

int num[MAXROW + 1];int cpot[MAXROW + 1]; num[(*Q).mu+1],row,cpot[(*Q).mu+1]; cpot[1]=1;

for(k=1;k<=(*Q).mu;k++)

num[k]=0;

for(row=2;row<=(*Q).mu;row++)

cpot[row]=cpot[row-1]+num[row-1];

第 11 页 共26页

}

}

}

else

(*Q).rpos[row]=0;

else

(*Q).rpos[row]=0;

第 12 页 共26页

第五章 程序编码

源程序代码:

#include #include #define OK 1 #define ERROR 0

#define MAXSIZE 100 //非零元个数的最大值 #define MAXROW 100 typedef struct triple {

int i,j; //行下标,列下标 int e; //非零元素值 }triple;

typedef struct RLSMatrix {

triple data[MAXSIZE + 1]; //非零元三元组表

int rpos[MAXROW + 1]; //各行第一个非零元的位置表 int mu,nu,tu,num; //矩阵行数、列数和非零元个数

}RLSMatrix;

Greatesmatrix(RLSMatrix &M) //创建稀疏矩阵 {

int e,i,m,n;

M.data[0].i=0; //为以下比较顺序做准备

printf(\请输入矩阵的行数,列数,和非零元素的个数:\ scanf(\ for(i=1;i<=M.tu;i++)

{

printf(\请按行序输入第%d个非零元素所在的行(1~%d),列(1~%d),元素值:\

scanf(\ if(m<1||m>M.mu||n<1||n>M.nu)

{printf(\行或列超出范围\

第 13 页 共26页

M.data[i].i=m; M.data[i].j=n; M.data[i].e=e; }

void TransposeSMatrix(RLSMatrix M,RLSMatrix &T) {//采用三元组表存储表示,求稀疏矩阵M的转置矩阵T

int q,p;

T.mu=M.nu; T.nu=M.mu; T.tu=M.tu; if(T.tu) { } return ;

q=1;

for(int col=1;col<=M.nu;++col)

for(p=1;p<=M.tu;++p)

if(M.data[p].j==col) { }

T.data[q].i=M.data[p].j; T.data[q].j=M.data[p].i; T.data[q].e=M.data[p].e; ++q;

} return OK;

}//TransposeRLSMatrix

void HeRLSMatrix(RLSMatrix *M,RLSMatrix *N,RLSMatrix *Q) {//矩阵求和函数

int row;

if((*M).mu!=(*N).mu||(*M).nu!=(*N).nu)

{printf(\不满足矩阵相加的条件!\

int k=1; triple *p,*q;

//设置两个指针,分别指向M,N的第一个非零元位置,移动指针进行比较,得出相

加后的新矩阵非零元

p=&(*M).data[1]; q=&(*N).data[1];

第 14 页 共26页

while(p<(*M).data+(*M).tu+1&&q<(*N).data+(*N).tu+1)

if((*p).i<=(*q).i)

if((*p).i<(*q).i){

(*Q).data[k].i=(*p).i; (*Q).data[k].j=(*p).j; (*Q).data[k].e=(*p).e; k++;p++; }

else

if((*p).j<=(*q).j) if((*p).j<(*q).j){

(*Q).data[k].i=(*p).i; (*Q).data[k].j=(*p).j; (*Q).data[k].e=(*p).e; k++;p++; }

else

{

(*Q).data[k].i=(*p).i; (*Q).data[k].j=(*p).j; (*Q).data[k].e=(*p).e+(*q).e; k++;p++;q++; }

else {

(*Q).data[k].i=(*q).i; (*Q).data[k].j=(*q).j; (*Q).data[k].e=(*q).e; k++;q++; }

else

{

(*Q).data[k].i=(*q).i; (*Q).data[k].j=(*q).j; (*Q).data[k].e=(*q).e;

第 15 页 共26页

k++;q++; }

if(p<=(*M).data+(*M).tu) while(p<=(*M).data+(*M).tu){

(*Q).data[k].i=(*p).i; (*Q).data[k].j=(*p).j; (*Q).data[k].e=(*p).e; k++;p++; }

if(q<=(*N).data+(*N).tu) while(q<=(*N).data+(*N).tu){

(*Q).mu=(*M).mu;(*Q).nu=(*M).nu;(*Q).tu=k-1;

(*Q).data[k].i=(*q).i; (*Q).data[k].j=(*q).j; (*Q).data[k].e=(*q).e; k++;q++; }

//计算各行第一个非零元素在存储数组中的位置 //若该行无非零元,则rpos[]值为零

for(row=1;row<=(*Q).mu;row++){

if(cpot[row]<=(*Q).tu)

if((*Q).data[cpot[row]].i==row){ for(k=1;k<=(*Q).tu;k++)

++num[(*Q).data[k].i];

int num[MAXROW + 1];int cpot[MAXROW + 1]; num[(*Q).mu+1],row,cpot[(*Q).mu+1]; cpot[1]=1;

for(k=1;k<=(*Q).mu;k++)

num[k]=0;

for(row=2;row<=(*Q).mu;row++)

cpot[row]=cpot[row-1]+num[row-1];

第 16 页 共26页

第六章 程序调试与测试

6.1 运行该程序的操作平台 6.1.1 硬件要求:

此程序需在一台PC机上运行,要用INTER或AMD的CPU,其他没多大要求。 6.1.2 软件要求:

本程序能在WINDOWS 9X/2000/XP/2003下运行。 6.2 错误分析

1、cannot convert parameter 1 from 'struct RLSMatrix *' to 'struct RLSMatrix &' 在调用主函数的时候结构体之间不能转化(应该尽量避免该错误的出现)。

2、Cannot modify a constant object 不能修改一个常量对象,对定义为常量的对象进行不合法的操作都将引起该错误。

3、subscript requires array or pointer type 由于ctemp未定义导致了一系列错误。

4、Extra parameter in call 调用函数时出现多余函数,调用一个函数时,其实际参数的个数多余函数定义中的参数个数。

5、For statement missing )for 后面缺少“)”,在编制程序的时候,编译程序会发现控制表达式后面缺少右括号。

源程序在编写的时候,总是存在函数未定义或者变量、结果体等未定义的问题,这说明在编程的时候还是不够细心,以后要尽量避免这样的问题。总之,我们在编程时应该尽量认真检查,避免一些不必要的错误发生!

第 22 页 共26页

第七章 结果分析

7.1 程序运行结果

7.1.1 程序主菜单面板

图-1 为程序主菜单

7.1.2 输入选项a运行结果

图-2 为稀疏矩阵求和运算结果

第 23 页 共26页

7.1.3 输入选项b运行结果

图-3 为稀疏矩阵求差运算结果

7.1.4 输入选项c运行结果

图-4 为稀疏矩阵的求积运算结果

第 24 页 共26页

7.1.5 输入选项d运行结果

图-5 为稀疏矩阵转置运算的结果

7.1. 6 程序运行结束

图-6 为稀疏矩阵结术运算

7.2 时间及空间复杂度分析

累加器ctemp初始化的时间复杂度为O(M.nu * N.nu),则Q的所有非零元的时间复杂度为O(M.tu X*N.tu/N.mu),进行压缩存储的时间复杂度为O(M.mu * N.nu),总的时间复杂度就是O(M.nu * N.nu+M.tu X*N.tu/N.mu)。

第 25 页 共26页

第八章 总结

通过这次维持两周的课程设计,使我对数据结构有了更深的理解,以前对稀疏矩阵这一章节概念很模糊,在当时的学习过程中也有很多不明白的,这次课程设计使我对稀疏矩阵这一章节不理解的地方都有了进一步的理解。虽然在实际操作中遇到了很多困难,但通过找资料,请教同学,不仅使我的动手能力增强了,同时也让我的沟通能力都有了提高。在整个课程设计中,开始都无从下手,通过查阅相关资料,使自己有了雪头绪,但是总是在编写程序中发生错误,有时会很没耐性,也会发出怨言,但最后都被我克服了,编程一定要有耐心,同时还有认真仔细,尽量保证不出现错误。编程要有条理,不仅使自己要看懂 ,别人也能看懂,这样有利于程序的改正。

当花了两周时间做完这个课程设计时,心里有种说不出来的高兴,自己动手完成的设计有一种成就感,增强了自己的自信心,我相信在今后的学习中,我会保持这种良好的心情投入到各科的学习中,使我的成绩不断提高。

第 26 页 共26页

参考文献

谭浩强著,C++程序设计,北京,清华大学出版社,2006

张白一,崔尚森编著,面向对象程序设计---Java,西安,西安电子科技大学出版社,2011 谭浩强主编,C++程序设计题解与上机指导,北京,清华大学出版社,2006 严蔚敏,吴伟民编著,数据结构(C语言版),北京,清华大学出版社,2011 吴乃陵,C++程序设计实践教程,北京,清华大学出版社,2006 谭浩强著,C程序设计(第三版),北京,清华大学出版社,2011

第 27 页 共26页

参考文献

谭浩强著,C++程序设计,北京,清华大学出版社,2006

张白一,崔尚森编著,面向对象程序设计---Java,西安,西安电子科技大学出版社,2011 谭浩强主编,C++程序设计题解与上机指导,北京,清华大学出版社,2006 严蔚敏,吴伟民编著,数据结构(C语言版),北京,清华大学出版社,2011 吴乃陵,C++程序设计实践教程,北京,清华大学出版社,2006 谭浩强著,C程序设计(第三版),北京,清华大学出版社,2011

第 27 页 共26页

本文来源:https://www.bwwdw.com/article/8zj3.html

Top