数组---数组的基本操作
程序员文章站
2022-04-03 16:22:14
...
问题:
利用数组的基本运算队数组进行初始化,然后输出数组的值
涉及到数组的基本操作:初始化,赋值,定位,销毁等
代码:
头文件“SeqArray.h"
#pragma once
#define MaxArraySize 3
#include<stdarg.h>
#include <stdio.h>
#include<stdlib.h>
typedef struct
{
DataType *base;
int dim;// 数组的维数
int *bounds; // 数组的每一位界限间的地址
int *constants; //数组存储映像常量地址,里面的数据用来数组元素定位
}Array;
int InitArray(Array *A, int dim, ...)
/*初始化数组,根据数组的维数和各维的长度构造一个数组,为数组的所有元素分配内存单元,确定每一维的界限
地址,便于以后为数组赋值和获取数组中的元素,构造成功则返回1*/
{
int i;
int ElemTotal = 1;
va_list ap;
if (dim < 1 || dim >MaxArraySize)
{
return 0;
}
A->dim = dim;
A->bounds = (int*)malloc(dim * sizeof(int));
if (!A->bounds)
exit(-1);
va_start(ap, dim);
for (i = 0; i < dim; i++)
{
A->bounds[i] = va_arg(ap, int);//依次获得各维参数,即各维的长度
if (A->bounds[i] < 0)
return -1;
ElemTotal *= A->bounds[i];
}
va_end(ap);
A->base = (DataType*)malloc(ElemTotal * sizeof(DataType)); // 为数组所有元素分配空间
if (!A->base)
exit(-1);
A->constants = (int*)malloc(dim * sizeof(int));//为数组的常量基址分配内存单元
if (!A->constants)
exit(-1);
A->constants[dim - 1] = 1;
for (i = dim - 2; i >= 0; i--)
{
A->constants[i] = A->bounds[i + 1] * A->constants[i + 1];
}
return 1;
}
int LocateArray(Array A, va_list ap, int *offset)
/*根据数组中元素的下标,求出该元素在数组中的相对位置*/
{
int i, instand;
*offset = 0;
for (i = 0; i < A.dim; i++)
{
instand = va_arg(ap, int);//一个一个把取值出来
if (instand < 0 || instand >= A.bounds[i])
return 0;
*offset += A.constants[i] * instand;
}
return 1;
}
int AssignValue(Array A, DataType e, ...)
/*数组的赋值操作,将e的值赋给指定的数组元素,...为坐标*/
{
va_list ap;//指向可变参数的指针
va_start(ap, e);//ap指向e的下一个参数。。。
int offset;
if (LocateArray(A, ap, &offset) == 0)
return 0;
va_end(ap);
*(A.base + offset) = e;
return 1;
}
int GetValue(DataType *e, Array A, ...)
/*返回数组中指定的元素*/
{
va_list ap;
int offset;
va_start(ap, A);
if (LocateArray(A, ap, &offset) == 0)
return -1;
va_end(ap);
(*e) = *(A.base+offset);
return 1;
}
void DestroyArray(Array *A)
/*销毁数组*/
{
if (A->base)
free(A);
if (A->bounds)
free(A->bounds);
if (A->constants)
free(A->constants);
A->base = A->constants = A->bounds = NULL;
A->dim = 0;
}
源文件
// SeqArray.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//利用数组的基本运算队数组进行初始化,然后输出数组的值
#include "pch.h"
#include <iostream>
typedef int DataType;
#include"SeqArray.h"
int main()
{
Array A;
int i, j, k;
int dim = 3;
int bound1 = 5, bound2 = 3, bound3 = 2;//初始化数组的维数和各维的长度
DataType e;
InitArray(&A, dim, bound1, bound2, bound3);
std::cout << "数组A的各维长度是:\n";
for (i = 0; i < dim; i++)
{
printf("%3d", A.bounds[i]);
}
printf("\n");
std::cout << "数组A的常量基值是:";
for (i = 0; i < dim; i++)
{
printf("%3d", A.constants[i]);
}
printf("\n");
printf("数组A[%d][%d][%d]的元素如下", bound1, bound2, bound3);
for (i = 0; i < bound1; i++)
{
for (j = 0; j < bound2; j++)
{
for (k = 0; k < bound3; k++)
{
AssignValue(A, 100 * i + 10 * j + k, i, j, k);
GetValue(&e, A, i, j, k);//把该元素赋值e
printf("A[%d][%d][%d] = %3d ", i, j, k, e);
}
printf("\n");
}
printf("\n");
}
printf("按照数组的先行序列输出元素,利用基地址输出元素:\n");
for (i = 0; i < bound1*bound2*bound3; i++)
{
printf("第%d个元素 = %3d\t", i + 1, *(A.base + i));
if ((i + 1) % bound2 == 0)
printf("\n");
}
DestroyArray(&A);
}
上一篇: 数组--数组的基本学习
下一篇: 多维数组的使用(二维数组)