问答题

试题三
阅读以下说明和C函数,将应填入(n)处的字句写在答题纸的对应栏内。
[说明]
若一个矩阵中的非零元素数目很少且分布没有规律,则称之为稀疏矩阵。对于m行n列的稀疏矩阵M,进行转置运算后得到n行m列的矩阵MT,如图3-1所示。

为了压缩稀疏矩阵的存储空间,用三元组(即元素所在的行号、列号和元素值)表示稀疏矩阵中的一个非零元,再用一维数组逐行存储稀疏矩阵中的所有非零元素(也称为三元组顺序表)。例如,图3-1所示的矩阵M相应的三元组顺序表如表3-1所示,其转置矩阵MT的三元组顺序表如表3-2所示。

函数TransposeMatrix(MatrixM)的功能是对用三元组顺序表表示的稀疏矩阵M进行转置运算。
对M实施转置运算时,为了将M中的每个非零元素直接存入其转置矩阵MT三元组顺序表的相应位置,需先计算M中每一列非零元素的数目(即MT中每一行非零元素的数目),并记录在向量num中;然后根据以下关系,计算出矩阵M中每列的第一个非零元素在转置矩阵MT三元组顺序表中的位置:
cpot[0]=0
cpot[j]=cpot[j-1]+num[j-1]/*j为列号*/
类型ElemType、Triple和Matrix定义如下:
typedefintElemType;
typedefstruct{/*三元组类型*/
intr,c;/*矩阵元素的行号、列号*/
ElemTypee;/*矩阵元素的值*/
}Triple;
typedefstruct{/*矩阵的三元组顺序表存储结构*/
introws,cols,elements;/*矩阵的行数、列数和非零元素数目*/
Tripledata[MAXSIZE];
}Matrix;
[C函数]
intTransposeMatrix(MatrixM)
{
intj,q,t;
int*num,*cpot;
MatrixMT;/*MT是M的转置矩阵*/
num=(int*)malloc(M.cols*sizeof(int));
cpot=(int*)malloc(M.cols*sizeof(int));
if(!num||!cpot)
returnERROR;
MT.rows=(1);/*设置转置矩阵MT行数、列数和非零元数目*/
MT.cols=(2);
MT.elements=M.elements;
if(M.elements>0){
for(q=0;qnum[q]=0;
for(t=0;tnum[M.data[t].c]++;
/*计算矩阵M中每列第一个非零元素在其转置矩阵三元组顺序表中的位置*/
(3);
for(j=1;jcpot[j]=(4);
/*以下代码完成转置矩阵MT三元组顺序表元素的设置*/
for(t=0;tj=(5);/*取矩阵M的一个非零元素的列号存入j*/
/*q为该非零元素在转置矩阵MT三元组顺序表中的位置(下标)*/
q=cpot[j];
MT.data[q].r=M.data[t].c;
MT.data[q].c=M.data[t].r;
MT.data[q].e=M.data[t].e;
++cpot[j];/*计算M中第j列的下一个非零元素的目的位置*/
}/*for*/
}/*if*/
free(num);free(cpot);
/*此处输出矩阵元素,代码省略*/
returnOK;
}/*TransposeMatrix*/

【参考答案】


(↓↓↓ 点击下方‘点击查看答案’看完整答案 ↓↓↓)
热门 试题

问答题
试题七 阅读以下应用说明以及用Visual Basic编写的程序代码,将应填入 (n) 处的字句写在答题纸的对应栏内。 【应用说明】 某应用程序用于监测某种设备的工作温度(20~200℃),其运行窗口中,包括一个温度计(矩形形状shpMeter)以及其中指示当前设备温度的水银柱(矩形形状shpT),文字标签标记了温度刻度;另有一个图片框picCurve,用于动态描述检测到的温度曲线 (用户见到的曲线与水银柱等高变化);命令按钮“开始检测”(cmdStart)用于启动温度检测,命令按钮“暂停检测”(emdStop)用于暂停检测。 矩形形状shpT(水银柱)属性visible初始设置为不可见,属性Filltype设置为solid (实心),FillColor设置为红色;图片框picCurve的属性AutoRedraw设置为Tree 再创建一个定时器TimT,属性Enabled初始设置为False(不起作用),属性Interval(定时间隔)设置为500ms。 为模拟设备温度的检测,程序中利用了(0,1)之间均匀分布的伪随机数获得[20,200]之间的随机温度T。为了便于在图片框picCurve中绘制曲线,程序中对该图片框建立了坐标系统,左上角为原点(0,0),水平向右方向为X轴,垂直向下方向为Y轴,右下角坐标为(50,180)。为了便于观察记录的温度值,图片框中从上到下创建了5条水平线Ls(i),i=0,1,…,4,并在程序中按等间隔排列进行位置设置。程序中每隔半秒算出曲线点(x,y),其中x=0,1,2,…,再用线段连接各相邻曲线点形成温度曲线,如下所示。 【 Visual Basic程序代码 】 Dim (1) As Integer *声明全局变量* Private Sub CmdStart_Click( ) TimT.Enabled = True ShpT.Visible = True End Sub Private Sub CmdStop_Click( ) TimT.Enabled = False End Sub Private Sub Form Load( ) Dim i, H As Integer PicCurve.Scale(0,0)-(50,180) ’设置图片框坐标系:左上角—右下角 H=30 ’H等于图片框高度的六分之一 For i=0 To 4 ’设置5条水平线Ls(i)的位置 Ls(i).X1=0 ’Ls(i)起点横坐标 Ls(i).n=n* (2) ’Ls(±)起点纵坐标 Ls(i).x2=50 ’Ls(i)终点横坐标 Ls(i).Y2=Ls(i).Y1 ’Ls(i)终点纵坐标 Ls(i).BorderColor=&HCOCOC0 ’设置水平线颜色 Next i x=0 ’设置曲线坐标初值 End Sub Private Sub timT_Timer() Dim T,H As Integer ’T为即时温度,H为图片框中温度点显示高度 T=Int(Rnd*181)+20 ’模拟随机产生设备温度(20~200℃) ’按当前温度显示水银柱 H=ShpMeter.Height* (3) ’算出水银柱的高度 ShpT.Top= (4) -H ’设置水银柱顶部位置 ShpT.Height=H ’设置水银柱的高度 ’绘制温度曲线 y= (5) ’算出曲线上当前点的纵坐标 If x=51 Then ’当超出图片框时 PicCurve.Cis ’清除图片框内以前画的曲线 x=0 ’设置重画曲线的初值 Elself x>0 Then ’除左边点外 PicCurve.Line (x-1,Lasty)-(x,y),vbRed ,由前1点到当前点画红色线段 End If x=x+1 ’准备下一点坐标 Lasty=y ’保存当前坐标供下次使用 End Sub