第6章 利用数组处理批量数据
数组是一组有序数据的集合。数组中各数据的排列是有一定规律的,下标代表数据在数组中的序号
用一个数组名和下标惟一确定数组中的元素
数组中的每一个元素都属于同一个数据类型
一维数组
定义一维数组的一般形式为:
类型符 数组名[常量表达式];
数组名的命名规则和变量名相同
如 int a[10];
引用数组元素的表示形式为:
数组名[下标]
a[0]=a[5]+a[7]-a[2*3]
int n=5, a[10];
a[n]=20;
对10个数组元素依次赋值为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;
}
一维数组的初始化
在定义数组的同时,给各数组元素赋值
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};
int a[5]={1,2,3,4,5}; 可写为
int a[ ]={1,2,3,4,5};
用数组处理求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;
}
有10个地区的面积,要求对它们按由小到大的顺序排列。
int a[10]; int 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]);
printf("\n");
二维数组
二维数组定义的一般形式为
类型符 数组名[常量表达式][常量表达式];
如:float a[3][4],b[5][10];
二维数组元素的表示形式为:
数组名[下标][下标]
将一个二维数组行和列的元素互换,存到另一个二维数组中。
#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++)
{ 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");
}
return 0;
}
有一个3×4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。
“打擂台算法”
……
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\n
colum=%d\n",max,row,colum);
……
字符数组
用来存放字符数据的数组是字符数组
字符数组中的一个元素存放一个字符
定义字符数组的方法与定义数值型数组的方法类似
输出一个已知的字符串。
#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;
}
为了测定字符串的实际长度,C语言规定了字符串结束标志’\0’ ,’\0’代表ASCII码为0的字符
字符数组的输入输出
字符数组的输入输出可以有两种方法:
逐个字符输入输出(%c)
整个字符串一次输入输出(%s)
善于使用字符串处理函数
-
puts函数 –– 输出字符串的函数
其一般形式为:
puts (字符数组)
作用是将一个字符串输出到终端
char str[20]=”China”;
puts(str);
输出:China -
gets函数 –– 输入字符串的函数
其一般形式为:
gets (字符数组)
作用是输入一个字符串到字符数组
char str[20];
gets(str);
输入:Computer↙ -
strcat函数 –– 字符串连接函数
其一般形式为:
strcat (字符数组1,字符数组2)
其作用是把两个字符串连接起来,把字符串2接到字符串1的后面,结果放在字符数组1中
使用字符串函数时,在程序开头用 #include <string.h>
char str1[30]=”People”;//要足够大
char str2[]=”China”;
printf(”%s”, strcat(str1,str2));
输出:PeopleChina
-
strcpy和strncpy函数 –– 字符串复制
strcpy 一般形式为:
strcpy (字符数组1,字符串2)
作用是将字符串2复制到字符数组1中去
char str1[10],str2[]=”China”;
strcpy(str1,str2);
相当于
strcpy(str1,”China”);
可以用strncpy函数将字符串2中前面n个字符复制到字符数组1中去
strncpy(str1,str2,2);
作用是将str2中最前面2个字符复制到str1中,取代str1中原有的最前面2个字符
复制的字符个数n不应多于str1中原有的字符
-
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”); 正确
-
strlen函数 –– 测字符串长度的函数
其一般形式为:
strlen (字符数组)
它是测试字符串长度的函数
函数的值为字符串中的实际长度char str[10]=”China”;
printf(”%d”,strlen(str));
输出结果是5
也可以直接测试字符串常量的长度
strlen(”China”); -
strlwr函数 –– 转换为小写的函数
其一般形式为
strlwr (字符串)
函数的作用是将字符串中大写字母换成小写字母 -
strupr函数 –– 转换为大写的函数
其一般形式为
strupr (字符串)
函数的作用是将字符串中小写字母换成大写字母
输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。
……
char string[81],c; int i,num=0,word=0;
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++) 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;
}