为啥不让定义个结构体呢???搞那么多数组多麻烦
#include <stdio.h>
int main()
{
int n;
float score[30][3];
int num[30],s[30] = {0};
float sum[30] = {0};
float aver[30],ft;
int i,j,t;
printf("输入学生人数:");
scanf("%d",&n);
for(i=0;i<n;i++)
s[i] = i;
printf("输入学生序号及三门课成绩:");
for(i=0;i<n;i++)
{
scanf("%d",&num[i]);
for(j=0;j<3;j++)
{
scanf("%f",&score[i][j]);
sum[i] += score[i][j];
}
aver[i] = sum[i]/3;
}
//
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i-1;j++)
{
if(sum[j] < sum[j+1])
{
t = sum[j];
sum[j] = sum[j+1];
sum[j+1] = t;
t = s[j];
s[j] = s[j+1];
s[j+1] = t;
t = num[j];
num[j]= num[j+1];
num[j+1] = t;
}
}
}
//
printf("%10s%10s%10s%10s%10s%10s\n","学号","数学","英语","计算机","总分","平均分");
for(i=0;i<n;i++)
{
printf("%10d%10.1f%10.1f%10.1f%10.1f%10.1f\n",num[i],score[s[i]][0],score[s[i]][1],score[s[i]][2],sum[i],aver[s[i]]);
}
printf("输入查找学号:");
int oneNum;
scanf("%d",&oneNum);
for(i=0;i<n;i++)
{
if(num[i] == oneNum)
{
printf("%10s%10s%10s%10s%10s%10s\n","排名","数学","英语","计算机","总分","平均分");
printf("%10d%10.1f%10.1f%10.1f%10.1f%10.1f\n",i+1,score[s[i]][0],score[s[i]][1],score[s[i]][2],sum[i],aver[s[i]]);
break;
}
}
if(i==n)
printf("查无此人");
return 0;
}
#include <stdio.h>
#define STU 30
#define COURSE 3
void Input(long num[], int score[][COURSE], int n);
void GetSumAver(int score[][COURSE], int n, int sum[], float aver[]);
void Sort(long num[], int score[][COURSE], int n, int sum[], float aver[]);
void Print(long num[], int score[][COURSE], int n, int sum[], float aver[]);
int Search(long num[], int n, long x);
int main(void)
{
int n, score[STU][COURSE],sum[STU],pos;
long num[STU],x;
float aver[STU];
printf("Please enter the total number of the students(n<=30):");
scanf("%d", &n); //输入参加考试的学生人数
printf("Enter No. and score as: MT EN PH\n");
Input(num, score, n); //输入学生成绩
GetSumAver(score, n, sum, aver); //计算总分和平均分
printf("Before sort:\n");
Print(num, score, n, sum, aver);
Sort(num, score, n, sum, aver); //排名次
printf("After sort:\n");
Print(num, score, n, sum, aver);
printf("Please enter searching number:\n");
scanf("%ld", &x);//以长整型的格式输入待查找学生的学号
pos = Search(num, n, x); //名次查询
if(pos != -1)
{
printf("position: %8s\t|%6s%6s%6s%7s%8s\n"," NO ","MT","EN","PH","SUM","AVER");
printf("%8d %4ld\t|%6d%6d%6d%7d%8.0f\n",
pos+1, num[pos], score[pos][0], score[pos][1], score[pos][2], sum[pos], aver[pos]);
}
else
{
printf("Not found!\n");
}
return 0;
}
// 函数功能:输入某班学生期末考试三门课程成绩
void Input(long num[], int score[][COURSE], int n)
{
int i, j;
for (i=0; i<n; i++)
{
scanf("%ld", &num[i]);
for (j=0; j<COURSE; j++)
{
scanf("%d", &score[i][j]);
}
}
}
// 函数功能:计算每个学生的总分和平均分,结果存入对应的sum数组和aver数组
void GetSumAver(int score[][COURSE], int n, int sum[], float aver[])
{
int i, j;
for(i=0; i<n; i++)
{
sum[i] = 0;
for(j=0; j<COURSE; j++)
{
sum[i] = sum[i] + score[i][j];
}
aver[i] = (float)sum[i] / COURSE;
}
}
// 函数功能:按总分成绩由高到低排出成绩的名次。注意,对应的学号、成绩、总分和平均分都需要保持一致
void Sort(long num[], int score[][COURSE], int n, int sum[], float aver[])
{
int i, j, k, m;
int temp1;
long temp2;
float temp3;
for(i=0; i<n-1; i++)
{
k = i;
for(j=i+1; j<n; j++)
{
if(sum[j] > sum[k])
{
k =j;
}
}
if(k != i)
{
temp1 = sum[k]; sum[k] = sum[i]; sum[i] = temp1;
temp2 = num[k]; num[k] = num[i]; num[i] = temp2;
temp3 = aver[k]; aver[k] = aver[i]; aver[i] = temp3;
for(m=0; m<COURSE; m++)
{
temp1 = score[k][m];
score[k][m] = score[i][m];
score[i][m] = temp1;
}
}
}
}
// 函数功能:输出名次表,表格内包括学生编号、各科分数、总分和平均分
void Print(long num[], int score[][COURSE], int n,
int sum[], float aver[])
{
int i, j;
printf("%8s\t|%6s%6s%6s%7s%8s\n"," NO ","MT","EN","PH","SUM","AVER");
printf("---------------------------------------------------\n");
for (i=0; i<n; i++)
{
printf("%ld\t|", num[i]);
for (j=0; j<COURSE; j++)
{
printf("%6d", score[i][j]);
}
printf("%7d%8.0f\n", sum[i], aver[i]);
}
}
//函数功能:在学号数组中顺序查找学生学号
// 找到时,返回学生学号在学号数组中的小标位置,否则返回值-1
int Search(long num[], int n, long x)
{
int i;
for(i=0; i<n; i++)
{
if(num[i] == x)
{
return i;
}
}
return -1;
}
用结构体应该比较方便吧
这种简单的算法还是自己慢慢想吧