#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 3
#define COURSE 5
char filename[81] = {0};
int updated;
typedef struct Student {
char Sex[10];
char Name[20];
unsigned Num;
double Grades[COURSE + 2];//è¯æãæ°å¦ãè±è¯ãCè¯è¨ãä½è²ãæ»æ绩ãå¹³åæ绩
struct Student *next;
}*LinkList,*NODE;
LinkList head = NULL;
char subjects[COURSE + 2][8] = {"è¯æ","æ°å¦","è±è¯","Cè¯è¨","ä½è²","æ»å","å¹³åå"};
void Menu(void);
void CreateList(void);
void Sort(void);
void Search(void);
void Tongji(void);
void Insert(void);
void Modify(void);
void Delete(void);
void ShowAll(void);
void SaveData(void);
char *CppPath(char s[]);
char *FmtName(char *name);
void ShowTitle(void);
void ShowLine(void);
void ShowNode(NODE p);
void FreeList(void);
void Menu(void) {
int choose;
do {
system("cls"); //DOSå½ä»¤ï¼æ¸
å±
printf("\n");
printf("***********************************************************\n");
printf(" XXXXXXX大å¦æ¬¢è¿ä½ \n\n");
printf(" å¦çæ绩信æ¯ç®¡çç³»ç»\n");
printf("***********************************************************\n");
printf("\n\n");
printf("\t\t 1.读æ°æ®æ件\n");
printf("\t\t 2.æåº\n");
printf("\t\t 3.ç»è®¡\n");
printf("\t\t 4.æ¥æ¾\n");
printf("\t\t 5.æå
¥\n");
printf("\t\t 6.ä¿®æ¹\n");
printf("\t\t 7.å é¤\n");
printf("\t\t 8.æ¾ç¤º\n");
printf("\t\t 9.æ°æ®åç\n");
printf("\t\t 10.éåº\n");
printf("\n\n");
printf("请éæ©æ¨éè¦çæä½,è¾å
¥ç¸å
³æ°å : ");
scanf("%d",&choose);
switch(choose) {
case 1 : CreateList();break;
case 2 : Sort();break;
case 3 : Tongji();break;
case 4 : Search();break;
case 5 : Insert();break;
case 6 : Modify();break;
case 7 : Delete();break;
case 8 : ShowAll();system("pause");break;
case 9 : SaveData();break;
default: break;
}
}while(choose != 10);
}
void ReadData(NODE p) {
int i;
double sum = 0.0;
printf("请è¾å
¥å§åï¼");
scanf("%s",p->Name);
strcpy(p->Name,FmtName(p->Name));
printf("请è¾å
¥å¦å·ï¼");
scanf("%d",&p->Num);
printf("请è¾å
¥æ§å«ï¼");
scanf("%s",p->Sex);
p->Grades[COURSE] = 0.0;
for(i = 0;i < COURSE; ++i) {
printf("%sæ绩(0 ï½ 100) = ",subjects[i]);
scanf("%lf",&p->Grades[i]);
p->Grades[COURSE] += p->Grades[i];
}
p->Grades[COURSE + 1] = p->Grades[COURSE]/COURSE;
}
void CreateList(void) { // å建é¾è¡¨
FILE *fp;
double sum = 0.0;
NODE p;
int i;
updated = 1;
printf("请è¾å
¥æ件å : ");
scanf("%s",filename);
fp = fopen(CppPath(filename),"rb");
if(fp == NULL) {
printf("æå¼æ件%såºéã\n",filename);
exit(1);
}
if(head) for(p = head; p->next; p = p->next);
else head = p = (LinkList)malloc(sizeof(Student));
printf("请è¾å
¥å¦çä¿¡æ¯ï¼\n");
for(i = 0;i < N;i++) {
p->next = (LinkList)malloc(sizeof(Student));
fread(p->next,sizeof(Student),1,fp);
p = p->next;
}
p->next = NULL;
fclose(fp);
}
void SaveData(void) {
FILE *fp;
NODE p;
if(head == NULL) {
printf("ä¿¡æ¯å°æªå»ºç«ï¼åçæä½å¤±è´¥ã\n");
return;
}
if(filename[0] = '\0') {
printf("请è¾å
¥æ件å : ");
scanf("%s",filename);
strcpy(filename,CppPath(filename));
}
fp = fopen(CppPath(filename),"wb");
if(fp == NULL) {
printf("æå¼æ件%såºéã\n",filename);
exit(1);
}
for(p = head->next; p; p = p->next)
fwrite(p,sizeof(Student),1,fp);
fclose(fp);
updated = 0;
}
void ShowLine(void) {
int i;
for(i = 0; i < 67; ++i) printf("*");
printf("\n");
}
char *CppPath(char s[]) {
char *q,*p = s;
int len = strlen(s);
while(*p) {
if(*p == '\\' && *(p + 1) != '\\') {
for(q = s + len; q > p; --q)
*(q + 1) = *q;
*(q + 1) = '\\';
++len;
p += 2;
}
else ++p;
}
return s;
}
char *FmtName(char *name) {
int len = strlen(name);
char *p = name;
if(len > 6) name[6] = '\0';
else if(len == 4) {
name[6] = name[4];
name[5] = name[3];
name[4] = name[2];
name[2] = name[3] = ' ';
}
return name;
}
void ShowTitle(void) {
printf("å§ å å¦ å· æ§å« è¯ æ æ° å¦ è± è¯ ä½ è² Cè¯ è¨ æ» å å¹³åå\n");
}
void ShowNode(NODE p) {
int i;
printf("%6s %6d %4s ",p->Name,p->Num,p->Sex);
for(i = 0; i < COURSE + 2; ++i) printf("%6.2lf ",p->Grades[i]);
printf("\n");
}
void ShowAll(void) {
NODE p;
if(head == NULL) {
printf("ä¿¡æ¯å°æªå»ºç«ï¼è¯·å
ãå½å
¥ãã\n");
return;
}
ShowTitle();
ShowLine();
for(p = head->next; p; p = p->next)
ShowNode(p);
ShowLine();
}
void Search(void) { /* æ¥è¯¢å¦ç */
unsigned num,choose,flag;
char name[20];
NODE p;
if(head == NULL) {
printf("ä¿¡æ¯å°æªå»ºç«ï¼è¯·å
ãå½å
¥ãã\n");
return;
}
do {
system("cls");
printf("è¾å
¥æ¥è¯¢æ¹å¼ï¼\n1.æå§åæ¥è¯¢\n2.æå¦å·æ¥è¯¢\n3.è¿å\n");
printf("请éæ© : ");
scanf("%d",&choose);
if(choose == 1) { /* æå§åæ¥è¯¢ */
flag = 1; // 没æ¾å°
printf("è¯·ä½ è¾å
¥è¦æ¥æ¾çå§å:");
scanf("%s",name);
strcpy(name,FmtName(name));
for(p = head->next; p; p = p->next) {
if(strcmp(p->Name,name) == 0) {
ShowTitle();
ShowLine();
ShowNode(p);
ShowLine();
flag = 0; // å·²æ¾å°
break;
}
}
if(flag) printf("(没æ¾å°å§å为\"%s\"çå¦çã)\n",name);
}
else if(choose == 2) { // æå¦å·æ¥è¯¢
flag = 1; // 没æ¾å°
printf("è¯·ä½ è¾å
¥è¦æ¥æ¾çå¦å·:");
scanf("%d",&num);
for(p = head->next; p; p = p->next) {
if(p->Num == num) {
ShowTitle();
ShowLine();
ShowNode(p);
ShowLine();
flag = 0; // å·²æ¾å°
break;
}
}
if(flag) printf("(没æ¾å°å¦å·ä¸º\"%d\"çå¦çã)\n",num);
}
}while(choose != 3);
}
void Delete(void) { /* å é¤å¦ç */
unsigned an,num,choose,flag;
char name[20];
NODE p,q;
if(head == NULL) {
printf("ä¿¡æ¯å°æªå»ºç«ï¼è¯·å
ãå½å
¥ãã\n");
return;
}
updated = 1;
do {
system("cls");
printf("è¾å
¥æ¹å¼ï¼\n1.æå®å§å\n2.æå®å¦å·\n3.è¿å\n");
printf("请éæ© : ");
scanf("%d",&choose);
if(choose == 1) { /* æå®å§å */
flag = 1; // 没æ¾å°
printf("è¯·ä½ è¾å
¥è¦å é¤å¦ççå§å:");
scanf("%s",name);
strcpy(name,FmtName(name));
for(p = head; p->next; p = p->next) {
if(strcmp(p->next->Name,name) == 0) {
ShowTitle();
ShowLine();
ShowNode(p->next);
ShowLine();
printf("确认è¦å é¤å: 1.å é¤ï¼2.ä¸å é¤");
scanf("%d",&an);
if(an == 1) {
q = p->next;
p->next = q->next;
free(q);
}
flag = 0; // å·²æ¾å°
break;
}
}
if(flag) printf("(没æ¾å°å§å为\"%s\"çå¦çã)\n",name);
}
else if(choose == 2) { // æå®å¦å·
flag = 1; // 没æ¾å°
printf("è¯·ä½ è¾å
¥è¦å é¤å¦ççå¦å·:");
scanf("%d",&num);
for(p = head; p->next; p = p->next) {
if(p->next->Num == num) {
ShowTitle();
ShowLine();
ShowNode(p);
ShowLine();
printf("确认è¦å é¤å: 1.å é¤ï¼2.ä¸å é¤");
scanf("%d",&an);
if(an == 1) {
q = p->next;
p->next = q->next;
free(q);
}
flag = 0; // å·²æ¾å°
break;
}
}
if(flag) printf("(没æ¾å°å¦å·ä¸º\"%d\"çå¦çã)\n",num);
}
}while(choose != 3);
}
void Modify(void) {
int flag,choose;
char name[20];
NODE p;
if(head == NULL) {
printf("ä¿¡æ¯å°æªå»ºç«ï¼è¯·å
ãå½å
¥ãã\n");
return;
}
updated = 1;
do {
system("cls");
ShowAll();
flag = 1; // 没æ¾å°
printf("è¯·ä½ è¾å
¥è¦ä¿®æ¹çå§å:");
scanf("%s",name);
strcpy(name,FmtName(name));
for(p = head->next; p; p = p->next) {
if(strcmp(p->Name,name) == 0) {
ShowTitle();
ShowLine();
ShowNode(p);
ShowLine();
flag = 0; // å·²æ¾å°
ReadData(p);
break;
}
}
if(flag) printf("(没æ¾å°å§å为\"%s\"çå¦çã)\n",name);
printf("1.继ç»ä¿®æ¹ 0.è¿å\n");
scanf("%d",&choose);
}while(choose != 1);
}
void Sort(void) {
int i,choose;
NODE q,p,pt;
if(head == NULL) {
printf("ä¿¡æ¯å°æªå»ºç«ï¼è¯·å
ãå½å
¥ãã\n");
return;
}
updated = 1;
do {
system("cls");
printf("æåºåç±»:\n");
printf("1.å§ååæåº\n2.å¦å·åæåº\n3.è¯æéæåº\n4.æ°å¦éæåº\n5.è±è¯éæåº\n");
printf("6.Cè¯è¨éæåº\n7.ä½è²éæåº\n8.æ»æ绩éæåº\n9.å¹³åæ绩éæåº\n10.è¿å\n");
scanf("%d",&choose);
switch(choose) {
case 1 : p = head;
while(p->next) {
q = p->next;
while(q->next) {
if(strcmp(p->next->Name,q->next->Name) > 0) {
pt = p->next;
p->next = q->next;
q->next = q->next->next;
p->next->next = pt;
}
else q = q->next;
}
p = p->next;
}
break;
case 2 : p = head;
while(p->next) {
q = p->next;
while(q->next) {
if(p->next->Num > q->next->Num) {
pt = p->next;
p->next = q->next;
q->next = q->next->next;
p->next->next = pt;
}
else q = q->next;
}
p = p->next;
}
break;
case 3 :
case 4 :
case 5 :
case 6 :
case 7 :
case 8 :
case 9 : i = choose - 3;
p = head;
while(p->next) {
q = p->next;
while(q->next) {
if(p->next->Grades[i] < q->next->Grades[i]) {
pt = p->next;
p->next = q->next;
q->next = q->next->next;
p->next->next = pt;
}
else q = q->next;
}
p = p->next;
}
break;
}
}while(choose != 10);
}
void Insert(void) { // å¯ä»¥ç¨æ¥å建é¾è¡¨
int choose;
NODE q;
if(head != NULL) ShowAll();
else {
system("cls");
head = (LinkList)malloc(sizeof(Student));
q = (LinkList)malloc(sizeof(Student));
ReadData(q);
head->next = q;
q->next = NULL;
}
updated = 1;
do {
system("cls");
ShowAll();
q = (LinkList)malloc(sizeof(Student));
ReadData(q);
q->next = head->next;
head->next = q;
printf("1.ç»§ç» 0.è¿å : ");
scanf("%d",&choose);
}while(choose == 1);
}
void Tongji(void) {
int i,n,choose,nopass;
double sum;
NODE p;
if(head != NULL) ShowAll();
if(head == NULL) {
printf("ä¿¡æ¯å°æªå»ºç«ï¼è¯·å
ãå½å
¥ãã\n");
return;
}
do {
printf("åç±»å¦ä¸:\n");
printf("1.è¯æ\t2.æ°å¦\t3.è±è¯\t4.Cè¯è¨\t5ä½è²\t6.æ»æ绩\t7.å¹³åæ绩\t8.è¿å\n");
printf("请请éæ© : ");
scanf("%d",&choose);
switch (choose) {
case 1 :
case 2 :
case 3 :
case 4 :
case 5 :
case 6 :
case 7 :
i = choose - 1;
sum = 0.0;
nopass = 0;
for(n = 1,p = head->next;p; ++n,p = p->next) {
sum += p->Grades[i];
if(p->Grades[i] < 60.0) nopass++;
}
printf("%sæ»æ绩 : %.2lf\n",subjects[i],sum);
printf("%så¹³åæ绩 : %.2lf\n",subjects[i],sum/n);
if(nopass) printf("%sä¸åæ ¼çæ%d个人\n",subjects[i],nopass);
}
}while(choose != 8);
}
void FreeList(void) {
NODE q,p = head;
while(p) {
q = p;
p = p->next;
free(q);
}
}
int main() {
int choose;
updated = 0;
Menu();
if(updated == 1) {
printf("æ°æ®å·²ç»æ´æ°ï¼éè¦ä¿åå°æ件ã\n");
printf("1. ä¿åï¼0. æ¾å¼ : ");
scanf("%d",&choose);
if(choose == 1) SaveData();
}
FreeList();
return 0;
}
追é®å¥½çãè¿è¡ãå°äºä¸ªå¢å ä¿¡æ¯ãè½ä¸è½ 补个å
¨ã
追ç5 ãæå
¥ åè½å¯ä»¥å¢å ä¿¡æ¯ã