一、实验题目
二维数组基本操作的编程实现
二、题目要求
二维数组基本操作的编程实现,掌握数组的建立、读取数据、压缩存储等基本操作的编程实现,存储结构可以在顺序结构或链接结构中任选,也可以全部实现。也鼓励学生利用基本操作进行一些应用的程序设计。
三、运行结果
四、程序基本功能
1、矩阵生成
对于矩阵的生成,我采用了两种方式,第一种为随机生成,第二种为文件导入,其实之前我打算加入第三种人工输入的,我认为文件导入其实就包括了人工输入,所以放弃了这种方法。
(1)随机生成矩阵
函数名:arraycreate1()
描述:随机生成一个1x1—20x20的矩阵,并且非零元大约为总数的20%。
入口参数:无
出口参数:无
说明:函数执行之后,我首先随机生成了随机行row和随机列col,然后确定存储随机矩阵大小的二维数组,接着控制非零元的个数count在总数的20%左右。然后初始化row*col二维数组全为0,通过一个for循环随机生成一个数据,该数据的十位存为行rowc,该数据的个位存为列colc,然后为二维数组array[rowc][colc]随机赋值。部分重要代码如下:
row=rand()%20+1;
col=rand()%20+1;
int data[row*col/5];
do
{
srand(time(NULL)); //避免每次产生相同的随机数
if(row*col/5==0) //行数*列数<5
{
count=1;
}
else
count=rand()%(row*col/5); //非零数的个数
}while(count<(row*col/5-3));
for(i=0;i<row;i++)
for(j=0;j<col;j++)
{
array[i][j]=0; //数组初始化为0
}
for(i=0;i<count;i++) //随机为count个数赋值
{
data[i]=rand()%100;
rowc=data[i]/10;
colc=data[i]%10;
do
{
array[rowc][colc]=rand()%100;
}while(array[rowc][colc]<10);
}
printf("随机%dx%d矩阵已生成!\n",row,col);
(2)文件导入矩阵
函数名:arraycreate2()
描述:从文件导入一个1x1—20x20的矩阵。
入口参数:无
出口参数:无
说明:首先在“文件导入矩阵数据.txt”文件中输入符合规格的矩阵。先判断此文件是否存在,不存在即退出,否则开始读取数据,进入while循环,当文件读取结束时结束循环。While循环中读入字符ch,判断字符ch是否是空格或者回车,如果是空格j++,如果是回车i++。用i,j最终的值确定文件中的行列数。再次读取文件,确定行列数之后,用fscanf()函数读取数据,录入所在的行列。最后关闭文件。部分重要代码如下:
if((fp=fopen("文件导入矩阵数据.txt","r"))==NULL)
{
printf("文件打开失败!\n");
exit(0);
}
while (!feof(fp))
{
ch=fgetc(fp);
if(ch==' ')
{
j++;
continue;
}
if(ch=='\n')
{
i++;
continue;
}
}
row=i+1;
col=j/(i+1);
fp=fopen("文件导入矩阵数据.txt", "r");
for(i=0;i<row;i++)
for(j=0;j<col;j++)
{
fscanf(fp,"%d",&array[i][j]);
}
printf("\n矩阵导入完成!\n");
fclose(fp);
文件导入矩阵数据.txt
1 1 1 0 0
2 2 2 0 0
3 3 3 0 0
4 4 4 0 0
(3)矩阵压缩三元组
函数名:arraycompress()
描述:将矩阵中的非零元压缩成三元组。
入口参数:无
出口参数:无
说明:由于行row,列col均是全局变量,所以开始定义一个rowcol大小的结构体数组(struct compress data[rowcol]),通过两个for循环判断当array[i][j]==0时将i赋值给data[count+1].row,将j赋值给data[count+1].col,array[i][j]赋值给data[count+1].number。每添加一组数据count++。然后把行row,列col,count赋值给data[0],即矩阵压缩三元组成功。部分重要代码如下:
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
if(array[i][j]!=0)
{
data[count+1].row=i;
data[count+1].col=j;
data[count+1].number=array[i][j];
count++;
}
}
}
data[0].row=row;
data[0].col=col;
data[0].number=count;
2、三元组生成
三元组生成有两种方式,随机生成三元组和文件导入三元组.
(1)随机生成三元组
函数名:groupcreate1()
描述: 随机生成一个三元组
入口参数:无
出口参数:无
说明:首先随机生成矩阵的行row,列col,和非零元的个数count,并且非零元的个数限制在总数的20%,将行、非零元的个数存在data[0]中。然后定义一个value[count+1],随机生成count个0- -(row-1)*(col-1)大小的数,为了让三元组中数据是有序的,通过冒泡法将value这个一维数组中我的数据排序,之后将每个数的十位作为该组数据的行,个位数作为列,之中判断该行该列是否重复,通过一个判断重复函数来判断,然后随机为该行该列的非零元随机赋值。部分重要代码如下:
row=rand()%10+1;
col=rand()%10+1;
count=rand()%((row*col+1)/5);
int value[count+1];
struct compress data