C语言数组知识点

数组
一,知识梳理
一个数组就是线性存储的一系列相同类型的值,
1,数组的创建:在创建数组时,我们必须定义数组的类型和大小,数组的大小不能为0,数组中的元素类型都是相同的。
2,一堆数组的使用,

int arr[10] = { 0 };
   int i = 0;
   for (i = 0; i < 10; i++)//i<11是不可以的,不可以越界访问
   {
       arr[i] = i;
   }

初始化方式

int arr[] = {1,2,3,4,5,6};   //初始化的同时进行内存空间的分配,默认数组长度为6
int arr[3] = {0};      //分配内存空间的同时进行初始化操作,所有值都初始化为0
定义一个数组长度为5的int类型的数组。
    int arr[5]={4};     //分配内存空间同时进行初始化操作,第一个元素值为4,后面的所有元素值为0。

sizeof(数组名)是用来计算数组长度的。
3,二维数组
在这里插入图片描述

int  arr[2][2];
int i;
 for(i = 0; i < 2; i++)
     {
         int  j ;
         for(j = 0; j < 2; j++)
         scanf("%d",&arr[i[j]);
     for(i = 0; i < 2; i++)
     {
         int  j ;
         for(j = 0; j < 2; j++)
         {
               printf("&arr[%d][%d] = %p\n", i, j,&arr[i][j]);
         }
    }

4,字符串数组
字符数组的初始化,char str[10]={ ‘I’,’ ‘,‘a’,‘m’,’ ',‘h’,‘a’,‘p’,‘p’,‘y’};
即把10个字符分别赋给str[0]到str[9]10个元素
如果花括号中提供的字符个数大于数组长度,则按语法错误处理;若小于数组
长度,则只将这些字符数组中前面那些元素,其余的元素自动定为空字符(即
‘\0’ )。
二维字符串数组和一般二维数组使用方法相同。
strlen 是 用来获得字符串的长度。所谓长度,就是包含多少个字符(不包括字符串结束标志 ‘\0’)。语法格式为:strlen(数组名);
strcat 是 string catenate 的缩写,意思是把两个字符串拼接在一起,语法格式为: strcat(数组名1, 数组名2);
strcpy 是 string copy 的缩写,意思是字符串复制,语法格式为:
strcpy(数组名1, 数组名2);
strcpy 会把 数组2 中的字符串拷贝到 数组1 中,串结束标志 ‘\0’ 也一同拷贝。
strcat 要求数组1 要有足够的长度,否则不能全部装入所拷贝的字符串。
strcmp 是 字符串比较,语法格式为:

strcmp(数组名1, 数组名2);
数组1 和 数组2 是需要比较的两个字符串。

字符本身没有大小之分,strcmp() 以各个字符对应的 ASCII 码值进行比较。strcmp() 从两个字符串的第 0 个字符开始比较,如果它们相等,就继续比较下一个字符,直到遇见不同的字符,或者到字符串的末尾。

返回值:若数组1 和 数组2 相同,则返回0;若 数组1 大于 数组2,则返回大于 0 的值;若 数组1 小于 数组2,则返回小于0 的值。
输入
scanf():通过格式控制符 %s 输入字符串。
gets():直接输入字符串,并且只能输入字符串。
输出
puts():直接输出字符串,并且只能输出字符串。
printf():通过格式控制符 %s 输出字符串。

二,使用方法
一维数组,可以解决需要很多变量,而且变量互相有关,类型相同。
例如:校门外的树,
描述
某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。

由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。

输入
第一行有两个整数L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。
输出
样例输入
500 3
150 300
100 200
470 471
样例输出
298
包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。
这道题的思路就是把每棵树都用数组的一个元素来记录,先把数组元素全部清零,然后在区域范围内的复制为1,最后用一个变量计数,从第一个元素开始遍历,数组元素为0就计数一个,最后输出总数即可,代码如下:

#include<stdio.h>
#include<cstring>
 int a[100001];
int main()
{
  int l,m,j,i,x,y,sum=0;

  memset(a,-1,sizeof(a));
  scanf("%d%d",&l,&m);
  for(i=0;i<m;i++)
  {
      scanf("%d %d",&x,&y);
      for(j=x;j<=y;j++)
        a[j]=0;
  }
   for(i=0;i<=l;i++)
    {
        if(a[i]==-1)
            sum++;
    }
  printf("%d\n",sum);
    return 0;
}

二维数组的使用
二维数组对于矩阵类型的问题非常适用,
例:计算矩阵边缘元素之和
描述
输入一个整数矩阵,计算位于矩阵边缘的元素之和。所谓矩阵边缘的元素,就是第一行和最后一行的元素以及第一列和最后一列的元素。

输入
第一行分别为矩阵的行数m和列数n(m < 100,n < 100),两者之间以一个空格分开。
接下来输入的m行数据中,每行包含n个整数,整数之间以一个空格分开。
输出
输出对应矩阵的边缘元素和
样例输入
3 3
3 4 1
3 7 1
2 0 1
样例输出
15
这道题的思路就是通过两重for循环把矩阵输入,然后再用两个for循环加上特判来把边缘元素给相加。代码如下:

#include<stdio.h>
int main()
{
    int a[105][105];
    int m,n,i,j,sum=0;
    scanf("%d %d",&n,&m);
    for(i=1; i<=n; i++)
    {
        for(j=1; j<=m; j++)
        {
            scanf("%d",&a[i][j]);
            if(((i==1)||(i==n))||((j==1)||(j==m)))
            {
                sum=sum+a[i][j];
            }
        }
    }
    printf("%d\n",sum);
    return 0;
}

字符串的使用,字符串对于大量字符的问题适用,
例如:最长的单词
描述
一个以’.'结尾的简单英文句子,单词之间用空格分隔,没有缩写形式和其它特殊形式,求句子中的最长单词。

输入
一个以’.'结尾的简单英文句子(长度不超过500),单词之间用空格分隔,没有缩写形式和其它特殊形式。
输出
该句子中最长的单词。如果多于一个,则输出第一个
样例输入
I am a student of Peking University.
样例输出
University
思路就是读入字符串后,从第一个元素开始遍历,不是空格就是计数,选出最大的数,用两个变量来记录数组的初末位置,然后输出。
代码如下

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
    char a[5000];
    int len;
    int i;
    int max=0,maxi,sum=0;
    gets(a);
    len=strlen(a);
    a[len]=' ';
    for(i=0;i<len;i++)
    {
        if(a[i]!=' '&&a[i]!='.')
           sum++;
           else if(sum>0)
           {
               if(sum>max)
               {
                   max=sum;
                   maxi=i-sum;
               }
               sum=0;
           }
    }
    for(i=maxi;i<maxi+max;i++)
        cout<<a[i];
    cout<<endl;
    return 0;
}

三,感悟
数组对于要输入大量的变量且类型相同的问题应用起来特别方便,通过多种循环的嵌套来完成对数组的处理。对于数组又很多内置好的函数供我们调用。

猜你喜欢

转载自blog.csdn.net/qq_43627087/article/details/85109954