数组的引入
数组是基于处理大量同类型数据的目的来使用的,且处理时不关心数据名称
1、数组是数据的集合 2、数组的数据是同类型的 都是整数1-100,就不能是1.1,1.2,1.3 3、数组的地址是连续的
#include <stdio.h>
int main()
{
int i;
int sum = 0;
int array[50];
for(i=1;i<=50;i++){
array[i-1] = i;
}
for(i=0;i<50;i++){
sum+=array[i];
}
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};
循环的方式历遍数组
死脑筋的访问数组写法
#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];
}
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]);
}
}
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]));
printf(“b数组元素的个数是%d\n”,sizeof(b)/sizeof(b[0]));
计算数组元素的个数
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)
{
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];
}
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];
}
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;
}
|