C语言基础-数组,排序,函数
一、一维数组
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;i<size-1;i++)
{
for(j = 0;j<size-1-i;j++)
{
if(array[j]>array[j+1]) //从大到小为array[j]<array[j+1]
{
tmp = array[j];
array[j] = array[j+1];
array[j+1] = tmp;
}
}
}
for(i = 0;i<size;i++)
{
printf("%d ",array[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;i<size-1;i++)
{
for(j = i+1;j<size;j++)
{
if(array[i]<array[j])//从大到小为array[i]<array[j]
{
tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
}
}
for(i = 0;i<size;i++)
{
printf("%d ",array[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<arr[i][j])
{
max = arr[i][j];
a = i;
b = j;
}
}
}
printf("第%d行第%d列的数最大,为:%d",a,b,max);
三、函数
先定义后使用
三要素:函数名(体现功能)、参数列表、返回值
函数体:执行的功能
—定义无参数函数
void printWelcome()
{
printf("欢迎");
}
—定义有参数函数
#include <stdio.h>
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 <stdio.h>
int getMax(int a,int b) //形式参数,需要包含变量类型,变量名
{
if(a>b)
{
return a;
}
else if(a<b)
{
return b; //三目运算
} //return (a>b)?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 <stdio.h>
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 <stdio.h>
void inarr(int arry[],int len)
{
int i;
for(i = 0;i<len;i++)
{
printf("请输入第%d个学生的成绩:\n",i+1);
scanf("%d",&arry[i]);
}
printf("本班输入完毕!\n");
}
void printarr(int arry[],int len)
{
int i;
printf("总人数为%d个\n",len);
for(i = 0;i<len;i++)
{
printf("%d ",arry[i]);
}
printf("\n");
}
float getAverage(int arry[],int len)
{
int i;
int sum = 0;
float a = 0.0;
for(i = 0;i<len;i++)
{
sum += arry[i];
}
a = (float)sum/len;
return a;
}
int main()
{
int class1[5];
int class2[10];
float a1;
float a2;
int len1 = sizeof(class1)/sizeof(class1[0]);
int len2 = sizeof(class2)/sizeof(class2[0]);
inarr(class1,len1);
inarr(class2,len2);
printarr(class1,len1);
printarr(class2,len2);
a1 = getAverage(class1,len1);
a2 = getAverage(class2,len2);
printf("一班的平均分为:%.2f\n",a1);
printf("二班的平均分为:%.2f\n",a2);
return 0;
}
四、二维数组作为函数的参数
注意:
函数参数列表中二维数组必须要写列数,行数可以不写
#include <stdio.h>
void printArray(int arr[][3],int hang,int lie)
{
int i;
int j;
for(i = 0;i<hang;i++)
{
for(j = 0;j<lie;j++)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
}
void inArray(int arr[][3],int hang,int lie)
{
int i;
int j;
for(i = 0;i<hang;i++)
{
for(j = 0;j<lie;j++)
{
printf("请输入第%d行第%d列的值:",i+1,j+1);
scanf("%d",&arr[i][j]);
}
}
}
int getMax(int arr[][3],int hang,int lie)
{
int i;
int j;
int max;
for(i = 0;i<hang;i++)
{
for(j = 0;j<lie;j++)
{
if(max<arr[i][j])
{
max = arr[i][j];
}
}
}
return max;
}
int main()
{
int max;
int arr[2][3];
inArray(arr,2,3);
printArray(arr,2,3);
max = getMax(arr,2,3);
printf("最大为:%d",max);
return 0;
}
五、全局变量(外部)与局部变量
全局变量:放在所有函数之前;(编程便捷,但是有风险,所有函数都可以操作,多线程)
六、练习
1、输入10个数,求最大值及其下标
#include <stdio.h>
void in(int arr[],int l)
{
int i;
printf("请输入10个数:\n");
for(i =0;i<l;i++)
{
scanf("%d",&arr[i]);
}
printf("输入完成!");
}
int b;
int getMax(int arr[],int l)
{
int i;
int max = 0;
b = i;
for(i = 0;i<l;i++)
{
if(max<arr[i])
{
max = arr[i];
b = i;
}
}
return max;
}
int main()
{
int max;
int a[10];
int length = sizeof(a)/sizeof(a[0]);
in(a,length);
max = getMax(a,length);
printf("最大值为:%d下标为%d",max,b);
return 0;
}
2、封装冒泡排序的函数
#include <stdio.h>
void in(int arr[],int l)
{
int i;
printf("请输入列表:\n");
for(i =0;i<l;i++)
{
scanf("%d",&arr[i]);
}
printf("输入完成!\n");
}
void maopao(int arr[],int l)
{
int i;
int j;
int tmp;
for(i =0;i<l-1;i++)
{
for(j=0;j<l-1-i;j++)
{
if(arr[j]>arr[j+1])
{
tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
for(i =0;i<l;i++)
{
printf("%d ",arr[i]);
}
}
int main()
{
int array[7];//数组元素个数自定
int len = sizeof(array)/sizeof(array[0]);
in(array,len);
maopao(array,len);
return 0;
}
3、封装选择排序的函数
#include <stdio.h>
void in(int arr[],int l)
{
int i;
printf("请输入列表:\n");
for(i =0;i<l;i++)
{
scanf("%d",&arr[i]);
}
printf("输入完成!\n");
}
void jianDan(int arr[],int l)
{
int i;
int j;
int tmp;
for(i =0;i<l-1;i++)
{
for(j=i+1;j<l;j++)
{
if(arr[i]>arr[j])
{
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
for(i =0;i<l;i++)
{
printf("%d ",arr[i]);
}
}
int main()
{
int array[7];//数组元素个数自定
int len = sizeof(array)/sizeof(array[0]);
in(array,len);
jianDan(array,len);
return 0;
}