五、数组
<1>为什么需要数组
为解决大量同类型数据的储存和使用
<2>数组的分类
*一维数组
*二维数组
*多维数组
【简单数组的初始化】
#include<stdio.h>
int main()
{
int a[5]={1,2,3,4,5};//a是数组的名字,是第一个元素的地址,5表示数组元素的个数
//并且这5个元素分别用a[0],a[1],a[2],a[3],a[4]来表示
int i;
for(i=0;i<5;++i)
printf("%d\n",a[i]);
return 0;
}
<3>一维数组
*怎样定义一维数组
为n个变量连续分配存储空间
所有变量的数据类型必须相同
所有变量所占的字节大小必需相等
eg:int a【5】;
*有关一维数组的操作
1、初始化
完全初始化:int a【5】={1,2,3,4,5};
不完全初始化:int a[5]={1,2,3};
不初始化:所有的元素是垃圾值
清零:int a[5]={0};
2、赋值
/*#include<stdio.h>
int main()
{
int a[5];
scanf("%d",&a[0]);
printf("%d\n",a[0]);
return 0;
}*/
/*#include <stdio.h>
int main()
{
int i;
int a[10] = {0};
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<10;i++)
{
printf("%d\n",a[i]);
}
return 0;
} */
#include <stdio.h>
int main()
{
int i;
int a[5]; // 数组名:a 是数组首元素的地址 -----相当于一个指针 是一个常量
//指针+整型值,表示地址的前移,前移的字节由指针指向的对象的类型决定
//b+1; 前移4个字节(int型)
printf("%#p\n",a); //打印输出数组a的地址 相当于a[0]的地址
printf("%#p\n",&a[0]);
printf("%#p\n",a+1);
printf("%#p\n",&a[1]);
printf("%#p\n",a+2);
printf("%#p\n",&a[2]);
printf("请输入数组a元素的值:");
for(i=0;i<5;i++)
{
scanf("%d",a+i); //赋值给数组a
}
printf("a数组元素的值为:");
for(i=0;i<5;i++)
{
printf("%d ",*(a+i));
}
return 0;
}
3、倒置【两种方法】
设以数组A[],另设一数组B[],我们将A[]的元素倒序赋给B[],再将B[]顺序赋给A[],就完成了一组交换,这种方法比较直观,但我们还要在内存中划定一片区域给B[],有一定缺陷。
#include <stdio.h>
int main()
{
int a[10],b[10];
int i;
for(i=0;i<10;i++) //按0~9赋值一个数组//
{
a[i]=i;
}
for(i=0;i<10;i++)//将a[]倒序赋值给b[]
{
b[i]=a[9-i];
}
for(i=0;i<10;i++)//再换过来//
{
a[i]=b[i];
}
for(i=0;i<10;i++)
{
printf("%d\n",a[i]);//打印//
}
return 0;
}
互换该数组内的前后元素,定义一个变量实现元素的互换
#include <stdio.h>
int main()
{
int t, i;
int a[10];
for(i = 0;i < 10;i++)//我们定义一个数组并赋值为1~10//
{
a[i] = i;
}
for(i = 0;i <= 5;i++)//数组中下标和为9的两个元素互换,要换10/2=5次,若数组长度为奇数则为n/2-1次//
{
t = a[i];//进行互换//
a[i] = a[9-i];
a[9-i] = t;
}
for(i = 0;i < 10;i++)
{
printf("%-3d",a[i]);//打印结果//
}
return 0;
}
/*#include<stdio.h>
int main()
{
int a[7]={1,2,3,4,5,6,7};
int i,j;
int t;
i=0;
j=6;
while(i<j)
{
t=a[i];
a[i]=a[j];
a[j]=t;
i++;
j--;
printf("%d\n",a[i]);
}
return 0;
}*/
4、排序【两种方法】
1.冒泡排序法:
#include<stdio.h>
int main ()
{
int i,j;
int temp;
int array[10];
printf("请输入10个整数:\n");
for(i=0; i<10; i++)
{
printf("第 %d 个元素: ",i+1);
scanf("%d",&array[i]);
}
for(i=0; i<10; i++)
{
for(j=0; j<10-i-1; j++)
{
if(array[j] > array[j+1]) //相邻元素之间比较
{ //大的元素向右移动
temp = array[j] //每一轮比较最大的元素在最后
array[j] = array[j+1]
array[j+1] = temp;
}
}
}
printf("排序后的结果: \n");
for(i=0; i<10; i++)
{
printf("%d",array[i]);
}
printf("\n");
return 0;
}
2.选择排序法:
#include<stdio.h>
int main( )
{
int i, j = 0;
int temp, array[10];
printf("请输入10个整数:\n");
for(i=0; i<10; i++)
{
printf("第 %d 个数: ",i+1);
scanf("%d",array+i);
}
for(i=0; i<10-1; i++)
{
for(j=i+1; j<10; j++) //10个元素选出最小的元素放在第一位
{
temp = array[i]; //在剩下9个元素中选出最小的放在第二位
if (array[i] > array[j]) //以此类推
{
array[i] = array[j];
array[j] = temp;
}
}
}
printf("排序过后的结果: \n");
for(i=0; i<10; i++)
{
printf("%d\t",array[i]);
}
}
5、错误写法
int a[5]; a[5]={1,2,3,4,5}; //错误 只有在定义数组的同时才可以整体赋值
int a[5]={1,2,3,4,5} a[5]=100;//错误 因为没有a【5】这个元素
int a[5]={1,2,3,4,5} int b[5]; b=a;//错误!!a,b不代表数组中所有的元素,他们是数组的名字,也代表数组中第一个元素的地址 //正确写法 for(i=0;i<5;++i) b[i]=a[i];
<4>二维数组
*eg:int a[3][4]
总共是12个元素,可以当做3行4列来看待
a[i][j]表示第i+1行,第j+1列的元素
int a[m][n]; 该二维数组最大位置的元素只能是a[m-1][n-1](右下角)
//可看做一个矩阵
*初始化
int [3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int [3][4]={
{1,2,3,4}
{5,6,7,8}
{9,10,11,12}
}
【输出数组内容】
#include<stdio.h>
int main()
{
int a[0];
int i;
int j;
for(i=0;i<3;++i)
{
for(j=0;j<4;++j)
printf("%d ",a[i][j]);
}
return 0;
}
<5>多维数组
*多维数组的遍历
多维数组也是存在遍历的,和一维数组遍历一样,也是需要用到循环。不一样的就是多维数组需要采用嵌套循环,如:遍历输出int num[3][3] = {undefined{1,2,3},{4,5,6},{7,8,9}};
*多维数组的定义
多维数组的初始化与一维数组的初始化类似也是分两种:
1、数据类型 数组名称[常量表达式1][常量表达式2]...[常量表达式n] = {undefined{值1,..,值n},{值1,..,值n},...,{值1,..,值n}};
2、数据类型 数组名称[常量表达式1][常量表达式2]...[常量表达式n]; 数组名称[下标1][下标2]...[下标n] = 值;
多维数组初始化要注意以下事项:
1、采用第一种始化时数组声明必须指定列的维数。因为系统会根据数组中元素的总个数来分配空间,当知道元素总个数以及列的维数后,会直接计算出行的维数;
2、采用第二种初始化时数组声明必须同时指定行和列的维数。
【注意:多维数组的每一维下标均不能越界!!!】