C语言学习笔记之(数组)

一、一维数组

1.格式

类型说明符 数组名 [常量表达式];
int ch[20];		/*定义整型数组ch,有20个元素*/
float b[10],c[20];	/*定义实型数组b,有10个元素;实型数组c,有20个元素*/

2.赋值

对数组进行初始化赋值的一般形式为:
类型说明符 数组名[常量表达式]={数值1,数值2,…,数值n};
其中,在{}中的各数据值即为各元素的初值,各值之间用逗号间隔。例如:
int a[3]={0,1,2};
经过以上初始化后,a[0]=0,a[1]=1,a[2]=2。

3.定义

例如:定义语句“int a[15];”说明了以下几个问题:

① 数组名为a。

② 数组元素的数据类型为int整型。

③ 数组元素的下标值从0开始。数组元素的个数为15个,分别是a[0],a[1],a[2]…,a[13],a[14]。

④ 数组名a是数组存储区的首地址,即存放数组第一个元素的地址:a→&a[0],因此,数组名是一个地址常量,不能对数组名进行赋值和运算。数据元素的存储形式如图所示,在Visual C++中,一个整型变量的存储空间为4个字节,所以此空间大小为4*15=60字节。

4.例子1:实现从键盘中输入10个互不相同的整数,输出这10个数并求其中的最小数。

#include <stdio.h>
int main()
{
      int a[10];						/*数组定义,定义数组a*/
      int i,min;						/*定义循环变量i和最小值min*/
      for(i=0;i<=9;i++)					/*循环10次*/
	 scanf("%d",&a[i]);				/*数组引用,给数组元素赋值*/
      for(i=0;i<=9;i++)					/*循环10次*/
	 printf("%4d",a[i]);				              /*数组引用,输出数组元素的值*/
      min=a[0];						/*数组引用,给min变量赋初值*/
      for(i=1;i<=9;i++)					/*循环9次*/
	 if(min>a[i])					/*数组引用,如果min大于a[i]*/
	          min=a[i];					/*数组引用,将较小的赋给min*/
      printf("\n最小值为%d\n",min);		                             /*输出最小值*/
      return 0;
}

5.例子2:给定任意n个整数,按由小到大次序对其进行排序,并输出结果。

#include <stdio.h>
#define N 10						/*定义符号常量,N为排序数字个数*/
int main()
{ 
	int a[N];						/*定义数组a*/
	int i,j,t;						/*定义变量*/
	printf("请输入10个整数:\n");	/*输出提示语*/
	for(i=0;i<N;i++)				/*从键盘接收N个数据放入数组a中*/
	{
		printf("a[%d]=",i);	
		scanf("%d",&a[i]);
	}
	for(i=0;i<N;i++)				/*i是趟次循环变量(外循环变量)*/
        for(j=i+1;j<N;j++)			/*j是每趟中比较的次数变量(内循环变量)*/
	   if(a[i]>a[j])			/*比较相邻两数大小,将较小的数放在前面*/
	   {   
	          t=a[j];
	          a[j]=a[i];
	          a[i]=t;
	   }
   printf("排序后的顺序为:\n");	               /*输出提示语*/
   for(i=0;i<N;i++)				/*将排序好的数组输出*/
       printf("%d\t",a[i]);
   printf("\n");				/*输出回车符*/
   return 0;
}

二、二维数组

1.格式

类型说明符 数组名[常量表达式1][常量表达式2];
其中,常量表达式1表示行下标,常量表达式2表示列下标。数组元素个数为:常量表达式1常量表达式2。与一维数组相同,下标值从0开始。例如:
int x[2][3];
x是二维数组名,这个二维数组共有6个元素(2×3=6),分别是:x[0][0],x[0][1],x[0][2],x[1][0],x[1][1],x[1][2],其全部元素数据类型均为整型。
二维数组在概念上是二维的,但在存储器中是按一维线性排列的。在C语言中,二维数组是按行排列的。例如,二维数组x[2][3],先放第一行,即x[0][0],x[0][1],x[0][2];再放第二行,即x[1][0],x[1][1],x[1][2];

2.赋值

二维数组的初始化有两种方法:
(1)把初始化值括在一对大括号内,例如:
int x[2][3]={1,2,3,4,5,6};
初始化结果是:x[0][0]=1,x[0][1]=2,x[0][2]=3,x[1][0]=4,x[1][1]=5,x[1][2]=6。
(2)把二维数组看作是一种特殊的一维数组,该数组的每个元素又是一个一维数组。例如:定义了二维数组x[2][3],可以把数组x看成是具有两个元素的一维数组,其元素是x[0]和x[1];而每个元素x[0]和x[1]又都是具有三个元素的一维数组。

因此,二维数组的初始化也可以分解成多个一维数组的初始化,例如:
int x[2][3]={{1,2,3},{4,5,6}};

3.例子1:求一个3*3矩阵的两条对角线元素之和(注意:两条对角线交叉点处的元素只计算一次)。

#include <stdio.h>
int main()
{ 
	int a[3][3];			/*定义3*3矩阵*/
	int i,j,sum,result1=0,result2=0;	/*定义变量*/
	for (i=0;i<3;i++)			/*外循环*/
	{
	       printf("输入一行: ");		/*输出提示信息*/
	       for(j=0;j<3;j++)		/*内循环*/
	       { 
		scanf("%d",&a[i][j]);	/*逐行输入矩阵*/
		if(i==j)			/*如下标相同,则累加到result1*/
		     result1+=a[i][j];
		if(i+j==2&&i!=j)		/*如下标不同且和为2,则累加到result2*/
		     result2+=a[i][j];
	       }
	}
	sum=result1+result2;		/*将result1和result2相加*/
	printf("sum=%d\n",sum);		/*输出结果*/
}

4.例子2:一个学习小组有6个人,每个人有3门课(数学、语文和英语)的考试成绩,如表所示。求每门课的平均分和每个人的平均分。

可设一个二维数组a[3][6]存放6个人3门课的成绩。再设一个一维数组v[3]存放每门课的平均分,设一个一维数组w[6]存放每个人的平均分。

课程王笑李鹏吴欣张平赵明张晓娜
数学859384859586
语文7995958010098
英语809193759790
#include <stdio.h>
int main()
{
      int i,j,s=0,v[3],w[6];				         /*定义变量*/
      int a[3][6]={{85,93,84,85,95,86},{79,95,95,80,100,98},{80,91,93,75,97,90}};
					                       /*初始化*/
      for(i=0;i<3;i++)				        /*外循环*/
      {
	for(j=0;j<6;j++)				        /*内循环*/
	      s=s+a[i][j];				        /*各科的分数累加*/
	v[i]=s/6;				                       /*各科平均分*/
	s=0;					        /*s重新赋初值0*/
	}
      for(j=0;j<6;j++)				/*外循环*/
      {
	 for(i=0;i<3;i++)				/*内循环*/
	      s=s+a[i][j];				/*各人的分数累加*/
	 w[j]=s/3;					/*各人平均分*/
	 s=0;					/*s重新赋初值0*/
      }
      printf("数学:%d\t语文:%d\t英语:%d\n",v[0],v[1],v[2]);
						/*输出各科平均分*/
      printf("王笑:%d\t李鹏:%d\t吴欣:%d\t张平:%d\t赵明:%d\t张晓娜:%d\n",
              w[0],w[1],w[2],w[3],w[4],w[5]);	              /*输出每个人的平均成绩*/
      return 0;
}

三、字符数组

1.格式

前面介绍的都是数值型数组,即数组元素都是数值型。那么还有一种数组,其每个元素都是一个字符,也就是说,数组元素的数据类型都是char类型,称为字符数组。定义字符数组的方法与定义数值型数组的方法类似。例如:
char a[5];				/*定义字符数组a*/
char b[3][4];				/*定义二维字符数组b*/

2.赋值

字符数组的引用也与数值型数组引用方式一样,可使用下标的形式。例如,为上面定义的数组a中的第1个元素赋值,可以用如下方式描述:
a[0]='H';
字符数组同样允许在定义时进行初始化赋值。字符数组初始化的过程与数值型数组初始化的过程相似。例如:
char a[5]={'H','e','l','l','o'};
赋值后各元素的值为:a[0]='H',a[1]='e',a[2]='l',a[3]='l',a[4]='o'。
字符数组与数值型数组在初始化时的区别在于:如果字符数组在初始化时提供的数据个数少于数组元素个数,则多余的数组元素初始化为空字符'\0',而数值型数组是0。例如:
char b[9]={'G','o','o','d'};
初始化后各元素的值为:b[0]='G',b[1]='o',b[2]='o',b[3]='d',b[5]='\0',b[6]='\0',b[7]='\0',b[8]='\0'。

3.例子1:编写程序,将字符I love C!存放在一维数组中并输出。

#include <stdio.h>
int main()
{
	char c[9]={'I',' ','l','o','v','e',' ','C','!'};	                             /*初始化字符数组c*/
	int i;				                             /*定义循环变量i*/
	for(i=0;i<9;i++)					/*输出字符数组c中每个元素的值*/
		printf("%c",c[i]);				/*格式化输出语句中,输出字符用%c*/
	printf("\n");				               /*输出换行符*/
	return 0;
}

四、字符串

1.格式

在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。前面介绍字符串常量时,已说明字符串总是以'\0'作为串的结束符。因此,当把一个字符串存入一个数组时,也把结束符'\0'存入数组,并以此作为该字符串是否结束的标志。
存放字符串的字符数组的初始化有两种方法。
用字符常量初始化数组。用字符常量给字符数组赋初值时,要用花括号将赋值的字符常量括起来。例如:
char str[6]={'C','h','i','n','a','\0'};
数组str[6]被初始化为“China”,其中,最后一个元素的赋值'\0'可以省略。
用字符串常量初始化数组。例如:
char string[6]={"China"};
还可将“{}”去掉,写成:
char string[6]="China";

2.例子1:编程实现从键盘输入一个字符串,存放于一个数组中,并将该数组输出。用不同的输入/输出函数实现。

用格式化输入输出字符实现如下

#include <stdio.h>
int main()
{
	char a[10];				/*定义数组a能够存放10个元素*/
	int i;					/*定义循环变量i*/
	for(i=0;i<10;i++)			              /*循环实现逐个输入a[i]的值*/
		scanf("%c",&a[i]);		              /*用scanf()对字符数组进行赋值*/
	for(i=0;i<10;i++)			              /*循环实现逐个输出a[i]的值*/
		printf("%c",a[i]);		              /*用printf()输出字符数组中的内容*/
	printf("\n");				/*输出回车符*/
	return 0;
}

用字符输入输出函数实现如下

#include <stdio.h>
int main()
{
	char a[10];				/*定义数组a能够存放10个元素*/
	int i;						/*定义循环变量*/
	for(i=0;i<10;i++)			/*循环实现逐个输入a[i]的值*/
		a[i]=getchar();			/*用getchar()对字符数组进行赋值*/
	for(i=0;i<10;i++)			/*循环实现逐个输出a[i]的值*/
		putchar(a[i]);			/*用putchar()输出字符数组中的内容*/
	printf("\n");				/*输出回车符*/
	return 0;
}

3.字符串输入输出函数

① gets函数为字符串输入函数,函数调用格式为:
gets(字符串数组名)
其作用是从终端输入一个字符串到字符数组,并且得到一个函数值。该函数值是字符数组的起始位置。如执行函数:
gets(a);			/*a为已定义的字符数组*/
② puts函数为字符串输出函数,函数调用格式为:
puts(字符串数组名)
其作用是将一个字符串(以'\0'结束的字符序列)输出到终端。

例子:编写程序,将字符I love C!存放在一维数组中并输出。

#include <stdio.h>
#include <string.h>
int main()
{
	char str1[30]="I love ",str2[]="C!";	                             /*初始化str1和str2*/
	strcat(str1,str2);					/*调用strcat函数*/
	puts(str1);					/*输出str1*/
	return 0;
}

4.字符串拷贝函数strcpy函数

格式

其一般格式为:
strcpy(字符数组名1,字符数组名2)
功能:把字符数组2中的字符串拷贝到字符数组1中。串结束标志'\0'也一同拷贝。字符数组2,也可以是一个字符串常量,这时相当于把一个字符串赋予一个字符数组。

例子:编写程序实现将字符串2中的字符拷贝到字符串1中

#include <stdio.h>
#include <string.h>
int main()
{
	char str1[15],str2[]="C Language";	                /*定义两个字符数组,并为str2赋初值*/
	strcpy(str1,str2);				  /*调用strcpy函数*/
	puts(str1);				  /*输出字符串1*/
	return 0;
}

5.大小写转换函数strlwr函数和strupr函数

格式

① strlwr函数的一般格式为:
strlwr(字符数组名)
功能:将字符串中的字符转换成小写。
② strupr函数的一般格式为:
strupr(字符数组名)
功能:将字符串中的字符转换成大写。

例子:编程实现将一字符串中的字符转换成小写输出,再转换成大写输出。

#include <stdio.h>
#include <string.h>
int main()
{
	char s[]="how ARE You?";			/*初始化字符串s*/
	strlwr(s);					/*将s中的字符转换成小写*/
	puts(s);					/*输出s*/
	strupr(s);				/*将s中的字符转换成大写*/
	puts(s);					/*输出s*/
	return 0;
}

6.字符串比较函数strcmp函数

格式

其一般格式为:
strcmp(字符数组名1,字符数组名2)
功能:将两个数组中的字符串从左至右逐个相比较,比较字符的ASCII码大小,并由函数返回值返回比较结果。
(1)如果字符串1=字符串2,则返回值为0。
(2)如果字符串1>字符串2,则返回值为一个正整数。
(3)如果字符串1<字符串2,则返回值为一个负整数。

例子:比较两字符串的大小,并输出结果。

#include <stdio.h>
#include <string.h>
int main()
{ 
	int k;				/*定义变量k用于存放strcmp函数的返回值*/
	char str1[15],str2[15];		/*定义字符数组*/
	printf("请输入第一个字符串:");	/*输出提示语*/
	gets(str1);			/*输入字符串1*/
	printf("请输入第二个字符串:");	/*输出提示语*/	
	gets(str2);			/*输入字符串2*/
	k=strcmp(str1,str2);		/*调用strcmp函数*/
	if(k==0) printf("str1=str2\n");	/*返回值为0,那么字符串1=字符串2*/
	if(k>0) printf("str1>str2\n");		/*返回值>0,那么字符串1>字符串2*/
	if(k<0) printf("str1<str2\n");		/*返回值<0,那么字符串1<字符串2*/
	return 0;
}