#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#define N 30
#define C 6
#define max_len 10
void Readscore(long num[], char name[][max_len], int score[][C], int n,int m);
void AverageKC(int score[][C], int sum1[], float aver1[], int n,int m);
void Averagestu(int score[][C], int sum2[], float aver2[], int n,int m,long num[],char name[][max_len]);
void swap1(int* x, int* y);
void swap2(char* x, char* y);
void swap3(long* x, long* y);
int Ascending(int a, int b);
int Descending(int a, int b);
void sort(int sum2[], char name[][max_len], long num[], int (*compare)(int a, int b), int n);
void sortstring(char name[][max_len], int n);
void namefind(char name[][max_len], int n, int m, int score[][C]);
void printscore(int score[][C], int sum2[], float aver2[], int sum1[], float aver1[], int n, int m, long num[], char name[][max_len]);
int main()
{
int n, m, choice,score[N][C], sum1[N], sum2[N],a,i,j,k;
long num[N];
float aver1[N], aver2[N];
char name[N][max_len];
printf("输入总的学生数:");
scanf_s("%d", &n);
printf("输入总的科目数:");
scanf_s("%d", &m);
do
{
printf("\n1:录入每个学生的学号、姓名和各科考试成绩\n");
printf("2:计算每门课程的总分和平均分\n");
printf("3:计算每个学生的总分和平均分\n");
printf("4:按每个学生的总分由高到低排出名次表\n");
printf("5:按每个学生的总分由低到高排出成绩表\n");
printf("6:按姓名的字典顺序排出成绩表\n");
printf("7:按姓名查询学生的排名及各科考试成绩\n");
printf("8:输出每个学生的学号、姓名、各科考试成绩、总分、平均分,以及每门课程的总分和平均分\n");
printf("0: 退出\n");
printf("请选择需要的功能:");
scanf_s("%d", &choice);
switch (choice)
{
case 1:
Readscore(num, name,score, n, m);
break;
case 2:
AverageKC(score, sum1, aver1, n, m);
break;
case 3:
printf("每个学生的学号、姓名、总分、平均分是:\n");
printf("num\tname\t总分\t平均分\t\n");
Averagestu(score, sum2, aver2, n, m,num,name);
break;
case 4:
printf("每个学生名次是:\n");
printf("名次\tnum\tname\t\n");
sort( sum2, name, num, Descending, n);
for (a = 1; a <= n; a++)
{
printf("%-8d%-8ld%-8s\n", a, num[a - 1], name[a - 1]);
}
break;
case 5:
printf("成绩表是:\n");
printf("num\tname\t总分\t\n");
sort(sum2, name, num, Ascending, n);
for (a = 0; a < n; a++)
{
printf("%-8ld%-8s%-8d\n", num[a], name[a],sum2[a]);
}
break;
case 6:
sortstring(name, n);
printf("排序结果:\n");
for (i = 0; i < n; i++)
{
puts(name[i]);
}
break;
case 7:
namefind(name, n,m,score);
break;
case 8:
printf("学号\t姓名\t各科考试成绩\t总分\t平均分\t每门课程的总分\t每门课程的平均分\t\n");
j = sum2;
k = sum1;
printscore(score, j, aver2, k, aver1, n, m, num, name);
break;
}
} while (choice != 0 && choice > 0 && choice <= 8);
return 0;
}
void Readscore(long num[], char name[][max_len], int score[][C],int n,int m)
{
int i, k;
printf("请依次输入学生的学号、姓名和各科考试成绩\n");
for (i = 0; i < n;i++)
{
scanf_s("%ld", &num[i]);//什么时候不要&??
getchar();
gets(name[i]);
for (k = 0; k < m; k++)
{
scanf_s("%d", &score[i][k]);
}
}
}
void AverageKC(int score[][C], int sum1[], float aver1[], int n,int m)
{
int i, j;
for (i = 0; i < m; i++)
{
sum1[i] = 0;
for (j = 0; j < n; j++)
{
sum1[i] += score[j][i];
}
aver1[i] = (float)sum1[i] / n;
printf("总分是:%d平均分是:%f\n", sum1[i],aver1[i]);
}
}
void Averagestu(int score[][C], int sum2[], float aver2[], int n,int m,long num[],char name[][max_len])
{
int i, j;
for (i = 0; i < n; i++)
{
sum2[i] = 0;
for (j = 0; j < m; j++)
{
sum2[i] += score[i][j];
}
aver2[i] = (float)sum2[i] / n;
printf("%-8ld%-8s%-8d%-8f\n", num[i],name[i], sum2[i], aver2[i]);
}
}
void swap1(int* x, int* y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}
void swap2(char* x, char* y)
{
char temp;
temp = *x;
*x = *y;
*y = temp;
}
void swap3(long* x, long* y)
{
long temp;
temp = *x;
*x = *y;
*y = temp;
}
int Ascending(int a, int b)//从小大大
{
return a > b;
}
int Descending(int a, int b)//从大到小
{
return a < b;
}
void sort(int sum2[], char name[][max_len], long num[], int (*compare)(int a, int b), int n)
{
int i, j, k;
for (i = 0; i < n - 1; i++)
{
k = i;
for (j = 0; j < n; j++)
{
if ((*compare)(sum2[i], sum2[j]))
k = j;
}
if (k != i)
{
swap1(&sum2[k], &sum2[i]);
swap2(&name[k],&name[i]);
swap3(&num[k], &num[i]);
}
}
}
void sortstring(char name[][max_len], int n)
{
int i, j;
char temp[max_len];
for (i = 0; i < n - 1; i++)
{
for (j = i + 1; j < n; j++)
{
if (strcmp(name[i], name[j]) > 0)
{
strcpy(temp, name[i]);
strcpy(name[i], name[j]);
strcpy(name[j], temp);
}
}
}
}
void namefind(char name[][max_len], int n,int m,int score[][C])
{
char temp;
int i;
printf("请输入需要查询的名字");
scanf_s("%s", &temp);
for (i = 0; i < n; i++)
{
if(strcmp(temp,name[i] )==0)
printf("学生排在第%d位,成绩为:%p\n", i + 1,score[i]);
}
}
void printscore(int score[][C], int j, float aver2[], int k, float aver1[], int n, int m, long num[], char name[][max_len])
{
int i;
for (i = 0; i < n; i++)
{
printf("%-8ld%-8s%-8p%-8d%-8f%-8d%-8f\n", num[i], name[i], score[i],j, aver2[i], k, aver1[i]);
}
}