第6章 利用数组批量处理数据
6.1怎样定义和引用一维数组
一维数组的定义
定义方式: 数据类型 数组名[常量表达式];
一维数组元素的引用
数组必须先定义,后使用
只能逐个引用数组元素,不能一次引用整个数组。
数组元素表示形式: 数组名[下标]
其中:下标可以是常量或整型表达式
例6.1
#include <stdio.h>
void main()
{ int i,a[10];
for(i=0;i<=9;i++)
a[i]=i;
for(i=9;i>=0;i- -)
printf(“%d”,a[i]);
}
运行结果:
9 8 7 6 5 4 3 2 1 0
一维数组的初始化
int a[5]={1,2,3,4,5};
等价于:a[0]=1; a[1]=2; a[2]=3; a[3]=4; a[4]=5;
例6.2 用数组来处理求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]);
}
return 0;
}
运行结果:
1 1 2 3 5
8 13 21 34 55
89 144 233 377 610
987 1597 2584 4181 6765
例6.3:用冒泡排序法将10个整数按照从小到大的顺序排序
#include <stdio.h>
void main()
{ int a[10],i,j,t;
printf("Input 10 numbers:\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("The sorted numbers:\n");
for(i=0;i<10;i++)
printf("%d ",a[i]);
}
例:用选择排序法将10个整数按照从小到大的顺序排序
#include <stdio.h>
int main( )
{
int a[11], i, j, k, x;
printf ("Input 10 numbers: \n");
for (i = 1; i < 11; i++)
scanf ("%d", &a[i]);
printf ("\n");
for (i = 1; i < 10; i++)
{
k = i;
for (j = i+1; j <= 10; j++)
if (a[j] < a[k]) k = j;
if (i != k)
{ x = a[i]; a[i] = a[k]; a[k] = x; }
}
printf("The sorted numbers:\n");
for (i = 1; i < 11; i++)
printf ("%d ", a[i]);
return 0;
}
6.2怎样定义和引用二维数组
二维数组的引用
形式: 数组名[下标][下标]
下标是整型或字符型的常量,变量或表达式。(定义时不能使用变量)
如: a[1][2] a[i][j]
数组元素可出现在表达式中,如: a[1][2]=a[2][2]/2
使用数组元素时,应注意不要超出其定义的范围;
如: int a[2][3]; a[2][3]=5;
例6.4 将二维数组行列元素互换,存到另一个数组中
#include <stdio.h>
void 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++)
{ for(j=0;j<=2;j++)
{ printf("%5d",a[i][j]);
b[j][i]=a[i][j];}
printf("\n");
}
printf("array b:\n");
for(i=0;i<=2;i++)
{ for(j=0;j<=1;j++)
printf("%5d",b[i][j]);
printf("\n");}
}
例6.5 求二维数组中最大元素值及其行列号
#include <stdio.h>
void main()
{ int a[3][4]={{1,2,3,4},
{9,8,7,6},{-10,10,-5,2}};
int i,j,row=0,colum=0,max;
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,row=%d,
colum=%d\n",max,row,colum);
}
6.3字符数组
字符数组:存放字符数据的数组。
一维字符数组:存放一个字符串(每个数组元素存放一个字符)
二维字符数组:存放多个字符串(行数是字符串的个数)
字符数组的定义
形式:
char 数组名[常量表达式]
char 数组名[常量表达式][常量表达式]
例6.6 输出一个字符串
#include <stdio.h>
void main()
{ char c[10]={'I',' ','a','m',' ','a',' ','b','o','y'};
int i;
for(i=0;i<10;i++)
printf("%c",c[i]);
printf("\n");
}
例6.7 输出一个钻石图形
#include <stdio.h>
void 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");
}
}
运行结果:
*
* *
* *
* *
*
字符串:用双引号括起的若干字符,如: “china”
可将其存放在一维或两维字符型数组中。
无字符串变量,用字符数组处理字符串
字符串结束标志:‘\0’,(既无动作,又不显示)
字符串的长度:第一个‘\ 0’以前字符的个数
在字符型数组或字符串中遇‘\ 0’,即认为该字符串结束。
系统对字符串常量自动加一个‘\0’作为结束符。
printf(“china”);
china/0
字符串输出函数 puts
格式: puts(字符数组)
功能:向显示器输出一个字符串(输出完,换行)
说明:字符数组必须以‘\0’结束。可以包含转义字符。
输出时‘\0’转换成‘\n’,即输出字符后换行。
字符串输入函数gets
格式:gets (字符数组)
功能:从键盘输入一个以回车结束的字符串放入字符
数组中,并自动加‘\0’。
说明:输入串长度应小于字符数组维数
字符串连接函数strcat
格式:strcat (字符数组1,字符数组2)
功能:把字符数组2连到字符数组1后面
返值:返回字符数组1的首地址
说明:字符数组1必须足够大
连接前,两串均以‘\0’结束;连接后,串1的‘\0’取
字符串拷贝函数strcpy
格式:strcpy(字符数组1,字符串2)
功能:将字符串2,拷贝到字符数组1中去
返值:返回字符数组1的首地址
说明:字符数组1必须足够大,>字符串2
字符数组1必须是数组名形式(str1),
字符串 2可以是字符数组名或字符串常量。
拷贝时‘\0’一同拷贝
不能使用赋值语句为一个字符数组赋值
例7 strcpy与strcat应用举例
#include <stdio.h>
void main()
{ char destination[25];
char blank[] = " ", c[]= "C++",
turbo[] = "Turbo";
strcpy(destination, turbo);
strcat(destination, blank);
strcat(destination, c);
printf("%s\n", destination);
}
Turbo C++
字符串比较函数strcmp
格式:strcmp(字符串1,字符串2)
功能:比较两个字符串
比较规则:对两串从左向右逐个字符比较(ASCII码),
直到遇到不同字符或‘\0’为止。
返回值:返回int型整数。其值是ASCII码的差值
a. 若字符串1< 字符串2, 返回负整数
b. 若字符串1> 字符串2, 返回正整数
c. 若字符串1== 字符串2, 返回零
说明:字符串比较不能用“= =”,必须用strcmp,
虽然编译无错,但结果不对
例:字符比较
#include <stdio.h>
void main( )
{ int i,j,k;
char a1[ ]=“wuhan”, a2[ ]=“beijing” ;
i=strcmp(a1,a2);
j=strcmp(“china”, “korea”);
k=strcmp(a2, “beijing” );
printf(“i=%d\ nj=%d\ nk=%d\ n”,i,j,k);
}
运行结果:
i=21 i=w-b=119-98=21
j=-8 j=c-k=99-107=-8
k=0 k=b-b=98-98=0
例6.8 输入一行字符,统计其中的单词个数,单词间空格分开。
#include <stdio.h>
void main()
{char string[81];
int i,num=0,word=0;
char c;
gets(string);
for(i=0;(c=string[i])!='\0';i++)
if(c==' ') word=0;
else if(word==0)
{word=1; num++;}
printf("There are %d words
in the line\n",num);
}
例6.9 有3个字符串,要求找出其中最大者。
#include <stdio.h>
#include <string.h>
void main()
{ char string[20],str[3][20];
int i;
for(i=0;i<3;i++)
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 string
is:\n%s\n",string);
}