C语言--数组

一.数组

二.一维数组

一维数组是数组中最简单的,它的元素只需要用数组名加一个下标,就能唯一地确定元素。如s[9]就是一个一维数组中的元素。s[9][0]代表二维数组中的元素,s[9][0][1]代表三维数组中的元素。

1.定义一维数组
int A[10]
//定义了一个整型数组,数组名为A,包含十个元素。

定义一维数组的一般形式:
类型说明符+数组名[常量表达式]
⚠️⚠️⚠️
(1).数组名的命名遵循标识符命名规则。
(2).定义数组时,需要指定数组中元素的个数,[]内的常量表达式用来表示元素的个数,即数组长度。⚠️下标从0开始而不是从1开始。
(3).[]内的内容可以是常量符号常量常量,但不能是变量

2.引用一维数组

⚠️只能引用数组元素而不能调用整个数组的元素。
引用数组元素的表示形式:
数组名[下标]
例:逆序输出0,1,2,3,4,5,6,7,8,9

#include<stdio.h>
int main()
    {
        int i,a[10];
        for(i=0;i<=9;i++)
            a[i]=i;
        for(i=9;i>=0;i--)
            printf(" %d",a[i]);
        printf("\n");
        return 0;
    }
//运行结果
 9 8 7 6 5 4 3 2 1 0
3.初始化一维数组

为啥程序简洁,常在定义数组时给数组中的元素赋值,这称为数组的初始化

(1).全部赋值
int A[10]={1,2,3,4,,5,6,7,8,9}

数组长度是多少就要提供多少元素

(2).部分赋值
int A[10]={1,2,3,4,5}

在数组长度范围内,想给前面多少元素赋初值就提供多少元素

(3).全部赋为0
int A[10]={0,0,0,0,0,0,0,0,0,0}
//或
int A[10]={0}

未赋值部分自动设定为0

(4).数据个数确定可不指定数组长度
int A[10]={1,2,3,4,,5,6,7,8,9}
//等价于
int A[]={1,2,3,4,,5,6,7,8,9}

⚠️有且仅当数据个数等于数组长度时可这样使用
💡定义数值型数组时,凡未被初始化的的元素,系统会自动将它们初始化为0.
若为字符型数组,则为’\0’,
若为指针型数组,则为NULL,即空指针。

4.例子
#include<stdio.h>
int main()
{
    int a[10];
    int i,j,t;
    printf("请输入十个数字:\n");
    for(i=0;i<10;i++)
        scanf("%d",&a[i]);
    printf("\n");
    for(j=0;j<9;j++)
        for(i=0;i<9-j;i++)
            if(a[i]>a[i+1])
                    {t=a[i];a[i]=a[i+1];a[i+1]=t;}
printf("从小到大的排列:\n");
for(i=0;i<10;i++)
    printf("%d ",a[i]);
printf("\n");
return 0;
}
//运行结果
请输入十个数字:
1 3 5 2 6 8 3 9 10 7
从小到大的排列:
1 2 3 3 5 6 7 8 9 10 
三.二维数组

二维数组常被称为矩阵。把二维数组写成行(row)和列(column)的排列方式,有助于理解二维数组的逻辑结构。

1.定义二维数组

方法和定义一维数组类似。
二维数组数组的一般形式为:
类型说明符 数组名[常量表达式][常量表达式]
如:

float a[2][3]

定义a为2x3的数组。

2.引用二维数组

二维数组元素的表示形式为:
数组名 [下标][下标]
数组元素可以出现在表达式中,也可以被赋值,
如:B[2][3]=A[1][2]/2

3.二维数组的初始化
(1)分行赋初值
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

这种方法直观,不易遗漏。第一个花括号的数据赋给第一行,其他行以此类推

(2)整体赋值
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

所有元素放在一个花括号内,按数据的排列顺序对各元素赋初值。和第一个方法相比,第一个方法更好一些,一行对一行,界限清楚。

(3)部分赋值
int a[3][4]={{1},{2},{3}};

只对各行第一列序号为0的元素赋初值,其余元素值为0。

int a[3][4]={{1},{0,4},{0,0,8}}

对各行中某一个元素赋初值,在非零元素少时比较方便。

int a[3][4]={{1,2},{ },{3,4}}

对某几行元素赋初值。

int a[][4]={0,0,3},{ },{0,10}};

可以省略一维长度,但要分行赋值

(4)全部赋值
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
//等价于
int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};

一维的长度可以省略不写,但二维的不能省。系统会根据二维长度推算出一维长度。

4.举例

二维数组元素互换

#include<stdio.h>
int main()
{
    int a[2][3]={{1,2,3},{4,5,6}};
    int b[3][2],i,j;
    printf("数组 a:\n");
    for(i=0;i<=1;i++)
    {
        for(j=0;j<=2;j++)
        {
            printf("%5d",a[i][j]);
            b[j][i]=a[i][j];
        }
        printf("\n");
    }
    printf("数组 b:\n");
    for(i=0;i<=2;i++)
    {
        for(j=0;j<=1;j++)
            printf("%5d",b[i][j]);
        printf("\n");
    }
    return 0;
}
//运行结果
数组 a:
    1    2    3
    4    5    6
数组 b:
    1    4
    2    5
    3    6

3x4矩阵求最大值,以及他的行列号

#include<stdio.h>
int main()
{
    int i,j,row=0,colum=0,max;
    int a[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};
    max=a[0][0];
    for(i=0;i<=2;i++)
        for(j=0;j<=3;j++)
            if(a[i][j]>max)
            {
                max=a[i][j];
                row=i;
                colum=j;
            }
    printf("max=%d\nrow=%d\ncolum=%d\n",max,row,colum);
    return 0;
}
//运行结果
max=10
row=2
colum=1
四.字符数组

字符型数据以ASCII码的形式存储在存储单元中,一般占一个字节。

1.定义字符数组

用来存放字符数据的数组就是字符数组。在字符数组中的一个元素内存放一个字符。
定义字符数组的方法和定义数值型数组的方法类似。
如:

char a[11]={'I',' ','a','m',' ','L','i','M','i','n','g'};

上面定义了a为字符数组,包含11个元素。

2.初始化字符数组

对字符数组初始化,最易理解的方式是使用‘初始化列表’,把各个字符依次赋给数组中个元素。
如:

char a[11]={'I',' ','a','m',' ','L','i','M','i','n','g'};

将11个字符依次赋给a0~a10这11个元素。
若提供的初值个数和预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。
如:

char a[]={'I',' ','a','m',' ','L','i','M','i','n','g'};

也可以定义和初始化一个二维字符数组。
如:

char a[4][5]={{' ','*',' ','*' ' '},{'*',' ','*',' ','*'},{' ','*',' ','*',' '},{' ',' ','*',' ',' '}};
3.引用字符元素中的元素

可以引用字符数组中的元素得到一个字符。
如:
例一:输出爱心图案

#include<stdio.h>
int main()
{
    char a[4][5]={{' ','*',' ','*',' '},{'*',' ','*',' ','*'},{' ','*',' ','*',' '},{' ',' ','*',' ',' '}};
    int i,j;
    for(i=0;i<4;i++)
        {
            for(j=0;j<5;j++)
                printf("%c",a[i][j]);
            printf("\n");
        }
    return 0;
}
//运行结果
 * * 
* * *
 * * 
  *  

将*号连起来,可以看到一个爱心。
例二:输出字符串

#include<stdio.h>
int main()
{
    char a[11]={'I',' ','a','m',' ','L','i','M','i','n','g'};
    int i;
    for(i=0;i<11;i++)
        printf("%c",a[i]);
    printf("\n");
    return 0;
}
//运行结果
I am LiMing
4.字符串和字符串结束标志

在C语言中,将字符串作为字符数组来处理。
在实际工作中,人们关心的往往是字符串的有效长度而不是字符数组的长度。所以为了测定字符串的实际长度,C语言规定了一个字符串结束标志。以字符’\0’作为结束标志。
若字符数组中存在若干个字符,前面的9个字符都不是('\0'),而第10个字符是'\0'则认为数组中有一个字符串,有效字符有9个。换而言之,'\0'前面的字符组成一个字符串。
💡💡💡
'\0'代表ASCII码中为0的字符。这是一个空操作符,即它什么也不做。起一个供辨别的标志。

使用字符串常量使字符数组初始化
char d[]={"I am LiMing"};
//等于
char d[]="I am LiMing";
//等价于(长度为11)
char a[]={'I',' ','a','m',' ','L','i','M','i','n','g','\0'};
//不等价于(长度为10)
char a[]={'I',' ','a','m',' ','L','i','M','i','n','g'};

若有

char c[10]={"China"}

则数组中前五个元素为:‘C’,‘h’,‘i’,‘n’,‘a’。后面的元素自动设定为’\0’。
💡💡💡
字符数组并不要求它的最后一个字符必须是’\0’,像下面这样写完全可以:

char c[5]={'C','h','i','n','a'};

是否需要添加’\0’,需要根据实际判断。但是由于系统在存储字符串常量时会自动添加一个’\0’,所以为了使处理方法一致,便于测定字符串的实际长度,常认为的加上一个’\0’。
如:

char c[6]={'C','h','i','n','a','\0'};

这样做便于引用字符数组中的字符串
如:

//定义如下数组
char c[]={"Chinese"};

使用Hello替换原来的字符串,在不加'\0'的情况下。
数组中存储的字符是Hellose'\0'。加上'\0'后,再输出字符串,就会只输出Hello。这就是加上了'\0'的作用

#include<stdio.h>
int main()
{
    char c[]={"China",};
    char a[]={'H','e','l','l','o','\0'};
    printf("%s\n",a);
    printf("%s\n",c);
    return 0;
}
//运行结果
Hello
China

没有’\0’

#include<stdio.h>
int main()
{
    char c[]={"China",};
    char a[]={'H','e','l','l','o'};
    printf("%s\n",a);
    printf("%s\n",c);
    return 0;
}
//运行结果
HelloChina
China
5。字符串的输入输出

两种方法
(1)逐个输入输出,使用格式符“%c”输入输出一个字符。
(2)整个输入输出,使用格式符“%s”输入输出一个字符串
如:

#include<stdio.h>
int main()
{
    char c[]={"China",};
    printf("%s\n",a)return 0;
}
//运行结果
China
6.使用字符串处理函数
1.puts函数–输出字符串

一般形式:puts(字符数组)
将一个字符串输出到终端。
作用和printf函数相同,所以可以用printf函数代替puts函数。所以puts函数不常使用。
用puts函数输出的字符串中可以包含转义字符。

2.gets函数–输入字符串

一般形式:gets(字符数组)
作用是:从终端输入一个字符串到字符数组,并且得到一个函数值。
puts函数和gets函数都只能输入或输出1个字符串,不能写成

puts(str1,str2);或gets(str1,str2);
4.strcat–字符串连接函数

一般形式:
strcat(字符数组1,字符数组2)
作用是将两个字符数组中的字符串连接在一起,将字符数组2接到字符数组1的后面。字符数组1的长度必须能包含字符数组2,即字符数组1除了有存储本省存储的字符串,还要有能容纳字符数组2内字符串的空间。

4.strcpy和strncpy函数–字符串复制函数

一般形式:
strcpy(字符数组1,字符串2)
作用是将字符串2复制到字符数组中
字符数组1的长度至少等于字符串2的长度。字符数组1必须为字符数组名,字符串2可以是字符串常量也可以是字符数组名。

5.strcmp函数–字符串比较函数

.一般形式:
strcmp(字符串1,字符串2)
作用是比较字符串1和字符串2的大小。
💡字符串比较的规则是将两个字符串自左至右逐个字符比较(按ASCII码值大小比较),只到出现不同的字符或遇到’\0’为止。
(1)字符全部相同,两个字符串相等
(2)出现不同字符,则以第一对不相同的字符比较的结果为准。
💡若比较中两个字符都是由英文字母组成,那么在英文字典中位置在后面的为大。小写字母>大写字母。
比较结果由函数值带回:
相同为0, a>b为正整数,a<b为负整数。a代表字符串1,b代表字符串2。

6.strlen函数——测字符串长度的函数

一般形式:
strlen(字符串)
作用是测量字符串的实际长度。

7.strupr函数和strlwr函数——转化为大小写的函数

一般形式:
大写:strupr函数(字符串)
小写:strlwr函数(字符串)
作用是将字符串中的大小写字母转化为对应的小大写字母

五.实例

100以内的素数

#include <stdio.h>
#include <math.h>
int main()
{int i,j,n,a[101];
  for (i=1;i<=100;i++)
      a[i]=i;
  a[1]=0;
  for (i=2;i<sqrt(100);i++)
    for (j=i+1;j<=100;j++)
       {if(a[i]!=0 && a[j]!=0)
	      if (a[j]%a[i]==0)
	        a[j]=0; 
       }
  printf("\n");
  for (i=2,n=0;i<=100;i++)
    { if(a[i]!=0)
	    {printf("%5d",a[i]);
         n++;
        }
      if(n==10)
        {printf("\n");
         n=0;
        }
    }
  printf("\n");
  return 0;
}
//运行结果
开始运行...
    2    3    5    7   11   13   17   19   23   29
   31   37   41   43   47   53   59   61   67   71
   73   79   83   89   97
运行结束。
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值