第八章、数组
8.1数组的定义和初始化
一维数组:
#define months 12
int day[months]={31,28,31,30,31,30,31,31,30,31,30,31};
一维数组在定义的同时进行了初始化。下标从0开始,到months-1。
二维数组:
二维数组的定义以及初始化:
short matrix[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
short matrix[][4]={{1,2,3,4},{5,6,7,8},{9,10};
第一维长度可以省略,但是第二维的长度不能省略。个数可以小于数组初始化的个数,默认初始化为0。
从键盘输入某年某月,输出该年该月拥有的天数:
#include<stdio.h>
#define MONTHS 12
int main()
{
int days[2][MONTHS]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};
int year,month;
do
{
scanf("%d%d",&year,&month);
}while(year<0||year>12||month<0||months>12);
if((year%4==0)&&(year%100!=0)||(year%400)==0)
printf("%d\n",days[1][montn-1]);
else
printf("%d\n",days[2][montn-1]);
}
8.2向函数传递一维数组
从键盘输入学生成绩,计算平均分和最高分。
#include<stdio.h>
#include<stdlib.h>
int ReadScore(int Score[])//数组名是代表数组的首地址,进行是址传递
{
int i=-1;
do
{
i++;
scanf("%d",&score[i]);
}while(score[i]>=0);
return i;
}
int Average(int score[],int n)
{
int i,sum;
sum=0;
if(n>0)
{
for(i=0;i<n;i++)
{
sum+=score[i];
}
return sum/n;
}
else
{
return -1;
}
}
int FindMax(int score[],int n)
{
int max,i;
max=score[0];
for(i=0;i<n;i++)
{
if(score[i]>max)
{
max=score[i];
}
}
return max;
}
int main()
{
int score[20],n,ret,max;
scanf("%d",&n);
n=ReadScore(score);
if(n==0)
{
exit(0);
printf("输入有误!\n");
}
aver=Average(score,n);
if(aver==-1)
{
exit(0);
printf("无法求得平均数!\n");
}
else
{
printf("aver=%d\n",aver);
}
max=FindMax(score,n);
printf("max=%d\n",max);
return 0;
}
8.3排序和查找
冒泡排序。
void DateSort(int score[],int n)
{
int i,j,temp;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(score[j]<score[i])
{
temp=score[j];
score[j]=score[i];
score[i]=temp;
}
}
}
}
快速排序。
void DateScore(int score[],int n)
{
int i,j,k,temp;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if(score[j]<score[i])
{
k=j;
}
}
if(k!=i)
{
temp=score[i];
score[i]=score[k];
score[k]=temp;
}
}
return;
}
折半查找。
int BinSearch(long num[],long x,int n)
{
int low=0,high=n-1,mid;
while(low<=high)
{
mid=(low+high)/2;
if(x>num[mid])
{
low=mid+1;
}
else if(x<num[mid])
{
high=mid-1;
}
else
{
return mid;
}
}
return -1;
}
8.4向函数传递二维数组
计算每个学生、每门课程的总分和平均分。
#include<stdio.h>
#define STUD_N 40
#define COURSE_N 30
void ReadScore(int score[][COURSE_N],int num[],int n)
{ //可以省略第一列,第二列不能省略
int i,j;
for(i=0;i<n;i++)
{
scanf("%ld",&num[i]);
for(j=0;j<COURSE_N;j++)
{
scanf("%d",&score[i][j]);
}
}
}
void AverForStudent(int score[][COURSE_N],int sumS[STUD_N],averS[STUD_N],int n)
{
int i,j;
for(i=0;i<n;i++)
{
sumS[i]=0;
for(j=0;j<COURSE_N;j++)
{
sumS[i]+=score[i][j];
}
averS[i]=sumS[i]/n;
}
}
void AverForScore(int score[][COURSE_N],int sumC[COURSE_N],averC[COURSE_N],int n)
{
int i,j;
for(i=0;i<COURSE_N;i++)
{
sumC[i]=0;
for(j=0;j<n;j++)
{
sumC[i]+=score[j][i];
}
averC[i]=sumC[i]/n;
}
}
int main()
{
int score[STUD_N][COURSE_N],sumS[STUD_N],sumC[COURSE_N],n;
long num[STUD_N];
float averS[STUD_N],averC[COURSE_N];
scanf("%d",&n);
ReadScore(score,num,n); //址传递
AverForStudent(score,sumS,averS,n);
AverForScore(score,sumC,averC,n);
return 0;
}
|