三 、C 语言数组

目录

(一)数组的基本概念、一维数组和二维数组的定义、引用与初始化

一、怎样定义和引用一维数组

1、怎样定义一维数组

2、怎样引用一维数组元素

3、一维数组的初始化 

4、一维数组程序举例

二、怎样定义和引用二维数组

1、怎样定义二维数组

2、怎样引用二维数组的元素

3、二维数组的初始化

4、二维数组程序举例

(二)字符数组的定义、引用与初始化,字符数组的输入与输出,字符串和字符串处理函数的应用

1、怎样定义字符数组。

2、字符数组的初始化。

3、怎样引用字符数组中的元素。

4、字符串和字符串结束标志。

5、字符数组的输入输出。

6、善于使用字符串处理函数 。

7、字符数组应用举例


(一)数组的基本概念、一维数组和二维数组的定义、引用与初始化

①数组是一组有序数据的集合。数组中各数据的排列是有一定规律的,下标代表数据在数组中的序号。

C语言用方括号中的数字表示下标,如用s[15]表示。

②用一个数组名和下标惟一确定数组中的元素。

③数组中的每一个元素都属于同一个数据类型。

一、怎样定义和引用一维数组

1、怎样定义一维数组

一维数组是数组中最简单的。

它的元素只需要用数组名加一个下标,就能惟一确定。

要使用数组,必须在程序中先定义数组。

定义一维数组的一般形式为:    

类型符  数组名[常量表达式];

数组名的命名规则和变量名相同

如  int a[10];                                //其中a为数组名,10为数组长度,int表示每个元素的数据类型

例如:

int a[4+6];  合法

int n=10;          不合法

int a[n];        不合法

2、怎样引用一维数组元素

在定义数组并对其中各元素赋值后,就可以引用数组中的元素。

注意:只能引用数组元素而不能一次整体调用整个数组全部元素的值。

引用数组元素的表示形式为:        

数组名[下标]

例如:

a[0]=a[5]+a[7]-a[2*3]   合法

int n=5,a[10];        合法

a[n]=20;        合法

3、一维数组的初始化 

在定义数组的同时,给各数组元素赋值

int a[10]={0,1,2,3,4,5,6,7,8,9};                                //对全部元素赋值

int a[10]={0,1,2,3,4};相当于int a[10]={0,1,2,3,4,0,0,0,0,0};        //只给一部分赋值

int a[10]={0,0,0,0,0,0,0,0,0,0}; 相当于int a[10]={0};                        //令全部值为0

int a[5]={1,2,3,4,5}; 可写为int a[ ]={1,2,3,4,5};                        //可以不指定长度

4、一维数组程序举例

用数组处理求Fibonacci数列问题,

#include <stdio.h>

int main()

    {

    int i;  int f[20]={1,1};                                

    for(i=2;i<20;i++)

        f[i]=f[i-2]+f[i-1];

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

    {  

        if(i%5==0) printf("\n");

        printf("%12d",f[i]);                          

    }

    printf("\n");

    return 0;

}

二、怎样定义和引用二维数组

1、怎样定义二维数组

二维数组定义的一般形式为:

类型符  数组名[常量表达式][常量表达式];      

如:float a[3][4],b[5][10];

二维数组可被看作是一种特殊的一维数组:        

它的元素又是一个一维数组。

例如,把a看作是一个一维数组,它有3个元素:            

a[0]、a[1]、a[2]

每个元素又是一个包含4个元素的一维数组。

2、怎样引用二维数组的元素

二维数组元素的表示形式为:        数组名[下标][下标]

b[1][2]=a[2][3]/2    合法

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

printf(“%d,%d\n”,a[i][0],a[0][i]);        合法

3、二维数组的初始化

例如int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};        //分行给二维数组赋初值

int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};                        //按数组元素在内存中的排列顺序赋值

int a[3][4]={{1},{5},{9}};    等价于 int a[3][4]={{1,0,0,0},{5,0,0,0}, {9,0,0,0}};        //可以对部分赋值

int a[3][4]={{1},{5,6}};    相当于 int a[3][4]={{1},{5,6},{0}};                //只对某几行赋值

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};        //一维长度可不指定,二维长度不能省

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

4、二维数组程序举例

将一个二维数组行和列的元素互换,存到另一个二维数组中。

例如:

a=[1  2  3]                将其转化为b=[1  4]

     [4  5  6]                                        [2  5]

                                                          [3  6]

#include <stdio.h>

int main()  

{  

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

        int b[3][2],i,j;      

        printf("array a:\n");      

        for (i=0;i<=1;i++)                      //处理a的一行中各元素

        {

                for (j=0;j<=2;j++)        //处理a中某一列元素

                {  

                        printf("%5d",a[i][j]);              //输出a的各元素

                        b[j][i]=a[i][j];                              //a元素值赋给b相应元素

                }        

        printf("\n");      

        }

        printf("array b:\n");      

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

        {  

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

                        printf("%5d",b[i][j]);                //输出b的各元素

                printf("\n");    

        }    

        return 0;

        }    


(二)字符数组的定义、引用与初始化,字符数组的输入与输出,字符串和字符串处理函数的应用

1、怎样定义字符数组。

用来存放字符数据的数组是字符数组。

字符数组中的一个元素存放一个字符。

定义字符数组的方法与定义数值型数组的方法类似。

char c[10];

c[0]=’I’;           c[1]=’ ’;

c[2]=’a’;         c[3]=’m’;

c[4]=’  ’;           c[5]=’h’;

c[6]=’a’;          c[7]=’p’;

c[8]=’p’;          c[9]=’y’;

c[0]c[1]c[2]c[3]c[4]c[5]c[6]c[7]c[8]c[9]

iamhappy

2、字符数组的初始化。

char c[10]={’I’,’ ’,’a’,’m’,’ ’,’h’,’a’,’p’,’p’,’y’};

c[0]c[1]c[2]c[3]c[4]c[5]c[6]c[7]c[8]c[9]

I

a

m

h

a

p

p

y

char c[10]={’c’,’ ’,’p’,’r’,’o’,’g’,’r’,’a’,’m’};

c[0]c[1]c[2]c[3]c[4]c[5]c[6]c[7]c[8]c[9]

c

p

r

g

r

a

m

\0

char diamond[5][5]={{’ ’,’ ’,’*’},                                      

                                    {’ ’,’*’,’ ’,’*’},                                      

                                    {’*’,’ ’,’ ’,’ ’,’*’},                                      

                                    {’ ’,’*’,’ ’,’*’},                                      

                                    {’ ’,’ ’,’*’}  };

3、怎样引用字符数组中的元素。

例如一:输出一个已知的字符串。

#include <stdio.h>

int main()  {

        char c[15]={'I',' ','a','m',' ','a', ' ','s','t','u','d','e','n','t','.'};    

        int i;    

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

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

        printf("\n");    

        return 0;

        }

例如二:输出一个菱形图。

#include <stdio.h>

int main() {

        char diamond[][5]={{' ',' ','*'}, {' ','*',' ','*'},{'*',' ',' ',' ','*'}, {' ','*',' ','*'},{' ',' ','*'}};

        int i,j;  

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

                {for (j=0;j<5;j++)          

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

                printf("\n");    

                }  

        return 0;

        }

4、字符串和字符串结束标志。

在C语言中,是将字符串作为字符数组来处理的。

关心的是字符串的有效长度而不是字符数组的长度。

为了测定字符串的实际长度,C语言规定了字符串结束标志’\0’

 ’\0’代表ASCII码为0的字符,从ASCII码表可以查到,ASCII码为0的字符不是一个可以显示的字符,而是一个“空操作符”,即它什么也不做。

用它作为字符串结束标志不会产生附加的操作或增加有效字符,只起一个供辨别的标志。

例如:

 char c[ ]={”I  am  happy”};

可写成

char c[ ]=”I  am  happy”;

相当于

char c[11]={”I  am  happy”};

char c[10]={”China”};

可写成

char c[10]=”China”;

从c[5]开始,元素值均为\0。

例如:

C

h

i

n

\0

\0

\0

\0

\0

只显示 printf(”%s”,c);

5、字符数组的输入输出。

字符数组的输入输出可以有两种方法:  

        ①逐个字符输入输出(%c)。  

        ②整个字符串一次输入输出(%s)。

输出的字符中不包括结束符’\0’ 。

用%s输出字符串时,printf函数中的输出项是字符数组名,不是数组元素名。

如果一个字符数组中包含多个’\0’,则遇第一个’\0’时输出就结束。

可以用scanf函数输入一个字符串。

scanf函数中的输入项c是已定义的字符数组名,输入的字符串应短于已定义的字符数组的长度。

例如:

char c[6];

scanf(”%s”,c);   China↙

系统自动在China后面加一个’\0’。

char str1[5],str2[5],str3[5];

scanf(”%s%s%s”,str1,str2,str3);

How are you? ↙

str1:  H   o  w  \0  \0

str2:  a    r  e   \0  \0

str3:  y   o   u   \0  \0

6、善于使用字符串处理函数 。

在C函数库中提供了一些用来专门处理字符串的函数,使用方便.

(1)puts函数----输出字符串的函数。

        其一般形式为:        

                puts (字符数组)

作用是将一个字符串输出到终端.

        char str[20]=”China”;

        puts(str);

                输出China

(2)gets函数----输入字符串的函数

        其一般形式为:        

                gets(字符数组)

作用是输入一个字符串到字符数组.

        char str[20];

        gets(str);    

                Computer↙

(3)strcat函数----字符串连接函数。

        其一般形式为:    

                strcat(字符数组1,字符数组2)

其作用是把两个字符串连接起来,把字符串2接到字符串1的后面,结果放在字符数组1中。

注:使用字符串函数时,在程序开头用#include <string.h>。

char str1[30]=”People”;                          //其中此处的值30要足够大。

char str2[ ]=”China”;  

printf(”%s”, strcat(str1,str2));      

输出:PeopleChina

(4)strcpy和strncpy函数-字符串复制。

strcpy一般形式为:    

        strcpy(字符数组1,字符串2)

作用是将字符串2复制到字符数组1中去。

char str1[10],str2[ ]=”China”;                                //此处的数值10也要足够大

strcpy(str1,str2);                             //此处的str1是数组名的形式,str2是数组名或字符串常量

str1: c  h  i  n  a  \0  \0  \0  \0  \0

其中strcpy(str1,str2); 相当于 strcpy(str1,”China”);

例如:

        char str1[10],str2[]=”China”;  

        str1=”China”;   错误    

        str1=str2;         错误

可以用strncpy函数将字符串2中前面n个字符复制到字符数组1中去。

strncpy(str1,str2,2);

        作用是将str2中最前面2个字符复制到str1中,取代str1中原有的最前面2个字符。

        复制的字符个数n不应多于str1中原有的字符。

(5) strcmp函数----字符串比较函数

其一般形式为:

        strcmp(字符串1,字符串2)

作用是比较字符串1和字符串2

strcmp(str1,str2);

strcmp(”China”,”Korea”);

strcmp(str1,”Beijing”);

字符串比较的规则是:

①将两个字符串自左至右逐个字符相比,直到出现不同的字符或遇到’\0’为止。

②如全部字符相同,认为两个字符串相等。

③若出现不相同的字符,则以第一对不相同的字符的比较结果为准

例如: 

”A”<”B”        

”a”>”A”    

”computer”>”compare”  

”these”>”that”  

”1A”>”$20”    

”CHINA”>”CANADA”    

”DOG”<”cat”  

 ”Tsinghua”>”TSINGHUA”

比较的结果由函数值带回:

①如果字符串1=字符串2,则函数值为0。

②如果字符串1>字符串2,则函数值为一个正整数。

③如果字符串1<字符串2,则函数值为一个负整数。

例如:

if(str1>str2)  printf(”yes”);  错误

if(strcmp(str1,str2)>0)       printf(”yes”);    正确

(6)strlen函数----测字符串长度的函数

其一般形式为:        

        strlen (字符数组)

它是测试字符串长度的函数。

函数的值为字符串中的实际长度。

例如:

        char str[10]=”China”;  

        printf(”%d”,strlen(str));         输出结果是5

        也可以直接测试字符串常量的长度:            

        strlen(”China”);

(7)strlwr函数----转换为小写的函数。

其一般形式为        

strlwr (字符串)

函数的作用是将字符串中大写字母换成小写字母。

(8) strupr函数----转换为大写的函数

其一般形式为        

strupr (字符串)

函数的作用是将字符串中小写字母换成大写字母。

7、字符数组应用举例

例一:

输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。

#include<stdio.h>

int main(){        

    char string[81],c;  

    int i,num=0,word=0;

    printf("请输入一串字符:");

    gets(string);        

    for(i=0;(c=string[i])!='\0';i++)

        if(c==' ')

            word=0;

        else if(word==0)

            {

                word=1;

                num++;

            }

     printf("%d words\n",num);

}

例二:

有3个字符串,要求找出其中最大者。

#include<stdio.h>

#include<string.h>

int main(){

    char str[3][10];

    char string[10];

    int i;

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

    printf("请输入三个字符串:");

    gets (str[i]);  

    if (strcmp(str[0],str[1])>0)

        strcpy(string,str[0]);

    else                            

        strcpy(string,str[1]);  

    if(strcmp(str[2],string)>0)

        strcpy(string,str[2]);      

    printf("\nthe largest:\n%s\n",string);  

    return 0;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凤栖红尘

你的鼓励将是我最大的动力,谢谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值