1.一维数组的定义与初始化
1.数组(Array)是一组具有相同类型的变量的集合,它是一种顺序存储、随机访问的顺序表结构。
int score[SIZE];
int 代表该数组的基类型,即数组中元素1类型。下表代表数组的维数。
需要注意的是,数组的下标都是从 0 开始的。
2.二维数组的定义与初始化
#include<stdio.h>
int AVE(int score[],int n);
int Read(int score[],int n);
#define N 40
int main()
{
int score[N],aver,n;
printf("Please input n:");
scanf("%d",&n);
Read(score,n);
aver = AVE(score,n);
printf("Average score is %d\n",aver);
}
int AVE(int score[],int n)
{
int i,sum=0;
for(i=0;i<n;i++)
{
sum += score[i];
printf("sum = %d\n",sum);
}
return sum/n;
}
int Read(int score[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("Input score:");
scanf("%d",&score[i]);
}
}
把一个数组传递给一个函数,那么只要使用不带方括号的数组名作为函数实参调用函数即可。
由于数组名代表数组的第一个元素地址,因此用数组名作函数参数实际上是将数组的首地址传给被调函数。
3.排序和查找
排序就是把一系列无序的数据按照特定的顺序重新排列为有序的数据。
1.交换法排序
//选择法排序//
#include<stdio.h>
#define N 40
int ReadScore(int score[]);
void DataSort(int score[],int n);
void PrintScore(int socre[],int n);
int main()
{
int score[N],n;
n = ReadScore(score);
printf("Total students are %d\n",n);
DataSort(score,n);
PrintScore(score,n);
return 0;
}
int ReadScore(int score[])
{
int i=-1;
do{
i++;
printf("Input score:");
scanf("%d",&score[i]);
}while(score[i]>=0);
return i;
}
void DataSort(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 PrintScore(int score[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%d",score[i]);
}
printf("\n");
}
2.选择法排序(Selection Sort)
首数和余下所有数先比较,然后再与符合条件的交换一次,最多交换n-1次。(记录下标法)
#include<stdio.h>
#define N 40
int ReadScore(int score[],long num[]);
void DataSort(int score[],long num[],int n);
void PrintScore(int socre[],long num[],int n);
int main()
{
int score[N],n;
long num[N];
n = ReadScore(score,num);
printf("Total students are %d\n",n);
DataSort(score,num,n);
printf("Sorted scores:\n");
PrintScore(score,num,n);
return 0;
}
int ReadScore(int score[],long num[])
{
int i=-1;
do{
i++;
printf("Input students's ID and scores:");
scanf("%ld%d",&num[i],&score[i]);
}while(score[i]>=0&&num[i]>=0);
return i;
}
void DataSort(int score[],long num[],int n)
//排序
{
int i,j,k,temp1;
long temp2;
for(i = 0;i < n-1;i++)
{
k = i;
for(j = i+1;j < n;j++)
{
if(score[j] >score[k])
{
k = j;
}
}
if (k != i)//交换成绩
{
temp1 = score[k];
score[k] = score[i];
score[i] = temp1;
temp2 = num[k];
num[k] = num[i];
num[i] = temp2;
}
}
}
void PrintScore(int score[],long num[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%ld %d\n",num[i],score[i]);
}
printf("\n");
}
4.查找
1.线性查找
#include<stdio.h>
#define N 40
int Read(int score[],long num[]);
int Line(long num[],long x,int n);
int main(void)
{
int score[N],n,pos;
long num[N],x;
n = Read(score,num);
printf("Total Students are %d\n",n);
printf("Input the searching ID:");
scanf("%ld",&x);
pos = Line(num,x,n);
if(pos != -1)
printf("score = %d\n",score[pos]);
else
printf("Not found!");
return 0;
}
int Read(int score[],long num[])
{
int i = -1;
do{
i++;
printf("Input student's ID and score:");
scanf("%ld%d",&num[i],&score[i]);
}while(num[i] > 0 && score[i] > 0);
return i;
}
int Line(long num[],long x,int n)
{
int i;
for( i = 0;i < n;i++)
{
if(num[i] == x)
{
return i;
}
}
return -1;
}
2.折半查找
#include<stdio.h>
#define N 40
int Read(int score[],long num[]);
int Line(long num[],long x,int n);
int main(void)
{
int score[N],n,pos;
long num[N],x;
n = Read(score,num);
printf("Total Students are %d\n",n);
printf("Input the searching ID:");
scanf("%ld",&x);
pos = Line(num,x,n);
if(pos != -1)
printf("score = %d\n",score[pos]);
else
printf("Not found!");
return 0;
}
int Read(int score[],long num[])
{
int i = -1;
do{
i++;
printf("Input student's ID and score:");
scanf("%ld%d",&num[i],&score[i]);
}while(num[i] > 0 && score[i] > 0);
return i;
}
int Line(long num[],long x,int n)
{
int low = 0,high = n-1;
int mid;
int pos = -1;
while(low < high)
{
mid = (high + low)/2;
if(x > num[mid])
{
low = mid + 1;
}
else if(x < num[mid])
{
high = mid -1;
}
else
return mid;
}
return -1;
}
/*标志变量法
int Line(long num[],long x,int n)
{
int low = 0,high = n-1;
int mid;
int find = 0;
int pos = -1;
while(low < high)
{
mid = (high + low)/2;
if(x > num[mid])
{
low = mid + 1;
}
else if(x < num[mid])
{
high = mid -1;
}
else
{
pos = mid;
find = 1;
}
return -1;
}
*/
5.向函数传递二维数组
#include<stdio.h>
#define STUD_N 40
#define COURSE_N 3
void Read(int score[][COURSE_N],long num[],int n);
void AverS(int score[][COURSE_N],int sum[],float aver[],int n);
void AverC(int score[][COURSE_N],int sum[],float aver[],int n);
void Print(int score[][COURSE_N],long num[],int sumS[],float averS[],int sumC[],float averC[],int 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];
printf("input the total number of the students(n <= 40):");
scanf("%d",&n);
Read(score,num,n);
AverS(score,sumS,averS,n);
AverC(score,sumC,averC,n);
Print(score,num,sumS,averS,sumC,averC,n);
}
void Read(int score[][COURSE_N],long num[],int n)
{
int i,j;
printf("Input student's ID and score as: MT EN PH:\n");
for(i = 0; i < n;i++)
{
scanf("%ld",&num[i]);
for(j = 0; j <COURSE_N;j++)
{
scanf("%d",&score[i][j]);
}
}
}
void AverS(int score[][COURSE_N],int sum[],float aver[],int n)
{
int i,j;
for(i = 0;i < n;i++)
{
sum[i] = 0;
for(j = 0;j < COURSE_N;j++)
{
sum[i] = sum[i] + score[i][j];
}
aver[i] = (float)sum[i]/COURSE_N;
}
}
void AverC(int score[][COURSE_N],int sum[],float aver[],int n)
{
int i,j;
for(j = 0;j < COURSE_N;j++)
{
sum[j] = 0;
for(i = 0;i < n;i++)
{
sum[j] = sum[j] + score[i][j];
}
aver[j] = (float)sum[j]/n;
}
}
void Print(int score[][COURSE_N],long num[],int sumS[],float averS[],int sumC[],float averC[],int n)
{
int i,j;
printf("Student's ID\t MT\t EN\t PH\t SUM\t AVER\t\n");
for(i = 0;i < n;i++)
{
printf("%12ld\t",num[i]);
for(j = 0;j < COURSE_N;j++)
{
printf("%4d\t",score[i][j]);
}
printf("%4d\t% 5.1f\n",sumS[i],averS[i]);
}
printf("Sumofcourse\t");
for(j = 0; j < COURSE_N;j++)
{
printf("%4d\t",sumC[j]);
}
printf("\nAverofCourse\t");
for( j = 0;j < COURSE_N;j++)
{
printf("%4.1f\t",averC[j]);
}
printf("\n");
}