4.1 数组的 引入及基本用法
一、定义一个数组
如何定义一个数组
1、相同数据类型
关于中括号的解释[ ]
定义的时候表示数组中元素的总个数 int a[10];
下标法表示数组中的某个元素,从0开始计数
整型 4个字节
类型名 数组名 常量表达式
int a[10];
即:定义一个整型数组,数组名为a, 此数组有10个元素
2、数组如何遍历
#include <stdio.h>
int main()
{
int a[10];//10表示大小
int i;
for(i=0;i<10;i++)
{
a[i]=i+100;
}
for(i=0;i<10;i++)
{
printf("%d %p\n",a[i] &a[i]);
}
printf("done");
return 0;
}
特点:
下标法访问 结合循环控制语句 地址连续的
4.2 数组计算大小和各种初始化
<1>全部赋值
int a[10]={1,2,3,4,5,6,7,8,9};
<2>部分复制
int a[10]={1,2,3,4,5};
<3>初始化成0
int a[10]={0,0,0,0,0,0,0,0,0,0};
<4>见怪不怪 写法
int a[5]={1,2,3,4,5}; 可以写成 int a[]={1,2,3,4,5}
这时可以计算size大小,size=sizeof(a)/sizeof(a[0]); [size 是关键字]
#include <stdio.h>
int main()
{
int a[10]={100,101,102,103,104,105,106,107,108,109};
int data;
int size;
/*for(data =0; data <10; data++)
{
a[data]=data+100;
}
puts("初始化完毕");*/
size=sizeof(a)/sizeof(a[0]);
//sizeof(a)整个数组的大小;sizeof(a[0]一个数组的大小
for(data =0; data <size; data++)
{
printf("address:%p,%d \n",&a[data],a[data]);
}
puts("done");
return 0;
}
4.3 数组应用编程练习
编程案例
1、数组初始化及逆序输出
例子: 对10个数组元素依次赋值为0,1,2,3,4,5,6,7,8,9,要求按逆序输出;
说明
#include <stdio.h>
int main()
{
int a[]={0,1,2,3,4,5,6,7,8,9};
int size;
size=sizeof(a)/sizeof(a[0]);
printf("size大小为%d\n",size);
int i;
printf("逆序输出 ");
for(i=size;i>0;i--)
{
printf("%d ",a[i]);
}
printf("done");
return 0;
}
结果:
D:\code\复习\notpad++\if>a.exe
size大小为10
逆序输出 10 9 8 7 6 5 4 3 2 1 done
2、斐波那契数列
斐波那契数列:
0,1,1,2,3,5,8,13,21,34,55,。。。。。。。。。。。46398.。。。。。。。。。
an=an-1+an-2;
#include <stdio.h>
int main()
{
int a[20];//20必须写,如果没有写各个元素的话
int size;
size=sizeof(a)/sizeof(a[0]);
printf("size大小为%d\n",size);
int i;
a[0]=0;//不加int
a[1]=1;//不加int
for(i=2;i<size;i++)
{
a[i]=a[i-1]+a[i-2];
}
for(i=0;i<size;i++)
{
printf("%d\n",a[i]);
}
printf("done");
return 0;
}
4.4 数组编程练习之冒泡排序法
问题:a[]={1,2,3,4,5,6}
a[10];
a[1]=10; 不加int
1、a[]={8,9,12,13}; 从大到小输出
//输出从大到小,大的向右移(视屏中的每行结果是从小到大,),i=i-1;j从0开始,j=j-i-1
#include <stdio.h>
int main()
{
int arry[]={12,8,13,9};
int i;
int j;
int len;
int tmp;
len=sizeof(arry)/sizeof(arry[0]);
for (i=0;i<len-1;i++)
{
for (j=0;j<len-i-1;j++)
if(arry[j]<arry[j+1]){
tmp=arry[j];
arry[j]=arry[j+1];
arry[j+1]=tmp;
}
}
for (i=0;i<len;i++)//不应该len-1
{
printf("%d ",arry[i]);
}
return 0;
}
2、a[]={8,9,12,13}; 从小到大输出
//输出从小到大,小的向右移(视屏中的每行结果是从大到小,),i=i-1;j从0开始,j=j-i-1
#include <stdio.h>
int main()
{
int arry[]={12,8,13,9};
int i;
int j;
int len;
int tmp;
len=sizeof(arry)/sizeof(arry[0]);
for (i=0;i<len-1;i++)
{
for (j=0;j<len-i-1;j++)
if(arry[j]>arry[j+1]){
tmp=arry[j];
arry[j]=arry[j+1];
arry[j+1]=tmp;
}
}
for (i=0;i<len;i++)//不应该len-1
{
printf("%d",arry[i]);
}
return 0;
}
D:\code\4>gcc 4.4.1.c
D:\code\4>a.exe 8 9 12 13 D:\code\4>
4.5简单选择排序法
1、简单选择排序法
//选择排序,从大到小,12,8,13,9 //首先a[0]和a[1]比,然后a[0]和a[2]比,最后a[0]和a[3]比,只要遇到值大的就交换,输出a[0] //首先a[1]和a[2]比,然后a[1]和a[3]比,输出a[1] //首先a[2]和a[3]比,输出a[2]
#include <stdio.h>
int main()
{
int array[]={12,8,13,9};
int i;
int j;
int temp;
int len=sizeof(array)/sizeof(array[0]);
for(i=0;i<len-1;i++)
{
for(j=i+1;j<len;j++) // j=i+1;
{
if (array[i]<array[j])
{
temp=array[i];
array[i]=array[j];
array[j]=temp;
}
}
}
for(i=0;i<len;i++)
{
printf("%d ",array[i]);
}
return 0;
}
4.6 二维数组
四、二维数组
、、
4.7 二维数组初始化
注意:可以不写行,但是一定要写列
类型说明符 数组名【常量表达式】【常量表达式】
int array[2] [3]={{12,8,139},{222,333,455}};
int array[ ] [3]={{12,8,139},{222,333,455}};
解释
4、二维数组的遍历
#include <stdio.h>
int main()
{
int array[2][3]={{12,8,139},{222,333,455}};
int i;
int j;
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
printf("%d\n",array[i][j]);
}
putchar('\n');
}
return 0;
}
循环的嵌套
#include <stdio.h>
int main()
{
int array[2][3]={{12,8,139},{222,333,455}};
int array2[2][3]={{1,2,4},{322}};
int i;
int j;
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
printf("%d\n",array2[i][j]);
}
putchar('\n');
}
return 0;
}
D:\code\4>a.exe
1
2
4
322
0
0
4.8 二维数组应用之找最大值及对应下标
5、编程案例
有一个3*4的矩阵,要求编程求出其中值最大的那个元素的值,以及其所在的行号和列号
#include <stdio.h>
int main()
{
int a[3][4]={{11,9,12,13}
,{15,9,3,8}
,{32,4,55,6}};
int size;
int i;
int j;
int tmp;
int max=a[0][0];
int hang;
int lie;
size=sizeof(a)/sizeof(a[0]);
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("%2d \t",a[i][j]);
}
printf("\n");
}
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
if(max<a[i][j])
{
max=a[i][j];
hang=i;
lie=j;
}
}
}
printf("%d行%d列的数最大%d\n",hang,lie,max);
printf("done");
return 0;
}