利用数组处理批量元素

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

6.1.1怎样定义一维数组

定义一维数组的一般形式
类型符 数组名[常量表达式]
说明:
(1)数组名的命名规则和变量名相同,遵循标识符命名规则
(2)在定义数组时,需要指定数组中元素的个数,方括号中的常量表达式用来表示元素的个数,即数组长度
(3)常量表达式中可以包括常量和符号常量,不能包括变量。

6.1.2 怎样引用一维数组元素

引用数组元素的表示形式
数组名[下标]
对10个数组元素依次赋值为0,1,2,3,4,5,6,7,8,9,要求按逆序输出。

#include <stdio.h>
int main()
{
int array[10],i;
for(i = 0; i<=9;i++)
array[i] = i;
for(i=9;i>=0;i--)
printf("%d\t",array[i]);
return 0;
}

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}; 

或者

int a[10] ={0};

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

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

可以写成

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

6.1.4 一维数组程序举例

用数组来处理fibonacci数列问题。
求fabonacci数列的前40个数。这个数列有如下特点:第1,2两个数为1,1,从第三个数开始,该数是其前面两个数之和。

 #include <stdio.h>
#define M 40
int main()
{
int array[M] = {1,1},i;
for(i=2;i<M;i++)
array[i]=array[i-1]+array[i-2];
for(i=0;i<M;i++)
printf("%d\n",array[i]);
return 0;
}

有十个地区的面积,要求对它们按由小到大的顺序排列

#include <stdio.h>
int main()
{
int a[10],i,j,temp;
printf("请输入十个地区的面积:\n");
for(i = 0;i<10;i++)
scanf("%d",&a[i]);
printf("-------\n");
for(i = 0;i<9;i++)
for(j=0; j<9-i;j++)
{
if(a[j]>a[j+1])
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
for(i= 0;i<10;i++)
printf("%d\n",a[i]);
return 0;
}

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

6.2.1怎样定义二维数组

二维数组定义的一般形式为
类型说明符 数组名[常量表达式][常量表达式]
例如;
float a[3][4],b[5][10];

6.2.2 怎样引用二维数组的元素

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

b[1][2] = 10;

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}};

它的作用是只对各行第一列的元素赋值,其余元素为0。
(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};

6.2.4二维数组程序举例

例 将一个二维数组行与列的元素互换,存到另一个二维数组中。例如
a[2][3]={{1,2,3},{4,5,6}};
b[3][2] = {{1,4},{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 <2;i++)
{
for(j=0;j<3;j++)
{
printf("%5d",a[i][j]);
b[j][i]=a[i][j];
}
printf("\n");
}
printf("array b:\n");
for(i= 0;i<3;i++)
{
for(j= 0; j <2;j++)
printf("%5d",b[i][j]);
printf("\n");
}
return 0;
}

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

#include <stdio.h>
int main()
{
int a[3][4],i,j,row,colum,max;
printf("请输入矩阵的值:\n");
for(i= 0;i<3;i++)
{
for(j= 0; j <4;j++)
scanf("%d",&a[i][j]);
}
for(i= 0;i<3;i++){
for(j= 0; j <4;j++)
{
printf("%7d",a[i][j]);
}
printf("\n");
}
max=a[0][0];
for(i= 0;i<3;i++)
for(j= 0; j <4;j++)
{
if(max < a[i][j])
{
max = a[i][j];
row =i+1;
colum = j+1;
}
}
printf("max = %d\nrow = %d\ncolum =%d\n",max,row,colum);
return 0;
}

6.3 字符数组

6.3.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';

6.3.2 字符数组的初始化

对字符数组初始化,最容易理解的方法是”初始化列表“,把各个字符依次赋给数组中的各个元素。例如:

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

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

可以引用字符数组中的一个元素,得到一个字符。
例 输出一个已知的字符串。

#include <stdio.h>
int main(){
char c[15];
int i;
printf("请输入一串字符串\n");
for(i=0;i<15;i++)
c[i] = getchar();
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;
}

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

在C语言中,是将字符串作为字符数组来处理的。为了测定字符串的实际长度,C语言规定了一个“字符串结束标识符”,以字符’\0’作为结束标志。
用字符串常量来使字符数组初始化。例如;

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

也可以直接省略花括号,写为:

char c[] = "I am happy";

等价于

char c[] = {'I',' ','a',m', ' ','h','a','p','p','y','\0'};

6.3.5 字符数组的输入输出

字符数组的输入输出可以有两种方法。
(1)逐个字符输入输出。用格式符"%c"输入或输出一个字符
(2)将整个字符串一次输入或输出。用"%s"格式符,意思是对字符串(string)的输入输出。
例如:

char c[] = {"China"};
printf("%s\n",c);

6.3.6 使用字符串处理函数

1.put函数——输出字符串的函数
其一般形式为
puts(字符数组)
其作用是将一个字符串(以’\0’结束的字符序列)输出到终端。假如已定义str是一个字符数组名,且该数组已被初始化为"China",则执行

puts(str);

其结果是在终端输出"China"。
2.gets函数——输入一个字符串的函数
其一般形式为
gets(字符数组)
其作用是从终端输入一个字符串到字符数组中,并且得到一个函数值。该函数值是字符数组的起始地址。如执行下列函数

gets(str);

从键盘输入:

Computer

将输入的"Computer"送给字符数组str,返回的函数值是字符数组的起始地址。
3.strcat函数——字符串连接函数
其一般形式为
strcat(字符数组1,字符数组2);
其作用是把两个字符数组中的字符串连接起来,把字符串2接到字符串1后面,结果放在字符数组1中,函数调用后得到一个函数值——字符数组1的地址。例如:

char str1[30] ={"People's Republic of"};
char str2[] = {"China"};
printf("%s",strcat(str1,str2));

输出

People's Republic of China

4.strcpy和strncpy函数——字符串复制函数
strcpy其一般形式为
strcpy(字符数组1,字符串2)
它的作用是将字符串2复制到字符数组1中去。例如:

char str[10],str2[] = "China";
strcpy(str1,str2);

说明:
(1)字符数组1必须定义得足够大,以便容纳被复制得字符串2,字符数组1的长度不应小于字符串2的长度
(2)“字符数组1”必须写成数组名形式(如str1),“字符串2”可以是字符数组名,也可以是字符串常量。例如:

strcpy(str1,"China");

(3)如果复制前未对str1数组初始化或赋值,则str1各字节中的内容是无法预知的,复制时将str2中的字符串和其后的’\0’一起复制到字符数组1中,取代字符数组1中前面6各字符,最后4个字符不一定是’\0’,而是str1原有的最后4个字节的内容
(4)不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组。
如下列两行都是不合法的

str1 ="China";		//企图用赋值语句将一个字符串常量直接赋给一个字符数组
str1 = str2;		//企图用赋值语句将一个字符数组直接赋给另一个字符数组

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

strncpy(str1,str2,2);

作用是将str2中最前面2各字符复制到str1中,取代str1原有的最前面2个字符。但复制的字符个数不应多于str1中原有的字符。
5.strcmp函数——字符串比较函数
其一般形式为
strcmp(字符串1,字符串2)
它的作用是比较字符串1和字符串2。例如

strcmp("China","Korea");
strcmp(str1,str2);
strcmp(str1,"BeiJing");

说明:字符串的比较规则是:将两个字符串自左至右逐个字符相比(按ASCII码大小比较),直到出现不同的字符或遇到’\0’为止。
(1)如全部字符相同,则认为两个字符串相等
(2)若出现不相同的字符,则以第一对不相同的字符的比较结果为准。
如果参加比较的两个字符串都由英文字母组成,则有一格简单的规律:在英文字典中位置在后买你的大。
比较的结果由函数值带回。
(1)如果字符串1=字符串2,则函数值为0。
(2)如果字符串1>字符串2,则函数值为一个正整数。
(3)如果字符串1<字符串2,则函数值为一个负整数。
6.strlen函数——测字符串长度的函数
其一般形式是
strlen(字符数组)
它的作用是测试字符串长度的函数。函数值为字符串中的实际长度(不包括’\0’在内)。例如:

char str[10] = "China";
printf("%d",strlen(str));

输出结果不是10,也不是6,而是5.也可以直接测试字符串常量的长度。例如:

strlen("China");

7.strlwr函数——转换为小写的函数
其一般形式为
strler(字符串)
函数的作用是将字符串中大写字母换成小写字母。
8.strupr函数——转换为大写的函数
其一般形式为
strupr(字符串)
函数的作用是将字符串中的大写字母换成小写字母。

6.3.7 字符数组应用举例

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

#include <stdio.h>
int main()
{
char ch[100];
int i,word=0;
printf("请输入一行字符\n");
gets(ch);
for(i=1;ch[i]!='\0';i++)
{
if((ch[i]==' ' &&ch[i-1] != ' ') || (ch[i]=='\0' && ch[i-1] != ' '))
word++;
}
printf("该行字符中有%d个单词\n",word);
return 0;
}

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

#include <stdio.h>
#include <string.h>
int main()
{
char str[3][20];
char larger[20];
int i;
for(i = 0;i < 3;i++)
{
printf("请输入第%d个字符串\n",i+1);
gets(str[i]);
}
strcpy(larger,str[0]);
for(i=1;i<3;i++)
if(strcmp(larger,str[i])<0)
strcpy(larger,str[i]);
printf("The larger string is %s\n",larger);
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值