数组基本概念
数组 -- 连续的内存空间
变量四要素:类型 变量名 /标识符 值 内存地址
//注:数组=每个元素没有变量名,只有数组名 -- 用下标法访问他的具体元素
赋值:
全部赋值:
a[5]={1,2,3,4,5}
部分赋值 :
a[10]={1,2,3,4,5} -- 只给了前面5个 赋值,后面的没赋值的都赋值为0
a[10]={0} --全部初始化为0
a[]={45,55,5,667,98,88} -- 自动分配内存空间
-- 可以用 关键字 sizeof() 求出他的额数组大小 -- size=sizeof (a)/sizeof(a[0]),单位是字节,比如int -- 4 bit
case:
斐波那契数列:a[n]=a[n-1]*a[n-2]
数组经典应用 -- 冒牌排序
核心 -- 两层循环比较 --每一轮比较拿到一个最值,经过n-1轮就得到所有的排序
#include<stdio.h>
int len,i,j,t;
int main()
{
int arr[]={8,663,9852,45,3,48};
len= sizeof(arr)/sizeof(arr[0]);
for(i=0;i<len-1;++i)
for(j=0;j<len-1-i;++j)
if(arr[j]<arr[j+1])
{
t=arr[j];
arr[j]=arr[j+1];
arr[j+1]=t;
}
for(i=0;i<len;++i)
printf("%d ",arr[i]);
puts("");
return 0;
}
二维数组:
int arr[2][3]={{1,2,3},{10,20,30}};
也可以 arr[2][3]={1,2,3,10,20,30};
【初始化问题】
1.可以不写行,但是一定要写列 -- a[][4] --这样是可以的
2.二维数组也可以向一维数组一样部分赋值,其他用0补全
test:3*4的矩阵 编程求出其中最大的元素的值已经他的行号列号
/t -- 水平制表符
函数:
为什么要用函数:
1.避免代码冗长
2.模块化的设计思路
3.按照功能划分
报错undefine -- 函数未定义
函数三要素:
函数名 -- 体现功能
参数列表 -- 类型和个数根据 需求来定义
返回值 -- 业务需求
int func(int x) //形式参数 -- 需要包含变量名,类型
{}
定义空函数 -- 占位置 --先把大概用到的功能函数都写出来,然后完善函数 (功能)
函数定义上 -- 可以当成他的表达式 -- 利用函数的返回值
形参和实参
形参和实参 -- 值相同但是地址不同 -- 修改是形参,实参不受影响
形参 -- 只传递数值
实参 -- 传递地址
#include<stdio.h>
void sSwitch(int *x,int *y)
{
int t=*x;
*x=*y;
*y=t;
}
int main()
{
int x,y;
scanf("%d%d",&x,&y);
sSwitch(&x,&y);
printf("x=%d, y=%d",x,y);
return 0;
}
局部变量 -- 在{}内的变量 -- 存放在栈空间 --
生命周期 -- 只有被调用的时候才为形参申请内存,调用结束就释放内存
注意 -- if实现的函数部分在被调用之后,会触发警报 ,要在调用前面声明即可
函数的嵌套 -- 函数调用过程也调用其他函数
case1: 输入4个数字,返回他们的最大值
int getMaxFromTwo(int x,int y)
{
return x>y?x:y;
}
int getMaxFromFour(int x,int y,int a,int b)
{
int max =getMaxFromTwo(x,y);
max=getMaxFromTwo(max,a);
return getMaxFromTwo(max,b);
}
//函数递归 -- 自己调用自己
需要有一个退出条件
//递归求阶乘
int jic(int a)
{
if(a==1)return 1;
return jic(a-1)*a;
}
//注意 -- long int 也是 4个字节
#include<stdlib.h>
int jic(int a)
{
if(a>=17)
{
printf("越界\n");
exit(-1);
}
if(a==1)return 1;
return jic(a-1)*a;
}
函数打印数组
//注意 -- 形参中不存在数组的概念 -- 即便约定了(arr[3]) --也是传递首地址 --8字节
//数组传参都是传数组的首地址 -- 数组名对应数组的首地址 || 数组的第一个元素地址也是数组的首地址
printArr(arr,len);
printArr(&arr[0],len);
test: A,B两班同学,分别求出平均分
//API -- 函数
//局部变量要 初始化,不然编译器可能会默认大数
二维数组的数据类型 -- 特殊的一维数组 --这个一维数组的每一个元素就是-一个数组
作为参数时候 -- 需要大小确定 -
- 合法写法: arr[][2] arr[3][2]
**延伸 -- 多维数组必须对第一个数组之外的所有元素都有边界
局部变量 和 全局变量(外部变量)
局部变量 -- 只能在函数体里面操作
全局变量 -- 在整个程序都可操作 -- 提供便捷性,但是有一定风险
//注意: 全局变量一般写在所有函数之前,不然会前面的函数调用报错
test1:-班级10个同学,封装一个函数 -- 获得班上同学的平均分,最高分,最低分
要求输入10个数,找出最大,最小值的下标
冒泡排序和选择排序
void bubbleSort(int arr[],int len)
{
int i,j,t;
for(i=0;i<len-1;++i)
{
for(j=len-1;j>i;--j)
if(arr[j]>arr[j-1])
{
t=arr[j];
arr[j]=arr[j-1];
arr[j-1]=t;
}
}
}
void selectSort(int arr[],int len)
{
int i,j,k,minn;
for(int i=0;i<len-1;++i)
{ minn=arr[i];
j=i;
for(int j=i+1;j<len;++j)
{
if(minn<arr[j])
{
minn=arr[j];
k=j;
}
}
int t=arr[i];
arr[i]=arr[k];
arr[k]=t;
}
}