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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值