先从一个简单程序说起,输入3名学生的分数并求其平均分数:
#include<;
int main(){
int stuScord1,stuScord2,stuScord3;
printf("输入学生1成绩");
scanf("%d",&stuScord1);
printf("输入学生2成绩");
scanf("%d",&stuScord2);
printf("输入学生3成绩");
scanf("%d",&stuScord3);
printf("3学生的平均分数为:%d",(stuScord1+stuScord2+stuScord3)/3);
}
以上程序乍一看是没有任何问题,但是我们只不过输入了3学生的分数,如果我们需要输入一班学生甚至一个年级的学生,难道要上百个甚至上千个变量?显然不可能,因此需要一个解决上述简单问题的办法,那么人们就想到批量处理数据的办法,那就是数组,数组在C语言中是非常重要的概念,基本任何高级编程都要用到数组,因此把数组用的得心应手将显得十分重要。
一、数组的定义和引用:
数组分为一维数组,二维数组及多维数组,先介绍一维数组,一维数组就是存储一维数列中数据的集合,其一般形式为:类型 数字标识符[常量表达式],其中类型可以是整型、字符型、实型等。所为物以类聚,数组中的数据必须是同一类型,倘若可以添加其他类型的数据,那么数组也就基本失去了存在的意义,毕竟没规矩不方圆。
注:下标可以是整型常量或整型表达式。
方括号中的常量表达式定义了数组中存放数组元素的个数,及数组长度,如int a[5],5表示数组a有五个元素,但数组中每个元素的索引范围0~4。
①、初始化:定义数组时可以直接对数组元素赋值,如a[5]={1,2,3,4,5}、b[5]={1,2,3},后者只给一部分元素赋值,后面元素补0,当然也可以不指定长度,如c[]={1,2,3,4,5,6},大括号中有6个元素,系统会根据初始化元素值的个数来确定数组长度,该数组变量的长度为6。
二、二维数组:
二维数组跟一维数组的声明大致相同:类型 数组标识符[常量表达式1][常量表达式2],表达式1为行下标,2为列下标,如int a[m][n],行下标范围的取值范围为0~m-1,列下标的范围为0~n-1,数组中最大下标元素是a[m-1][n-1]。
二维数组初始化:
①、可以将元素写入大括号内,按照顺序给元素赋值,不足补0,如a[3][2]={{1,2},{3,4}}。
②、为所有元素赋值时可以省略行下标,但绝不可省略列下标,如a[][3]={{1,2,3},{8,10}},系统默认两行,不足补0。
③、当然也可以逐个赋值,如数组a[2][3];a[0][0]=1,a[0][1]=2。
三、字符型数据:
主要介绍字符型数组的赋值方式,其实字符数组赋值方式有上面的赋值方式外,如 char c[]={'a','b','c'},还有一种赋值方式,也就是字符串赋值方式,如 char c[]="i love you",应当想到字符串总是以'\0'结尾,因此当把一个字符串赋给字符串数组时实际上字符串数组中最后一个元素是'\0',因此上面的赋值语句实际上等同于char c[]={'i',' ','l','o','v','u',' ','y','o','u','\0'},这个是需要注意的。
四、数组的基本排序:
①、选择排序法:每次选择所要排序的数组中的最大值(由大到小)或最小值(由小到大),将这个数组元素与前面没有排序的数组元素进行互换(要是前面的已经排过,说明前面已经有更大(更小)的值,当然不能互换),如数组元素是:3、4、5、2、1。要是按有小到大排序的话,那么先通过循环找到最小的值,并声明一个变量来存放当前(最小值)位置的索引,然后与第一个元素进行互换得到:1、4、5、2、3,然后从第二个元素开始,在通过循环找到其中最小的元素,并记录当前元素的索引值,然后进行互换,第二步过后变成:1、2、5、4、3,继续上面的过程,最后会变成由小到大排列的数组。
主要代码段:
int i,j,a[5],temp,ps;
通过循环输入数组元素值,
for(i=0;i<4;i++){
temp=a[i];
ps=i;
for(j=i+1;j<5;j++){
if(a[j]<temp){
temp=a[j];
ps=j;
}
}
a[ps]=a[i];
a[i]=temp;
}
②、冒泡排序法:
冒泡排序法指的是每次比较相邻的两个数组元素,以较小的数放在较大数前面(从小到大)。比如上面的数组a[5]={3、4、5、2、1},先比较第一个跟第二个元素,可以发现不须要变动,因3比4小不变,3在4前面,因而不需要互换,然后在通过4跟5毕竟,5比4大,所以不互换,然后在通过5跟2比,因为5比2大并且5在2前面,所以发生互换,那么互换后变成3、4、2、5、1,然后在通过5跟1比,5比1大,1在5后面,所以发生互换,最后变成3、4、2、1、5可以发现进过一个循环下来,大数下沉,大数到了最后面,然后除去最后一个数,前面的元素依次按照上面的过程,那么最终元素将变成从小到大。
主要代码段:
int i,j,a[5],temp;
通过循环输入数组元素值,
for(i=1;i<5;i++){
for(j=4;j>=i;j--){
if(a[j]<a[j-1]){
temp=a[j-1];
a[j-1]=a[j];
a[j]=temp;
}
}
}
③、交换法排序:
交换排序法指让每一位数与其后所有的数相比较,要是有符合的则交换位置。如数组a[5]={3、2、5、4、1},首先先让3跟2比,由于3比2大,所以互换,2变成第一个数,即2、3、5、4、1,接下来用2跟5比,不发生互换,2跟4比不发生互换,接着跟1比,1比2小,发生互换,一次循环下来变成1、3、5、4、2,接下来除去一,从第二个元素开始比较,第二轮下来,数据变成1、2、3、5、4,然后从第三个元素在此按照上面的执行,最后就会变成12345。
主要代码:
int i,j,a[5],temp;
通过循环输入数组元素值,
for(i=0;i<4;i++){
for(j=i+1;j<5;j++){
if(a[j]<a[i]){
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
当然了还有插入法排序,二分法排序等等,主要是算法,只要想通了也就不难了。
实际上基础知识扎实是一方面,但是后期应该多多练习,多看看别人的程序,自己用心去体会用心去理解,经过一段时间后编程水平将大大提高。