main.c
#include "Student.h"
int main()
{
int n = 0, m = 0;
int i, j, flag = 0;
char filename[100];
STU *head = NULL;
while (1)
{
system("cls");
i = Menu();
switch (i)
{
case 1:
system("cls");
printf("\t\t\t******************************************************************************\n");
printf("\t\t\tInput student number(n<1000):");
scanf("%d", &n);
m = 3;
printf("\t\t\tInput student's ID, name and course score");
printf("(");
for(j = 0; j < m; j++)
{
printf(" %s", courseName[j]);
}
printf(" )\n");
head = Creat(n, m);
printf("录入数据成功!按任意键继续......");
getche();
system("cls");
break;
case 2:
system("cls");
AverSumofEveryCourse(head, n, m);
print1(m);
printf("数据计算完毕!按任意键继续......");
getche();
break;
case 3:
system("cls");
AverSumofEveryStudent(head, n, m);
flag = 1;
printf("数据计算完毕!按任意键继续......");
getche();
break;
case 4:
system("cls");
printf("\n\n\n");
printf("\t\t\tSort in ascending order by score:\n");
if(flag)
{
head = SortbyScore(head, n);
Print(head, n, m);
printf("数据排序完毕!按任意键继续......");
}
else
{
printf("未计算总分,无法排序,按任意键继续......");
}
getche();
break;
case 5:
system("cls");
printf("\n\n\n");
printf("\t\t\tSort from high to low by number:\n");
head = SortbyNumber1(head, n);
Print(head, n, m);
printf("数据排序完毕!按任意键继续......");
getche();
break;
case 6:
system("cls");
printf("\n\n\n");
printf("\t\t\tSort from low to high by number:\n");
head = SortbyNum(head);
Print(head, n, m);
printf("数据排序完毕!按任意键继续......");
getche();
break;
case 7:
system("cls");
printf("\n\n\n");
printf("\t\t\tSort from high to low in ascending order by Chinese:\n");
head = SortbyChinese(head, n);
Print(head, n, m);
printf("数据排序完毕!按任意键继续......");
getche();
break;
case 8:
system("cls");
printf("\n\n\n");
printf("\t\t\tSort from high to low in ascending order by Maths:\n");
head = SortbyMaths(head, n);
Print(head, n, m);
printf("数据排序完毕!按任意键继续......");
getche();
break;
case 9:
system("cls");
printf("\n\n\n");
printf("\t\t\tSort from high to low in ascending order by English:\n");
head = SortbyEnglish(head, n);
Print(head, n, m);
printf("数据排序完毕!按任意键继续......");
getche();
break;
case 10:
system("cls");
printf("\n\n\n");
printf("\t\t\tSort from high to low in ascending order by Aver:\n");
head = SortbyAver(head, n);
Print(head, n, m);
printf("数据排序完毕!按任意键继续......");
getche();
break;
case 11:
system("cls");
printf("\n\n\n");
printf("\t\t\tSort in dictionary order by name:\n");
head = SortbyName(head, n);
Print(head, n, m);
printf("数据排序完毕!按任意键继续......");
getche();
break;
case 12:
system("cls");
printf("\n\n\n");
printf("\t\t\t******************************************************************************\n");
printf("\t\t\tInput the number you want to search:\n");
SearchbyNum(head, n, m);
printf("按任意键继续......");
getche();
break;
case 13:
system("cls");
printf("\n\n\n");
printf("\t\t\t******************************************************************************\n");
printf("\t\t\tInput the name you want to search:\n");
SearchbyName(head, n, m);
printf("按任意键继续......");
getche();
break;
case 14:
system("cls");
printf("\t\t\t******************************************************************************\n");
head = deleteStu(head, &n, m);
printf("按任意键继续......");
getche();
break;
case 15:
system("cls");
printf("\n\n\n");
addStu(head, &n, m);
printf("添加成功!按任意键继续......");
getche();
break;
case 16:
system("cls");
printf("\n\n\n");
Modify(head, n, m);
printf("按任意键继续......");
getche();
break;
case 17:
system("cls");
printf("\n\n\n");
topStu(head, m);
printf("按任意键继续......");
getche();
break;
case 18:
system("cls");
printf("\n\n\n");
failStu(head, m);
printf("按任意键继续......");
getche();
break;
case 19:
system("cls");
printf("\n\n\n");
Print(head, n, m);
printf("按任意键继续......");
getche();
break;
case 20:
system("cls");
printf("\t\t\t请在执行相应计算操作后保存至相应文件中,计算、排序后将无法再进行原始数据保存\n");
printf("\t\t\t提示:按照提示的文件名保存\n");
printf("\t\t\tplease input file name(RawData.xls StatisticalData.xls ComprehensiveScoresOfStudents.xls or .txt): ");
fflush(stdin);
gets(filename);
WritetoFile(head, filename, n, m);
printf("按任意键继续......");
getche();
break;
case 21:
system("cls");
head = ReadfromFile(head, &n, &m);
printf("按任意键继续......");
getche();
break;
case 0:
system("cls");
printf("\n\n\n");
printf("\t\t\t******************************************************************************\n");
printf("\t\t\tEnd of program!\n");
printf("\t\t\t******************************************************************************\n");
return 0;
default:
system("cls");
printf("\n\n\n");
printf("\t\t\t******************************************************************************\n");
printf("\t\t\tInput error!\n");
printf("\t\t\t******************************************************************************\n");
}
}
return 0;
}
int Menu(void)
{
int i;
system("title 学生成绩管理系统");
printf("\t\t\t ****** ***** * * ****** \n");
printf("\t\t\t * * * * * * * \n");
printf("\t\t\t ****** * * * * ****** \n");
printf("\t\t\t * * * * * * \n");
printf("\t\t\t ****** ***** * * ****** \n");
printf("\t\t\t 学生成绩管理系统\n");
printf("\t\t\t******************************************************************************\n");
printf("\t\t\t| -------->> 1. Input record (Once) (Can be overrided) |\n");
printf("\t\t\t| ------>> 2. Caculate each section and average score of every course |\n");
printf("\t\t\t| ------>> 3. Caculate total and average score of every student |\n");
printf("\t\t\t| ------>> 4. Sort in descending order by total score |\n");
printf("\t\t\t| 5. Sort form high to low by number(DESC) |\n");
printf("\t\t\t| 6. Sort from low to high by number(ASC) |\n");
printf("\t\t\t| 7. Sort from high to low by Chinese(DESC) |\n");
printf("\t\t\t| 8. Sort from high to low by Maths(DESC) |\n");
printf("\t\t\t| 9. Sort from high to low by English(DESC) |\n");
printf("\t\t\t| 10. Sort from high to low by Aver(DESC) |\n");
printf("\t\t\t| 11. Sort in dictionary order by name |\n");
printf("\t\t\t| 12. Search by number |\n");
printf("\t\t\t| 13. Search by name |\n");
printf("\t\t\t| 14. Delete student by number |\n");
printf("\t\t\t| ------->>15. Add student(s) |\n");
printf("\t\t\t| 16. Modify student informaton |\n");
printf("\t\t\t| ---->>17. search and save top student(s) |\n");
printf("\t\t\t| ---->>18. search and save student(s) failling subject |\n");
printf("\t\t\t| 19. print link-lists |\n");
printf("\t\t\t| -->>20. Write to a file |\n");
printf("\t\t\t| 21. Read From file |\n");
printf("\t\t\t| 0. Exit |\n");
printf("\t\t\t******************************************************************************\n");
printf("\n");
printf("\t\t\t*****************Please Input your choice:");
scanf("%d", &i);
return i;
}
STU *Creat(int n, int m) {
STU *head = NULL;
STU *p1, *p2;
int i, j, flag;
for (i = 1; i<n + 1; i++)
{
p1 = (STU *)malloc(LEN);
printf("\t\t\t");
scanf("%lld", &p1->num);
flag = CheckNum(NULL,p1->num);
while(flag != 0)
{
printf("\t\t\tInput error!!!\n");
printf("\t\t\t");
scanf("%lld", &p1->num);
flag = CheckNum(NULL,p1->num);
}
printf("\t\t\t");
scanf("%s",p1->name);
for (j = 0; j<m; j++)
{
printf("\t\t\t");
scanf("%f", &p1->score[j]);
flag = CheckNum(NULL,p1->score[j]);
while(flag != 0)
{
printf("\t\t\tInput error!!!\n");
printf("\t\t\t");
scanf("%f", &p1->score[j]);
flag = CheckNum(NULL,p1->score[j]);
}
}
p1->rankNum = 0;
p1->aver = 0;
p1->sum = 0;
p1->next = NULL;
if (i == 1)
{
head = p2 = p1;
}
else
{
p2->next = p1;
p2 = p1;
}
}
return (head);
}
STU *CreatEmpty(int n, int m)
{
STU *head;
STU *p1, *p2;
int i, j;
for (i = 1; i<n + 1; i++)
{
p1 = (STU *)malloc(LEN);
p1->next = NULL;
if (i == 1)
{
head = p2 = p1;
}
else
{
p2->next = p1;
p2 = p1;
}
}
return(head);
}
void AverSumofEveryCourse(STU *head, int n, int m)
{
STU *p;
int i;
char ch;
float sum;
memset(Course, 0, sizeof(Course));
p = head;
if (head != NULL)
{
for (i = 0; i<m; i++)
{
p = head;
sum = 0.0;
do {
sum += p->score[i];
if(p->score[i] < 60)
{
Course[i].sectionNum[0]++;
}
if(p->score[i] >= 60 && p->score[i] < 70)
{
Course[i].sectionNum[1]++;
}
if(p->score[i] >= 70 && p->score[i] < 80)
{
Course[i].sectionNum[2]++;
}
if(p->score[i] >= 80 && p->score[i] < 90)
{
Course[i].sectionNum[3]++;
}
if(p->score[i] >= 90)
{
Course[i].sectionNum[4]++;
}
p = p->next;
} while (p != NULL);
Course[i].avescore = sum / n;
Course[i].sumscore = sum;
}
}
else
{
printf("Please input student information before doing this\n!!!\n");
}
}
void AverSumofEveryStudent(STU *head, int n, int m)
{
STU *p;
int i, j;
p = head;
if (head != NULL)
{
printf("\t\t\t******************************************************************************\n");
for (i = 0; i<n; i++)
{
p->sum = 0.0;
for (j = 0; j<m; j++)
{
p->sum += p->score[j];
}
p->aver = p->sum / m;
printf("\t\t\tstudent %s: sum=%.1f,aver=%.1f\n", p->name, p->sum, p->aver);
p = p->next;
}
printf("\t\t\t******************************************************************************\n");
}
else
{
printf("Please input student information before doing this!!!\n");
}
}
STU *SortbyScore(STU *head, int n)
{
STU *endpt;
STU *p;
STU *p1, *p2;
int data = -1, ranknum = 0;
p1 = (STU *)malloc(LEN);
p1->next = head;
head = p1;
for (endpt = NULL; endpt != head; endpt = p)
{
for (p = p1 = head; p1->next->next != endpt; p1 = p1->next)
{
if (p1->next->sum < p1->next->next->sum)
{
p2 = p1->next->next;
p1->next->next = p2->next;
p2->next = p1->next;
p1->next = p2;
p = p1->next->next;
}
}
}
p1 = head;
head = head->next;
free(p1);
for(p = head; p; p = p->next)
{
if(p->sum == data)
{
p->rankNum = ranknum;
}
else
{
ranknum++;
p->rankNum = ranknum;
data = p->sum;
}
}
return head;
}
STU *SortbyNumber1(STU *head, int n)
{
STU *endpt;
STU *p;
STU *p1, *p2;
p1 = (STU *)malloc(LEN);
p1->next = head;
head = p1;
for (endpt = NULL; endpt != head; endpt = p)
{
for (p = p1 = head; p1->next->next != endpt; p1 = p1->next)
{
if (p1->next->num < p1->next->next->num)
{
p2 = p1->next->next;
p1->next->next = p2->next;
p2->next = p1->next;
p1->next = p2;
p = p1->next->next;
}
}
}
p1 = head;
head = head->next;
free(p1);
p1 = NULL;
return head;
}
STU *SortbyNum(STU *head)
{
STU *first;
STU *t;
STU *p, *q;
if(head == NULL)
{
return head;
}
first = head->next;
head->next = NULL;
while (first != NULL)
{
for (t = first, q = head; ((q != NULL) && (q->num < t->num)); p = q, q = q->next);
first = first->next;
if (q == head)
{
head = t;
}
else
{
p->next = t;
}
t->next = q;
}
return head;
}
STU *SortbyChinese(STU *head, int n)
{
STU *endpt;
STU *p;
STU *p1, *p2;
p1 = (STU *)malloc(LEN);
p1->next = head;
head = p1;
for (endpt = NULL; endpt != head; endpt = p)
{
for (p = p1 = head; p1->next->next != endpt; p1 = p1->next)
{
if (p1->next->score[0] < p1->next->next->score[0])
{
p2 = p1->next->next;
p1->next->next = p2->next;
p2->next = p1->next;
p1->next = p2;
p = p1->next->next;
}
}
}
p1 = head;
head = head->next;
free(p1);
p1 = NULL;
return head;
}
STU *SortbyMaths(STU *head, int n)
{
STU *endpt;
STU *p;
STU *p1, *p2;
p1 = (STU *)malloc(LEN);
p1->next = head;
head = p1;
for (endpt = NULL; endpt != head; endpt = p)
{
for (p = p1 = head; p1->next->next != endpt; p1 = p1->next)
{
if (p1->next->score[1] < p1->next->next->score[1])
{
p2 = p1->next->next;
p1->next->next = p2->next;
p2->next = p1->next;
p1->next = p2;
p = p1->next->next;
}
}
}
p1 = head;
head = head->next;
free(p1);
p1 = NULL;
return head;
}
STU *SortbyEnglish(STU *head, int n)
{
STU *endpt;
STU *p;
STU *p1, *p2;
p1 = (STU *)malloc(LEN);
p1->next = head;
head = p1;
for (endpt = NULL; endpt != head; endpt = p)
{
for (p = p1 = head; p1->next->next != endpt; p1 = p1->next)
{
if (p1->next->score[2] < p1->next->next->score[2])
{
p2 = p1->next->next;
p1->next->next = p2->next;
p2->next = p1->next;
p1->next = p2;
p = p1->next->next;
}
}
}
p1 = head;
head = head->next;
free(p1);
p1 = NULL;
return head;
}
STU *SortbyAver(STU *head, int n)
{
STU *endpt;
STU *p;
STU *p1, *p2;
p1 = (STU *)malloc(LEN);
p1->next = head;
head = p1;
for (endpt = NULL; endpt != head; endpt = p)
{
for (p = p1 = head; p1->next->next != endpt; p1 = p1->next)
{
if (p1->next->aver < p1->next->next->aver)
{
p2 = p1->next->next;
p1->next->next = p2->next;
p2->next = p1->next;
p1->next = p2;
p = p1->next->next;
}
}
}
p1 = head;
head = head->next;
free(p1);
p1 = NULL;
return head;
}
STU *SortbyName(STU *head, int n)
{
STU *endpt;
STU *p;
STU *p1, *p2;
p1 = (STU *)malloc(LEN);
p1->next = head;
head = p1;
for (endpt = NULL; endpt != head; endpt = p)
{
for (p = p1 = head; p1->next->next != endpt; p1 = p1->next)
{
if (strcmp(p1->next->name, p1->next->next->name)>0)
{
p2 = p1->next->next;
p1->next->next = p2->next;
p2->next = p1->next;
p1->next = p2;
p = p1->next->next;
}
}
}
p1 = head;
head = head->next;
free(p1);
p1 = NULL;
return head;
}
void Print(STU *head, int n, int m)
{
STU *p;
int i;
p = head;
if (head != NULL)
{
printf("\t\t\t******************************************************************************\n");
printf("\t\t\t%15s\t%s\t", "学号", "姓名");
for(i = 0; i < m; i++)
{
printf("%s\t", courseName[i]);
}
printf("%s\t%s\t%s\n", "总分", "平均分", "排名");
do
{
printf("\t\t\t%15lld\t%s\t", p->num, p->name);
for (i = 0; i<m; i++)
{
printf("%.1f\t", p->score[i]);
}
printf("%.1f\t%.1f\t%d\n", p->sum, p->sum / m, p->rankNum);
p = p->next;
} while (p != NULL);
printf("\t\t\t******************************************************************************\n");
}
}
void print1(int courseNum)
{
int i;
printf("\t\t\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n", "course", "sum", "averscore","<60(不及格)", "[60,70)", "[70,80)", "[80,90)", ">=90","通过数");
for(i = 0; i < courseNum; i++)
{
printf("\t\t\t%s\t%.1f\t%.1f\t\t%d\t\t%d\t%d\t%d\t%d\t%d\n", courseName[i], Course[i].sumscore, Course[i].avescore, Course[i].sectionNum[0],
Course[i].sectionNum[1], Course[i].sectionNum[2], Course[i].sectionNum[3], Course[i].sectionNum[4],Course[i].sectionNum[1]+Course[i].sectionNum[2]+Course[i].sectionNum[3]+Course[i].sectionNum[4]);
}
}
void SearchbyNum(STU *head, int n, int m)
{
long long num;
int i;
int flag = 1;
printf("\t\t\t");
scanf("%lld", &num);
STU *p;
p = head;
if (head != NULL)
{
do {
if (p->num == num)
{
printf("\t\t\t%s\t%s\t", "学号", "姓名");
for(i = 0; i < m; i++)
{
printf("%s\t", courseName[i]);
}
printf("%s\t%s\t%s\n", "总分", "平均分", "排名");
printf("\t\t\t");
printf("%lld\t%s\t", p->num, p->name);
for (i = 0; i<m; i++)
{
printf("%.1f\t", p->score[i]);
}
printf("%.1f\t%.1f\t%d\n", p->sum, p->sum / m, p->rankNum);
flag = 0;
break;
}
p = p->next;
} while (p != NULL);
}
if (flag)
{
printf("\t\t\t");
printf("Not found!\n");
}
printf("\t\t\t******************************************************************************\n");
}
void SearchbyName(STU *head, int n, int m)
{
char name[MAX_LEN];
int i;
int flag = 1;
printf("\t\t\t");
scanf("%s", name);
STU *p;
p = head;
if (head != NULL)
{
do {
if (strcmp(name, p->name) == 0)
{
printf("\t\t\t%s\t%s\t", "学号", "姓名");
for(i = 0; i < m; i++)
{
printf("%s\t", courseName[i]);
}
printf("%s\t%s\t%s\n", "总分", "平均分", "排名");
printf("\t\t\t");
printf("%lld\t%s\t", p->num, p->name);
for (i = 0; i<m; i++)
{
printf("%.1f\t", p->score[i]);
}
printf("%.1f\t%.1f\t%d\n", p->sum, p->sum / m, p->rankNum);
flag = 0;
}
p = p->next;
} while (p != NULL);
}
if (flag)
{
printf("\t\t\t");
printf("Not found!\n");
}
printf("\t\t\t******************************************************************************\n");
}
STU* deleteStu(STU *head, int *n, int m)
{
long long num;
int i;
int flag = 1;
char temp[5];
printf("\t\t\tplease input number you want to delete\n");
printf("\t\t\t");
scanf("%lld", &num);
STU *p, *q;
p = head;
if (head != NULL)
{
do {
if (p->num == num)
{
printf("\t\t\t%s\t%s\t", "学号", "姓名");
for(i = 0; i < m; i++)
{
printf("%s\t", courseName[i]);
}
printf("%s\t%s\t%s\n", "总分", "平均分", "排名");
printf("\t\t\t");
printf("%lld\t%s\t", p->num, p->name);
for (i = 0; i<m; i++)
{
printf("%.1f\t", p->score[i]);
}
printf("%.1f\t%.1f\t%d\n", p->sum, p->sum / m, p->rankNum);
flag = 0;
printf("\t\t\tAre you surn to delete?(yes/no):");
scanf("%s", temp);
if(strcmp(temp, "yes") == 0)
{
if(p == head)
{
head = p->next;
}
else
{
q->next = p->next;
}
free(p);
*n = *n - 1;
printf("删除成功!按任意键继续......");
getche();
}
break;
}
q = p;
p = p->next;
} while (p != NULL);
if (flag)
{
printf("\t\t\t");
printf("Not found!\n");
}
}
printf("\t\t\t******************************************************************************\n");
return head;
}
void addStu(STU *head, int *stuNum, int m)
{
STU *Nhead = NULL;
STU *p1, *p2;
int i, j, n;
int flag;
printf("please input student number you want to add:");
scanf("%d", &n);
*stuNum += n;
printf("\t\t\tInput student's ID, name and course score");
printf("(");
for(j = 0; j < m; j++)
{
printf(" %s", courseName[j]);
}
printf(" )\n");
for (i = 1; i<n + 1; i++)
{
p1 = (STU *)malloc(LEN);
printf("\t\t\t");
scanf("%lld", &p1->num);
flag = CheckNum(head,p1->num);
while(flag != 0)
{
if(flag == 2) printf("\t\t\tInput erroor,may you input repeat number!!!\n");
if(flag == 1) printf("\t\t\tInput error!!!\n");
printf("\t\t\t");
scanf("%lld", &p1->num);
flag = CheckNum(head,p1->num);
}
printf("\t\t\t");
scanf("%s",p1->name);
for (j = 0; j<m; j++)
{
printf("\t\t\t");
scanf("%f", &p1->score[j]);
flag = CheckNum(NULL,p1->score[j]);
while(flag != 0)
{
printf("\t\t\tInput error!!!\n");
printf("\t\t\t");
scanf("%f", &p1->score[j]);
flag = CheckNum(NULL,p1->score[j]);
}
}
p1->rankNum = 0;
p1->aver = 0;
p1->sum = 0;
p1->next = NULL;
if (i == 1)
{
Nhead = p2 = p1;
}
else
{
p2->next = p1;
p2 = p1;
}
}
p2 = head;
while(p2->next)
{
p2 = p2->next;
}
p2->next = Nhead;
}
void Modify(STU *head, int n, int m)
{
long long num;
int i;
int flag = 1;
STU *p = head;
printf("\t\t\tplease input number you want to modify\n");
printf("\t\t\t");
scanf("%lld", &num);
if (head != NULL)
{
do {
if (p->num == num)
{
printf("\t\t\t%s\t\t%s\t", "学号", "姓名");
for(i = 0; i < m; i++)
{
printf("%s\t", courseName[i]);
}
printf("%s\t%s\t%s\n", "总分", "平均分", "排名");
printf("\t\t\t");
printf("%lld\t%s\t", p->num, p->name);
for (i = 0; i<m; i++)
{
printf("%.1f\t", p->score[i]);
}
printf("%.1f\t%.1f\t%d\n", p->sum, p->sum / m, p->rankNum);
printf("\t\t\tplease input the modified information:\n");
printf("\t\t\t%s\t\t%s\t", "学号", "姓名");
for(i = 0; i < m; i++)
{
printf("%s\t", courseName[i]);
}
printf("\n\t\t\t");
scanf("%lld", &p->num);
flag = CheckNum(NULL,p->num);
while(flag != 0)
{
if(flag == 1) printf("\t\t\tInput error!!!\n");
printf("\t\t\t");
scanf("%lld", &p->num);
flag = CheckNum(NULL,p->num);
}
printf("\t\t\t");
scanf("%s", p->name);
for(i = 0; i < m; i++)
{
printf("\t\t\t");
scanf("%f", &p->score[i]);
flag = CheckNum(NULL,p->score[i]);
while(flag != 0)
{
printf("\t\t\tInput error!!!\n");
printf("\t\t\t");
scanf("%f", &p->score[i]);
flag = CheckNum(NULL,p->score[i]);
}
}
flag = 0;
printf("修改成功!");
}
p = p->next;
}while(p);
if(flag)
{
printf("Not find!\n");
}
}
}
void WritetoFile(STU *head, char filename[20], int n, int m)
{
STU *p;
p = head;
FILE *fp;
int i, j;
printf("\n\n\n");
printf("\t\t\t******************************************************************************\n");
if ((fp = fopen(filename, "w")) == NULL)
{
printf("\t\t\tFail to open %s\n", filename);
printf("\t\t\t******************************************************************************\n");
return;
}
if(strcmp(filename, "RawData.xls") == 0 || strcmp(filename, "RawData.txt") == 0 || strcmp(filename, "ComprehensiveScoresOfStudents.xls") == 0 || strcmp(filename, "ComprehensiveScoresOfStudents.txt") == 0)
{
fprintf(fp,"%s\t%d\t%s\t%d\n","学生总数:",n,"课程数:",m);
fprintf(fp, "%s\t%s\t", "学号", "姓名");
for(i = 0; i < m; i++)
{
fprintf(fp, "%s\t", courseName[i]);
}
fprintf(fp, "%s\t%s\t%s\n", "总分", "平均分", "排名");
for (i = 0; i<n; i++)
{
fprintf(fp, "%lld\t%s\t", p->num, p->name);
for (j = 0; j<m; j++)
{
fprintf(fp, "%.1f\t", p->score[j]);
}
fprintf(fp, "%.1f\t%.1f\t%d\n", p->sum, p->sum / m, p->rankNum);
p = p->next;
}
}
else
{
if(strcmp(filename, "StatisticalData.xls") == 0 || strcmp(filename, "StatisticalData.txt") == 0)
{
fprintf(fp, "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n", "课程", "课程总分", "课程平均分", "<60(不及格)", "[60,70)", "[70,80)", "[80,90)", ">=90","通过数");
for(i = 0; i < m; i++)
{
fprintf(fp, "%s\t%.1f\t%.1f\t%d\t%d\t%d\t%d\t%d\t%d\n", courseName[i], 100, Course[i].avescore, Course[i].sectionNum[0],
Course[i].sectionNum[1], Course[i].sectionNum[2], Course[i].sectionNum[3], Course[i].sectionNum[4],Course[i].sectionNum[1]+Course[i].sectionNum[2]+Course[i].sectionNum[3]+Course[i].sectionNum[4]);
}
}
else
{
printf("filename is wrong!\n");
return ;
}
}
printf("\t\t\tExport Successfully!\n");
fclose(fp);
printf("\t\t\t******************************************************************************\n");
}
void topStu(STU *head, int n)
{
STU *p = head;
FILE *fp;
int i, flag1 = 0, flag2 = 0, flag3 = 0, flag4 = 1, count = 0;
if((fp = fopen("SuperiorStudent.xls", "w")) == NULL)
{
printf("打开文件失败!\n");
flag4 = 0;
}
fprintf(fp, "%s\t%s\n", "学号", "姓名");
for(; p; p= p->next)
{
flag1 = 0;
flag2 = 0;
flag3 = 0;
if(p->aver >= 80)
{
flag1 = 1;
}
if(p->aver >= 60 && p->aver <90)
{
for(i = 0; i < n; i++)
{
if(p->score[i] >= 90)
{
flag2 = 1;
break;
}
}
}
if(p->aver < 60)
{
for(i = 0; i < n; i++)
{
if(p->score[i] == 100)
{
flag3 = 1;
break;
}
}
}
if(flag1 || flag2 || flag3)
{
count++;
printf("%lld\t%s\n", p->num, p->name);
if(flag4)
{
fprintf(fp, "%lld\t%s\n", p->num, p->name);
}
}
}
if(count == 0)
{
printf("无优等生!");
if(flag4)
fprintf(fp, "无优等生");
}
else
{
printf("优等生共%d人\n", count);
if(flag4)
fprintf(fp, "\t优等生共%d人\n", count);
}
fclose(fp);
}
void failStu(STU *head, int n)
{
STU *p = head;
int i, flag1 = 0, flag2 = 1, flag3 = 1;
FILE *fp;
if((fp = fopen("FailingSubjects.xls", "w")) == NULL)
{
printf("打开文件失败\n");
flag3 = 0;
}
fprintf(fp, "%s\t%s\t", "学号", "姓名");
for(i = 0; i < 3; i++)
{
fprintf(fp, "%s\t", courseName[i]);
}
fprintf(fp, "\n");
for(; p; p = p->next)
{
flag1 = 0;
for(i = 0; i < n; i++)
{
if(p->score[i] < 60)
{
flag1 = 1;
break;
}
}
if(flag1)
{
flag2 = 0;
printf("%lld\t%s\t", p->num, p->name);
if(flag3)
{
fprintf(fp, "%lld\t%s\t", p->num, p->name);
}
for(i = 0; i < n; i++)
{
if(p->score[i] < 60)
{
printf("%s:%.1f\t", courseName[i], p->score[i]);
if(flag3)
{
fprintf(fp, "%.1f\t", p->score[i]);
}
}
else
{
if(flag3)
{
fprintf(fp,"%s\t","过关");
}
}
}
printf("\n");
if(flag3)
fprintf(fp, "\n");
}
}
if(flag2)
{
printf("无不及格学生\n");
if(flag3)
{
fprintf(fp, "无不及格学生\n");
}
}
fclose(fp);
}
STU *ReadfromFile(STU *head, int *n, int *m)
{
STU *p;
FILE *fp;
int i, j;
char file_name[100];
char temp1[100],temp2[100],temp3[100],temp4[100],temp5[100],temp6[100],temp7[100],temp8[100];
printf("\t\t\tPlease input file name:\n\t\t\t");
scanf("%s",file_name);
if ((fp = fopen(file_name, "r")) == NULL)
{
printf("\t\t\tFail to open %s\n",file_name);
printf("\t\t\tTry RawData.xls ???\n");
return NULL;
}
fscanf(fp,"%s\t%d\t%s\t%d\n",temp1,n,temp2,m);
fscanf(fp,"%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",temp1,temp2,temp3,temp4,temp5,temp6,temp7,temp8);
head = CreatEmpty(*n, *m);
p = head;
for (i = 0; i<*n; i++)
{
fscanf(fp,"%lld\t%s\t", &p->num, &p->name);
for (j = 0; j<*m; j++)
{
fscanf(fp, "%f\t", &p->score[j]);
}
fscanf(fp, "%f\t%f\t%d\n", &p->sum, &p->aver,&p->rankNum);
p = p->next;
}
i = *n;
j = *m;
printf("\t\t\t******************************************************************************\n");
printf("\t\t\tImport Successfully!\n");
printf("\t\t\t******************************************************************************\n");
fclose(fp);
Print(head, i, j);
return(head);
}
int CheckNum(STU *head, long long number)
{
STU *p;
p = head;
if(number < 0)
{
return 1;
}
while(p != NULL)
{
if(p->num == number)
{
return 2;
}
p = p->next;
}
return 0;
}
Student.h
#ifndef __STUDENT__
#define __STUDENT__
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <malloc.h>
#include <stdlib.h>
#include <conio.h>
#define MAX_LEN 10
#define STU_NUM 1000
#define COURSE_NUM 3
#define LEN sizeof(struct Student)
typedef struct Student
{
long long num;
char name[MAX_LEN];
float score[COURSE_NUM];
float sum;
float aver;
int rankNum;
struct Student *next;
}STU;
struct {
float avescore, sumscore;
int sectionNum[5];
} Course[COURSE_NUM];
char *courseName[COURSE_NUM] ={"语文","数学","英语"};
int Menu(void);
void Print(STU *head, int n, int m);
void print1(int courseNum);
void AverSumofEveryStudent(STU *head, int n, int m);
void AverSumofEveryCourse(STU *head, int n, int m);
STU *SortbyScore(STU *head, int n);
STU *Creat(int n, int m);
STU *CreatEmpty(int n, int m);
STU *SortbyNumber1(STU *head, int n);
STU *SortbyNum(STU *head);
STU *SortbyChinese(STU *head, int n);
STU *SortbyMaths(STU *head, int n);
STU *SortbyEnglish(STU *head, int n);
STU *SortbyAver(STU *head, int n);
STU *SortbyName(STU *head, int n);
void SearchbyNum(STU *head, int n, int m);
void SearchbyName(STU *head, int n, int m);
STU* deleteStu(STU *head, int *n, int m);
void addStu(STU *head, int *stuNum, int m);
void Modify(STU *head, int n, int m);
void topStu(STU *head, int n);
void failStu(STU *head, int n);
void WritetoFile(STU *head, char filename[100], int n, int m);
STU *ReadfromFile(STU *head, int *n, int *m);
int CheckNum(STU *head, long long number);
#endif