用数组处理批量数据
含义:数组是一组有序数据的集合,数组中数据的排列是有一定规律的
关于一维数组
定义一维数组
类型符 数组名【常量表达式】
说明:
1)int a[10]定义了一个整型数组,数组名为a,数组中有10个元素,注意下角标从0开始,即这个数组中不存在数组元素a【10】;
2)注意C语言中不允许对数组的大小做动态定义,int a[n] 是非法的
引用一维数组
注意只能引用数组元素而不能一次性调用整个数组全部元素的值
引用方法:数组名【下标】
#include<stdio.h>
int main()
{
int i, a[10];
for (i = 0; i <= 9; i++)
a[i] = i;
for (i = 9; i >= 0; i--)
printf("%d ", a[i]);
putchar('\n');
system("pause");
return 0;
}
一维数组的初始化
(1)在定义数组时对全部数组元素赋予初值
int a[10]={0,1,2,3,4,5,6,7,8,9};
(2) 也可以只给数组中的一部分的元素赋值:
int a[10]={0,1,2,3,4}
数组中有10个元素,花括号里却只有5个初值,表示只给前面五个元素赋初值,系统会自动给后五个元素赋初值为0;
(3)在对全部数组元素赋初值时,由于数据的个数已经确定,可以不指定数组长度
a[5]={1,2,3,4,5}等价于a[]={1,2,3,4,5}
重要应用:起泡排序法
思想:大数沉底,小数起泡;每次将相邻的两个数比较,小数调到前头,看上去好像是小数浮起
过程分析:若有6个数:9,8,5,4,2,0易得一共需要比较六轮,第一轮需要排第一个数9的位置,9与8比,大数9下沉,小数8浮起,接着9和5比,以此类推,确定9的定位需要比较5次,确定完5的位置后就对剩下的五个数字排位,一次确定8,5,4,2,0的位置
注意:如果有n个数,则需要进行n-1轮比较,又因为在第一轮中要进行n-1次比较,则在进行第j轮时要进行n-j次比较
示例:对任意输入的10个数字按从小到大的顺序排列
#include<stdio.h>
int main()
{
int a[10];
int i, j, t;
printf("please input 10 numbers:\n");
for (i = 0; i < 10; i++)
scanf_s("%d", &a[i]);
printf("\n");
for (j = 0; j < 9; j++)//进行9次循环,实现9次比较
{
for (i = 0; i < 9 - j; i++)//在每一次都要n-j次比较
{
if (a[i] > a[i + 1])//将相邻的两个数进行比较
{
t = a[i];
a[i] = a[i + 1];
a[i + 1] = t;
}
}
}
printf("the sorted numbers numbers are as follows:\n");
for (i = 0; i < 10; i++)
printf("%d ", a[i]);
putchar('\n');
system("pause");
return 0;
}
二维数组
定义二维数组
类型说明符 数组名【常量表达式1】【常量表达式2】
常量表达式1表示的是第一维下标的长度;
常量表达式2表示的是第二维下标的长度
例 :int a[3] [4]声明了一个3行4列的数组
,可以视为三个一维数组a[0][];a[1][];a[2][];也可以视为4个一维数组a[][0];a[][1];a[]][2];a[]][3];
实际上与一维数组是触类旁通的;
引用二维数组的元素
二维数组的初始化
1)分行给二维数组赋初值:
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
这种赋值的方法很直观,把第一个花括号中的内容赋值给第一行元素,以此类推;
2)也可以将所有数据都写在一个大括号里
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12,}系统会默认按数组元素在内存中的排列顺序对各种元素赋初值
3)也可以仅仅对二维数组中的部分元素赋值,其他元素像一维数组一样会默认为0
示例:将一个二维数组行和列的元素互换,存到另一个二维数组中
a[2][3]={{1,2,3},{4,5,6}} 变到b[3][2]={{1,4},{2,5},{3,6}}
#include<stdio.h>
int main()
{
int b[3][2], i, j;
int a[2][3] = { {1,2,3},{4,5,6} };
printf("the array a is:\n ");//输出a数组的元素
for (i = 0; i <= 1; i++)//处理a数组中一行的各元素
{
for (j = 0; j <= 2; j++)//处理a数组中一列的各元素
{
printf("%5d ", a[i][j]);
b[j][i] = a[i][j];//将a数组中各元素的值赋给b数组的相应元素
}
printf("\n");//这个很关键,保证这一行只有三个元素,也是很巧妙的
}
printf("the array b is :\n");//输出b数组的元素·
for (i = 0; i <= 2; i++)
{
for (j = 0; j <= 1; j++)
printf("%5d ", b[i][j]);//这个地方for语句中只有一行,我们就不需要加大括号了
printf("\n");//这个设定很关键,保证输出的是一个矩阵而非数组,这个换行就能保证每一行仅有两个元素
}
putchar('\n');
system("pause");
return 0;
}
重要应用引入:打擂算法
打擂思路:先找出任意一个人在台上,第二个人上去与他比武,胜者留在台上,以后,每一个人都是与当时留在台上的那个人比武,知道所有人都上台比过为止
示例:有一个3*4的矩阵,要求编程求出其中最大的元素的值以及其所在的行号与列号
#include<stdio.h>
int main()
{
int i, j, row = 0, colum = 0, max;
int a[3][4] = { {1,2,3,4},{9,8,7,6},{-10,10,-5,2} };
max = a[0][0];//先暂时认为a[0][0]是最大值;
for (i = 0; i <= 2; i++)
{
for (j = 0; j <= 3; j++)
{
if (a[i][j] > max)//如果某元素大于max,就让该元素取代max的原值
{
max = a[i][j];
row = i;//记下此元素的行号和列号;
colum = j;
}
}
}
printf("max=%d\nrow=%d\ncolum=%d\n", max, row, colum);
putchar('\n');
system("pause");
return 0;
}
应用举例:班级竞选班长,共有三个候选人,输入参加选举的人数以及每个人选举的内容,输出三个候选人最终得票数以及无效选票数
#include<stdio.h>
int main()
{
int i, v1 = 0, v2 = 0, v3 = 0,v0=0, n,a[50];
printf("please input the number of electorate:\n");//输入参加选举的人数
scanf_s("%d", &n);
printf("please input the number you vote:\n");//输入每个人所选的人
for (i = 0; i < n; i++)
scanf_s("%d", &a[i]);
for (i = 0; i < n; i++)
{
if (a[i] == 1)//统计一号候选人的票数
v1++;
else if (a[i] == 2)//统计二号候选人的票数
v2++;
else if (a[i] == 3)//统计三号候选人的票数
v3++;
else
v0++;//统计无效票数
}
printf("the result are as follows:\n");
printf("candidate1:%d\ncandidate2:%d\ncandidate3;%d\nnouser:%d\n", v1, v2, v3, v0);//将统计结果输出
putchar('\n');
system("pause");
return 0;
}