C语言复习--数组,函数

数组基本概念

数组 -- 连续的内存空间

变量四要素:类型 变量名 /标识符 值 内存地址

//注:数组=每个元素没有变量名,只有数组名 -- 用下标法访问他的具体元素

赋值:

全部赋值:

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;

}

}

相关推荐
XiaoLeisj12 分钟前
【递归,搜索与回溯算法 & 综合练习】深入理解暴搜决策树:递归,搜索与回溯算法综合小专题(二)
数据结构·算法·leetcode·决策树·深度优先·剪枝
Jasmine_llq31 分钟前
《 火星人 》
算法·青少年编程·c#
闻缺陷则喜何志丹42 分钟前
【C++动态规划 图论】3243. 新增道路查询后的最短距离 I|1567
c++·算法·动态规划·力扣·图论·最短路·路径
Lenyiin1 小时前
01.02、判定是否互为字符重排
算法·leetcode
小林熬夜学编程1 小时前
【Linux网络编程】第十四弹---构建功能丰富的HTTP服务器:从状态码处理到服务函数扩展
linux·运维·服务器·c语言·网络·c++·http
鸽鸽程序猿1 小时前
【算法】【优选算法】宽搜(BFS)中队列的使用
算法·宽度优先·队列
Jackey_Song_Odd1 小时前
C语言 单向链表反转问题
c语言·数据结构·算法·链表
Watermelo6171 小时前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
乐之者v1 小时前
leetCode43.字符串相乘
java·数据结构·算法