数组学习总结

目录

 

一、数组

1.1、数组的概念

1.2、数组的定义

1.3、计算平均成绩与总分

1.4、数组初始化

1.5、求数组中最大数

1.6、冒泡排序

二, 二维数组

三,  数组典型例题

一、数组

1.1、数组的概念

用来存储一组相同类型数据的数据结构。有点像班上放手机的手机袋,超市的储物柜。

 

特点:只能存放一种类型的数据,如全部是int型或者全部是char型,数组里的数据成为元素。

 

1.2、数组的定义

格式: 类型 数组名[元素个数];

 

举例:存储5个人的年龄

 

int ages[5]; //在内存中开辟4x5=20个字节的存储空间

 

char str[]={'x','y'};

 

char str[]="xy";

 

double array[10];

 

可以在定义数组的同时对数组进行初始化:

 

int ages[5]={17,18,19,20,21};

 

遍历数组:

 

for(int i=0;i<5;i++)

 

{

 

printf(“ages[%d]=%d\n”,i,ages[i]);

 

}

 

注意:

 

(1)数组的初始化

 

①.int ages[5]={17,18,19,20,21};//一般写法

 

②. int ages[5]={17,18};//只对前两个元素赋值

 

③. int ages[5]={[3]=10,[4]=11};//对指定的元素赋值,这里为第三个和第四个

 

④. int ages[]={11,12,13}.//正确,右边的元素确定,则个数可以省略这里为3个。

 

⑤. int ages[];//错误,编译器无法知道应该分配多少的存储空间

 

⑥. int ages[5];ages={17,18,19,20,21};//错误,只能在定义数组时这样进行初始化

 

⑦. int ages[‘A’]={1,2,3};//正确,相当于是ages[65]

 

⑧. int count=5;int ages[count];//如果不进行初始化,则这种写法正确,编译器不会报错为其分配20个字节的存储空间,ages[0]=1;ages[1]=2;可以像这样对数组的元素进行赋值,但是2,3,4等元素的值时不确定的。

 

⑨. 而int count=5;int ages[count]={1,2,3,4,5};//这种写法是错误的,在定义数组时对数组进行初始化,元素的个数必须为常量或者不写,不能是一个变量

 

但是访问数组时,是利用相同的数组名和其不同的下标来访问,下标必须从0开始计算,那么最后一个元素的下标就是“长度-1”。即数组元素的一般形式为:数组名[下标] 

 

#include "stdio.h"

void main()

{

    //数组定义

    int a[5],i;  //定义长度为5的int类型数组,相当于定义了5个变量

    

    //使用数组元素,0-5叫下标

    a[0]=100;

    a[1]=200;

    a[2]=300;

    a[3]=400;

    a[4]=500;

    

    //循环输入

    for(i=0;i<5;i++)

    {

        scanf("%d",&a[i]);

    }

    

    //遍历数组中的每一个元素

    for(i=0;i<5;i++)

    {

        printf("%d \n",a[i]);

    }

}

1.3、计算平均成绩与总分

/* Note:Your choice is C IDE */

#include "stdio.h"

void main()

{

    //定义一个长度为10的float类型的数组,

    //循环输入10个学生的成绩

    //计算出平均成绩与总分

    //数组定义

    int i;

    float mark[10],s=0;  //定义float数组,长度为10,0-9

    for(i=0;i<10;i++)

    {

        printf("mark[%d]=",i);

        scanf("%f",&mark[i]);

    }

    

    for(i=0;i<10;i++)

    {

        s=s+mark[i];

    }

    

    printf("总分:%.2f",s);

    printf("平均分:%.2f",s/10);

}

1.4、数组初始化

初始化赋值的一般形式为:

类型说明符 数组名[常量表达式]={值,值……值};

其中在{ }中的各数据值即为各元素的初值,各值之间用逗号间隔。例如:

int a[10]={ 0,1,2,3,4,5,6,7,8,9 };

相当于a[0]=0;a[1]=1...a[9]=9;

可以只给部分元素赋初值,但值的个数多于数组元素个数则不行;当{ }中值的个数少于数组元素个数时,则只给前面部分元素赋值,多于数组元素个数时,则越界。 

只能给元素逐个赋值,不能给数组整体赋值。 

如给全部元素赋值,则在数组说明中,可以不给出数组元素的个数。

#include "stdio.h"

void main()

{

    int i,a[]={1,2};

   

    for(i=0;i<3;i++)

    {

        printf("%d\n",a[i]);

    }

   

}

1.5、求数组中最大数

#include "stdio.h"

void main()

{

    int a[]={95,59,98,0,35,46,8,-1,99,98},max,i;

    

    //假定最大数为a[0]

    max=a[0];

    

    //遍历,枚举

    for(i=1;i<10;i++)

    {

        if(a[i]<max)

        {

            max=a[i];

        }

    }

    printf("%d",max);

}

1.6、冒泡排序

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。

 

冒泡排序算法的运作如下:(从后往前)

比较相邻的元素。如果第一个比第二个大,就交换他们两个。

对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

针对所有的元素重复以上的步骤,除了最后一个。

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

冒泡排序舞蹈演示

/* Note:Your choice is C IDE */

#include "stdio.h"

void main()

{

   //冒泡排序

   int a[]={195,99,98,0,-35,46,8,-10,99,98},i,j,t;

   for(i=0;i<9;i++)

   {

        for(j=0;j<9-i;j++)

        {

            if(a[j]>a[j+1])

            {

                t=a[j];

                a[j]=a[j+1];

                a[j+1]=t;

            }

        }

   }

   

   for(i=0;i<10;i++)

    printf("%d \n",a[i]);

    

}

N个数排序,外重循环N-1,内重循环N-1-i,比较交换

三、 二维数组

一组数组是线性的,二组数组是平面的

/* Note:Your choice is C IDE */

#include "stdio.h"

void main()

{

    int a[3][3],i,j;

    

    a[0][0]=1;

    a[0][1]=5;

    

    for(i=0;i<3;i++)

    {

        for(j=0;j<3;j++)

        {

            a[i][j]=i*j;

        }

    }

    

    for(i=0;i<3;i++)

    {

        for(j=0;j<3;j++)

        {

            printf("a[%d][%d]=%d \t",i,j,a[i][j]);

        }

        printf("\n");

    }

}

/* Note:Your choice is C IDE */

#include "stdio.h"

void main()

{

    int a[3][3]={{1,2,3},{4,5,6},{7,8,9}},i,j;

   

    for(i=0;i<3;i++)

    {

        for(j=0;j<3;j++)

        {

            printf("a[%d][%d]=%d \t",i,j,a[i][j]);

        }

        printf("\n");

    }

}

 

三:数组典型例题

1:石头剪刀布

描述

石头剪刀布是常见的猜拳游戏。石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。

 

一天,小A和小B正好在玩石头剪刀布。已知他们的出拳都是有周期性规律的,比如:“石头-布-石头-剪刀-石头-布-石头-剪刀……”,就是以“石头-布-石头-剪刀”为周期不断循环的。请问,小A和小B比了N轮之后,谁赢的轮数多?

 

输入

输入包含三行。

第一行包含三个整数:N,NA,NB,分别表示比了N轮,小A出拳的周期长度,小B出拳的周期长度。0 < N,NA,NB < 100。

第二行包含NA个整数,表示小A出拳的规律。

第三行包含NB个整数,表示小B出拳的规律。

其中,0表示“石头”,2表示“剪刀”,5表示“布”。相邻两个整数之间用单个空格隔开。

输出

输出一行,如果小A赢的轮数多,输出A;如果小B赢的轮数多,输出B;如果两人打平,输出draw。

样例输入

10 3 4

0 2 5

0 5 0 2

样例输出

A

代码:

#include <iostream>

#include <cmath>

using namespace std;

int main()

{

    int N, NA, NB, A[100], B[100], i, awin=0, bwin=0;

    cin >> N >> NA >> NB;

    for (i=0; i<NA; i++) cin >> A[i];

    for (i=0; i<NB; i++) cin >> B[i];

    for (i=0; i<N; i++){

        if ((A[i%NA]==0&&B[i%NB]==2) ||

            (A[i%NA]==2&&B[i%NB]==5) ||

            (A[i%NA]==5&&B[i%NB]==0))

            awin++;

        if ((B[i%NB]==0&&A[i%NA]==2) ||

            (B[i%NB]==2&&A[i%NA]==5) ||

            (B[i%NB]==5&&A[i%NA]==0))

            bwin++;

    }

    if (awin > bwin) cout << "A" << endl;

    else if (awin < bwin) cout << "B" << endl;

    else cout << "draw" << endl;

    return 0;

}

2:扫雷游戏地雷数计算

描述

扫雷游戏是一款十分经典的单机小游戏。它的精髓在于,通过已翻开格子所提示的周围格地雷数,来判断未翻开格子里是否是地雷。

 

现在给出n行m列的雷区中的地雷分布,要求计算出每个非地雷格的周围格地雷数。

 

注:每个格子周围格有八个:上、下、左、右、左上、右上、左下、右下。

 

输入

第一行包含两个整数n和m,分别表示雷区的行数和列数。1 <= n <= 100, 1 <= m <= 100。

接下来n行,每行m个字符,‘*’表示相应格子中是地雷,‘?’表示相应格子中无地雷。字符之间无任何分隔符。

输出

n行,每行m个字符,描述整个雷区。若相应格中是地雷,则用‘*’表示,否则用相应的周围格地雷数表示。字符之间无任何分隔符。

样例输入

3 3

*??

???

?*?

样例输出

*10

221

1*1

代码:

#include<cstdio>

int s[101][101]={0};

char a[101][101],b;

int main(){

    int n,m,i,j,i1,i2,j1,j2;

    scanf("%d%d",&n,&m);

    scanf("%c",&b);

    for(i=1;i<=n;i++){

        for(j=1;j<=m;j++){

            scanf("%c",&a[i][j]);

            if(a[i][j]=='*'){

                i1=i-1;i2=i+1;j1=j-1;j2=j+1;

                s[i1][j1]++;

                s[i1][j2]++;

                s[i1][j]++;

                s[i2][j1]++;

                s[i2][j2]++;

                s[i2][j]++;

                s[i][j1]++;

                s[i][j2]++;

            }

        }

        scanf("%c",&b);

    }

    for(i=1;i<=n;i++){

        for(j=1;j<=m;j++){

            if(a[i][j]=='*')

                printf("%c",a[i][j]);

            else

                printf("%d",s[i][j]);

        }

        putchar('\n');

    }

    return 0;

}

3:做游戏

描述

有M个小孩子围成一圈做游戏,每个小孩子都有一个初始的号码。游戏有X步,每一步的操作方法都相同:每个小孩子把自己手上的号码改写成自己原来的号码加上右手边的小孩子的号码除以100的余数。请问你:经过X步之后,每个小孩子手上的号码是多少? 比如:有3个初始编号为{1,2,3}的小孩子,第一步操作完成之后,他们的编号变成了{1+2,2+3,3+1}即{3,5,4}。 

 

输入

输入有N组测试数据。每组测试数据有2行: 第一行包含M和X。 第二行包含M个不超过100的整数。

输出

输出数据有N行,每行是一组测试数据的结果。注意:两个数字之间只有一个空格。

样例输入

2

3 1

1 2 3

3 2

1 2 3

样例输出

3 5 4

8 9 7

代码:

#include<iostream>

using namespace std;

int main()

{int a[10001];

int N,M,X,i,j,t;

cin>>N;

for(t=1;t<=N;t++)

{

cin>>M>>X;

for(i=1;i<=M;i++)

cin>>a[i];

 

for(i=1;i<=X;++i)

{a[0]=a[1];

for(j=1;j<=M;j++)

    

    if(j!=M)

a[j]+=a[j+1];

else

a[j]+=a[0];}

for(int i=1;i<=M;++i)

cout<<a[i]<<" ";

cout<<endl;}

return 0;

}

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值