當前位置:成語大全網 - 漢語詞典 - c語言學生成績管理系統

c語言學生成績管理系統

學生成績管理系統的c代碼

/*頭文件*/

# include & ltstdio.h & gt

# include & ltdos.h & gt

# include & ltstdlib.h & gt/*其他註釋*/

# include & ltstring.h & gt/*字符串函數*/

# include & ltmem.h & gt/*存儲器操作功能*/

# include & ltctype.h & gt/*字符操作功能*/

# include & ltalloc.h & gt/*動態地址分配功能*/

#定義LEN sizeof(學生)

Typedef struct stu /*定義用於緩存數據的結構數組*/

{ char num[6];

字符名稱[5];

int score[3];

int sum

浮動平均值;

int順序;

struct stu * next

}學生;

/*函數原型*/

學生* init();/*初始化函數*/

int menu _ select();/*菜單功能*/

學生* create();/*創建壹個鏈表*/

作廢打印(學生*頭像);/*顯示所有記錄*/

void搜索(學生*人頭);/*查找記錄*/

學生*刪除(學生*頭);/*刪除記錄*/

學生*排序(學生*頭);/*排序*/

學生*插入(學生*頭,學生*新);/*插入記錄*/

作廢保存(學生*人頭);/*保存文件*/

學生* load();/*讀取文件*/

/*主功能界面*/

主()

{學生*頭,新;

head = init();/*鏈表被初始化,使得head的值為NULL*/

for(;;)/*無限次循環*/

{開關(menu_select())

{

case 1:head = create();打破;

案例二:打印(頭);打破;

案例三:搜索(頭);打破;

情況4:head=delete(頭);打破;

案例五:head=sort(頭);打破;

案例6:head = insert(head & amp;新);打破;/* & amp;新的意思是回郵地址*/

案例7:救(頭);打破;

情況8:head = load();打破;

案例9:出口(0);/*如果菜單返回值為9,程序結束*/

}

}

}

/*初始化函數*/

學生*init()

{

返回NULL/*返回空指針*/

}

/*菜單選擇功能*/

menu_select()

{ int n;

結構日期d;/*定義時間結構*/

getdate(& amp;d);/*讀取系統日期並將其放入結構D */

printf("按任意鍵進入菜單……");/*按任意鍵進入主菜單*/

getch();/*從鍵盤讀取字符,但不要在屏幕上顯示*/

clr SCR();/*清空屏幕*/

printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n ");

printf("\t\t歡迎使用\ n ");

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

printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *菜單* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n ");

printf("\t\t\t1。輸入記錄\ n ");/*輸入學生記錄*/

printf("\t\t\t2。打印記錄\ n ");/*顯示*/

printf("\t\t\t3。按姓名搜索記錄\ n ");/*查找*/

printf("\t\t\t4。刪除壹條記錄\ n ");/*刪除*/

printf("\t\t\t5。排序以創建新文件\ n ");/*排序*/

printf("\t\t\t6。將記錄插入列表\ n ");/*插入*/

printf("\t\t\t7。保存文件\ n ");/*保存*/

printf("\t\t\t8。加載文件\ n”);/*閱讀*/

printf("\t\t\t9。退出\ n ");/*退出*/

printf("\n\t\t由胡海紅制作。\ n ");

printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n ");

printf("\t\t\t\t%d\\%d\\%d\n ",d.da_year,d.da_mon,d . da _ day);/*顯示當前系統日期*/

做{

printf(" \ n \ t \ t \ t輸入您的選擇(1 ~ 9):");

scanf("%d ",& ampn);

} while(n & lt;1 | | n >;9);/*如果所選項目不在1~9之間,請再次輸入*/

返回(n);/*返回選中的項,主函數根據數字調用相應的函數*/

}

/*輸入函數*/

學生*創建()

{int i,s;

學生*head=NULL,* p;/*定義函數。這個函數返回壹個指向鏈表頭的指針*/

clr SCR();

for(;;)

{ p =(STUDENT *)malloc(LEN);/*創建新模塊*/

如果(!P) /*如果指針p為空*/

{ printf(" \ n內存不足。);/*輸出內存溢出*/

返回(頭);/*返回頭指針,下同*/

}

printf("輸入編號(0:列表結尾):");

scanf("%s ",p-& gt;num);

如果(p->;num[0]= = ' 0 ')break;/*如果學號的第壹個字符為0,則輸入結束*/

printf("輸入姓名:");

scanf("%s ",p-& gt;姓名);

printf("請輸入%d分\n ",3);/*提示開始輸入分數*/

s = 0;/*計算每個學生的總分,初始值為0*/

for(I = 0;我& lt3;I++) /*3門課程循環3次*/

{

做{

printf("分數%d:",I+1);

scanf("%d ",& ampp->;score[I]);

如果(p->;score[I]& lt;0 | | p->;score[I]& gt;100) /*確保分數在0到100之間*/

printf("數據錯誤,請重新輸入。\ n ");

} while(p-& gt;score[I]& lt;0 | | p->;score[I]& gt;100);

s = s+p-& gt;得分[I];/*累加所有科目的分數*/

}

p->;sum = s;/*保存總分*/

p->;平均值=(float)s/3;/*通過強制類型轉換將S轉換為float類型,然後得到平均值*/

p->;順序= 0;/*排序前該值為0 */

p->;下壹個=頭;/*將首節點作為新輸入節點的後繼節點*/

head = p;/*新的輸入節點是新的頭節點*/

}

返回(頭);

}

/*顯示所有記錄的功能*/

作廢打印(學生*頭像)

{ int I = 0;/*統計記錄的數量*/

學生* p;/*移動指針*/

clr SCR();

p =頭部;/*初始值是頭指針*/

printf(" \ n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *學生* * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n ");

printf("-\ n ");

printf(" | Rec | Num | Name | sc 1 | Sc2 | Sc3 | Sum | Ave | Order | \ n ");

printf("-\ n ");

而(p!=空)

{

i++;

printf(" | % 3d | % 4s | %-4s | % 3d | % 3d | % 3d | % 3d | % 4.2f | %-5d | \ n ",

我,p-& gt;num,p->姓名,p-& gt;得分[0],p-& gt;分數[1],p-& gt;分數[2],p-& gt;sum,p->平均值,p-& gt;訂單);

p = p-& gt;接下來;

}

printf("-\ n ");

printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * END * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n ");

}

/*查找記錄功能*/

無效搜索(學生*負責人)

{學生* p;/*移動指針*/

char s[5];/*用於存儲名稱的字符數組*/

clr SCR();

printf("請輸入搜索名稱。\ n ");

scanf("%s ",s);

p =頭部;/*將頭指針賦給p*/

while(strcmp(p-& gt;姓名和地址。& ampp!= NULL) /*當記錄的名稱不是您要查找的名稱,或者指針不為空時*/

p = p-& gt;接下來;/*將指針移動到下壹個節點*/

如果(p!=NULL) /*如果指針不為空*/

{ printf(" \ n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *);

printf("-\ n ");

printf(" | Num | Name | sc 1 | sc2 | sc3 | Sum | Ave | Order | \ n ");

printf("-\ n ");

printf(" | % 4s | % 4s | % 3d | % 3d | % 3d | % 3d | % 4.2f | %-5d | \ n ",

p->;num,p->姓名,p-& gt;得分[0],p-& gt;分數[1],p-& gt;分數[2],p-& gt;sum,p->平均值,p-& gt;訂單);

printf("-\ n ");

printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * END * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n ");

}

其他

printf(" \ n列表中沒有編號為%s的學生。\n”,s);/*顯示沒有學生*/

}

/*刪除記錄功能*/

學生*刪除(學生*頭)

{ int n;

學生*p1,* p2/*p1是指向要刪除的節點的指針,p2是其前任指針*/

char c,s[6];/*s[6]用於存儲學號,C用於輸入字母*/

clr SCR();

printf("請輸入刪除的編號:");

scanf("%s ",s);

p 1 = p2 =頭;/*將初始值頭指針分配給p1和p2 */

while(strcmp(p 1->;數字,s)和amp& ampp1!= NULL) /*當記錄的學號不是妳要找的,或者指針不為空*/

{ p2 = p 1;/*將p1的指針值賦給p2,作為p1的前任指針*/

p 1 = p 1->;接下來;/*將p1指針指向下壹條記錄*/

}

if(strcmp(p 1->;Num,s)==0) /*找到的學生編號*/

{ printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *找到了* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n ");

printf("-\ n ");

printf(" | Num | Name | sc 1 | sc2 | sc3 | Sum | Ave | Order | \ n ");

printf("-\ n ");

printf(" | % 4s | % 4s | % 3d | % 3d | % 3d | % 3d | % 4.2f | %-5d | \ n ",

p 1->;num,p 1->;名稱,p 1->;分數[0],p 1-& gt;分數[1],p 1->;score[2],p 1-& gt;sum,p1->平均值,p 1->;訂單);

printf("-\ n ");

printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * END * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n ");

printf("確定要刪除學生Y/N嗎?");/*提示是否刪除,輸入y刪除,輸入n退出*/

for(;;)

{scanf("%c ",& ampc);

if(c = = ' N ' | | c = = ' N ')break;/*如果不刪除,就會跳出這個循環*/

if(c=='y'||c=='Y ')

{

If(p 1 = = head)/* If p 1 = = head,被刪除的節點是第壹個節點*/

head = p 1->;接下來;/*給head第二個節點地址*/

其他

p2->;next = p 1->;接下來;/*否則,將下壹個節點地址分配給前壹個節點地址*/

n = n-1;

printf(" \ n共有%s名學生被刪除。\n”,s);

printf("別忘了保存。\ n ");打破;/*刪除然後跳出循環*/

}

}

}

其他

printf(" \ n列表中沒有編號為%s的學生。\n”,s);/*找不到節點*/

返回(頭);

}

/*排序功能*/

學生*排序(學生*頭)

{ int I = 0;/*保存排名*/

學生*p1,*p2,*t,* temp/*定義臨時指針*/

temp = head-& gt;接下來;/*將原表頭指針指向的下壹個節點作為頭指針*/

head->;next = NULL/*第壹個節點是新表的頭節點*/

while(temp!=NULL) /*當原始表不為空時排序*/

{

t =溫度;/*取原表的頭節點*/

temp = temp-& gt;接下來;/*原始頭節點的指針向後移動*/

p 1 =頭;/*設置移動指針p1,從頭指針開始*/

p2 =頭部;/*設置移動指針p2為p1的前身,初始值為頭指針*/

while(t->;平均& ltp 1->;平均& amp& ampp1!=NULL) /*比較平均分數*/

{

p2 = p 1;/*當排序點值較小時,新的表格指針將向後移動*/

p 1 = p 1->;接下來;

}

If(p1==p2) /*p1==p2,表示要排序的點的值大,應該排在第壹*/

{

t->;next = p 1;/*要排序的點的後繼者是p*/

head = t;/*新的頭節點是要排序的點*/

}

Else /*要排序的點要插在中間的p2和p1之間,如果P為空,就是尾部*/

{

t->;next = p 1;/*t後面是p1*/

p2->;next = t;/*p2後面跟著t*/

}

}

p 1 =頭;/*排序後的頭指針賦給p1,準備填排名*/

而(p1!=NULL) /*當p1不為空時,執行以下操作*/

{

i++;/*節點序列號*/

p 1->;order = I;/*將節點序列號分配給等級*/

p 1 = p 1->;接下來;/*指針向後移動*/

}

printf("排序成功。\ n ");/*排序成功*/

返回(頭);

}

/*插入記錄功能*/

學生*插入(學生*頭,學生*新)

{學生*p0,*p1,* p2

int n,sum1,I;

p 1 =頭;/*使p1指向第壹個節點*/

p0 =新;/*p0指向要插入的節點*/

請輸入壹個新記錄。\ n ");/*提示輸入記錄信息*/

printf("輸入編號:");

scanf("%s ",新-& gt;num);

printf("輸入姓名:");

scanf("%s ",新-& gt;姓名);

printf("請輸入%d分。\n ",3);

sum 1 = 0;/*保存新記錄的總分,初始值為0*/

for(I = 0;我& lt3;i++)

{

做{

printf("分數%d:",I+1);

scanf("%d ",& amp新建-& gt;score[I]);

if(新建-& gt;score[I]& gt;100 | |新->;score[I]& lt;0)

printf("數據錯誤,請重新輸入。\ n ");

}while(新-& gt;score[I]& gt;100 | |新->;score[I]& lt;0);

sum 1 = sum 1+new-& gt;得分[I];/*累加所有科目的分數*/

}

新建-& gt;sum = sum 1;/*將總分存儲在新記錄中*/

新建-& gt;平均值=(float)sum 1/3;

新建-& gt;順序= 0;

If(head==NULL) /*原鏈表為空表*/

{ head = p0P0->;next = NULL}/*將p0指向的節點作為頭節點*/

其他

{ while((P0-& gt;平均& ltp 1->;平均)& amp& amp(p 1->;下壹個!=NULL))

{ p2 = p 1;/*使p2指向p1剛剛指向的節點*/

p 1 = p 1->;接下來;/*p1向後移動壹個節點*/

}

如果(P0-& gt;平均值& gt= p 1->;平均)

{ if(head = = p 1)head = P0;/*在原始第壹個節點之前插入*/

否則p2-& gt;next = p0/*在p2指向的節點後插入*/

P0->;next = p 1;}

其他

{ p 1->;next = p0P0->;next = NULL}/*在最後壹個節點後插入*/

}

n = n+1;/*節點數加上1*/

head=sort(頭);/*調用排序函數對學生的成績重新排序*/

printf(" \ n已插入學生%s。\n ",新建-& gt;姓名);

printf("不要忘記保存新文件。\ n ");

返回(頭);

}

/*將數據保存到文件功能*/

作廢保存(學生*人頭)

{ FILE * fp/*定義指向文件的指針*/

學生* p;/*定義移動指針*/

char outfile[10];

printf("輸入輸出文件名,例如c:\ \ score \ n ");

scanf("%s ",outfile);

If ((FP = fopen (outfile," WB))= = null)/*以只寫模式打開二進制文件進行輸出*/

{

printf("無法打開文件\ n ");

返回;/*如果打不開,返回菜單*/

}

printf(" \ n保存文件......\ n ");

p =頭部;/*將指針從頭指針移開*/

而(p!=NULL) /*如果p不為空*/

{

fwrite(p,LEN,1,FP);/*寫記錄*/

p = p-& gt;接下來;/*指針向後移動*/

}

fclose(FP);/*關閉文件*/

printf("保存文件成功!\ n ");

}

/*從文件函數中讀取數據*/

學生*負荷()

{STUDENT *p1,*p2,* head = NULL/*定義記錄指針變量*/

FILE * fp/*定義指向文件的指針*/

char infile[10];

printf("輸入infile名稱,例如c:\ \ score \ n ");

scanf("%s ",infile);

If ((FP = fopen (infile," Rb))= = null)/*以只讀模式打開壹個二進制文件*/

{

printf("無法打開文件。\ n ");

返回(頭);

}

printf(" \ n正在加載文件!\ n ");

p1=(學生*)malloc(LEN);/*創建新模塊*/

如果(!p1)

{

printf("內存不足!\ n ");

返回(頭);

}

head = p 1;/*作為頭指針應用於空格*/

而(!Feof(fp)) /*循環讀取數據,直到文件結束*/

{

if(fread(p1,LEN,1,fp)!= 1)break;/*如果數據未被讀取,跳出循環*/

p 1->;next =(STUDENT *)malloc(LEN);/*為下壹個節點騰出空間*/

如果(!p 1->;下壹個)

{

printf("內存不足!\ n ");

返回(頭);

}

p2 = p 1;/*使p2指向p1剛剛指向的節點*/

p 1 = p 1->;接下來;/*指針向後移動,數據鏈接被重新讀入當前頁腳*/

}

p2->;next = NULL/*最後壹個節點的後繼指針為空*/

fclose(FP);

printf("妳已經成功從文件中讀取數據!\ n ");

返回(頭);

}