一、一维数组
1、一维数组定义
数据类型 变量名 = [元素个数]
int a[10];
//数组
int a[10];
int data;
for(data = 0;data<10;data++)
{
a[data] = data * 10;
}
puts("数组初始化完成");
for(data = 0;data<10;data++)
{
printf("%d ",a[data]);
}
2、数组的初始化赋值keyi
int a[10] = {0,1,2,3,4,5,6,7,8,9};
可以只给前部分赋值,后面数据系统自动赋值为0
int a[10] = {1,2,3}
在对全部数据赋值时,中括号内的元素个数可以省略不写(如下代码,5即可不写)
int a[] = {1,2,3,4,5}
3、sizeof关键字(不是函数!!!)
计算数组内元素的个数,利用sizeof求出整个数组的内存空间大小和一个元素的内存空间大小,两数相除即可得出数组内元素的个数。
int size;
size = sizeof(array)/sizeof(array[0]);
4、练习
//数组初始化练习
//赋值并逆序输出
int a[] = {0,1,2,3,4,5,6,7,8,9};
int i;
for(i = 9;i>=0;i--)
{
printf("%d ",a[i]);
}
斐波那契数列
//斐波那契数列
//F(0)=1,F(1)=1, F(n)=F(n - 1)+F(n - 2)
//1、1、2、3、5、8、13、21、34、……
//计算斐波那契数列前30个值
int arr[30];
int i;
int arraySize;
arraySize = sizeof(arr[30])/sizeof(arr[0]);
arr[0] = 0;
arr[1] = 1;
for(i = 2;i<30;i++)
{
arr[i] = arr[i-1] + arr[i-2];
}
puts("计算完成!");
for(i = 0;i<30;i++)
{
printf("%d ",arr[i]);
}
冒泡排序
//冒泡排序
int array[] = {23,4,5,2,99,29};
int i;
int j;
int tmp;
int size;
size = sizeof(array)/sizeof(array[0]);
for(i = 0;iarray[j+1]) //从大到小为array[j]
简单排序法
int array[] = {23,4,5,2,99,29};
int i;
int j;
int tmp;
int size;
size = sizeof(array)/sizeof(array[0]);
for(i = 0;i
二、二维数组
1、定义
类型说明符 数组名[ 常量表达式][ 常量表达式];
int a[3][4];
2、初始化
① 分行给二维数组赋初值
int a[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
②将所有数据写在一个花括号内,按数组排列的顺序对各元素赋初值
int a[3][4] = {1, 2, 3, 4,5, 6, 7, 8, 9, 10, 11, 12};
③只对部分元素赋初值。其余元素自动为 0。
int a[3][4] = {{1, 2}, {5}, {9}};
//对第一行的前两个元素赋值、第二行和第三行的第一个元素赋值
④可以省略行号,但是不可以省略列号
int[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12} //正确
int[][4] = {1,2,3,4,5,6,7,8,9,10,11,12} //正确
int[3][] = {1,2,3,4,5,6,7,8,9,10,11,12} //错误
3、二维数组的练习
//求二维数组中的最大值,并显示其行列
int i;
int j;
int a;
int b;
int arr[3][4] = {23,43,1,23,45,56,44,88,78,56,12,65};
int max;
max = arr[0][0];
//遍历一下
for(i =0;i<3;i++)
{
for(j = 0;j<4;j++)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
//找最大
for(i =0;i<3;i++)
{
for(j = 0;j<4;j++)
{
if(max
三、函数
先定义后使用
三要素:函数名(体现功能)、参数列表、返回值
函数体:执行的功能
—定义无参数函数
void printWelcome()
{
printf("欢迎");
}
—定义有参数函数
#include
int getDate(int a) //形式参数,需要包含变量类型,变量名
{
int b;
b = a - 1;
return b;
}
int main()
{
int x;
int y;
printf("请输入一个数:");
scanf("%d",&x);
y = getDate(x);
printf("%d",y);
}
—形式参数与实际参数
数值一样,但是地址不一样
—局部变量
生命周期,被调用时才为形式参数申请内存,调用结束,内存被系统释放
练习
求两数中最大数
#include
int getMax(int a,int b) //形式参数,需要包含变量类型,变量名
{
if(a>b)
{
return a;
}
else if(ab)?a:b;
else
{
printf("两数相等!");
}
}
int main()
{
int x;
int y;
int z;
printf("请输入第一个数:\n");
scanf("%d",&x);
printf("请输入第二个数:\n");
scanf("%d",&y);
z = getMax(x,y);
printf("最大的数为:%d",z);
}
函数的递归与嵌套
求n!
#include
int getJieCheng(int a)
{
int jieCheng;
if(a>=17)
{
printf("越界!");
exit(-1);
}
if(a == 1)
{
jieCheng = 1;
}
else
{
jieCheng = a*getJieCheng(a-1);
}
return jieCheng;
}
int main()
{
int x;
int y;
printf("请输入一个数:\n");
scanf("%d",&x);
y = getJieCheng(x);
printf("它的阶乘为:%d",y);
}
三、一维数组作为函数的参数,数组值传递的问题(难点)
通过例题总结容易犯错的点:
求每个班的平均值
1、首先定义三个方法函数,输入成绩,打印成绩,计算平均值
需要注意的地方有:
-参数列表中数组传递的是地址,并非具体数据
-函数返回值是什么类型,并不是所有的都是void
-由整数赋值给小数时,需要强转,强转类型写在括号内
2、主函数
先创两个数组代表班级,并指明人数;
定义两个浮点数变量用于后续接收平均值;
求每个数组的元素个数;
调用【输入成绩】函数;
调用【打印成绩】函数;
调用【计算平均值】函数;赋值给两个浮点型变量;
打印输出每个班级的平均数;
#include
void inarr(int arry[],int len)
{
int i;
for(i = 0;i
四、二维数组作为函数的参数
注意:
函数参数列表中二维数组必须要写列数,行数可以不写
#include
void printArray(int arr[][3],int hang,int lie)
{
int i;
int j;
for(i = 0;i
五、全局变量(外部)与局部变量
全局变量:放在所有函数之前;(编程便捷,但是有风险,所有函数都可以操作,多线程)
六、练习
1、输入10个数,求最大值及其下标
#include
void in(int arr[],int l)
{
int i;
printf("请输入10个数:\n");
for(i =0;i
2、封装冒泡排序的函数
#include
void in(int arr[],int l)
{
int i;
printf("请输入列表:\n");
for(i =0;iarr[j+1])
{
tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
for(i =0;i
3、封装选择排序的函数
#include
void in(int arr[],int l)
{
int i;
printf("请输入列表:\n");
for(i =0;iarr[j])
{
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
for(i =0;i