當前位置:成語大全網 - 書法字典 - 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

}學生;

/*函數原型*/

STUDENT * init();/*初始化函數*/

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

STUDENT * create();/*創建鏈接列表*/

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

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

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

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

STUDENT * insert(STUDENT * head,STUDENT * new);/*插入記錄*/

void save(學生*頭像);/*保存文件*/

STUDENT * load();/*讀取文件*/

/*主功能界面*/

主()

{學生*頭像,新;

head = init();/*鏈表被初始化,因此head的值為空*/

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

{ switch(menu _ select())

{

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

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

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

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

情況5:head = sort(head);打破;

情況6:head = insert(head & amp;新);打破;/* & amp;新的意思是寄信人地址*/

案例七:救人(頭);打破;

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

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

}

}

}

/*初始化函數*/

學生*初始化()

{

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

}

/*菜單選擇功能*/

菜單選擇()

{ int n;

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

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

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

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

clrscr();/*清空屏幕*/

printf(“* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n“);

printf(“\ t \ t歡迎來到\ n“);

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

printf(“* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * n“);

printf(“\ t \ t \ t 1。輸入記錄\ 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“);/*退出*/

胡海紅制作。\ 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 & gt;9);/*如果所選項目不在1~9之間,請再次輸入*/

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

}

/*輸入功能*/

學生*創建()

{int i,s;

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

clrscr();

for(;;)

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

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

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

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

}

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

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

if(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】);

if(p-》;得分【I】& lt;0 | | p-》;score【I】& gt;100)/*確保分數在0到100之間*/

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

} while(p-& gt;得分【I】& lt;0 | | p-》;score【I】& gt;100);

s = s+p-& gt;score【I】;/*累加所有科目的分數*/

}

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

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

p-》;order = 0;/*排序前該值為0 */

p-》;next = head/*將首節點作為新輸入節點的後繼節點*/

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

}

返回(頭);

}

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

無效打印(學生*頭像)

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

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

clrscr();

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

printf(“\ n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n“);

printf(“-\ n“);

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

printf(“-\ n“);

而(p!=NULL)

{

i++;

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

我,p-》;num,p-》;名稱,p-& gt;得分【0】,p-》;分數【1】,p-》;score【2】,p-》;sum,p-》;平均值,p-》;訂單);

p = p-& gt;接下來;

}

printf(“-\ n“);

printf(“* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n“);

}

/*查找記錄功能*/

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

{ STUDENT * p;/*移動指針*/

char s【5】;/*用於存儲姓名的字符數組*/

clrscr();

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

scanf(“% s“,s);

p =頭部;/*將頭指針分配給p*/

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

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

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

{ printf(“\ n * * * * * * * *找到了* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ 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-》;分數【1】,p-》;score【2】,p-》;sum,p-》;平均值,p-》;訂單);

printf(“-\ n“);

printf(“* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n“);

}

其他

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

}

/*刪除記錄功能*/

學生*刪除(學生*頭)

{ int n;

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

char c,s【6】;/* s【6】用於存儲學生編號,C用於輸入字母*/

clrscr();

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

scanf(“% s“,s);

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

while(strcmp(p 1-》;數字(s)和& 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-& gt;分數【0】,p 1-》;score【1】,p 1-》;score【2】,p 1-》;sum,p 1-》;平均值,p 1-》;訂單);

printf(“-\ n“);

printf(“* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ 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-& gt;接下來;/*否則,將下壹個節點地址分配給前壹個節點地址*/

n = n-1;

printf(“\ nNum % s學生已被刪除。\n“,s);

printf(“不要忘記保存。\ n ");打破;/*刪除然後跳出循環*/

}

}

}

其他

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

返回(頭);

}

/*排序功能*/

學生*排序(學生*頭)

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

STUDENT *p1、*p2、*t、* temp/*定義臨時指針*/

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

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

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

{

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

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

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

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

while(t-》;平均& ltp 1-》;平均值和平均值。& ampp1!= NULL)/*比較平均分數*/

{

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

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

}

if(p 1 = = p2)/* p 1 = = 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 = head;/*排序後的頭指針賦給p1,準備填寫排名*/

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

{

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

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

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

}

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

返回(頭);

}

/*插入記錄功能*/

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

{STUDENT *p0、*p1、* p2

int n,sum1,I;

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

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

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

printf(“輸入編號:“);

scanf(“% s“,new-& gt;num);

printf(“輸入名稱:“);

scanf(“% s“,new-& 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 | |新-》;得分【I】& lt;0)

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

}while(新-& gt;score【I】& gt;100 | |新-》;得分【I】& lt;0);

sum 1 = sum 1+new-& gt;score【I】;/*累加所有科目的分數*/

}

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

新-& gt;average =(float)sum 1/3;

新-& gt;order = 0;

if(head = = NULL)/*原始鏈表是壹個空表*/

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

其他

{ while((P0-》;平均& ltp 1-》;平均)和amp& amp(p 1-》;下壹個!=空)

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

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

}

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

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

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

P0-》;next = p 1;}

其他

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

}

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

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

printf(“已插入學生%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 ");

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

如果(!p1)

{

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

返回(頭);

}

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

而(!feof(FP))/*循環讀取數據直到文件結束*/

{

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

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

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

{

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

返回(頭);

}

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

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

}

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

fclose(FP);

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

返回(頭);

}