當前位置:成語大全網 - 四字成語 - 編程如何用C語言編寫壹個學生成績管理系統程序

編程如何用C語言編寫壹個學生成績管理系統程序

我們才做了這個作業。。。

#include <malloc.h>

#include <stdio.h>

#include <stdlib.h>

#define LEN sizeof(struct scorenode)

#define DEBUG

#include <string.h>

struct scorenode

{

int number;/*學號*/

char name[8];/*姓名*/

float cj1;/*成績1*/

float cj2;/*成績2*/

float cj3;/*成績3 */

struct scorenode *next;

};

typedef struct scorenode score;

int n,k;/*n,k為全局變量,本程序中的函數均可以使用它*/

/*==============================================================================================*/

score *creat(void)

/*函數creat,功能:創建鏈表,此函數帶回壹個指向鏈表頭的指針*/

{

score*head;

score *p1,*p2,*p3,*max;

int i,j;

float fen;

char t[10];

n=0;

p1=p2=p3=(score *)malloc(LEN);head=p3; /*申請壹個新單元*/

printf("請輸入學生資料,輸0退出!\n");

repeat1: printf("請輸入學生學號(學號應大於0):");/*輸入大於0的學號*/

scanf("%d",&p1->number);

while(p1->number<0)

{

getchar();

printf("輸入錯誤,請重新輸入學生學號:");

scanf("%d",&p1->number);

}

/*輸入學號為字符或小於0時,程序報錯,提示重新輸入學號*/

if(p1->number==0)

goto end;/*當輸入的學號為0時,轉到末尾,結束創建鏈表*/

else

{

p3=head;

if(n>0)

{

for(i=0;i<n;i++)

{

if(p1->number!=p3->number)

p3=p3->next;

else

{

printf("學號重復,請重輸!\n");

goto repeat1;

/*當輸入的學號已經存在,程序報錯,返回前面重新輸入*/

}

}

}

}

printf("請輸入學生姓名:");

scanf("%s",&p1->name); /*輸入學生姓名*/

printf("請輸入cj1(0~100):"); /*輸入cj1,成績應在0-100*/

scanf("%f",&p1->cj1);

while(p1->cj1<0||p1->cj1>100)

{

getchar();

printf("輸入錯誤,請重新輸入cj1"); /*輸入錯誤,重新輸入成績1*/

scanf("%f",&p1->cj1);

}

printf("請輸入cj2(0~100):"); /*輸入cj2,成績應在0-100*/

scanf("%f",&p1->cj2);

while(p1->cj2<0||p1->cj2>100)

{

getchar();

printf("輸入錯誤,請重新輸入cj2"); /*輸入錯誤,重新輸入cj2直到正確為止*/

scanf("%f",&p1->cj2);

}

printf("請輸入cj3(0~100):");/*輸入cj3,成績應在0-100*/

scanf("%f",&p1->cj3);

while(p1->cj3<0||p1->cj3>100)

{

getchar();

printf("輸入錯誤,請重新輸入cj3");

scanf("%f",&p1->cj3);} /*輸入錯誤,重新輸入cj3直到正確為止*/

head=NULL;

while(p1->number!=0)

{

n=n+1;

if(n==1)

head=p1;

else

p2->next=p1;

p2=p1;

p1=(score *)malloc(LEN);

printf("請輸入學生資料,輸0退出!\n");

repeat2:printf("請輸入學生學號(學號應大於0):");

scanf("%d",&p1->number); /*輸入學號,學號應大於0*/

while(p1->number<0)

{

getchar();

printf("輸入錯誤,請重新輸入學生學號:");

scanf("%d",&p1->number);

}

/*輸入學號為字符或小於0時,程序報錯,提示重新輸入學號*/

if(p1->number==0)

goto end; /*當輸入的學號為0時,轉到末尾,結束創建鏈表*/

else

{

p3=head;

if(n>0)

{

for(i=0;i<n;i++)

{

if(p1->number!=p3->number)

p3=p3->next;

else

{

printf("學號重復,請重輸!\n");

goto repeat2;

/*當輸入的學號已經存在,程序報錯,返回前面重新輸入*/

}

}

}

}

printf("請輸入學生姓名:");

scanf("%s",&p1->name);/*輸入學生姓名*/

printf("請輸入cj1(0~100):");

scanf("%f",&p1->cj1);/*輸入cj1,成績應在0-100*/

while(p1->cj1<0||p1->cj1>100)

{

getchar();

printf("輸入錯誤,請重新輸入cj1");

scanf("%f",&p1->cj1);}/*輸入錯誤,重新輸入cj1直到正確為止*/

printf("請輸入cj2(0~100):");

scanf("%f",&p1->cj2);/*輸入cj2,成績應在0-100*/

while(p1->cj2<0||p1->cj2>100)

{

getchar();

printf("輸入錯誤,請重新輸入cj2");

scanf("%f",&p1->cj2);

} /*輸入錯誤,重新輸入cj2績直到正確為止*/

printf("請輸入cj3(0~100):");

scanf("%f",&p1->cj3);/*輸入cj3,成績應在0-100*/

while(p1->cj3<0||p1->cj3>100)

{

getchar();

printf("輸入錯誤,請重新輸入cj3");

scanf("%f",&p1->cj3);} /*輸入錯誤,重新輸入cj3直到正確為止*/

}

end: p1=head;

p3=p1;

for(i=1;i<n;i++)

{

for(j=i+1;j<=n;j++)

{

max=p1;

p1=p1->next;

if(max->number>p1->number)

{

k=max->number;

max->number=p1->number;

p1->number=k;

/*交換前後結點中的學號值,使得學號大者移到後面的結點中*/

strcpy(t,max->name);

strcpy(max->name,p1->name);

strcpy(p1->name,t);

/*交換前後結點中的姓名,使之與學號相匹配*/

fen=max->cj1;

max->cj1=p1->cj1;

p1->cj1=fen;

/*交換前後結點中的cj1,使之與學號相匹配*/

fen=max->cj2;

max->cj2=p1->cj2;

p1->cj2=fen;

/*交換前後結點中的cj2,使之與學號相匹配*/

fen=max->cj3;

max->cj3=p1->cj3;

p1->cj3=fen;

/*交換前後結點中的cj3,使之與學號相匹配*/

}

}

max=head;p1=head;/*重新使max,p指向鏈表頭*/

}

p2->next=NULL;/*鏈表結尾*/

printf("輸入的學生數為:%d個!\n",n);

return(head);

}

score *add(score *head,score *stu)

/*函數add,功能:追加學生資料,並且將所有學生資料按學號排序*/

{

score *p0,*p1,*p2,*p3,*max;

int i,j;

float fen;

char t[10];

p3=stu=(score *)malloc(LEN);/*開辟壹個新單元*/

printf("\n輸入要增加的學生的資料!");

repeat4: printf("請輸入學生學號(學號應大於0):");

scanf("%d",&stu->number);

/*輸入學號,學號應大於0*/

while(stu->number<0)

{

getchar();

printf("輸入錯誤,請重新輸入學生學號:");

scanf("%d",&stu->number);} /*輸入錯誤,重新輸入學號*/

/******************************************************/

if(stu->number==0)

goto end2;/*當輸入的學號為0時,轉到末尾,結束追加*/

else

{

p3=head;

if(n>0)

{for(i=0;i<n;i++)

{if(stu->number!=p3->number)

p3=p3->next;

else

{

printf("學號重復,請重輸!\n");

goto repeat4;

/*當輸入的學號已經存在,程序報錯,返回前面重新輸入*/

}

}

}

}

/******************************************************/

printf("輸入學生姓名:");

scanf("%s",stu->name); /*輸入學生姓名*/

printf("請輸入cj1(0~100):");

scanf("%f",&stu->cj1); /*輸入cj1,成績應在0-100*/

while(stu->cj1<0||stu->cj1>100)

{getchar();

printf("輸入錯誤,請重新輸入cj1");

scanf("%f",&stu->cj1);

} /*輸入錯誤,重新輸入cj1直到正確為止*/

printf("請輸入cj2(0~100):");

scanf("%f",&stu->cj2);/*輸入cj2,成績應在0-100*/

while(stu->cj2<0||stu->cj2>100)

{

getchar();

printf("輸入錯誤,請重新輸入cj2");

scanf("%f",&stu->cj2);}/*輸入錯誤,重新輸入cj2直到正確為止*/

printf("請輸入cj3(0~100):");

scanf("%f",&stu->cj3);/*輸入cj3,成績應在0-100*/

while(stu->cj3<0||stu->cj3>100)

{

getchar();

printf("輸入錯誤,請重新輸入cj3");

scanf("%f",&stu->cj3);}/*輸入錯誤,重新輸入cj3直到正確為止*/

p1=head;

p0=stu;

if(head==NULL)

{head=p0;p0->next=NULL;}/*當原來鏈表為空時,從首結點開始存放資料*/

else/*原來鏈表不為空*/

{

if(p1->next==NULL)/*找到原來鏈表的末尾*/

{

p1->next=p0;

p0->next=NULL;/*將它與新開單元相連接*/

}

else

{

while(p1->next!=NULL)/*還沒找到末尾,繼續找*/

{

p2=p1;p1=p1->next;

}

p1->next=p0;

p0->next=NULL;

}

}

n=n+1;

p1=head;

p0=stu;

for(i=1;i<n;i++)

{

for(j=i+1;j<=n;j++)

{

max=p1;

p1=p1->next;

if(max->number>p1->number)

{

k=max->number;

max->number=p1->number;

p1->number=k;

/*交換前後結點中的學號值,使得學號大者移到後面的結點中*/

strcpy(t,max->name);

strcpy(max->name,p1->name);

strcpy(p1->name,t);

/*交換前後結點中的姓名,使之與學號相匹配*/

fen=max->cj1;

max->cj1=p1->cj1;

p1->cj1=fen;

/*交換前後結點中的cj1,使之與學號相匹配*/

fen=max->cj2;

max->cj2=p1->cj2;

p1->cj2=fen;

/*交換前後結點中的cj2績,使之與學號相匹配*/

fen=max->cj3;

max->cj3=p1->cj3;

p1->cj3=fen;

/*交換前後結點中的cj3,使之與學號相匹配*/

}

}

max=head;p1=head;/*重新使max,p指向鏈表頭*/

} end2:

printf("現在的學生數為:%d個!\n",n);

return(head);

}

/*========================================================

======================================*/

score *search(score *head)

/*函數search,功能:查詢學生成績*/

{int number;

score *p1,*p2;

printf("輸入要查詢的學生的學號,");

scanf("%d",&number);

while(number!=0)

{

if(head==NULL)

{printf("\n沒有任何學生資料!\n");return(head);}

printf("-----------------------------------------\n");

printf("|學號\t|姓名\t|cj1\t|cj2\t|cj3\t|\n");

printf("-----------------------------------------\n");/*打印表格域*/

p1=head;

while(number!=p1->number&&p1->next!=NULL)

{p2=p1;p1=p1->next;}

if(number==p1->number)

{printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p1->number,p1->name,p1->cj1,p1->cj2,p1->cj3);

printf("-----------------------------------------\n");}/*打印表格域*/

else

printf("%d不存在此學生!\n",number);

printf("輸入要查詢的學生的學號,");

scanf("%d",&number);

}

printf("已經退出了!\n");

return(head);

}/*=============================================

=================================================*/

score *del(score *head)/*函數del,功能:刪除學生資料*/

{

score *p1,*p2;

int number;

printf("輸入要刪除的學生的學號(輸入0時退出):");

scanf("%d",&number);

getchar();

while(number!=0)/*輸入學號為0時退出*/

{

if(head==NULL)

{

printf("\n沒有任何學生資料!\n");

return(head);

}

p1=head;

while(number!=p1->number&&p1->next!=NULL)

/*p1指向的不是所要找的首結點,並且後面還有結點*/

{

p2=p1;p1=p1->next;

} /*p1後移壹個結點*/

if(number==p1->number)

/*找到了*/

{

if(p1==head)

head=p1->next;

/*若p1指向的是首結點,把地二個結點地址賦予head*/

else

p2->next=p1->next;

/*否則將下壹個結點地址 賦給前壹結點地址*/

printf("已經刪除:%d\n",number);n=n-1;

}

else

printf("%d不存在此學生!\n",number);

/*找不到該結點*/

printf("輸入要刪除的學生的學號:");

scanf("%d",&number);

getchar();

}

#ifdef DEBUG

printf("已經退出了!\n");

#endif

printf("現在的學生數為:%d個!\n",n);

return(head);

} /*==================================================

============================================*/

score *statistics(score *head)

/*函數statistics,功能:統計學生成績*/

{

float sum1=0,sum2=0,sum3=0,ave1=0,ave2=0,ave3=0,max=0,min;

score *p;

int x,y=0,i=0;

p=head;

printf("1個人總分和平均分\t2單科平均分\t3總分最高分\t4總分最低分\n");

scanf("%d",&x);

getchar();

switch(x)

/*用switch語句實現功能選擇*/

{

case 1: if(head==NULL)

{printf("\n沒有任何學生資料!\n");return(head);}/*鏈表為空*/

else

{

printf("---------------------------------------------------------\n");

printf("|學號\t|姓名\t|cj1\t|cj2\t|cj3\t|總分\t|平均分\t|\n");

printf("---------------------------------------------------------\n");/*打印表格域*/

while(p!=NULL)

{

sum1=p->cj1+p->cj2+p->cj3; /*計算個人總分*/

ave1=sum1/3;/*計算個人平均分*/

printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|\n",p->number,p->name,p->cj1,p->cj2,p->cj3,sum1,ave1);

/*打印結果*/

printf("---------------------------------------------------------\n");/*打印表格域*/

p=p->next;}

}

return(head); break;

case 2: if(head==NULL)

{printf("\n沒有任何學生資料!\n");return(head);}/*鏈表為空*/

while(p!=NULL)

{

sum1=sum1+p->cj1;

sum2=sum2+p->cj2;

sum3=sum3+p->cj3;/*計算總分*/

y=y+1;

ave1=sum1/y;

ave2=sum2/y;

ave3=sum3/y;/*計算平均分*/

p=p->next;/*使p指向下壹個結點*/

}

printf("cj1平均分是%.1f\n",ave1);

printf("cj2平均分是%.1f\n",ave2);

printf("cj3平均分是%.1f\n",ave3);/*打印結果*/

return(head); break;

case 3:

if(head==NULL)

{printf("\n沒有任何學生資料!\n");return(head);}/*鏈表為空*/

max=p->cj1+p->cj2+p->cj3;

while(i<n)

{

i=i+1;

sum1=p->cj1+p->cj2+p->cj3; /*計算個人總分*/

if(max<sum1)

max=sum1;

p=p->next;

}

printf("總分最高分:%.1f",max);

printf("\n");

return(head); break;

case 4: if(head==NULL)

{printf("\n沒有任何學生資料!\n");return(head);}/*鏈表為空*/

while(p!=NULL)

{

min=p->cj1+p->cj2+p->cj3;

while(p!=NULL)

{sum2=p->cj1+p->cj2+p->cj3;

if(min>sum2)

min=sum2;

p=p->next;

}

}

printf("總分最低分:%.1f",min);

printf("\n");

return(head); break;

default :printf("輸入錯誤,請重試!\n");

}

return(head);

}

/*===========================================================

===================================*/

int save(score *p1)

/*函數save,功能:保存學生的資料*/

{

FILE *fp;

char filepn[20];/*用來存放文件保存路徑以及文件名*/

printf("請輸入文件路徑及文件名:");

scanf("%s",filepn);

if((fp=fopen(filepn,"w+"))==NULL)

{

printf("不能打開文件!\n");

return 0;

}

fprintf(fp," 學生成績管理系統 \n");

fprintf(fp,"-------------------------------------------------------\n");

fprintf(fp,"| 學號\t| 姓名\t| cj1\t| cj2\t| cj3\t|\n");

fprintf(fp,"-------------------------------------------------------\n");

/*打印表格域*/

while(p1!=NULL)

{

fprintf(fp,"%d\t%s\t%.1f\t%.1f\t%.1f\t\n",p1->number,p1->name,p1->cj1,p1->cj2,p1->cj3);

p1=p1->next;/*下移壹個結點*/

}

fclose(fp);

printf("文件已經保存!\n");

return 0;

}

int menu()/*函數menu,功能:菜單選擇界面*/

{

int i,k;

printf("\t\t\t\t學生成績管理系統\n");

for(i=0;i<80;i++)

printf("*");

printf("\t\t1創建資料\t\t\t2查詢成績\t\t\n");

printf("\t\t3刪除資料\t\t\t4追加資料\t\t\n");

printf("\t\t5統計成績\t\t\t6保存資料\t\t\n");

/*菜單選擇界面*/

for(i=0;i<80;i++)

printf("*");

printf("請選擇您所要的操作(選擇(0)退出):");

scanf("%d",&k);/*選擇操作*/

getchar();

return (k);}

/*==============================================================================================*/

main() /*主函數main,功能:通過調用creat,search,del,add,print,ststistics,save,taxis等函數,實現學生成績查詢系統功能*/

{

score *head=0,*stu=0;

while(1)

{

k=menu();

switch(k)/*用switch語句實現功能選擇*/

{

case 1: head=creat();break;/*調用創建鏈表函數*/

case 2: head=search(head);break;/*調用查詢函數*/

case 3: head=del(head); break;/*調用刪除函數*/

case 4: head=add(head,stu);break;/*調用追加函數*/

case 5: statistics(head); break;/*調用統計函數*/

case 6: save(head);break;/*調用保存函數*/

case 0: exit(0);/*退出系統,返回主界面*/

default: printf("輸入錯誤,請重試!\n");

}

}

}