实验四 二维数组基本操作的编程实现

实验四 二维数组基本操作的编程实现

【实验目的】

二维数组基本操作的编程实现

要求:

二维数组基本操作的编程实现(2学时,验证型),掌握数组的建立、读取数据、压缩存储等基本操作的编程实现,存储结构可以在顺序结构或链接结构中任选,也可以全部实现。也鼓励学生利用基本操作进行一些应用的程序设计。

【实验性质】

验证性实验(学时数:2H)

【实验内容】

设计一个可容纳40位数的求n!的程序设计一个将稀疏数组压缩的程序。

【注意事项】

1.开发语言:使用C。

2.可以自己增加其他功能。

【实验分析、说明过程】                                                 

稀疏矩阵的三元组压缩

定义二维数组arr[max][2]

定义整形变量i,j记录稀疏矩阵非零元素的行和列

定义count寻找稀疏数组的行数

arr数组第0行记录稀疏矩阵的行列数和元素个数

嵌套循环  当稀疏矩阵的元素不为零时count++,并将元素存入三元组表中

输出三元组表的元素

【思考问题】

  1. 数组的下标从什么地址开始?好处是什么?

数组下标从零开始。方便与底层硬件交互

  1. 压缩数据主要的思路是什么?

检测并删除数据中的重复部分,以节省存储空间

  1. 为什么用数组可以存储超出计算机数据要求的范围的数字?

数组可以存储多个相同类型的元素,而这些元素可以组成一个更大的数字,从而存储超出计算机数据要求的范围的数字。

  1. 举出几个数组的应用范例?

压缩编码和解码,矩阵运算,缓存,堆栈和队列

实验小结 (总结本次实验的重难点及心得、体会、收获)

本次实验重难点在于对三元组表的掌握

使用三元组表时应注意在还原时如何确保还原的稀疏矩阵的大小,可在三元组表存储稀疏矩阵的行列数

本次实验学习了对二维数组的操作,如何存储二维数据

【附录-实验代码】

基础篇

    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;

    }    

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值