第六章:利用数组处理批量数据

第六章:利用数组处理批量数据

(1)数组是一组有序数据的集合。数组中个数字的排列是有一定规律的,下标代表数据在数组中的序号。
(2)用一个数组名(如s)和下标(如15)来唯一确定数组中的元素,如 s 1 5 s_15 s15 就代表数组中的第15个元素。
(3)数组中的每一个元素都属于同一个数据类型。不能把不同的数据类型放在一个数组中。

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

6.1.1 怎样定义一维数组

定义一维数组的一般形式为:
类型符 数组名[常量表达式]
如:

int a[10];

注意:
(1)数组名的命名规则和变量名相同,遵循标识符明明规则。
(2)在定义数组时,需要指定数组中元素的个数,方括号中的常量表达式用来表示元素的个数,即数组长度。需要注意的是,a[10]表示a数组有10个元素,下标从0开始到9,不存在数组元素a[10]。
(3)常量表达式中可以包含包括常量和符号常量,如“int a[3+5]”是合法的。不能包含变量,如“int a[n]”是不合法的。

6.1.2 怎样引用一维数组

引用数组元素的表示形式为
数组名[下标]

6.1.3 一维数组的初始化

为了使程序简介,常在定义数组的同时给各数组元素赋值,作者称为数组的初始化
(1)在定义数组时对全部数组元素赋予初值,如:

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

(2)可以只给数组中的一部分元素赋值,如:

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

定义a数组有10个元素,但花括号内只提供5个初值,这表示只给前面5个元素赋初值,系统自动给后5个元素赋初值为0.
(3)如果想使一个数组中全部元素值为0,可以写成:

int a[10]={0,0,0,0,0,0,0,0,0,0}; //(1)
//或者
int a[10]={0}; //(2)

(4)在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度,例如:

int a[5]={1,2,3,4,5};
//可以写成
int a[]={1,2,3,4,5};

如果数组长度与提供初值的个数不相同,则方括号中的数组长度不能省略。

6.1.4 一维数组程序举例

例1:用数组来处理斐波那契数列问题

# 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-2];
		}
	for (i=0;i<20;i++){
		if (i%5==0)printf("\n");
		printf("%12d",f[i]);
		}
	printf("\n");
	return 0;

例2:冒泡排序

# include<stdio.h>

int main(){
    int a[10];
    int i,j,k,t;
    printf("please enter ten number:\n");
    for (i=0;i<10;i++){
        scanf("%d",&a[i]);
    }
    for (j=10;j>0;j--){
        for (k=0;k<j;k++){
            if(a[k]>a[k+1]){
                t = a[k];
                a[k] = a[k+1];
                a[k+1] = t;
            }
        }
    }
    printf("from small to big:\n");
    for (i=0;i<10;i++){
        printf("%d ",a[i]);
    }
    printf("\n");
    return 0;
}

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

6.2.1 怎样定义二维数组

二维数组定义的一般形式为:
类型说明符 数组名[常量表达式][常量表达式]
C语言中,二位数数组中元素排列的顺序是按行存放的,即在内存中先顺序存放第一行的元素,接着再存放第二行的元素。
用矩阵形式表示二维数组,是逻辑上的概念,能形象地表示出行列关系。而在内存中,各元素是连续存放的,不是二维的,是线性的。
C语言还允许使用多维数组,有了二维数组的基础,再掌握多维数组并不困难。

6.2.2 怎样引用二维数组

二维数组元素的表达形式为
数组名 [下标][下标]
下标应是整型表达式。

6.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},{5},{9}};
int a[3][4]={{1},{ },{9}};

(4)如果对全部元素都赋初值(即提供全部初始数据),即定义数组时对第1维的长度可以不指定,但第2维的长度不能省,如:

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

6.2.4 二维数组程序举例

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

# include <stdio.h>

int main(){
    int a[2][3] = {{1,2,3},{4,5,6}};
    int b[3][2];
    for (int i=0;i<2;i++){
        for (int j=0;j<3;j++){
            b[j][i]=a[i][j];
        }
    }
    printf("this is b:\n");
    for (int i=0;i<3;i++){
        for (int j=0;j<2;j++){
            printf("%d ",b[i][j]);
        }
        printf("\n");
    }
    return 0;
}

例2 有一个3×4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号

# include<stdio.h>

int main(){
    int a[3][4]={{1,5,6,2},{0,14,-5,68},{100,99,1,3}};
    int row=0,column=0,max=a[row][column];
    for (int i=0;i<3;i++){
        for (int j=0;j<4;j++){
            if (a[i][j]>max){
                max=a[i][j];
                row=i;
                column=j;
            }
        }
    }
    printf("the biggest one is:%d,which is located in row %d,column %d\n",max,row,column);
    return 0;
}

6.3 字符数组

6.3.1 怎样定义字符数组

char c[3];
c[0]='I';
c[1]=' ';
c[2]='a'

由于字符型数据是以整数形式存放的,因此也可以用整型数组来存放字符数据,如

int c[10];
c[0]='a';   //合法,但浪费存储空间

6.3.2 字符数组的初始化

(1)初始化列表,把各个字符一次赋给数组中各元素,如:

char c[5]={'i','A',' ','.',','};

(2)若在定义字符数组时不进行初始化,则数组中各元素的值是不可预料的。如果花括号中提供的初值个数大于数组长度,则出现语法错误。如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符(‘\0’)
(3)如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。

6.3.3 怎样引用字符数组中的元素

同之前的引用方式

6.3.4 字符串和字符串结束标志

在C语言中,是将字符串作为字符数组来处理的。为了测定字符串是实际长度,C语言规定了一个”字符串结束标志“,以字符’\0’作为结束标志。
基于以上,我们可以获得一个新的字符数组初始化方法:

char c[]="I am happy"; //可以加上花括号,也可以省略
//等效于
char c[]={'I',' ','a','m','','h','a','p','p','y','\0'}; //注意'\0',是字符串的结束标志

6.3.4 字符数组的输入输出

在这里插入图片描述
注意:
在这里插入图片描述
在这里插入图片描述

6.3.6 使用字符串处理函数

1.puts函数——输出字符串函数

其一般形式为:puts(字符数组)
其作用是将一个字符串(以’\0’结束的字符序列)输出到终端。在用puts输出时将字符串结束标志’\0’转换成’\n’,即输出完字符串后换行。

2.gets函数——输入字符串的函数

其一般形式为:gets(字符数组)
其作用是从终端输入一个字符串到字符数组,并且得到一个函数值。该函数值是字符数组的起始地址。一般利用gets函数的目的是向字符数组输入一个字符串,而不太关心其函数值。

3.strcat函数——字符串连接函数

其一般形式为:strcat(字符数组1, 字符数组2)
其作用是把两个字符数组中的字符串连接起来,把字符串2接到字符串1的后面,结果放在字符数组1中,函数调用后得到一个函数值——字符数组1的地址。
注意:
(1)字符数组1必须足够大,以便容纳连接后的新字符串。否则会报错。
(2)连接前两个字符串的后面都有’\0’,连接时将字符串1后面的’\0’取消,只在新串最后保留’\0’。

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

其一般形式为strcpy(字符数组1, 字符串2)
其作用是将字符串2复制到字符数组1中去。
注意:
(1)字符数组1的长度不应小于字符串2的长度
(2)“字符数组1”必须写成数组名形式,“字符串2”可以是字符数组名,也可以是一个字符串常量。
(3)如果在复制前未对字符数组1初始化或赋值,则字符数组1各字节中的内容是无法预知的,复制时将字符串2中的字符串和其后的’\0’一起复制到字符数组1中,取代字符数组1中的前几个字符,剩下的几个并不一定是’\0’,而是字符数组1中原有的最后几个字节的内容。
(4)不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组。字符串数组名是一个地址常量,不能被改变。只能用strcpy函数将一个字符串复制到另一个字符数组中去。用赋值语句只能将一个字符赋给一个字符型变量或字符数组元素。
(5)可以用strncpy函数将字符串2中前面n个字符复制到字符数组1中去,其形式为:
strncpy(字符数组1, 字符串2, n)作用是将字符串2中最前面的n个字符复制到字符数组1中,取代字符数组1中原有的最前面n个字符。但赋值的字符个数n不应多于字符数组1中原有的字符(不包括’\0’)

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

其一般形式为:strcmp(字符串1, 字符串2)
其作用是比较字符串1和字符串2。字符串比较的规则是:将两个字符串自左至右逐个字符相比(按照ASCII码值大小比较),直到出现不同的字符或遇到’\0’为止。如果全部字符相同,则认为两个字符串相等;若出现不相同的字符,则以第1对不相同的字符的比较结果为准。比较的结果由函数值带回。
(1)若字符串1与字符串2相同,则函数值为0;
(2)若字符串1>字符串2,则函数值为一个正整数;
(3)若字符串1<字符串2,则函数值为一个负整数;

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

其一般形式为:strlen(字符数组)
其作用为测字符串长度,函数的值为字符串中的实际长度(不包括’\0’在内)。也可以直接测试字符串常量的长度。

7.strlwr函数——转换为小写的函数

其一般形式为:strlwr(字符串)
其作用是将字符串中的大写字母换成小写字母。

8.strupr函数——转换为大写的函数

其一般形式为:strupr(字符串)
其作用是将字符串中的小写字母换成大写字母。

注意:在使用字符串处理函数时,应当在程序文件的开头用以下语句将string.h文件包含到本文件中。

# include<string.h>

6.3.7 字符数组应用举例

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值