目录
1.为什么需要数组?
只要大量数据不关心数字名称的时候 :计算1-100的和
学生成绩管理 :分数
协议 int openCMD={0xdf,0x11,0xfe,0x3e,0x64};
2.数组的介绍
数组是数据的集合: 1-100
数组的数据是同类型的 :1到100都是整数
数组的地址是连续的
3.数组的基本使用
数组的定义
类型——如int
数组名(命名规则和变量名一样)——如array
数组大小——如[100]
没有初始化的数组——int array[100];
部分初始化的数组——int array1[100]={0};
完全初始化的数组——int array2[3]={1,2,3};
数组单独访问
数组通过下标来引用当中的某个元素
array[0];外国人喜欢从零开始
数组的[] 只有在定义一个数组的时候才表示数组的大小,其余情况,都表示下标访问数组!!!!!
数组的遍历
数组大小的计算:sizeof(a)/sizoef(a[0])
#include <stdio.h>
/*
1.数组初始化 int b[5] = {0};//(建议一般这么定义)
2.数组打印for
3.数组大小计算:sizeof(a)/sizeof(a[0])
*/
int main()
{
int i;
int a[5];//不初始化数组
int b[5] = {0};//部分初始化数组(建议一般这么定义)
int array[5] = {1,2,3,4,5};//完全初始化数组
for(i=0;i<sizeof(a)/sizeof(a[0]);i++){
a[i] = i + 100;
}
puts("a数组初始化完毕,请指示!");
for(i=0;i<sizeof(a)/sizeof(a[0]);i++){
printf("%d ",a[i]);
}
puts("a数组打印完毕");
for(i=0;i<sizeof(b)/sizeof(b[0]);i++){
printf("%d ",b[i]);
}
puts("b数组打印完毕");
for(i=0;i<sizeof(array)/sizeof(array[0]);i++){
printf("%d ",array[i]);
}
puts("array数组打印完毕");
return 0;
}
数组的动态初始化
int data[5]={0};
for(i=0;i<5;i++){
printf("请输入第%d个数:\n",i+1);
scanf("%d",&datas[i]);
}
4.数组和函数
实际参数的表示方法:数组当做参数,传递的是数组的首地址(第一个数组元素的地址或者数组名)
形式参数为数组:数组中括号的数组大小无效;中括号此时仅作为该参数是一个数组首地址的说明;函数中对数组的操作,除了带一个数组首地址以外,一般还需要一个代表数组个数的实际参数。
作业
1. 要求输入10个数,找出最大数以及最大数的下标
2. 封装冒泡排序的函数
3. 封装选择排序的函数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#define N 5
/*
数组作为传参时,传递的是一个地址,地址传递表达方式:
1.int *array 2.int array[]
*/
//初始化数组
void initArray(int *array,int arrayLen)
{
int i;
for(i=0;i<arrayLen;i++){
printf("请输入第%d个数据\n",i+1);
scanf("%d",&array[i]);
}
}
//遍历数组
void printArray(int array[],int arrayLen)
{
int i;
puts("打印输入数据");
for(i=0;i<arrayLen;i++){
printf("%d ",array[i]);
}
putchar('\n');
}
//数组冒泡排序法 从大到小
void maoPaoArray(int array[],int arrayLen)
{
int i;
int j;
int tmp;
for(i=0;i<arrayLen-1;i++){
for(j=0;j<arrayLen-1-i;j++){
//从小到大 if(array[j] > array[j+1])
if(array[j] < array[j+1]){
tmp = array[j];
array[j] = array[j+1];
array[j+1] = tmp;
}
}
}
puts("冒泡法从大到小");
for(i=0;i<arrayLen ;i++){
printf("%d ",array[i] );
}
putchar('\n');
}
//数组选择排序法 从小到大
void xuanZheArray(int array[],int arrayLen)
{
int i;
int j;
int tmp;
for(i=0;i<arrayLen-1;i++){
for(j=i+1;j<arrayLen;j++){
//从小到大 if(array[i] > array[j])
if(array[i] > array[j]){
tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
}
}
puts("选择排序法从小到大");
for(i=0;i<arrayLen ;i++){
printf("%d ",array[i] );
}
putchar('\n');
}
//数组值的计算:大小,和,平均值
void jiSuanArray(int array[],int arrayLen)
{
int max;
int maxXiaBiao = 0;
int min;
int minXiaBiao = 0;
int sum = 0;
float get;
int i;
max = min = array[0];
for(i=0;i<arrayLen;i++){
if(max < array[i]){
max = array[i];
maxXiaBiao = i;
}
if(min > array[i]){
min = array[i];
minXiaBiao = i;
}
sum += array[i];
}
get = (float)sum/arrayLen;
printf("max=%d,下标是%d\n",max,maxXiaBiao);
printf("min=%d,下标是%d\n",min,minXiaBiao);
printf("sum=%d,get=%f\n",sum,get);
}
int main()
{
int max;
int min;
float get;
int arrayLen;
int array[5]; //数组大小动态分配(赋值)
/*int num;
int *array = NULL;//防止野指针
printf("需要录入的数据?\n");
scanf("%d",&num);
array = (int *)malloc(sizeof(int) * num);//开辟空间
memset(array,0,sizeof(int) * num);//空间初始化
*/
arrayLen = sizeof(array)/sizeof(array[0]);
initArray(array,arrayLen);
printArray(array,arrayLen);
maoPaoArray(array,arrayLen);
xuanZheArray(array,arrayLen);
jiSuanArray(array,arrayLen);
return 0;
}
5.二维数组(其实就是特殊一点的一维数组)
什么时候用二维数组
场景
表示
怎么定义二维数组
二维数组初始化
1.按行列初始化
2.没有明确行列,类似一维数组
3.部分赋初值
二维数组的遍历
for循环的嵌套
#include <stdio.h>
/*
二维数组是特殊的一维数组
二维数组=矩阵
*/
int main()
{
int a[6]={1,2,3,4,5,6};
//二维数组是特殊的一维数组
int array[2][3]={1,2,3,4,5,6};
int array1[2][3]={{11,22,33},{44,55,66}};
int i;
int j;
//数组a的遍历
for(i=0;i<sizeof(a)/sizeof(a[0]);i++){
printf("%d ",a[i]);
}
putchar('\n');
puts("一维数组a的遍历完毕");
//二维数组array的遍历
for(i=0;i<2;i++){
for(j=0;j<3;j++){
printf("%d %d %d\n",i,j,array[i][j]);
}
putchar('\n');
}
puts("二维数组array的遍历完毕");
//二维数组array1的遍历
for(i=0;i<2;i++){
for(j=0;j<3;j++){
printf("%d %d %d\n",i,j,array1[i][j]);
}
putchar('\n');
}
puts("二维数组array1的遍历完毕");
return 0;
}
二维数组和函数
#include <stdio.h>
//练习:有3x4矩阵,初始化它并输出,然后求最大值并输出
//初始化二维数组
void initArray(int array[][4],int hang,int lie)
{
int i,j;
for(i=0;i<hang;i++){
for(j=0;j<lie;j++){
printf("请输入第%d行,第%d列的数据\n",i+1,j+1);
scanf("%d",&array[i][j]);
}
}
}
//遍历数组 (和初始化二维数组差不多)
void printArray(int array[][4],int hang,int lie)
{
int i,j;
for(i=0;i<hang;i++){
for(j=0;j<lie;j++){
printf("%d ",array[i][j]);
}
putchar('\n');//好看,显示出像矩阵
}
}
//求数组最值
void zhuiDaArray(int array[][4],int hang,int lie)
{
int i,j;
int max;
int maxHang,maxLie;
max = array[0][0];
for(i=0;i<hang;i++){
for(j=0;j<lie;j++){
if(max < array[i][j]){
max = array[i][j];
maxHang = i+1;
maxLie = j+1;
}
}
}
printf("数组最大值是第%d行,第%d列的%d\n",maxHang,maxLie,max);
}
void zhuiXiaoArray(int array[][4],int hang,int lie)
{
int i,j;
int min;
int minHang,minLie;
min = array[0][0];
for(i=0;i<hang;i++){
for(j=0;j<lie;j++){
if(min > array[i][j]){
min = array[i][j];
minHang = i+1;
minLie = j+1;
}
}
}
printf("数组最小值是第%d行,第%d列的%d\n",minHang,minLie,min);
}
int main()
{
int array[3][4];
initArray(array,3,4);
printArray(array,3,4);
zhuiDaArray(array,3,4);
zhuiXiaoArray(array,3,4);
system("pause");
return 0;
}
请输入第1行,第1列的数据
1
请输入第1行,第2列的数据
2
请输入第1行,第3列的数据
3
请输入第1行,第4列的数据
0
请输入第2行,第1列的数据
5
请输入第2行,第2列的数据
6
请输入第2行,第3列的数据
3
请输入第2行,第4列的数据
8
请输入第3行,第1列的数据
9
请输入第3行,第2列的数据
4
请输入第3行,第3列的数据
5
请输入第3行,第4列的数据
6
1 2 3 0
5 6 3 8
9 4 5 6
数组最大值是第3行,第1列的9
数组最小值是第1行,第4列的0
请按任意键继续. . .