C语言-数组

  • Post author:
  • Post category:其他




数组的引入

数组是基于处理大量同类型数据的目的来使用的,且处理时不关心数据名称

1、数组是数据的集合

2、数组的数据是同类型的 都是整数1-100,就不能是1.1,1.2,1.3

3、数组的地址是连续的

#include <stdio.h>

int main()
{
	int i;
    int sum = 0;
    int array[50];//定义一个能放置100个数据的数组
    
    for(i=1;i<=50;i++){
		array[i-1] = i;
    }//把1到100的整数数值赋值给到array数组
    
    for(i=0;i<50;i++){
		sum+=array[i];
    }//计算1到100的和
    printf("1+2+.....+49+50=%d\n",sum);
    
    system("pause");
    return 0;
}



数组的定义和访问



数组的定义

  • 数组类型
  • 数组名
  • 数组大小

int array[10];

没有初始化的数组,仅仅是申请了10个连续的整型数内存空间

int array[3] = {1,2,3};

有初始化数组,完整初始化,该数组申请了3个整型数内存空间,并赋值3个数1,2,3

int array[10] = {1,2,3};

有初始化数组,不完整初始化,该数组申请了10个整型数内存空间,但只赋值3个数1,2,3。放在了数组前3个位置

int n;

n=10;

int array[n];

实际应用过程中在样的写法无报错,可使用。但在一些教材中认定为非法

这样定义时数组不能在定义数组时就初始化
如:
int n;
n=10;
int array[n] = {0};

最好的数组定义是需要初始化的

如:

int array[10] = {0};

把数组的所有元素初始化为0。



数组的单独访问


1、数组通过下标的方式来引用当中的元素


2、数组的中括号 [ ] 只有在定义一个数组的时候,才表示数组大小,其余任何情况都表示用下标访问数组

printf(“数组的第二项元素是%d\n”,array[1]);

  • 需要注意的是外国人把数组的排列顺序是从零开始的

int array[3] = {1,2,3};


  • 访问写法
  • 第一个数据

    • array[0]
  • 第二个数据

    • array[1]
  • 第三个数据

    • array[2]



循环的方式历遍数组


死脑筋的访问数组写法

#include <stdio.h>

int main()
{
	int array[3] = {1,2,3};

	printf("数组的第一项元素是%d\n",array[0]);
	printf("数组的第二项元素是%d\n",array[1]);
	printf("数组的第三项元素是%d\n",array[2]);
	
    system("pause");
    return 0;
}

这种写法就有违背数组的意义,所以需要通过循环的方式来一次性访问数组


for循环历遍访问数组

#include <stdio.h>

int main()
{
	int array[3] = {1,2,3};
	int i;
	for(i=0;i<3;i++){
		printf("数组的第%d项元素是%d\n",i+1,array[i]);
	}
    
    system("pause");
    return 0;
}



数组应用初始化及找大小

#include <stdio.h>

int main()
{
	int n = 0;
    printf("需要录入几个学生分数:");
    scanf("%d",&n);
	int array[n];
	int i;
    
	for(i=0;i<n;i++){
		printf("请输入第%d个学生的分数:",i+1);
        scanf("%d",&array[i]);
        if(array[i] > 100 || array[i] < 0){ //满足其中一项就执行
			printf("非法分数!\n强制退出!\n");
            system("pause");
            exit(-1);
        }
	}
    for(i=0;i<n;i++){
		printf("第%d个学生的分数是:%d\n",i+1,array[i]);
	}
    int max;
    max = array[0];
    for(i=0;i<n;i++){
		if(max < array[i]){
			max = array[i];
        }
	}
    printf("最高分max=%d\n",max);
    int min;
    min = array[0];
    for(i=0;i<n;i++){
		if(min > array[i]){
			min = array[i];
        }
	}
    printf("最低分min=%d\n",min);
    int total = 0;
    float average;
    for(i=0;i<n;i++){
		total +=array[i];
        //total = total + array[i];
    }
    average = (float)total/n;
    printf("%d个学生总分total=%d\n",n,total);
    printf("平均分average=%f\n",average);
    
    system("pause");
    return 0;
}



数组于函数间的应用

putchar('\n');
输出一个字符

getchar();
获取一个字符,可以用来过滤回车

1、数组在跟函数结合时,数组名可以当做实际参数传给函数的形参


数组结合函数基本运用

#include <stdio.h>

void arrayPrint(int datas[3])
{
	int i;
    for(i=0;i<3;i++){
		printf("array[%d]=%d\n",i,datas[i]);
    }
    //putchar('\n');
}

void hasParams(int a,int b,char c)
{
	printf("a=%d,b=%d,c=%c\n",a,b,c);
}

void noParams()
{
	printf("xxx\n");
}

int main()
{
	int array[3] = {1,2,3};
	noParams();
    hasParams(1,2,'u');
    hasParams(array[0],array[1],'a');
    
    arrayPrint(array);
    
    system("pause");
    return 0;
}



计算数组元素的个数

int a[3];

一个整型数占用内存空间4个字节,3个占用12个字节

char b[3];

一个char型占用内存空间1个字节,3个占用3个字节

两个数组元素个数都为3个,但因为是不同的类型,所以内存的大小不同

sizeof(a);

sizeof(b);


跟函数很像的关键字可以计算数组的大小

sizeof(int);

一个整型的大小是4

sizeof(char);

一个字符型的大小是1

printf(“a数组元素的个数是%d\n”,sizeof(a)/sizeof(a[0]));

  • sizeof(a)/sizeof(int)

printf(“b数组元素的个数是%d\n”,sizeof(b)/sizeof(b[0]));

  • sizeof(b)/sizeof(char)


计算数组元素的个数

sizeof(a)/sizeof(a[0])


void arrayPrint(int datas[3]);

  • 1、形式参数中,虽然写的是一个数组的写法,中括号中的数组元素个数跟数组的大小是无效的
  • 2、这里写多少,都不能代表形式参数数组有多大
  • 3、这里的中括号的作用,仅用俩表示这是一个数组。
  • 4、这个参数是一个地址,在windows中,用4个字节表示地址,Linux64位中用8个字节表示


故一般函数传数组的写法


函数接收


void arrayPrint(int datas[],int cnt);

int array[3] = {1,2,3};


调用函数


arrayPrint(array,sizeof(array)/sizeof(array[0]));

调用函数传数组名给函数,是传数组首个元素的地址。即第一个元素的地址

#include <stdio.h>

void arrayPrint(int datas[],int cnt)//cnt是接收计算的数组元素的个数,便于下面历遍数组循环的结束
{
	int i;
    for(i=0;i<cnt;i++){
		printf("array[%d]=%d\n",i,datas[i]);
    }
}

int main()
{
	int array[3] = {11,42,64};
    
    arrayPrint(array,sizeof(array)/sizeof(array[0]));
    arrayPrint(&array[0],sizeof(array)/sizeof(array[0]));
    
    system("pause");
    return 0;
}


数组结合函数实例

函数执行后输出结果

#include <stdio.h>

int initPeople(int n)
{
	printf("需要录入几个学生分数:");
    scanf("%d",&n);
    return n;
}

void initScores(int array[],int n)
{
	int i;
	for(i=0;i<n;i++){
		printf("请输入第%d个学生的分数:",i+1);
        scanf("%d",&array[i]);
        if(array[i] > 100 || array[i] < 0){
			printf("非法分数!\n强制退出!\n");
            system("pause");
            exit(-1);
        }
	}
}

void scoresPrint(int array[],int n)
{
	int i;
    for(i=0;i<n;i++){
		printf("第%d个学生的分数是:%d\n",i+1,array[i]);
	}
}

void scoresMax(int array[],int n)
{
	int i;
    int max;
    max = array[0];
    for(i=0;i<n;i++){
		if(max < array[i]){
			max = array[i];
        }
	}
    printf("最高分max=%d\n",max);
}

void scoresMin(int array[],int n)
{
	int i;
    int min;
    min = array[0];
    for(i=0;i<n;i++){
		if(min > array[i]){
			min = array[i];
        }
	}
    printf("最低分min=%d\n",min);
}

void scoresAverage(int array[],int n)
{
	int i;
    int total = 0;
    float average;
    for(i=0;i<n;i++){
		total +=array[i];
        //total = total + array[i];
    }
    average = (float)total/n;
    printf("%d个学生总分total=%d\n",n,total);
    printf("平均分average=%f\n",average);
}

int main()
{
	int len = 0;
	int scores[len];
    
    len = initPeople(len);
    
    initScores(scores, len);
    
    scoresPrint(scores, len);
    
    scoresMax(scores, len);
    
    scoresMin(scores, len);
    
    scoresAverage(scores, len);
    
    system("pause");
    return 0;
}

函数执行后把结果返回给到main函数

#include <stdio.h>

int initPeople(int n)
{
	printf("需要录入几个学生分数:");
    scanf("%d",&n);
    return n;
}

void initScores(int array[],int n)
{
	int i;
	for(i=0;i<n;i++){
		printf("请输入第%d个学生的分数:",i+1);
        scanf("%d",&array[i]);
        if(array[i] > 100 || array[i] < 0){
			printf("非法分数!\n强制退出!\n");
            system("pause");
            exit(-1);
        }
	}
}

void scoresPrint(int array[],int n)
{
	int i;
    for(i=0;i<n;i++){
		printf("第%d个学生的分数是:%d\n",i+1,array[i]);
	}
}

int getMax(int array[],int n)
{
	int i;
    int max;
    max = array[0];
    for(i=0;i<n;i++){
		if(max < array[i]){
			max = array[i];
        }
	}
    return max;
}

int getMin(int array[],int n)
{
	int i;
    int min;
    min = array[0];
    for(i=0;i<n;i++){
		if(min > array[i]){
			min = array[i];
        }
	}
    return min;
}

float getAverage(int array[],int n)
{
	int i;
    int total = 0;
    float average;
    for(i=0;i<n;i++){
		total +=array[i];
        //total = total + array[i];
    }
    average = (float)total/n;
    return average;
}

void printRet(int a, int b, float f)
{
	printf("最高分:%d\n最低分:%d\n平均分:%f\n",a,b,f);
}

int main()
{
	int len = 0;
	int scores[len];
    int max;
    int min;
    float average;
    
    len = initPeople(len);
    
    initScores(scores, len);
    
    scoresPrint(scores, len);
    
    max = getMax(scores, len);
    
    min = getMin(scores, len);
    
    average = getAverage(scores, len);
    
    printRet(max, min, average);
    
    system("pause");
    return 0;
}



版权声明:本文为Yangyingchungood原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。