文章目录
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;
}