10月25号,关于数组的练习

来源:互联网 发布:cs鼠标垫推荐知乎 编辑:程序博客网 时间:2024/04/28 22:05

一维数组:

数据结构类型:线性结构

数组:A 1,2,3,4,5,6,7,8 A[1];

数组概念:同类型数据的集合,他们在内存中是一片连续存储的区域
int short long long long
float double
char

数组的定义格式:
类型说明符 数组名字[元素个数]; //元素个数必须用常量
int a[20] //合法
int num = 20, a[num]; //不合法,num不是常量
const int num = 20, a[num]; //也不合法,num是伪常量

define num 20

int a[num]; //合法,num是标准常量

数组的初始化:
1,完全初始化 int arr[5] = {1,2,3,4,5};

2,完全初始化 int arr[] = {1,2};
如果初始化时数组元素个数省略了,那么赋值的个数就代表数组元素的总数.

3,不完全初始化 int arr[5] = {1,2};
当使用不完全初始化时,未赋值元素的值默认为0;(测试int类型式)

数组元素的获取:

int arr[5] = {1,2,3,4,5};

arr[0] = 100; //下标取值法,数组的下标是从0开始.
arr[4] = 1000;

注意,注意,注意:一定不要越界,数组的元素的小标最大值总是比元素个数少1

当数组元素较多时,且有一定规律时,如何完成赋值.
比如定义一个100个元素的数组,给每个元素赋值,取值范围1-100;
int a[100],i;
for (i = 0; i < 100; i++)
{
a[i] = 1 + rand()%100;
printf(“%d “, a[i]);
}

二维数组:
类型说明符 数组名字[第一维数量][第一维数量]; //数组元素个数 = 行数 * 列数;

完全初始化时,数组的行数可以省略,数组第一维的数量可以省略.
int a[4][3] = {{80,90,100},{66,77,88},{33,44,55},{100,35,78}};
int a[][3] = {{80,90,100},{66,77,88},{33,44,55},{100,35,78}};
int a[][3] = {80,90,100,66,77,88,33,44,55,100,35,78};

不完全初始化时,未初始化的值默认为0;
int a[4][3] = {{80,90},{66,88},{33,55},{100,35,78}};
相当于 a[4][3] = {{80,90,0},{66,88,0},{33,55,0},{100,35,78}};

int a[4][3] = {80,90,66,88,33,55,100,35,78};
相当于 a[4][3] = {{80,90,66},{88,33,55},{100,35,78},{0,0,0}};

二维数组的取值方式:下标取值
int a[4][3] = {{80,90,100},{66,77,88},{33,44,55},{100,35,78}};
a[1][2] = 100; //正确,将第二行,第三列赋值为100

关于数组的不合法操作:

1,用一个已经初始化的数组对另一个数组赋值,
即使是元素类型相同,数组大小相同,
这样的用法也是不允许的:
int x[3]={7,8,9}; int y[3]; y=x; /错误/

2,对数组进行整体输入输出。
int x[3]={7,8,9}; printf(x);/错误/

3,数组比较。
int x[3]={1,2,3};
int y[3]={4,5,6};
if(x < y) /错误/

4,数组整体运算。
int x[5]={5,6,7,8,9};
int y[5]={2,3,4,5,6};
x+=y;

取数组元素的地址进行加减运算时,实际上相当于沿着当前地址前进或后退,
每次移动的幅度取决于数组的类型.

比如int a[5];
假如:&a[0] //a[0]的地址是002DFCD0
那么 &a[0] + 1 得到的地址是:002DFCD4

再比如char a[5];
假如:&a[0] //a[0]的地址是002DFCD0
那么 &a[0] + 1 得到的地址是:002DFCD1

再比如short a[5];
假如:&a[0] //a[0]的地址是002DFCD0
那么 &a[0] + 1 得到的地址是:002DFCD2

再比如double a[5];
假如:&a[0] //a[0]的地址是002DFCD0
那么 &a[0] + 1 得到的地址是:002DFCD8

冒泡排序法演示:
从第一个元素开始取,取出的元素跟它后面的元素进行比较,
如果没有对方大,就交换值.

1,5,2,7,3,4,9,10

1,5,2,7,3,4,9,10
1,2,5,7,3,4,9,10

1,2,5,7,3,4,9,10
1,2,3,7,5,4,9,10

1,2,3,7,5,4,9,10
1,2,3,5,7,4,9,10
1,2,3,4,7,5,9,10

1,2,3,4,7,5,9,10
1,2,3,4,5,7,9,10

1,每个元素都要取到 for(i = 0;i

  for (i = 0; i < 20; i++)    {        for (j = i+1; j < 20; j++)        {            if (a[j] < a[i])            {                a[j] = a[j] ^ a[i];                a[i] = a[j] ^ a[i];                a[j] = a[j] ^ a[i];            }        }    }

:定义一个8*8的矩阵,随机赋值,取值范围1-100,
分别打印四边及两条对角线上元素之和;

void main(){    int i, j, a[64] ,q=0,w=0,e=0,r=0,t=0,y=0;    for (i = 0; i < 64; i++)    {        a[i] = 1 + rand() % 100;    }    for (i = 0; i < 64; i++)    {        for (j = i + 1; j < 64; j++)        {        }        printf("%-3d ", a[i]);        if (i % 8 == 7)        {            printf("\n");        }    }    for (i = 0; i < 8; i++)    {        q += a[i];        w += a[i + 56];        e += a[i + i * 7];        r += a[7+i * 8];        t += a[i+i*8];        y += a[7+i*7];    }    printf("元素之和为%d", q+w+e+r+t+y);getchar();}

这里写图片描述
20个学生,语数外三门课.分数随机给,满分100,给三门课分数进行排序.

void main(){    int i, j,i1,i2,i3, k,k2,k3, a[20][3];    for (i = 0; i < 20; i++)    {        for (j = 0;j < 3; j++)        {            a[i][j] = rand() %101;            printf("%d  ",a[i][j]);        }    }    printf("\n");    printf("\n");    printf("\n");    printf("语文分数排序:");for (i1 = 0; i1 < 20; i1++)    {    for (k = i1+1; k < 20; k++)    {        if (a[k][0] < a[i1][0])        {            a[k][0] = a[k][0] ^ a[i1][0];            a[i1][0] = a[k][0] ^ a[i1][0];            a[k][0] = a[k][0] ^ a[i1][0];        }    }    printf("%2d ", a[i1][0]);    }printf("\n"); printf("\n");printf("数学分数排序:");for (i2 = 0; i2 < 20; i2++){    for (k2 = i2 + 1; k2 < 20; k2++)    {        if (a[k2][1] < a[i1][1])        {            a[k2][1] = a[k2][1] ^ a[i2][1];            a[i2][1] = a[k2][1] ^ a[i2][1];            a[k2][1] = a[k2][1] ^ a[i2][1];        }    }printf("%2d ", a[i2][1]);}printf("\n"); printf("\n");printf("外语分数排序:");for (i3 = 0; i3 < 20; i3++){    for (k3 = i3 + 1; k3 < 20; k3++)    {        if (a[k3][2] < a[i1][2])        {            a[k3][2] = a[k3][2] ^ a[i3][2];            a[i3][2] = a[k3][2] ^ a[i3][2];            a[k3][2] = a[k3][2] ^ a[i3][2];        }    }printf("%2d ", a[i3][2]);}    getchar();}

这里写图片描述

在上面的代码中我发现了一个vs的好处,我在一开始定义了i,i1,i2,i3,这几个常量,然后在我后面使用的时候vs自己把我的i2,i3进行了自动赋值,但这导致我的运算结果发生了错误。我刚使用这个软件不久,不知道这是本来如此,还只是特殊情况。但我想我应该分享出来。

原创粉丝点击