【实验目的】
二维数组基本操作的编程实现
要求:
二维数组基本操作的编程实现(2学时,验证型),掌握数组的建立、读取数据、压缩存储等基本操作的编程实现,存储结构可以在顺序结构或链接结构中任选,也可以全部实现。也鼓励学生利用基本操作进行一些应用的程序设计。
【实验性质】
验证性实验(学时数:2H)
【实验内容】
设计一个可容纳40位数的求n!的程序。设计一个将稀疏数组压缩的程序。
【注意事项】
1.开发语言:使用C。
2.可以自己增加其他功能。
【实验分析、说明过程】
稀疏矩阵的三元组压缩 定义二维数组arr[max][2] 定义整形变量i,j记录稀疏矩阵非零元素的行和列 定义count寻找稀疏数组的行数 arr数组第0行记录稀疏矩阵的行列数和元素个数 嵌套循环 当稀疏矩阵的元素不为零时count++,并将元素存入三元组表中 输出三元组表的元素 |
【思考问题】
数组下标从零开始。方便与底层硬件交互
检测并删除数据中的重复部分,以节省存储空间
数组可以存储多个相同类型的元素,而这些元素可以组成一个更大的数字,从而存储超出计算机数据要求的范围的数字。
压缩编码和解码,矩阵运算,缓存,堆栈和队列 |
【实验小结】 (总结本次实验的重难点及心得、体会、收获)
本次实验重难点在于对三元组表的掌握 使用三元组表时应注意在还原时如何确保还原的稀疏矩阵的大小,可在三元组表存储稀疏矩阵的行列数 本次实验学习了对二维数组的操作,如何存储二维数据 |
【附录-实验代码】
基础篇 Data[j+1]=Data[j+1]+Data[j]/10; Data[j]=Data[j]%10; 提高篇 #include<stdio.h> #include<stdlib.h> #include <time.h> #define MAX 10 #define MAXSIZE 50 void matcreat(int matrix[MAX][MAX],int row,int col) {//随机生成稀疏矩阵 int i,j; int dataij[MAX*MAX/5]; int count; int rowc,colc; do { srand((int)time(0)); count=rand()%(row*col/5); //确定稀疏矩阵非零元个数 }while (count<(row*col/5-3)); //设法使得稀疏数据量接近总量的20%,避免数据量过少 for(i=0;i<row;i++) for(j=0;j<col;j++) matrix[i][j]=0; //赋初值 for(i=0;i<count;i++) //利用技巧解决了非零元分布的均匀性 { dataij[i]=rand()%100; //先产生一个两位数,首位可以为0 rowc=dataij[i]/10; //十位数约定给行下标 colc=dataij[i]%10; //个位数约定给列下标 do { matrix[rowc][colc]=rand()%100; //把这个位置控制住,再产生一个一位数的随机数存入 }while(matrix[rowc][colc]<10); } printf("这是产生的稀疏矩阵:\n"); for(i=0;i<row;i++) { for(j=0;j<col;j++) { printf("%6d",matrix[i][j]); } printf("\n"); } printf("\n"); } void compress(int matrix[MAX][MAX],int row,int col) {//稀疏矩阵的三元组压缩 int i,j; int count=0; int arr[MAX][2]; arr[count][0]=row; arr[count][1]=col; arr[count][2]=row*col; printf("%d %d %d\n",arr[count][0],arr[count][1],arr[count][2]); for(i=0;i<row;i++) { for(j=0;j<col;j++) { if(matrix[i][j]!=0) { count++; arr[count][0]=i; arr[count][1]=j; arr[count][2]=matrix[i][j]; printf("%d %d %d\n",arr[count][0]+1,arr[count][1]+1,arr[count][2]); } } } } void main() { int row,col; int matrixdata[MAX][MAX]; char choice; while(1) { printf(" 稀疏矩阵压缩存储\n"); system("pause"); printf(" 请输入稀疏矩阵的规模(行,列):"); scanf("%d,%d",&row,&col); matcreat(matrixdata,row,col); compress(matrixdata,row,col); printf("是否继续?按N结束,其他任意键继续…"); fflush(stdin); scanf("%c",&choice); system("cls"); if(choice=='N'||choice=='n') break; } } |