C语言:三、数组

1.数组的引入
#include<stdio.h>

int main() {
	int i;
	int sum = 0;
	int array[100];//定义了一个能存放100个数的数组

	for (i=1;i<=100;i++) {
		array[i - 1] = i;//(填充数组)使数组里的第[i-1]个元素得到i的值
	}

	for (i=0;i<100;i++) {
		sum += array[i];//数组内每个数的结果累加
	}

	printf("累加的结果是:%d\n",sum);

	return 0;
}
2.数组的定义及访问
#include<stdio.h>

int main() {
	//1.数组是数据的集合(如0-100)
	//2.数组的数据是同类型的(如1和1.2不能放进同一数组)
	//3.数组地址是连续的

	int array1[100];//1.没有初始化的数组,只申请了100个整数型的内存空间,最好初始化(如int array[100]=0,全部初始化为0)
	int array2[10] = {1,2,3,4,5,6,7,8,9,10};//2.完整初试化的数组,10个空间都进行了赋值
	int array3[100] = {1,2,3};//3.不完整初始化,只赋值了前三个空间

	//数组通过下标来引用当中的某个元素
	//数组从头开始不是从1开始是从0开始
	//array[0] array[1] array[2]
	//   1       2         3
	//变量声明时,array[n]表示数组具有n个变量,其余情况则为访问数组第n-1个变量

	for (int i = 0;i <10;i++) {
		printf("array[%d]的值是%d\n",i+1,array2[i]);
	}
	return 0;
}
3.数组的应用之初始化及找大小
#include<stdio.h>
#define N 10

//提示用户找到10个数,并找出其中的最大值、最小值,并计算它们的平均值

int main() {
	//1.定义一个10个整数的整数型数组(初始化数组)
	int array[10] = {0};

	//2.提示用户输入第几个数
	//3.获取用户的输入
	int i;
	for (i = 0;i < N;i++) {
		printf("请输入第%d个数:", i+1);
		scanf_s("%d",&array[i]);
		if (array[i] > 100 || array[i] < 0) {
			printf("超出范围,请重新进入程序");
			system("pause\n");
			exit(-1);
		}
	}

	//4.找最高分
	int max = array[0];
	for (i = 0;i < N;i++) {
		if (max < array[i])
			max = array[i];//不断将更大值赋给max
	}
	printf("最大值为:%d\n", max);

	//5.找最低分
	int min = array[0];
	for (i = 0;i < N;i++) {
		if (min > array[i])
			min = array[i];//不断将更小值赋给min
	}
	printf("最小值为:%d\n", min);

	//6.算平均值
	int sum=0, av=0;
	for (i = 0;i < N;i++) {
		sum += array[i];
	}

	av = (float)sum / N;
	printf("平均值是:%d\n", av);
}
4.数组和函数(算数组大小,数组传参,数组形参)

知识点:

​ (1)形式参数是一个已定义大小或者未定义大小的数组,如void printf(int datas[])其大小是无效的,不管中括号里写多少,都不能代表形参数组有多大,它告诉编译器,该参数只是一个地址,只传递一个地址;

​ (2)使用sizeof()时要包含<stdlib.h>

​ (3)当sizeof的参数是数组名时,计算的是整个数组的存储大小;当sizeof的参数是指针时,计算的是指针的大小(8字节,64位系统)。

​ (4)数组名作为地址传递时,地址为数组首地址

#include<stdio.h>
#include<stdlib.h>

void arrayprint(int datas[3]) //形参中数组的大小是无效的,该参数只是一个地址,windows中用四个字节表示地址(Linux64位中用八个字节)
{
	printf("数组的大小是:%d\n",sizeof(datas));//输出形参的数组大小
	printf("一个int数据大小是:%d\n",sizeof(int));//输出int(整型)的大小
	printf("函数调用中:datas数组元素个数为%d个\n",sizeof(datas)/sizeof(datas[0]));//输出形参的元素个数
}


int main() 
{
	int array[3] = {11,22,33};
	printf("array数组元素个数为%d个\n\n",sizeof(array)/sizeof(array[0]));
	//数组的元素个数==数组的大小/数组单个元素的大小(int型元素大小为4个字节)
	arrayprint(array);//数组名作为实际参数,调用arrayprint函数
}
5.数组和函数综合应用
#include<stdio.h>
//提示用户找到10个数,并找出其中的最大值、最小值,并计算它们的平均值

void inputing(int datas[],int size) 	//提示用户输入第几个数,获取用户的输入
										
{
	int i;
	for (i = 0;i < size;i++) {
		printf("请输入第%d个数:", i + 1);
		scanf_s("%d", &datas[i]);
		if (datas[i] > 100 || datas[i] < 0) {
			printf("超出范围,请重新进入程序\n");
			system("pause\n");
			exit(-1);
		}
	}
}

void printing(int datas[], int size)
{
	for (int i=0;i<size;i++) 
	{
		printf("第%d个学生的成绩是%d\n",i+1,datas[i]);
	}
}

int best(int datas[], int size)
{
	int max = datas[0];
	for (int i = 0;i < size;i++) {
		if (max < datas[i])
			max = datas[i];//不断将更大值赋给max
	}
	printf("最大值为:%d\n", max);
	return max;
}

int lowest(int datas[], int size)
{
	int min = datas[0];
	for (int i = 0;i <size;i++) {
		if (min > datas[i])
			min = datas[i];//不断将更小值赋给min
	}
	printf("最小值为:%d\n", min);
	return min;
}

float av(int datas[], int size)
{
	int sum = 0, ;
	float av = 0;
	for (int i = 0;i < size;i++) {
		sum += datas[i];
	}

	av = (float)sum / size;
	printf("平均值是:%d\n", av);
	return av;
}

int main() {
	//定义一个10个整数的整数型数组(初始化数组)
	int array[10] = { 0 };
	int len;
	len = sizeof(array) / sizeof(array[0]);
	
	//1.输入数据
	inputing(array,len);
	//2.打印数据
	printing(array, len);
	//3.找最高分
	best(array, len);
	//4.找最低分
	lowest(array, len);
	//5.算平均值
	av(array, len);
}

6.斐波那契数列

​ 斐波那契数列(Fibonacci sequence),指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)

​ C语言实现:算法核心:arr[0]=0,arr[1]=1,arr[n]=arr[n-1]+arr[n-2]

#include <stdio.h> 

void Fibonacci(int array[],int size)
{
	int n;
	for(n=2;n<=size;n++)
	{
	array[n]=array[n-1]+array[n-2];
	}

	printf("斐波那契数列前30个数为:");
	for(n=0;n<=size;n++)
	{
	printf("%d  ",array[n]);
	}	

	printf("\n done \n"); 
}


int main(){
	int arr[30]={0,1};
	int len=sizeof(arr)/sizeof(arr[0]);
	Fibonacci(arr,len);
}
7.冒泡排序
#include <stdio.h> 

//演示为从大到小 
//不停地左右互换,大的一直往左走 
void BubbleSort(int array[],int lenth)
{
	int i,j;
	int temp;//用作交换 
	for(i=0;i<lenth-1;i++)
	{
		for(j=0;j<lenth-1-i;j++)
		{
		if(array[j+1]>array[j])
			temp = array[j];
			array[j] = array[j+1];
			array[j+1] = temp;
		}
	} 
	
	
	printf("重新排列后的结果是:");
	for(i=0;i<lenth;i++){	
	printf("%d ",array[i]);
	}
}


int main(){
	int len;
	int arr[]={10,20,30,40};
	len=sizeof(arr)/sizeof(arr[0]);
	
	BubbleSort(arr,len);
}
8.简单选择排序
#include <stdio.h> 

//后面的数按顺序与第一个数对比,比出最大的放在第一位
//接着后面的数按顺序与第二个数对比,放在第二位
//以此类推,确认从大到小的顺序 
void SimpleSorting(int array[],int lenth)
{
	int i,j;
	int temp;//用作交换 
	for(i=0;i<lenth;i++)
	{
		for(j=i+1;j<lenth;j++)
		{
			
		//	printf("这是第%d次循环,array[%d]=%d,array[%d]=%d\n",i+1,i,array[i],j,array[j]);
		
		if(array[j]>array[i])
			{
				temp = array[i];
				array[i] = array[j];
				array[j] = temp;
			
		//		printf("这是第%d次循环,更换后:array[%d]=%d,array[%d]=%d\n",i+1,i,array[i],j,array[j]);
			}
		}
	} 
	
	
	printf("重新排列后的结果是:");
	for(i=0;i<lenth;i++){	
	printf("%d ",array[i]);
	}
}


int main(){
	int len;
	int arr[]={10,30,20,40};
	len=sizeof(arr)/sizeof(arr[0]);
	
	SimpleSorting(arr,len);
}
9.二维数组
9.1.定义
​			二维数组常称为矩阵,把二维数组写成****(column)和****(row)的排列形式,一般形式为

​			类型说明符    数组名[常量表达式] [常量表达式]int 				a[3] [4],b[4] [5]

​			定义a为3x4(34列)的数组,b为4x5(45列)的数组

​			之所以说二维数组是**特殊的一维数组**,解释如下:

​			拿a[3] [4]举例把每行看作一个元素,那么有a[0] a[1] a[2]三个元素,把每个元素展开,他们又包含四个元素a[0] [0] ,a[0] [1] ,a[0] [2],a[0] [3]
9.2.初始化

1.分行赋值

int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}//花括号里套花括号,每个花括号是一行

2.不分行(类似一维数组)

#include <stdio.h> 


int main(){
	int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
	
	int i,j;
	for(i=0;i<3;i++)//二维数组的遍历
	{
		printf("第%d行的各个元素及其大小:",i+1);
		
		for(j=0;j<4;j++)
		{
			printf("  a[%d][%d]=%d  ",i,j,a[i][j]);
		}
		
		printf("\n");		
	}
}

在这里插入图片描述

3.部分赋值

int a[3][4]={{1},{2},{3}};
//对每行的第一个元素进行赋值,反正不赋值就默认为0

如果对全部元素进行赋值,行的括号(第一维)可以不写,列(第二维)必须写

int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
//等价于
int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};
9.3.应用:二维数组找最大值及其对应下标
#include <stdio.h> 


int main(){
	int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
	
	int hang,lie;
	int max = a[0][0];
	
	int i,j;
	for(i=0;i<3;i++)
	{
		printf("第%d行的各个元素及其大小:",i+1);
		
		for(j=0;j<4;j++)
		{
			printf("  a[%d][%d]=%d  ",i,j,a[i][j]);
			
			if(a[i][j]>max)
			{
				max=a[i][j]; 
				hang = i;
				lie 
			}
		}
		
		printf("\n");		
	}
	
	printf("最大值的是第%d行第%d个,大小为%d",hang,lie,max);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值