目錄
6.源代碼
1.系統功能分析
1.1系統信息要求
1)學生基本信息如下:
學號、姓名、宿舍號、性別、年齡;
學號爲標準格式1234567890十位,其中前兩位代表學生入學年份,3-4位代表學生所在學院,5-6位代表學生所學專業、7-8位代表學生所在班級,9-10位代表學生在班級中的序號。
姓名最多爲4個漢字;
性別爲“男”或“女”;
年齡爲2位正整數
2)課程信息如下:
課程號、課程類別、課程所在學期、課程名稱、學分;
課程號爲標準課號。例如B08010100;
課程類別爲:選修/必修
所在學期用阿拉伯數字1-8代表
課程名稱爲專業爲2014版人才培養計劃中的課程名稱
3)學生成績信息如下:
學號、課程號、課程成績、是否重修
學號爲學生信息中的主關鍵字,可以唯一識別學生。課程號爲課程信息的主關鍵字,可以唯一識別課程。是否重修用於判斷課程成績是否是第一次考試取得。
4)綜合信息
學號、姓名、獲獎類別、獲獎時間、懲處類別、懲處時間、所獲學分、獎勵分值、懲罰分值。獎懲分起始值均爲0分。
1.2功能分析
1.2.1錄入部分
1)能實現學生信息的錄入、修改並保存;
2)能實現課程信息的錄入、修改並保存;
3)能分學期錄入品行表現成績(輔導員、班主任、班級評議)、修改並保存
4)能實現課程成績的錄入,並且在實現某課程成績錄入時,能夠自動按學號排好順序,並提示“某學號、某同學 某門功課成級”,例如“1508100201 丁兆元 C語言程序設計A成績”。
5)能錄入學生的各種獎懲信息
1.2.2修改部分
1)能對錄入的課程成績進行修改,例如成績錄錯、重考、重修原因引起的成績更改等。
2)能對個人信息進行修改
3)能對課程信息進行修改
4)能對學生獎懲信息進行修改
1.2.3統計分析部分
1)能對某門功課各分數段成績進行統計
2)能分學期對學生業務課程平均分按分數段進行統計
3)能統計任意一名同學每門功課的班級排名以及業務課成績總體排名
4)能以宿舍爲單位進行成績統計分析
5)能以掛科次數爲依據分學期對比分析
6)能以業務課班級排名爲依據分學期對比分析(前進或退步情況)
1.2.4排序部分
1)分學期按業務課程成績對學生由高到低排序,並顯示業務成績平均分。
2)分學期按不及格門次對學生由高到低排序,並顯示不及格門次。
3)分學期按不及格學生數對課程進行由高到低排序,並顯示課程名及不及格學生數。
4)能分學期以宿舍爲單位按成績由高到低進行排序,並顯示宿舍平均成績。
5)能隨時根據獎勵對學生進行由高到低排序並輸出信息。
6)能隨時根據懲罰情況對學生由低到高排序並輸出信息。
1.2.5獎學金自動評定
能根據學校獎學金評選辦法,分學期進行獎學金評定並顯示,並能夠將評選結果自動追加到學生的獎懲信息庫。
1.2.6數據的導入導出
基礎數據一次錄入永久存放,在需要時導入內存變量,如有修改重新導入文件,使永久保存的數據與臨時使用的數據保持一致性。
1.3獎學金評選標準
1.3.1獎學金評選資格。有下列情形之一者,不能獲得獎學金:
1)品行表現測評名次在班級70%以後者;
2)必修課或選修課有不及格者;
3)未達到《大學生體育鍛煉合格標準》者;
4)受警告以上處分者,半年或察看期內不得參加獎學金評選;
5)品行表現具有不宜獲得獎學金的其他情形者。
1.3.2綜合獎學金的評選
該獎項用於獎勵品學兼優、素質全面發展的優秀學生。
(1)獎勵等級、金額、比例爲:
特等獎2000元/人•年 3‰
一等獎1200元/人•年 3%
二等獎700元/人•年7%
三等獎400元/人•年15%
(2) 一、二、三等獎學金
以班級爲單位,根據綜合測評名次排列,列前35%名次者可參評獎學金。一、二、三等獎學金不全部評選的班級,可按學生數的3%、7%、15%的比例,只評選其中的一個等級。
1.4綜合成績計算標準
獎勵分值計算辦法,起始分值爲0分。
(1)獎學金計分:
獲得單項獎學金+1,三等獎學金+2,二等獎學金+3,一等獎學金+4,特等獎學金+5,校長獎學金+6。
(2)榮譽積分:
校級各種優秀個人+3,省級各種個人優秀+6,國家級各種優秀+12;
(3)學科競賽:
省級以上學科競賽成功參賽獎+1,省級三等獎+4、省二等獎+5、生一等獎+6,國家級三等獎+6、國家級二等獎+9、國家級一等獎+12,校級三等獎+1.校級二等獎+2,校級一等獎+3分。
(4)懲罰分值計算辦法,起始分值爲0分。
學院通報批評-1,校級警告-2,嚴重警告-3,記過-4,記大過-5,開除學籍留校察看-6。
2.系統設計
3.運行效果圖【界面太多,文章中只放兩個示例】
4.測試數據:
4.1 賬號、密碼
賬號:Headmaster
密碼:123456
4.2 輸入測試數據
(1)學生基本信息
存於“student.txt”文件。
(2)課程信息
存於“subject.txt”文件。
(3)課程成績信息
C語言程序設計:存於“C語言程序設計.txt”文件。
高等數學1:存於“高等數學_1.txt”文件。
大學英語1:存於“大學英語_1.txt”文件。
計算機導論:存於“計算機導論_1.txt”文件。
大學英語2:存於“大學英語_2.txt”文件。
離散數學:存於“離散數學_2.txt”文件。
(4)學生品行成績信息
存於“stCondSc.txt”文件。
(5)學生綜合信息
存於“cominfo.txt”文件。
5.文件說明:
6.下面附上源代碼
【運行前需要自行新建所需文件,必要時自己加上測試數據】
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <conio.h>
using namespace std;
//學生基本信息
struct student
{
int stage; //年齡
char stnum[12]; //學號
char stname[20]; //姓名
char stsex[6]; //性別
char dornum[10]; //宿舍號
struct student *next;
};
//課程信息
struct subject
{
char subNum[20]; //課程編號
char subName[30]; //課程名
char cate[20]; //課程類別(選修、必修)
int term; //課程所在學期
float credit; //學分
struct subject *next;
};
//學生成績信息
struct stscore
{
char stnum[12]; //學號
char subNum[20]; //課程編號
int mark; //課程成績
char repair[4]; //是否重修
int cnt = 0; //不及格門次
struct stscore *next;
};
//學生品行分信息
struct stCondSc
{
char stnum[12]; //學號
int coumark; //品行成績——輔導員
int headmark; //品行成績——班主任
int classsmark; //品行成績——班級
int conductmark; //品行分總分
struct stCondSc *next;
};
//學生綜合信息
struct cominfo
{
char stnum[12]; //學號
char stname[20]; //姓名
char awdlev[10]; //獲獎類別
int ayear, amon, aday; //獲獎時間
int amark; //獎勵分值
char puncate[10]; //懲處類別
int pyear, pmon, pday; //懲處時間
int pmark; //懲罰分值
int getcredit; //所獲學分
struct cominfo *next;
};
struct student *st;//學生基本信息
struct subject *sub;//課程信息
struct stscore *stsc;//學生成績信息
struct cominfo *coin;//學生綜合信息
struct stCondSc *stcosc; //學生品行成績信息
/* ***** 模塊函數 ********* */
void creat(); //信息錄入
void modify(); //信息修改
void ddelete(); //信息刪除
void countStatics(); //統計分析
void ssort(); //信息排序
/* ****** 信息錄入、修改、刪除 ********* */
struct student* creatStudent(); //錄入學生基本信息
struct subject* creatSubject(); //錄入課程信息
struct stscore* creatSubScore(); //錄入課程成績
struct cominfo* creatAwdPunScore(); //錄入綜合信息
struct stCondSc* creatConductScore(); //錄入學生品行成績信息
struct student* insertStudent(struct student *st); //添加學生基本信息
struct subject* insertSubject(struct subject *head); //添加課程基本信息
struct student * modifyStudent(); //修改學生基本信息
struct subject * modifySubject(); //修改課程信息
struct stscore * modifySubScore(); //修改課程成績信息
struct cominfo * modifyAwdPunScore(); //修改獎懲信息
struct stCondSc * modifyConductScore(); //修改品行成績信息
void deleteStudent(); //刪除學生基本信息
void deleteSubject(); //刪除課程信息
void deleteStScore(); //刪除課程成績信息
void deleteStCondSc(); //刪除品行成績信息
void deleteCominfo(); //刪除綜合信息
/* ******* 輸出查看 *************** */
void output(); //輸出信息
void outputStudent(); //輸出學生基本信息
void outputSubject(); //輸出課程信息
void outputStScore(); //輸出課程成績
void outputStCondSc(); //輸出學生品行分
void outputCominfo(); //輸出學生綜合信息
/* ***** 統計分析 ********* */
void countSubScore(); //某門課程按分數段成績統計
void countAveScore(); //業務課程平均分按分數段統計
void countStScore(); //統計任意一名同學每門功課的班級排名以及業務課成績總體排名
void countDorRank(); //以宿舍爲單位進行成績統計分析
void countFail(); //分學期統計掛科
void countChange(); //以業務課班級排名爲依據分學期對比分
void schoshipAsse(); //獎學金評定
/* ****** 排序 ********* */
void subStScoreSort(); //按課程成績(高->低)對學生排序
void failStcntSort(); //按掛科門次(高->低)對學生排序
void failSubSort(); //按不及格學生數對課程進行由高到低排序
void dorScoreSort(); //以宿舍爲單位按成績由高到低進行排序
void awdStSort(); //根據獎勵對學生進行由高到低排序
void punStScore(); //根據懲罰情況對學生由低到高排序
void fprintfStudent(struct student *head);//將學生信息寫入文件
struct student* loadStudent();//從文件中讀取學生信息
void fprintfsubject(struct subject *head);//將課程信息寫入文件
struct subject* loadSubject();//從文件中讀取課程信息
//主函數
int main()
{
int choice, n, y = 1;
char admname[20]="1", password[16]="1"; //用戶名,密碼
char an[20], pw[16];
char c;
int i;
while (y)
{
system("cls");
printf("\n\n\n\n\n\n\n");
printf(" ╔*☆***◎***◇***☆*** 歡迎光臨 ***☆***◇***◎***☆*╗\n");
printf(" *********************** 班主任管家系統 ************************\n\n");
printf("\n\n");
printf(" ============1-用戶登錄===========\n");
printf(" ============0-退出系統===========\n");
printf(" 請輸入您的選擇:");
scanf("%d", &n);
printf("\n");
getchar();
switch (n)
{
case 0: y = 0; break;
case 1:{
printf(" 請輸入您的用戶名:");
scanf("%s", an);
printf("\n");
printf(" 請輸入您的密碼:");
i = 0;
do
{
c = getch();
if (c == '\b')
{
printf("\b");
putchar('\0');
i--;
printf("\b");
}
else if (c != '\r')
{
printf("*");
pw[i] = c;
i++;
}
}while (c != '\r');
pw[i] = '\0';
printf("\n\n");
if (!(strcmp(admname,an)==0 && strcmp(password,pw)==0))
{
printf(" 驗證失敗,請重新輸入!\n");
getchar();
getchar();
}
else
{
printf(" 驗證通過!請按Enter鍵進入!\n");
getchar();
getchar();
int x = 1;
while (x)
{
system("cls");
printf(" ------------------\n");
printf(" *班主任管家系統*\n");
printf(" ------------------\n\n");
printf(" **********************************************\n\n");
printf(" **********************************************\n\n");
printf(" || 1-信息錄入 2-信息修改 ||\n\n");
printf(" || 3-信息查看 4-信息排序 ||\n\n");
printf(" || 5-統計分析 6-獎學金評定||\n\n");
printf(" || 7-信息刪除 0-退出系統 ||\n\n");
printf(" **********************************************\n\n");
printf(" **********************************************\n\n");
printf("請輸入所選擇的序號:");
scanf("%d",&choice);
system("cls");
switch (choice)
{
case 0: x = 0; break;
case 1: creat(); break;
case 2: modify(); break;
case 3: output(); break;
case 4: ssort(); break;
case 5: countStatics(); break;
case 6: schoshipAsse(); getchar(); getchar(); break;
case 7: ddelete(); break;
default :
printf(" 輸入錯誤,請重新輸入!\n");
getchar();
break;
}//switch
}//while(x)
}//else
}//case 1
break;
default :
printf(" 輸入錯誤,請重新輸入!\n");
getchar();
break;
}//switch(n)
}//while(y)
return 0;
}//main
//信息錄入
void creat()
{
st = (struct student *)malloc(sizeof(struct student));
sub = (struct subject *)malloc(sizeof(struct subject));
stsc = (struct stscore *)malloc(sizeof(struct stscore));
coin = (struct cominfo *)malloc(sizeof(struct cominfo));
stcosc = (struct stCondSc *)malloc(sizeof(struct stCondSc));
int choice, y = 1;
while (y)
{
system("cls");
printf(" ------------------\n");
printf(" *班主任管家系統*\n");
printf(" *信息錄入*\n");
printf(" ------------------\n\n");
printf(" ***********************************************\n\n");
printf(" ***********************************************\n\n");
printf(" || 1-學生基本信息錄入 2-課程信息錄入 ||\n\n");
printf(" || 3-課程成績錄入 4-綜合信息錄入 ||\n\n");
printf(" || 5-品行成績錄入 6-添加學生基本信息||\n\n");
printf(" || 7-添加課程信息 0-退出系統 ||\n\n");
printf(" ***********************************************\n\n");
printf(" ***********************************************\n\n");
printf("請輸入所選擇的序號:");
scanf("%d",&choice);
system("cls");
switch (choice)
{
case 0: y = 0; break;
case 1: st = creatStudent(); getchar(); break;
case 2: sub = creatSubject(); getchar(); break;
case 3: stsc = creatSubScore(); getchar(); break;
case 4: coin = creatAwdPunScore(); getchar(); break;
case 5: stcosc = creatConductScore(); getchar(); break;
case 6:
st = loadStudent();
st = insertStudent(st);
getchar();
break;
case 7:
sub = loadSubject();
sub = insertSubject(sub);
getchar();
break;
default:
printf(" 輸入錯誤,請重新輸入!\n");
getchar();
break;
}//switch(choice)
getchar();
}//while(y)
}//creat
//信息修改
void modify()
{
int choice, y = 1;
while (y)
{
system("cls");
printf(" ------------------\n");
printf(" *班主任管家系統*\n");
printf(" *信息修改*\n");
printf(" ------------------\n\n");
printf(" **********************************************\n\n");
printf(" **********************************************\n\n");
printf(" || 1-學生基本信息修改 2-課程信息修改 ||\n\n");
printf(" || 3-課程成績修改 4-品行成績修改 ||\n\n");
printf(" || 5-獎懲信息修改 0-退出系統 ||\n\n");
printf(" **********************************************\n\n");
printf(" **********************************************\n\n");
printf("請輸入所選擇的序號:");
scanf("%d",&choice);
system("cls");
switch (choice)
{
case 0: y = 0; break;
case 1: st = modifyStudent(); getchar(); break;
case 2: sub = modifySubject(); getchar(); break;
case 3: stsc = modifySubScore(); getchar(); break;
case 4: stcosc = modifyConductScore(); getchar(); break;
case 5: coin = modifyAwdPunScore(); getchar(); break;
default:
printf(" 輸入錯誤,請重新輸入!\n");
getchar();
break;
}//switch(choice)
getchar();
}//while(y)
}//modify
//信息輸出
void output()
{
int choice, y = 1;
while (y)
{
system("cls");
printf(" ------------------\n");
printf(" *班主任管家系統*\n");
printf(" *信息查看*\n");
printf(" ------------------\n\n");
printf(" **********************************************\n\n");
printf(" **********************************************\n\n");
printf(" || 1-查看學生基本信息 2-查看課程信息 ||\n\n");
printf(" || 3-查看學生品行成績 4-查看課程成績 ||\n\n");
printf(" || 5-查看學生綜合信息 0-退出系統 ||\n\n");
printf(" **********************************************\n\n");
printf(" **********************************************\n\n");
printf("請輸入所選擇的序號:");
scanf("%d",&choice);
system("cls");
switch (choice)
{
case 0: y = 0; break;
case 1: outputStudent(); getchar(); break;
case 2: outputSubject(); getchar(); break;
case 3: outputStCondSc(); getchar(); break;
case 4: outputStScore(); getchar(); break;
case 5: outputCominfo(); getchar(); break;
default:
printf(" 輸入錯誤,請重新輸入!\n");
getchar();
break;
}//switch(choice)
getchar();
}//while(y))
}//output
//統計分析
void countStatics()
{
int choice, y = 1;
while (y)
{
system("cls");
printf(" ------------------\n");
printf(" *班主任管家系統*\n");
printf(" *統計分析*\n");
printf(" ------------------\n\n");
printf(" ****************************************************\n\n");
printf(" ****************************************************\n\n");
printf(" || 1-課程分數段統計 2-課程平均分分數段統計 ||\n\n");
printf(" || 3-學生個人排名統計 4-宿舍成績統計分析 ||\n\n");
printf(" || 5-分學期掛科統計 6-學生進退分析 ||\n\n");
printf(" || 0-退出系統 ||\n\n");
printf(" ****************************************************\n\n");
printf(" ****************************************************\n\n");
printf("請輸入所選擇的序號:");
scanf("%d",&choice);
system("cls");
switch (choice)
{
case 0: y = 0; break;
case 1: countSubScore(); getchar(); break;
case 2: countAveScore(); getchar(); break;
case 3: countStScore(); getchar(); break;
case 4: countDorRank(); getchar(); break;
case 5: countFail(); getchar(); break;
case 6: countChange(); getchar(); break;
default:
printf(" 輸入錯誤,請重新輸入!\n");
getchar();
break;
}//switch(choice)
getchar();
}//while(y)
}
//信息排序
void ssort()
{
int choice, y = 1;
while (y)
{
system("cls");
printf(" ------------------\n");
printf(" *班主任管家系統*\n");
printf(" *信息排序*\n");
printf(" ------------------\n\n");
printf(" **************************************************\n\n");
printf(" **************************************************\n\n");
printf(" || 1-學生課程成績排序 2-學生掛科門次排序 ||\n\n");
printf(" || 3-課程掛科人次排序 4-宿舍成績排序 ||\n\n");
printf(" || 5-學生獎勵情況排序 6-學生懲處情況排序 ||\n\n");
printf(" || 0-退出系統 ||\n\n");
printf(" **************************************************\n\n");
printf(" **************************************************\n\n");
printf("請輸入所選擇的序號:");
scanf("%d",&choice);
getchar();
system("cls");
switch (choice)
{
case 0: y = 0; break;
case 1: subStScoreSort(); getchar(); break;
case 2: failStcntSort(); getchar(); break;
case 3: failSubSort(); getchar(); break;
case 4: dorScoreSort(); getchar(); break;
case 5: awdStSort(); getchar(); break;
case 6: punStScore(); getchar(); break;
default:
printf(" 輸入錯誤,請重新輸入!\n");
getchar();
break;
}//switch(choice)
}//while(y)
}//ssort
//信息刪除
void ddelete()
{
int choice, y = 1;
while (y)
{
system("cls");
printf(" ------------------\n");
printf(" *班主任管家系統*\n");
printf(" *信息刪除*\n");
printf(" ------------------\n\n");
printf(" **********************************************\n\n");
printf(" **********************************************\n\n");
printf(" || 1-學生基本信息刪除 2-課程信息刪除 ||\n\n");
printf(" || 3-課程成績刪除 4-品行成績刪除 ||\n\n");
printf(" || 5-綜合信息刪除 0-退出系統 ||\n\n");
printf(" **********************************************\n\n");
printf(" **********************************************\n\n");
printf("請輸入所選擇的序號:");
scanf("%d",&choice);
system("cls");
switch (choice)
{
case 0: y = 0; break;
case 1: deleteStudent(); getchar(); break;
case 2: deleteSubject(); getchar(); break;
case 3: deleteStScore(); getchar(); break;
case 4: deleteStCondSc(); getchar(); break;
case 5: deleteCominfo(); getchar(); break;
default:
printf(" 輸入錯誤,請重新輸入!\n");
getchar();
break;
}//switch(choice)
getchar();
}//while(y)
}//modify
//判斷學號是否已存在
//存在返回1,不存在返回0
int isNumExist(struct student *head, char *num)
{
struct student *q = head;
while (q != NULL)
{
if (strcmp(q ->stnum, num) == 0)
return 1;
q = q ->next;
}
return 0;
}
//將學生信息寫入文件
void fprintfStudent(struct student *head)
{
FILE *fp;
struct student *p;
if ((fp = fopen("student.txt", "w")) == NULL)
{
printf("Can't open the file!\n");
return ;
}
p = head;
while (p != NULL)
{
fprintf(fp, "%s\t%s\t%s\t%d\t%s\n", p ->stnum, p ->stname, p ->stsex, p ->stage, p ->dornum);
p = p ->next;
}
fclose(fp);
}//fprintfStudent
//從文件中讀取學生信息
struct student* loadStudent()
{
FILE *fp;
struct student *head, *tail, *p;
head = tail = NULL;
if ((fp = fopen("student.txt", "r")) == NULL)
{
printf("Can't open the file!\n");
exit(0);
}
while (!feof(fp))
{
p = (struct student *)malloc(sizeof(struct student));
fscanf(fp, "%s\t%s\t%s\t%d\t%s\n", p ->stnum, p ->stname, p ->stsex, &p ->stage, p ->dornum);
if (head == NULL)
head = p;
else
tail ->next = p;
tail = p;
}
tail ->next = NULL;
fclose(fp);
return head;
}//loadStudent
//錄入學生基本信息
struct student* creatStudent()
{
struct student *head, *tail, *p;
head = (struct student *)malloc(sizeof(struct student));
int age, key, y = 1;
char num[12], sex[6], dn[10], name[20];
char kk[3] = "0";
char ss1[5] = "男", ss2[5] = "女";
head = tail = NULL;
printf("請輸入學生信息,以學號0爲結束!\n");
while (y)
{
printf("\n");
do
{
printf("請輸入學生學號:");
scanf("%s", num);
if (strlen(num) != 10 && strcmp(kk, num) != 0)
{
printf("學號格式輸入錯誤,請重新輸入!\n");
key = 1;
}
else
{
key = isNumExist(head, num);
if (key == 1)
printf("該學號已存在,請重新輸入!\n");
if (strcmp(kk, num) == 0)
y = 0;
}
}while (key == 1);
if (y != 0)
{
printf("請輸入學生姓名:");
scanf("%s", name);
do
{
key = 1;
printf("請輸入學生性別:");
scanf("%s", sex);
if (strcmp(sex, ss1)==0 || strcmp(sex, ss2)==0)
key = 0;
else
printf("性別輸入錯誤,請重新輸入!\n");
}while(key == 1);
printf("請輸入學生年齡:");
scanf("%d", &age);
//getchar();
printf("請輸入學生宿舍號:");
scanf("%s", dn);
printf("是否要存儲該學生信息?\n");
printf(" 1-確定 0-取消\n");
int k;
scanf("%d", &k);
if (k == 1)
{
p = (struct student *)malloc(sizeof(struct student));
strcpy(p ->stname, name);
strcpy(p ->stnum, num);
strcpy(p ->stsex, sex);
strcpy(p ->dornum, dn);
p ->stage = age;
p ->next = NULL;
if(head == NULL)
head = p;
else
tail ->next = p;
tail = p;
}//if
}//if
}//while(y)
printf("是否要覆蓋原有信息,並將其存入文件?");
printf(" 1-確認 0-取消\n");
printf("請選擇:");
scanf("%d", &y);
if (y)
{
fprintfStudent(head);
printf("\n錄入學生基本信息成功!\n");
}
printf("\n **按Enter返回!");
return head;
}//creatStudent
//添加學生基本信息
struct student* insertStudent(struct student *head)
{
struct student *tail, *p;
int age, key, y = 1;
char num[12], sex[6], dn[6], name[20];
char kk[3] = "0";
tail = head;
while (tail!=NULL && tail ->next!=NULL)
{
tail = tail ->next;
}
printf("請輸入學生信息,以學號0爲結束!\n");
while (y)
{
printf("\n");
do
{
printf("請輸入學生學號:");
scanf("%s", num);
if (strlen(num) != 10 && strcmp(kk, num) != 0)
{
printf("學號格式輸入錯誤,請重新輸入!\n");
key = 1;
}
else
{
key = isNumExist(head, num);
if (key == 1)
printf("該學號已存在,請重新輸入!\n");
if (strcmp(kk, num) == 0)
y = 0;
}
}while (key == 1);
if (y != 0)
{
printf("請輸入學生姓名:");
scanf("%s", name);
printf("請輸入學生性別:");
scanf("%s", sex);
printf("請輸入學生年齡:");
scanf("%d", &age);
printf("請輸入學生宿舍號:");
scanf("%s", dn);
printf("是否要存儲該學生信息?\n");
printf(" 1-確定 0-取消\n");
int k;
scanf("%d", &k);
if (k == 1)
{
p = (struct student *)malloc(sizeof(struct student));
strcpy(p ->stname, name);
strcpy(p ->stnum, num);
strcpy(p ->stsex, sex);
strcpy(p ->dornum, dn);
p ->stage = age;
p ->next = NULL;
if(head == NULL)
head = p;
else
tail ->next = p;
tail = p;
}//if
}//if
}//while(y)
fprintfStudent(head);
printf("添加學生基本信息成功!\n");
printf("\n **按Enter返回!");
return head;
}//insertStudent
//判斷學號是否已存在
//存在返回1,不存在返回0
int isNumExist(struct subject *head, char *num)
{
struct subject *q = head;
while (q != NULL)
{
if (strcmp(q ->subNum, num) == 0)
return 1;
q = q ->next;
}
return 0;
}//isNumExist
//將課程信息寫入文件
void fprintfsubject(struct subject *head)
{
FILE *fp;
struct subject *p;
if ((fp = fopen("subject.txt", "w")) == NULL)
{
printf("Can't open the file!\n");
return ;
}
p = head;
while (p != NULL)
{
fprintf(fp, "%s\t%s\t%s\t%g\t%d\n", p ->subNum, p ->subName, p ->cate, p ->credit, p ->term);
p = p ->next;
}
fclose(fp);
}//fprintfsubject
//從文件中讀取課程信息
struct subject* loadSubject()
{
FILE *fp;
struct subject *head, *tail, *p;
head = tail = NULL;
if ((fp = fopen("subject.txt", "r")) == NULL)
{
printf("Can't open the file!\n");
exit(0);
}
while (!feof(fp))
{
p = (struct subject *)malloc(sizeof(struct subject));
fscanf(fp, "%s\t%s\t%s\t%g\t%d\n", p ->subNum, p ->subName, p ->cate, &p ->credit, &p ->term);
if (head == NULL)
head = p;
else
tail ->next = p;
tail = p;
}
tail ->next = NULL;
fclose(fp);
return head;
}//loadSubject
//錄入課程信息
struct subject* creatSubject()
{
struct subject *head, *tail, *p;
head = (struct subject *)malloc(sizeof(struct subject));
int key, y = 1;
char num[12], cate[6], name[20];
int term;
float credit;
char kk[3] = "0";
head = tail = NULL;
printf("請輸入課程信息,以編號0爲結束!\n");
while (y)
{
printf("\n");
do
{
printf("請輸入課程編號:");
scanf("%s", num);
key = isNumExist(head, num);
if (key == 1)
printf("該編號已存在,請重新輸入!\n");
if (strcmp(kk, num) == 0)
y = 0;
}while (key == 1);
if (y != 0)
{
printf("請輸入課程名稱:");
scanf("%s", name);
printf("請輸入課程類別:");
scanf("%s", cate);
printf("請輸入課程學分:");
scanf("%f", &credit);
printf("請輸入課程所在學期:");
scanf("%d", &term);
printf("是否要存儲該課程信息?\n");
printf(" 1-確定 0-取消\n");
int k;
scanf("%d", &k);
if (k == 1)
{
p = (struct subject *)malloc(sizeof(struct subject));
strcpy(p ->subName , name);
strcpy(p ->subNum, num);
strcpy(p ->cate, cate);
p ->term = term;
p ->credit = credit;
p ->next = NULL;
if(head == NULL)
head = p;
else
tail ->next = p;
tail = p;
}//if
}//if
}//while(y)
printf("是否要覆蓋原有信息,並將其存入文件?");
printf(" 1-確認 0-取消\n");
printf("請選擇:");
scanf("%d", &y);
if (y)
{
fprintfsubject(head);
printf("\n錄入課程信息成功!\n");
}
printf("\n **按Enter返回!");
return head;
}//creatsubject
//添加課程信息
struct subject* insertSubject(struct subject *head)
{
struct subject *tail, *p;
int key, y = 1;
char num[12], cate[6], name[20];
int term;
float credit;
char kk[3] = "0";
tail = head;
while (tail!=NULL && tail ->next!=NULL)
{
tail = tail ->next;
}
printf("請輸入課程信息,以編號0爲結束!\n");
while (y)
{
printf("\n");
do
{
printf("請輸入課程編號:");
scanf("%s", num);
key = isNumExist(head, num);
if (key == 1)
printf("該編號已存在,請重新輸入!\n");
if (strcmp(kk, num) == 0)
y = 0;
}while (key == 1);
if (y != 0)
{
printf("請輸入課程名稱:");
scanf("%s", name);
printf("請輸入課程類別:");
scanf("%s", cate);
printf("請輸入課程學分:");
scanf("%f", &credit);
printf("請輸入課程所在學期:");
scanf("%d", &term);
printf("是否要存儲該課程信息?\n");
printf(" 1-確定 0-取消\n");
int k;
scanf("%d", &k);
if (k == 1)
{
p = (struct subject *)malloc(sizeof(struct subject));
strcpy(p ->subName , name);
strcpy(p ->subNum, num);
strcpy(p ->cate, cate);
p ->term = term;
p ->credit = credit;
p ->next = NULL;
if(head == NULL)
head = p;
else
tail ->next = p;
tail = p;
}//if
}//if
}//while(y)
fprintfsubject(head);
printf("添加課程信息成功!\n");
printf("\n **按Enter返回!");
return head;
}//insertStudent
//判斷學號與成績是否已存在
//存在返回1,不存在返回0
int isNumExist(struct stscore *a, char *stnum, int n)
{
for (int i = 0; i < n; i++)
{
if (strcmp(a[i].stnum, stnum)==0)
return 1;
}
return 0;
}//isNumExist
//將課程成績寫入文件
void fprintfstscore(struct stscore *head, char *subname)
{
FILE *fp;
struct stscore *p;
if ((fp = fopen(subname, "w")) == NULL)
{
printf("Can't open the file!\n");
return ;
}
p = head;
while (p != NULL)
{
fprintf(fp, "%s\t%s\t%d\t%s\n", p ->stnum, p ->subNum, p ->mark, p ->repair);
p = p ->next;
}
fclose(fp);
}//fprintfstscore
//錄入課程成績
struct stscore * creatSubScore()
{
struct subject *head_sub, *r, *a[20];
struct stscore *head_sc, *p, *tail;
struct student *head_st, *q;
char term[3];
char subname[20];
int cnt;
int mark, k, t;
head_sc = (struct stscore *)malloc(sizeof(struct stscore));
head_st = loadStudent();
r = head_sub = loadSubject();
tail = head_sc;
printf("請輸入學期:");
scanf("%s", term);
t = 0 + term[0] - '0';
printf(" 第%d學期課程\n", t);
printf(" =========================\n");
cnt = 1;
while (r)
{
if (r ->term == t)
{
a[cnt] = r;
printf(" %d -- %s\n", cnt++, r ->subName);
}
r = r ->next;
}
printf(" 請選擇:");
scanf("%d", &t);
strcpy(subname, a[t] ->subName);
strcat(subname, "_");
strcat(subname, term);
strcat(subname, ".txt");
system("cls");
printf(" %s 課程成績錄入\n", a[t] ->subName);
printf(" =======================\n");
printf("請輸入對應學號的成績\n");
printf(" 學 號 成績\n");
q = head_st;
while (q)
{
p = (struct stscore *)malloc(sizeof(struct stscore));
tail ->next = p;
tail = p;
printf(" %s : ", q ->stnum);
strcpy(p ->stnum ,q ->stnum);
strcpy(p ->subNum, a[t] ->subNum);
do
{
k = 1;
scanf("%d", &mark);
if (mark < 0 || mark > 100)
{
printf("成績輸入錯誤,請重新輸入:");
k = 0;
}
}while (k == 0);
p ->mark = mark;
if (p ->mark < 60)
strcpy(p ->repair, "Y");
else
strcpy(p ->repair, "N");
q = q ->next;
}//while
tail ->next = NULL;
fprintfstscore(head_sc ->next, subname);
printf("\n錄入課程成績成功!\n");
printf("\n **按Enter返回!");
return head_sc;
}//creatSubScore
//判斷學號是否已存在
//存在返回1,不存在返回0
int isNumExist(struct stCondSc *head, char *stNum)
{
struct stCondSc *q = head;
while (q != NULL)
{
if (strcmp(q ->stnum, stNum) == 0)
return 1;
q = q ->next;
}
return 0;
}//isNumExist
//將學生品行成績信息寫入文件
void fprintfstCondSc(struct stCondSc *head)
{
FILE *fp;
struct stCondSc *p;
if ((fp = fopen("stCondSc.txt", "w")) == NULL)
{
printf("Can't open the file!\n");
return ;
}
p = head;
while (p != NULL)
{
fprintf(fp, "%s\t%d\t%d\t%d\t%d\n", p ->stnum, p ->coumark, p ->headmark, p ->classsmark, p ->conductmark);
p = p ->next;
}
fclose(fp);
}//fprintfstCondSc
//錄入學生品行成績信息
struct stCondSc* creatConductScore()
{
struct stCondSc *head, *tail, *p;
struct student *head_st, *q;
int mark, k;
head = (struct stCondSc*)malloc(sizeof(struct stCondSc));
q = head_st = loadStudent();
tail = head;
printf("請輸入學生品行成績信息\n");
while (q)
{
p = (struct stCondSc *)malloc(sizeof(struct stCondSc));
tail ->next = p;
tail = p;
printf("學號:%s\n", q ->stnum);
strcpy(p ->stnum ,q ->stnum);
printf("輔導員打分:");
do
{
k = 1;
scanf("%d", &mark);
if (mark < 0 || mark > 100)
{
printf("成績輸入錯誤,請重新輸入:");
k = 0;
}
}while (k == 0);
p ->coumark = mark;
printf("班主任打分:");
do
{
k = 1;
scanf("%d", &mark);
if (mark < -1 || mark > 100)
{
printf("成績輸入錯誤,請重新輸入:");
k = 0;
}
}while (k == 0);
p ->headmark = mark;
printf("班級打分:");
do
{
k = 1;
scanf("%d", &mark);
if (mark < 0 || mark > 100)
{
printf("成績輸入錯誤,請重新輸入:");
k = 0;
}
}while (k == 0);
p ->classsmark = mark;
p ->conductmark = p ->classsmark + p ->coumark + p ->headmark;
printf("\n");
q = q ->next;
}//while
fprintfstCondSc(head ->next);
printf("\n錄入品行成績成功!\n");
printf("\n **按Enter返回!");
return head;
}//creatConductScore
//判斷學號是否已存在
//存在返回1,不存在返回0
int isNumExist(struct cominfo *head, char *stNum)
{
struct cominfo *q = head;
while (q != NULL)
{
if (strcmp(q ->stnum, stNum) == 0)
return 1;
q = q ->next;
}
return 0;
}//isNumExist
//將學生綜合信息寫入文件
void fprintfStCominfo(struct cominfo *head)
{
FILE *fp;
struct cominfo *p;
if ((fp = fopen("cominfo.txt", "w")) == NULL)
{
printf("Can't open the file!\n");
return ;
}
p = head;
while (p != NULL)
{
fprintf(fp, "%s\t%s\t%d\n", p ->stnum, p ->stname, p ->getcredit);
fprintf(fp, "%s\t%d-%d-%d\t%d\n", p ->awdlev, p ->ayear, p ->amon, p ->aday, p ->amark);
fprintf(fp, "%s\t%d-%d-%d\t%d\n", p ->puncate, p ->pyear, p ->pmon, p ->pday, p ->pmark);
p = p ->next;
}
fclose(fp);
} //fprintfAwdPunScore
//錄入學生綜合信息
struct cominfo* creatAwdPunScore()
{
struct cominfo *head, *tail, *p;
struct student *head_st, *q;
int t;
head = (struct cominfo *)malloc(sizeof(struct cominfo));
tail = head;
q = head_st = loadStudent();
printf("請輸入學生綜合信息\n");
while (q)
{
p = (struct cominfo *)malloc(sizeof(struct cominfo));
tail ->next = p;
tail = p;
printf("學號:%s\n", q ->stnum);
printf("姓名:%s\n", q ->stname);
strcpy(p ->stnum, q ->stnum);
strcpy(p ->stname, q ->stname);
printf("是否有獎勵記錄:");
printf("1 - 是 0 - 否\n");
scanf("%d", &t);
if (t)
{
printf("請輸入獎勵類別:");
scanf("%s", p ->awdlev);
printf("請輸入獲獎時間(年 月 日):");
scanf("%d %d %d", &p ->ayear, &p ->amon, &p ->aday);
printf("請輸入獎勵分值:");
scanf("%d", &p ->amark);
}
else
{
strcpy(p ->awdlev, "無");
p ->aday = 0;
p ->amon = 0;
p ->aday = 0;
p ->amark = 0;
}
printf("是否有懲處記錄:");
printf("1 - 是 0 - 否\n");
scanf("%d", &t);
if(t)
{
printf("請輸入懲處類別:");
scanf("%s", p ->puncate);
printf("請輸入懲處時間:");
scanf("%d %d %d", &p ->pyear, &p ->amon, &p ->pday);
printf("請輸入懲罰分值:");
scanf("%d", &p ->pmark);
}
else
{
strcpy(p ->puncate, "無");
p ->pyear = 0;
p ->pmon = 0;
p ->pday = 0;
p ->pmark = 0;
}
printf("\n");
q = q ->next;
}//while
fprintfStCominfo(head ->next);
printf("錄入學生綜合信息成功!\n");
printf("\n **按Enter返回!");
return head;
}//creatAwdPunScore
//修改學生基本信息
struct student* modifyStudent()
{
char stnum[15];
char sex[6];
struct student* head, *p;
int key = 1, t;
char ss1[5] = "男", ss2[5] = "女";
printf("請輸入要修改學生的學號:");
do
{
scanf("%s", stnum);
if (strlen(stnum) != 10)
{
printf("學號格式輸入錯誤,請重新輸入!\n");
printf("請輸入學號:");
}
else
key = 0;
}while (key == 1);
head = loadStudent();
p = head;
while (p!=NULL && strcmp(p ->stnum,stnum)!=0)
{
p = p ->next;
}
if (p == NULL)
printf("未找到,修改失敗!\n");
else
{
printf("請輸入修改後的信息:\n");
printf("請輸入姓名:");
scanf("%s", p ->stname);
do
{
key = 1;
printf("請輸入性別:");
scanf("%s", sex);
if (strcmp(sex, ss1)==0 || strcmp(sex, ss2)==0)
key = 0;
else
printf("性別輸入錯誤,請重新輸入!\n");
}while(key == 1);
strcpy(p ->stsex, sex);
printf("請輸入年齡:");
scanf("%d", &p ->stage);
printf("請輸入宿舍號:");
scanf("%s", p ->dornum);
printf(" *確認修改?\n");
printf(" 1-確認 0-取消\n ");
scanf("%d", &t);
if (t)
{
fprintfStudent(head);
printf("修改成功!\n");
}
}//else
printf("\n **按Enter返回!");
return head;
}//modifyStudent
//修改課程信息
struct subject * modifySubject()
{
struct subject *head, *p;
char subnum[20];
printf("請輸入要修改課程的課程號:");
scanf("%s", subnum);
head = loadSubject();
p = head;
while (p!=NULL && strcmp(p ->subNum,subnum)!=0)
{
p = p ->next;
}
if (p != NULL)
{
printf("請輸入修改後的課程信息:\n");
printf("請輸入課程名稱:");
scanf("%s", p ->subName);
printf("請輸入課程類別:");
scanf("%s", p ->cate);
printf("請輸入課程學分:");
scanf("%f", &p ->credit);
printf("請輸入課程所在學期:");
scanf("%d", &p ->term);
fprintfsubject(head);
printf("修改成功!\n");
}//if
else
printf("未找到,修改失敗!\n");
printf("\n **按Enter返回!");
return head;
}//modifySubject
//從文件中讀取課程成績
struct stscore * loadStscore(char *modname)
{
FILE *fp;
struct stscore *head, *tail, *p;
head = tail = NULL;
if ((fp = fopen(modname, "r")) == NULL)
{
printf("Can't open the file!\n");
exit(0);
}
while (!feof(fp))
{
p = (struct stscore *)malloc(sizeof(struct subject));
fscanf(fp, "%s\t%s\t%d\t%s\n", p ->stnum, p ->subNum, &p ->mark, p ->repair);
if (head == NULL)
head = p;
else
tail ->next = p;
tail = p;
}//while
tail ->next = NULL;
fclose(fp);
return head;
}//loadSubject
//判斷學號是否存在
int isNumExist(struct stscore *head, char *num)
{
struct stscore *q = head;
while (q != NULL)
{
if (strcmp(q ->stnum , num) == 0)
return 1;
q = q ->next;
}
return 0;
}//isNumExist
//修改課程成績信息
struct stscore * modifySubScore()
{
struct stscore *head, *p;
struct subject *head_sub, *r, *a[10];
char subname[20], stnum[15];
int mark;
int t, cnt;
char term[3];
printf("請輸入學期:");
scanf("%s", term);
t = 0 + term[0] - '0';
r = head_sub = loadSubject();
printf(" 第%d學期課程\n", t);
printf(" =========================\n");
cnt = 1;
while (r)
{
if (r ->term == t)
{
a[cnt] = r;
printf(" %d -- %s\n", cnt++, r ->subName);
}
r = r ->next;
}
printf(" 請選擇:");
scanf("%d", &t);
strcpy(subname, a[t] ->subName);
strcat(subname, "_");
strcat(subname, term);
strcat(subname, ".txt");
system("cls");
printf("請輸入學號:");
scanf("%s", stnum);
head = loadStscore(subname);
p = head;
while (p!=NULL && strcmp(p ->stnum, stnum) != 0)
{
p = p ->next;
}
if (p != NULL)
{
printf("請輸入修改後的信息:\n");
printf("請輸入成績:");
scanf("%d", &mark);
while (mark>100 || mark < 0)
{
printf("成績格式錯誤,請重新輸入!\n");
printf("請輸入成績:");
scanf("%d", &mark);
}
p ->mark = mark;
if (p ->mark >= 60)
strcpy(p ->repair, "N");
else
strcpy(p ->repair, "Y");
fprintfstscore(head, subname);
printf("\n **修改成功!\n");
}//if
else
printf(" **未找到,修改失敗!\n");
printf("\n **按Enter返回!");
return head;
}//modifySubScore
//從文件中讀入學生品行信息
struct stCondSc * loadstCondSc()
{
FILE *fp;
struct stCondSc *head, *tail, *p;
head = tail = NULL;
if ((fp = fopen("stCondSc.txt", "r")) == NULL)
{
printf("Can't open the file!\n");
exit(0);
}
while (!feof(fp))
{
p = (struct stCondSc *)malloc(sizeof(struct stCondSc));
fscanf(fp, "%s\t%d\t%d\t%d\t%d\n", p ->stnum, &p ->coumark, &p ->headmark, &p ->classsmark, &p ->conductmark);
if (head == NULL)
head = p;
else
tail ->next = p;
tail = p;
}
tail ->next = NULL;
fclose(fp);
return head;
}//loadstCondSc
//修改品行成績信息
struct stCondSc * modifyConductScore()
{
char stnum[12];
struct stCondSc *head, *p;
int key;
printf("請輸入要修改學生的學號:");
do
{
scanf("%s", stnum);
if (strlen(stnum) != 10)
{
printf("學號格式輸入錯誤,請重新輸入!\n");
printf("請輸入學號:");
key = 1;
}
else
key = 0;
}while (key == 1);
p = head = loadstCondSc();
while (p!=NULL && strcmp(p ->stnum,stnum)!=0)
{
p = p ->next;
}
if (p == NULL)
printf("未找到,修改失敗!\n");
else
{
printf("請輸入修改後的信息:\n");
printf("輔導員打分:");
scanf("%d", &p ->coumark);
printf("班主任打分:");
scanf("%d", &p ->headmark);
printf("班級打分:");
scanf("%d", &p ->classsmark);
p ->conductmark = p ->classsmark + p ->coumark + p ->headmark;
fprintfstCondSc(head);
printf(" 修改成功!\n");
}//else
printf("\n **按Enter返回!\n");
return head;
}//modifyConductScore
//從文件中讀入學生品行信息
struct cominfo * loadstCominfo()
{
FILE *fp;
struct cominfo *head, *tail, *p;
head = tail = NULL;
if ((fp = fopen("cominfo.txt", "r")) == NULL)
{
printf("Can't open the file!\n");
exit(0);
}
while (!feof(fp))
{
p = (struct cominfo *)malloc(sizeof(struct cominfo));
fscanf(fp, "%s\t%s\t%d\n", p ->stnum, p ->stname, &p ->getcredit);
fscanf(fp, "%s\t%d-%d-%d\t%d\n", p ->awdlev, &p ->ayear, &p ->amon, &p ->aday, &p ->amark);
fscanf(fp, "%s\t%d-%d-%d\t%d\n", p ->puncate, &p ->pyear, &p ->pmon, &p ->pday, &p ->pmark);
if (head == NULL)
head = p;
else
tail ->next = p;
tail = p;
}//while
tail ->next = NULL;
fclose(fp);
return head;
}//loadstCominfo
//修改獎懲信息
struct cominfo * modifyAwdPunScore()
{
char stnum[12];
struct cominfo *head, *p;
int key;
printf("請輸入要修改學生的學號:");
do
{
scanf("%s", stnum);
if (strlen(stnum) != 10)
{
printf("學號格式輸入錯誤,請重新輸入!\n");
printf("請輸入學號:");
key = 1;
}
else
key = 0;
}while (key == 1);
p = head = loadstCominfo();
while (p!=NULL && strcmp(p ->stnum,stnum)!=0)
{
p = p ->next;
}
if (p == NULL)
printf("未找到,修改失敗!\n");
else
{
printf("請輸入修改後的信息:\n");
printf("是否有獎勵記錄:");
printf("1 - 是 0 - 否\n");
int t;
scanf("%d", &t);
if (t)
{
printf("請輸入獎勵類別:");
scanf("%s", p ->awdlev);
printf("請輸入獲獎時間(年 月 日):");
scanf("%d %d %d", &p ->ayear, &p ->amon, &p ->aday);
printf("請輸入獎勵分值:");
scanf("%d", &p ->amark);
}//if
else
{
strcpy(p ->awdlev, "無");
p ->ayear = 0;
p ->amon = 0;
p ->aday = 0;
p ->amark = 0;
}//else
printf("是否有懲處記錄:");
printf("1 - 是 0 - 否\n");
scanf("%d", &t);
if(t)
{
printf("請輸入懲處類別:");
scanf("%s", p ->puncate);
printf("請輸入懲處時間:");
scanf("%d %d %d", &p ->pyear, &p ->pmon, &p ->pday);
printf("請輸入懲罰分值:");
scanf("%d", &p ->pmark);
}//if
else
{
strcpy(p ->puncate, "無");
p ->pyear = 0;
p ->pmon = 0;
p ->pday = 0;
p ->pmark = 0;
}//else
p ->getcredit = p ->amark - p ->pmark;
fprintfStCominfo(head);
printf("\n **修改成功,按Enter返回!\n");
}//else
return head;
}//modifyAwdPunScore
//輸出學生基本信息
void outputStudent()
{
struct student *head, *p;
p = head = loadStudent();
printf("\n\n\t\t \t\t*****學生基本信息*****\n");
printf("\t\t ==============================================\n");
printf("\t\t 學 號\t 姓 名\t性別\t年齡\t宿舍號\n");
printf("\t\t ==============================================\n");
while (p)
{
printf("\t\t %s\t%s\t %s\t %d\t%s\n", p ->stnum, p ->stname, p ->stsex, p ->stage, p ->dornum);
p = p ->next;
}
printf("\t\t ==============================================\n");
printf("\n **按Enter返回!");
}//outputStudent
//輸出課程信息
void outputSubject()
{
struct subject *head, *p;
p = head = loadSubject();
printf("\n\n\t\t\t *******課 程 信 息*******\n");
printf("\t\t ============================================\n");
printf("\t\t 課程號 課程名\t類別\t學分\t學期\n");
printf("\t\t ============================================\n");
while (p)
{
printf("\t\t %s\t %s\t%s\t%g\t%d\n", p ->subNum, p ->subName, p ->cate, p ->credit, p ->term);
p = p ->next;
}
printf("\t\t ============================================\n");
printf("\n **按Enter返回!");
}//outputSubject
//輸出課程成績
void outputStScore()
{
struct stscore *head_sc, *p;
struct student *head_st, *q;
struct subject *head_sub, *r;
int term;
char t[3];
char subname[10][20], sn[10][20];
int cnt, k;
printf("請輸入學期:");
scanf("%d", &term);
t[0] = '0' + term - 0;
t[1] = '\0';
//查找該學期的所有課程
r = head_sub = loadSubject();
head_st = loadStudent();
cnt = 1;
while (r)
{
if (r ->term == term)
{
strcpy(sn[cnt], r ->subName);
strcat(sn[cnt], "_");
strcat(sn[cnt], t);
strcat(sn[cnt], ".txt");
strcpy(subname[cnt++], r ->subName);
}
r = r ->next;
}
//輸出該學期課程選擇
system("cls");
printf("\n\t\t\t\t ***課程成績查詢***\n");
printf(" \t\t\t =========================\n");
for (int i = 1; i < cnt; i++)
{
printf("\t\t\t\t%d ---- %s\n\n", i, subname[i]);
}
printf(" \t\t\t =========================\n");
printf("\t\t\t 請選擇:");
scanf("%d", &k);
//輸出課程成績
system("cls");
p = head_sc = loadStscore(sn[k]);
printf("\n\n\t\t *******課 程 成 績 信 息*******\n");
printf("\t\t ==============================================\n");
printf("\t\t **課程編號:%s\n", head_sc ->subNum);
printf("\t\t **課程名:%s\n", subname[k]);
printf("\t\t ==============================================\n");
printf("\t\t 學 號 \t姓名\t 成績\t 是否重修\n");
printf("\t\t ==============================================\n");
while (p)
{
printf("\t\t %s\t", p ->stnum);
q = head_st;
while (q)
{
if (strcmp(q->stnum, p ->stnum) == 0)
{
printf("%s", q ->stname);
break;
}
q = q ->next;
}
printf(" %d\t %s\n", p ->mark, p ->repair);
p = p ->next;
}//while
printf("\t\t ==============================================\n");
printf("\n **按Enter返回!");
}//outputStScore
//輸出學生品行分
void outputStCondSc()
{
struct stCondSc *head, *p;
struct student *head_st, *q;
p = head = loadstCondSc();
q = head_st = loadStudent();
printf("\n\n\t \t\t*******品 行 成 績 信 息*******\n");
printf("\t ================================================================\n");
printf("\t 學 號 \t姓 名\t 輔導員評分\t班主任評分\t班級評分\n");
printf("\t ================================================================\n");
while (p)
{
printf("\t %s\t", p ->stnum);
q = head_st;
while (q)
{
if (strcmp(q->stnum, p ->stnum) == 0)
{
printf("%s", q ->stname);
break;
}
q = q ->next;
}
printf(" %d\t\t %d\t\t %d\n", p ->coumark, p ->headmark, p ->classsmark);
p = p ->next;
}
printf("\t ================================================================\n");
printf("\n **按Enter返回!");
}//outputStCondSc
//輸出學生綜合信息
void outputCominfo()
{
struct cominfo *head, *p;
p = head = loadstCominfo();
printf(" \t\t*******學 生 綜 合 信 息*******\n");
printf(" =========================================================\n");
printf(" 學 號 \t姓名\t 綜合分\n");
printf(" \t\t獲獎類別 獎勵分值 獲獎日期\n");
printf(" \t\t懲處類別 懲罰分值 懲處日期\n");
printf(" ---------------------------------------------------------\n");
while (p)
{
printf(" %s\t%s\t %d\n", p ->stnum, p ->stname, p ->getcredit);
printf(" %s\t %d\t %d-%d-%d\n", p ->awdlev, p ->amark, p ->ayear, p ->amon, p ->aday);
printf(" %s\t %d\t %d-%d-%d\n", p ->puncate, p ->pmark, p ->pyear, p ->pmon, p ->pday);
printf(" ---------------------------------------------------------\n");
p = p ->next;
}
printf("\n **按Enter返回!");
}//outputCominfo
/* ***** 統計分析 ********* */
//某門課程按分數段成績統計
void countSubScore()
{
struct stscore *head_sc, *p;
struct student *head_st, *q;
struct subject *head_sub, *r;
// 總 90+ 75+ 60+
int cnt = 0, cn1 = 0, cn2 = 0, cn3 = 0, cn4 = 0;
struct stscore *c1[20], *c2[20], *c3[20], *c4[20];
float per;
int term, key;
char t[3];
char subname[10][20], sn[10][20];
int cntt, k;
printf("請輸入學期:");
scanf("%d", &term);
t[0] = '0' + term - 0;
t[1] = '\0';
//查找該學期的所有課程
r = head_sub = loadSubject();
//head_st = loadStudent();
cntt = 1;
while (r)
{
if (r ->term == term)
{
strcpy(sn[cntt], r ->subName);
strcat(sn[cntt], "_");
strcat(sn[cntt], t);
strcat(sn[cntt], ".txt");
strcpy(subname[cntt++], r ->subName);
}
r = r ->next;
}
//輸出該學期課程選擇
system("cls");
printf("\n\t\t\t\t ***課程成績查詢***\n");
printf(" \t\t\t =========================\n");
for (int i = 1; i < cntt; i++)
{
printf("\t\t\t\t%d ---- %s\n\n", i, subname[i]);
}
printf(" \t\t\t =========================\n");
printf("\t\t\t 請選擇:");
scanf("%d", &k);
p = head_sc = loadStscore(sn[k]);
while (p)
{
if (p ->mark >= 90)
c1[cn1++] = p;
else if (p ->mark >= 75)
c2[cn2++] = p;
else if (p ->mark >= 60)
c3[cn3++] = p;
else
c4[cn4++] = p;
cnt++;
p = p ->next;
}//while
per = (cn1+cn2+cn3) / float(cnt);
system("cls");
printf("\n\n\t\t **課程信息統計分析***\n\n");
printf("\t\t 課程名稱:%s\n", subname[k]);
printf("\t\t 及格率: %g%%\n", 100*per);
printf("\t\t ==========================\n");
printf("\t\t 分數段 人數\n");
printf("\t\t 90~100: %d\n", cn1);
printf("\t\t 75~89: %d\n", cn2);
printf("\t\t 60~74: %d\n", cn3);
printf("\t\t 0~59: %d\n", cn4);
printf("\t\t ==========================\n");
printf("\n\t\t是否要輸出各分數段學生?\n");
printf("\t\t 1 - 是 0 - 否\n");
printf("\t\t 請選擇:");
scanf("%d", &key);
if (key)
{
system("cls");
head_st = loadStudent();
printf("\n\t\t **各分數段學生**\n");
printf("\t\t===============================================\n");
printf("\t\t 學 號 \t姓名\t 成績\t 是否重修\n");
printf("\t\t===============================================\n");
printf("\t 90~100: \n");
for (int i = 0; i < cn1; i++)
{
printf("\t %s\t", c1[i] ->stnum);
q = head_st;
while (q)
{
if (strcmp(q ->stnum, c1[i] ->stnum) == 0)
{
printf("%s", q ->stname);
break;
}
q = q ->next;
}
printf(" %d\t", c1[i] ->mark);
printf(" %s\n", c1[i] ->repair);
}//for
printf("\t 75~89: \n");
for (int i = 0; i < cn2; i++)
{
printf("\t %s\t", c2[i] ->stnum);
q = head_st;
while (q)
{
if (strcmp(q ->stnum, c2[i] ->stnum) == 0)
{
printf("%s", q ->stname);
break;
}
q = q ->next;
}
printf(" %d\t", c2[i] ->mark);
printf(" %s\n", c2[i] ->repair);
}//for
printf("\t 60~74: \n");
for (int i = 0; i < cn3; i++)
{
printf("\t %s\t", c3[i] ->stnum);
q = head_st;
while (q)
{
if (strcmp(q ->stnum, c3[i] ->stnum) == 0)
{
printf("%s", q ->stname);
break;
}
q = q ->next;
}
printf(" %d\t", c3[i] ->mark);
printf(" %s\n", c3[i] ->repair);
}//for
printf("\t 0~59: \n");
for (int i = 0; i < cn4; i++)
{
printf("\t %s\t", c4[i] ->stnum);
q = head_st;
while (q)
{
if (strcmp(q ->stnum, c4[i] ->stnum) == 0)
{
printf("%s", q ->stname);
break;
}
q = q ->next;
}
printf(" %d\t", c4[i] ->mark);
printf(" %s\n", c4[i] ->repair);
}//for
}//if
printf("\t\t===============================================\n");
printf("\n\n統計分析完畢,按Enter返回!\n");
}//countSubScore
//業務課程平均分按分數段統計
void countAveScore()
{
struct stscore *head_sc, *p;
struct stscore *head_sc2, *q;
struct subject *head_sub, *r;
char subname[20][20], t[3];
// 總 90+ 75+ 60+
int cn1 = 0, cn2 = 0, cn3 = 0, cn4 = 0;
int term, cnt;
printf("請輸入學期:");
scanf("%d", &term);
t[0] = '0' + term - 0;
t[1] = '\0';
r = head_sub = loadSubject();
cnt = 0;
while (r)
{
if (r ->term == term)
{
strcpy(subname[cnt], r ->subName);
strcat(subname[cnt], "_");
strcat(subname[cnt], t);
strcat(subname[cnt], ".txt");
cnt++;
}
r = r ->next;
}//while
head_sc2 = loadStscore(subname[0]);
for (int i = 1; i < cnt; i++)
{
p = head_sc = loadStscore(subname[i]);
while (p)
{
q = head_sc2;
while (q && strcmp(p ->stnum, q ->stnum)!=0)
{
q = q ->next;
}
if (q)
q ->mark += p ->mark;
p = p ->next;
}
}//for
float sum;
p = head_sc2;
cnt--;
while (p)
{
sum = p ->mark / cnt;
if (sum >= 90)
cn1++;
else if (sum >= 75)
cn2++;
else if (sum >= 60)
cn3++;
else
cn4++;
p = p ->next;
}//while
printf("\n\n\t\t\t **各分數段人數**\n");
printf("\t\t\t =====================\n");
printf("\t\t\t 分數段 人數\n");
printf("\t\t\t =====================\n");
printf("\t\t\t 90~100: %d\n", cn1);
printf("\t\t\t 75~89: %d\n", cn2);
printf("\t\t\t 60~74: %d\n", cn3);
printf("\t\t\t 0~59: %d\n", cn4);
printf("\t\t\t =====================\n");
printf("\n\n **統計分析完畢,按Enter返回!\n");
}//countAveScore
//根據學號從小到大對成績進行排序
struct stscore * sortGrade(struct stscore *head)
{
struct stscore *head_new, *p, *r, *s, *t;
head_new = (struct stscore *)malloc(sizeof(struct stscore));
p = head;
head_new ->next = p;
p = p ->next;
head_new ->next ->next = NULL;
while (p)
{
t = p ->next;
r = head_new ->next;
s = head_new;
while (r!=NULL && strcmp(p ->stnum, r ->stnum)>0)
{
s = r;
r = r ->next;
}
s ->next = p;
p ->next = r;
p = t;
}
return head_new ->next;
}//sortGrade
//統計任意一名同學每門功課的班級排名以及業務課成績總體排名
void countStScore()
{
struct stscore *head_sc, *p, *q;
struct student *stu, *r;
struct subject *head_sub, *f;
int t, cnt, k;
char term[3];
char subname[10][20], sn[10][20];
printf("請輸入學期:");
scanf("%d", &t);
term[0] = '0' + t - 0;
term[1] = '\0';
//擇取相應學期課程
cnt = 1;
f = head_sub = loadSubject();
while (f)
{
if (f ->term == t)
{
strcpy(subname[cnt], f ->subName);
strcpy(sn[cnt], subname[cnt]);
strcat(subname[cnt], "_");
strcat(subname[cnt], term);
strcat(subname[cnt], ".txt");
cnt++;
}
f = f ->next;
}
//輸出課程
system("cls");
printf("\n\t\t\t\t ***成績排名統計***\n");
printf(" \t\t\t =========================\n");
for (int i = 1; i < cnt; i++)
{
printf("\t\t\t\t%d ---- %s\n\n", i, sn[i]);
}
printf(" \t\t\t =========================\n");
printf("\t\t\t 請選擇:");
scanf("%d", &k);
//統計排名
p = head_sc = loadStscore(subname[k]);
while (p)
{
p ->cnt = 1;
q = head_sc;
while (q)
{
if (q ->mark > p ->mark)
{
p ->cnt++;
}
q = q ->next;
}
p = p ->next;
}//while
system("cls");
printf("\n\n ***學生業務課程成績***\n");
printf(" 排名統計\n");
printf("\n 課程名:%s\n", sn[k]);
printf(" \t ==========================================\n");
printf(" \t\t 學 號 姓 名\t 排名\n");
printf(" \t ==========================================\n");
p = head_sc;
stu = loadStudent();
while (p)
{
printf("\t\t%s", p ->stnum);
r = stu;
while (r)
{
if (strcmp(r ->stnum, p ->stnum) == 0)
{
printf(" %s", r ->stname);
break;
}
r = r ->next;
}
printf("\t %d\n", p ->cnt);
p = p ->next;
}//while
printf(" \t ==========================================\n");
printf("\n**統計完畢,按Enter返回!");
}//countStScore
//以宿舍爲單位進行成績統計分析
void countDorRank()
{
struct student *head_st, *p;
struct subject *head_sub, *q;
struct stscore *head_sc[10], *f;
char dor_num[10];
char subname[10][20], sn[10][20];
int t, cnt;
char term[3];
printf("請輸入學期:");
scanf("%d", &t);
term[0] = '0' + t - 0;
term[1] = '\0';
q = head_sub = loadSubject();
cnt = 1;
while (q)
{
if (q ->term == t)
{
strcpy(sn[cnt], q ->subName);
strcpy(subname[cnt], sn[cnt]);
strcat(subname[cnt], "_");
strcat(subname[cnt], term);
strcat(subname[cnt], ".txt");
cnt++;
}
q = q ->next;
}//while
p = head_st = loadStudent();
for (int i = 1; i < cnt; i++)
head_sc[i] = loadStscore(subname[i]);
printf("請輸入宿舍號:");
scanf("%s", dor_num);
system("cls");
printf("\n *宿舍成員成績統計分析*\n");
printf("\n 宿舍號:%s\n", dor_num);
printf(" ========================================================================\n");
printf(" 學 號\t 姓 名\t ");
for (int i = 1; i < cnt; i++)
printf("%s ", sn[i]);
printf("\n");
printf(" ========================================================================\n");
while (p)
{
if (strcmp(p ->dornum, dor_num) == 0)
{
printf(" %s", p ->stnum);
printf(" %s", p ->stname);
for (int i = 1; i < cnt; i++)
{
f = head_sc[i];
while (f && strcmp(p ->stnum, f->stnum)!=0)
f = f ->next;
if (f)
printf("%11d", f ->mark);
else
printf(" 無");
}
printf("\n");
}//if
p = p ->next;
}//while
printf(" ========================================================================\n");
printf("\n**統計完畢,按Enter返回!");
}//countDorRank
//分學期統計掛科
void countFail()
{
struct student *head_st, *q;
struct subject *head_sub, *r;
struct stscore *head_sc[10], *p;
int t, cnt, tt;
char term[3];
char subname[10][20];
printf("請輸入學期:");
scanf("%d", &tt);
term[0] = '0' + tt - 0;
term[1] = '\0';
r = head_sub = loadSubject();
cnt = 1;
//選課程
while (r)
{
if (r ->term == tt)
{
strcpy(subname[cnt], r ->subName);
strcat(subname[cnt], "_");
strcat(subname[cnt], term);
strcat(subname[cnt], ".txt");
head_sc[cnt] = loadStscore(subname[cnt]);
cnt++;
}
r = r ->next;
}//while
q = head_st = loadStudent();
while (q)
{
q ->stage = 0;
for (int i = 1; i < cnt; i++)
{
p = head_sc[i];
while (p && strcmp(p ->stnum, q ->stnum)!=0)
p = p ->next;
if (p)
{
if (p ->mark < 60)
q ->stage++;
}
}//for
q = q ->next;
}//while
system("cls");
printf("\t\t **分學期統計掛科次數**\n");
printf("\n\t\t **學期:%d\n", tt);
printf("\t\t =========================================\n");
q = head_st;
t = 1;
printf("\t\t 序號 學 號\t\t 姓 名\t 掛科次數\n");
printf("\t\t =========================================\n");
while (q)
{
printf("\t\t%5d %s %s %d\n", t++, q ->stnum, q ->stname, q ->stage);
q = q ->next;
}
printf("\t\t =========================================\n");
printf("\n **統計輸出完成,按Enter返回!");
}//countFail
//以業務課班級排名爲依據分學期對比分
void countChange()
{
int cnt = 1;
struct stscore *head_sc1[10], *head_sc2[10], *p, *q;
struct student *head_st, *r;
struct subject *head_sub, *f;
char subname_1[10][20];
char subname_2[10][20];
int t1, t2, n1, n2;
char term1[3], term2[3];
printf("請輸入學期一:");
scanf("%d", &t1);
term1[0] = '0' + t1 - 0;
term1[1] = '\0';
printf("請輸入學期二:");
scanf("%d", &t2);
term2[0] = '0' + t2 - 0;
term2[1] = '\0';
n1 = 1;
f = head_sub = loadSubject();
while (f)
{
if (f ->term == t1)
{
strcpy(subname_1[n1], f ->subName);
strcat(subname_1[n1], "_");
strcat(subname_1[n1], term1);
strcat(subname_1[n1], ".txt");
head_sc1[n1] = loadStscore(subname_1[n1]);
n1++;
}
f = f ->next;
}//while
n2 = 1;
f = head_sub;
while (f)
{
if (f ->term == t2)
{
strcpy(subname_2[n2], f ->subName);
strcat(subname_2[n2], "_");
strcat(subname_2[n2], term2);
strcat(subname_2[n2], ".txt");
head_sc2[n2] = loadStscore(subname_2[n2]);
n2++;
}
f = f ->next;
}//while
//算成績
for (int i = 2; i < n1; i++)
{
p = head_sc1[1];
while (p)
{
q = head_sc1[i];
while (q)
{
if (strcmp(p ->stnum, q ->stnum) == 0)
{
p ->mark += q ->mark;
break;
}
q = q ->next;
}//while
p = p ->next;
}//while
}//for
for (int i = 2; i < n2; i++)
{
p = head_sc2[1];
while (p)
{
q = head_sc2[i];
while (q)
{
if (strcmp(p ->stnum, q ->stnum) == 0)
{
p ->mark += q ->mark;
break;
}
q = q ->next;
}//while
p = p ->next;
}//while
}//for
//統計名次
p = head_sc1[1];
while (p)
{
p ->cnt = 1;
q = head_sc1[1];
while (q)
{
if (q ->mark > p ->mark)
p ->cnt++;
q = q ->next;
}
p = p ->next;
}
p = head_sc2[1];
while (p)
{
p ->cnt = 1;
q = head_sc2[1];
while (q)
{
if (q ->mark > p ->mark)
p ->cnt++;
q = q ->next;
}
p = p ->next;
}
system("cls");
head_st = loadStudent();
printf("\n\n\t **學生成績排名統計**\n");
printf("\t ===========================================================\n");
printf("\t 序號 學 號\t\t 姓 名\t 第%d學期 第%d學期 排名變動\n", t1, t2);
printf("\t ===========================================================\n");
p = head_sc1[1];
while (p)
{
printf("\t%5d %s", cnt++, p ->stnum);
r = head_st;
while (r && strcmp(r ->stnum, p ->stnum)!=0)
{
r = r ->next;
}
if (r)
printf(" %s", r ->stname);
printf("%7d", p ->cnt);
q = head_sc2[1];
while (q)
{
if (strcmp(p ->stnum, q ->stnum) == 0)
{
printf("%9d", q ->cnt);
printf("%9d\n", p ->cnt - q ->cnt);
}
q = q ->next;
}
p = p ->next;
}//while
printf("\t ===========================================================\n");
printf("\n **統計輸出完成,按Enter返回!");
}//countChange
//按課程成績(高->低)對學生排序
void subStScoreSort()
{
struct stscore *head_new, *r, *s;
struct stscore *head, *p, *t;
struct subject *head_sub, *q;
char subname[10][20], sn[10][20];
int k, tt, cnt, key;
char term[3];
head_new = (struct stscore *)malloc(sizeof(struct stscore));
printf("請輸入課程學期:");
scanf("%d", &tt);
term[0] = '0' + tt - 0;
term[1] = '\0';
cnt = 1;
q = head_sub = loadSubject();
while (q)
{
if (q ->term == tt)
{
strcpy(subname[cnt], q ->subName);
strcpy(sn[cnt], subname[cnt]);
strcat(subname[cnt], "_");
strcat(subname[cnt], term);
strcat(subname[cnt], ".txt");
cnt++;
}
q = q ->next;
}
printf("\t\t\t**第%d學期課程**\n", tt);
printf("\t\t==================================\n");
for (int i = 1; i < cnt; i++)
printf("\t\t %d -- %s\n\n", i, sn[i]);
printf("\t\t==================================\n");
printf("\t\t 請選擇:");
scanf("%d", &key);
p = head = loadStscore(subname[key]);
head_new ->next = p;
p = p ->next;
head_new ->next ->next = NULL;
while (p)
{
t = p ->next;
r = head_new ->next;
s = head_new;
while (r!=NULL && p ->mark < r ->mark)
{
s = r;
r = r ->next;
}
s ->next = p;
p ->next = r;
p = t;
}
printf("\n\t\t是否輸出排序後成績信息?\n");
printf("\t\t 1 - 是 0 - 否\n");
printf("\n\t\t請選擇:");
scanf("%d", &k);
if (1 == k)
{
system("cls");
printf("\n\n\t\t **課程成績排序**\n\n");
printf("\n\t\t 課程名:%s\n", sn[key]);
printf("\t\t =========================================\n");
r = head_new ->next;
int num = 1;
printf("\t\t 名次 學 號\t成績 是否重修\n");
printf("\t\t =========================================\n");
while (r)
{
printf("\t\t %d\t%s\t%d\t %s\n", num++, r ->stnum, r ->mark, r ->repair);
r = r ->next;
}
printf("\t\t =========================================\n");
}//if
printf("\n **按Enter返回!");
getchar();
}//subStScoreSort
//按掛科門次(高->低)對學生排序
void failStcntSort()
{
struct stscore *head_new, *r, *s, *t;
struct subject *head_sub, *f;
struct stscore *head_sc1, *head_sc, *p, *q;
struct student *head_st, *u;
char subname[10][20];
int tt, cnt;
char term[3];
head_new = (struct stscore *)malloc(sizeof(struct stscore));
printf("請輸入學期:");
scanf("%d", &tt);
term[0] = '0' + tt - 0;
term[1] = '\0';
f = head_sub = loadSubject();
cnt = 1;
while (f)
{
if (f ->term == tt)
{
strcpy(subname[cnt], f ->subName);
strcpy(subname[cnt], f ->subName);
strcat(subname[cnt], "_");
strcat(subname[cnt], term);
strcat(subname[cnt], ".txt");
cnt++;
}
f = f ->next;
}//while
p = head_sc1 = loadStscore(subname[1]);
while (p)
{
p ->cnt = 0;
if (p ->mark < 60)
p ->cnt++;
p = p ->next;
}
for (int i = 2; i < cnt; i++)
{
p = head_sc1;
head_sc = loadStscore(subname[i]);
while (p)
{
q = head_sc;
while (q)
{
if (strcmp(p ->stnum, q ->stnum) == 0)
{
if (q ->mark < 60)
{
p ->cnt++;
break;
}
}
q = q ->next;
}//while
p = p ->next;
}//while
}//for
//排序
p = head_sc1;
head_new ->next = p;
p = p ->next;
head_new ->next ->next = NULL;
while (p)
{
t = p ->next;
r = head_new ->next;
s = head_new;
while (r!=NULL && p ->cnt < r ->cnt)
{
s = r;
r = r ->next;
}
s ->next = p;
p ->next = r;
p = t;
}
//輸出
system("cls");
head_st = loadStudent();
printf("\n\n\t\t\t **掛科信息統計排序**\n");
printf("\t\t============================================\n");
r = head_new ->next;
int num = 1;
printf("\t\t 名次 學 號\t姓 名 掛科次數\n");
printf("\t\t============================================\n");
while (r)
{
printf("\t\t %d\t%s\t", num++, r ->stnum);
u = head_st;
while (u)
{
if (strcmp(u ->stnum, r ->stnum) == 0)
printf("%s", u ->stname);
u = u ->next;
}
printf(" %d\n", r ->cnt);
r = r ->next;
}
printf("\t\t============================================\n");
getchar();
printf("\n **排序輸出完畢,按Enter返回!\n");
}//failStcntSort
struct
{
int a, b;
float per;
char subname[20];
char subnum[10];
}ssub[10];
//按不及格學生數對課程進行由高到低排序
void failSubSort()
{
struct stscore *head_sc, *p;
struct subject *head_sub, *f;
char subname[10][20], sn[10][20];
int t, cnt;
char term[3];
printf("請輸入學期:");
scanf("%d", &t);
term[0] = '0' + t - 0;
term[1] = '\0';
f = head_sub = loadSubject();
cnt = 1;
while (f)
{
if (f ->term == t)
{
strcpy(subname[cnt], f ->subName);
strcpy(sn[cnt], f ->subName);
strcat(subname[cnt], "_");
strcat(subname[cnt], term);
strcat(subname[cnt], ".txt");
cnt++;
}
f = f ->next;
}//while
for (int i = 1; i < cnt; i++)
{
ssub[i].b = 0;
ssub[i].a = 0;
p = head_sc = loadStscore(subname[i]);
strcpy(ssub[i].subname, sn[i]);
strcpy(ssub[i].subnum, p ->subNum);
while (p)
{
ssub[i].a++;
if (p ->mark < 60)
ssub[i].b++;
p = p ->next;
}
ssub[i].per =100 * (float)ssub[i].b / float(ssub[i].a);
}//for
for (int i = 1; i < cnt-1; i++)
{
for (int j = i+1; j < cnt; j++)
{
if (ssub[i].b < ssub[j].b)
{
ssub[3] = ssub[i];
ssub[i] = ssub[j];
ssub[j] = ssub[3];
}
}
}//for
system("cls");
printf("\n\n\t\t\t **第%d學期課程掛科率**\n", t);
printf("\t\t\t 統計排名\n");
printf("\t\t =================================================\n");
printf("\t\t 課程編號 課程名稱\t 掛科人數 掛科率\n");
printf("\t\t =================================================\n");
for (int i = 1; i < cnt; i++)
{
printf("\t\t%7s%19s%10d%10g%%\n", ssub[i].subnum, ssub[i].subname, ssub[i].b, ssub[i].per);
}
printf("\t\t =================================================\n");
printf("\n **排序輸出完畢,按Enter返回!\n");
getchar();
}//failSubSort
//根據成績從高到低學生進行排序
struct student * sortGrade(struct student *head)
{
struct student *head_new, *p, *r, *s, *t;
head_new = (struct student *)malloc(sizeof(struct student));
p = head;
head_new ->next = p;
p = p ->next;
head_new ->next ->next = NULL;
while (p)
{
t = p ->next;
r = head_new ->next;
s = head_new;
while (r!=NULL && p ->stage < r ->stage )
{
s = r;
r = r ->next;
}
s ->next = p;
p ->next = r;
p = t;
}
return head_new ->next;
}//sortGrade
//以宿舍爲單位按成績由高到低進行排序
void dorScoreSort()
{
struct student *head_st, *p;
struct student *head_st_dor, *r;
struct stscore *head_sub[10], *q;
struct subject *head, *f;
int t, m, tt, cnt;
float cont = 0;
char term[3];
char subname[10][20];
char dor[10];
printf("請輸入學期:");
scanf("%d", &tt);
term[0] = '0' + tt - 0;
term[1] = '\0';
printf("請輸入宿舍號:");
scanf("%s", dor);
cnt = 1;
f = head = loadSubject();
while (f)
{
if (f ->term == tt)
{
strcpy(subname[cnt], f ->subName);
strcat(subname[cnt], "_");
strcat(subname[cnt], term);
strcat(subname[cnt], ".txt");
head_sub[cnt] = loadStscore(subname[cnt]);
cnt++;
}
f = f ->next;
}//while
r = head_st_dor = (struct student *)malloc(sizeof(struct student));
p = head_st = loadStudent();
while (p)
{
if (strcmp(p ->dornum, dor) == 0)
{
r ->next = p;
r = p;
}
p = p ->next;
}//while
r ->next = NULL;
r = head_st_dor ->next;
t = 0;
while (r)
{
r ->stage = 0;
for (int i = 1; i < cnt; i++)
{
q = head_sub[i];
while (q)
{
if (strcmp(q ->stnum, r ->stnum) == 0)
r ->stage+= q ->mark;
q = q ->next;
}
}//for
t++;
r ->stage /= (cnt-1);
cont += r ->stage;
r = r ->next;
}//while
cont /= t;
system("cls");
printf("\n\t\t **宿舍成績排名**\n");
printf("\n\t\t **宿舍號:%s\n", dor);
printf("\t\t **宿舍平均成績:%g\n", cont);
printf("\t\t ====================================\n");
printf("\t\t 序號 學 號\t 姓 名\t 成績\n");
printf("\t\t ====================================\n");
r = head_st_dor ->next = sortGrade(head_st_dor ->next);
m = 1;
while (r)
{
printf("\t\t%5d %s %s%6d\n", m++, r ->stnum, r ->stname, r ->stage);
r = r ->next;
}
printf("\t\t ====================================\n");
printf("\n\n **排序輸出完畢,按Enter返回!");
getchar();
}//dorScoreSort
//根據成績從高到低學生進行排序
struct cominfo * sortGradeA(struct cominfo *head)
{
struct cominfo *head_new, *p, *r, *s, *t;
head_new = (struct cominfo *)malloc(sizeof(struct cominfo));
p = head;
head_new ->next = p;
p = p ->next;
head_new ->next ->next = NULL;
while (p)
{
t = p ->next;
r = head_new ->next;
s = head_new;
while (r!=NULL && p ->amark < r ->amark)
{
s = r;
r = r ->next;
}
s ->next = p;
p ->next = r;
p = t;
}
return head_new ->next;
}//sortGrade
//根據獎勵對學生進行由高到低排序
void awdStSort()
{
struct cominfo *head, *p;
int cnt = 1;
head = loadstCominfo();
p = head =sortGradeA(head);
printf("\n\t\t **學生獎勵信息排名**\n");
printf("\t\t ====================================\n");
printf("\t\t 序號 學 號\t 姓 名\t 成績\n");
printf("\t\t ====================================\n");
while (p)
{
printf("\t\t%5d %s %s%6d\n", cnt++, p ->stnum, p ->stname, p ->amark);
p = p ->next;
}
printf("\t\t ====================================\n");
printf("\n\n **排序輸出完畢,按Enter返回!");
}//awdStSort
//根據成績從高到低學生進行排序
struct cominfo * sortGradeP(struct cominfo *head)
{
struct cominfo *head_new, *p, *r, *s, *t;
head_new = (struct cominfo *)malloc(sizeof(struct cominfo));
p = head;
head_new ->next = p;
p = p ->next;
head_new ->next ->next = NULL;
while (p)
{
t = p ->next;
r = head_new ->next;
s = head_new;
while (r!=NULL && p ->pmark > r ->pmark)
{
s = r;
r = r ->next;
}
s ->next = p;
p ->next = r;
p = t;
}
return head_new ->next;
}//sortGrade
//根據懲罰情況對學生由低到高排序
void punStScore()
{
struct cominfo *head, *p;
int cnt = 1;
head = loadstCominfo();
p = head =sortGradeP(head);
printf("\n\t\t **學生懲處信息排名**\n");
printf("\t\t ====================================\n");
printf("\t\t 序號 學 號\t 姓 名\t 成績\n");
printf("\t\t ====================================\n");
while (p)
{
printf("\t\t%5d %s %s%6d\n", cnt++, p ->stnum, p ->stname, p ->pmark);
p = p ->next;
}
printf("\t\t ====================================\n");
printf("\n\n **排序輸出完畢,按Enter返回!");
}//punStScore
//根據品行分排序
struct stCondSc * SortStcondSc(struct stCondSc *head)
{
struct stCondSc *head_new, *p, *r, *s, *t;
head_new = (struct stCondSc *)malloc(sizeof(struct stCondSc));
p = head;
head_new ->next = p;
p = p ->next;
head_new ->next ->next = NULL;
while (p)
{
t = p ->next;
r = head_new ->next;
s = head_new;
while (r!=NULL && p ->conductmark < r ->conductmark)
{
s = r;
r = r ->next;
}
s ->next = p;
p ->next = r;
p = t;
}//while
return head_new ->next;
}//SortStcondSc
//獎學金評定
void schoshipAsse()
{
int tt;
char term[3];
int cnt, n, m;
struct subject *head, *f;//課程信息
struct cominfo *head_com, *q; //綜合信息
struct stscore *head_sub[10], *p; //課程成績
struct stCondSc *head_con, *r; //品行成績
struct student *head_st, *t; //基本信息
char subname[10][20];
head = loadSubject();
head_st = loadStudent();
head_con = loadstCondSc();
head_con = SortStcondSc(head_con);
printf("請輸入學期:");
scanf("%d", &tt);
term[0] = '0' + tt - 0;
term[1] = '\0';
f = head;
m = 0;
while (f)
{
if (f ->term == tt)
{
strcpy(subname[m], f ->subName);
strcat(subname[m], "_");
strcat(subname[m], term);
strcat(subname[m], ".txt");
head_sub[m] = loadStscore(subname[m]);
m++;
}
f = f ->next;
}//while
cnt = 0;
r = head_con;
while (r)
{
cnt++;
r ->conductmark = cnt;
r ->classsmark = 0;
r = r ->next;
}
//判斷品行分(前70%)
n = cnt * 0.7;
r = head_con;
while (r)
{
if (r ->conductmark > n)
r ->classsmark++;
r = r ->next;
}
//判斷掛科
r = head_con;
while (r)
{
if (r ->classsmark == 0)
{
for (int i = 1; i < m; i++)
{
if (r ->classsmark == 0)
{
int flag = 1;
p = head_sub[i];
while (p)
{
if (strcmp(r ->stnum, p ->stnum) == 0)
{
if (p ->mark < 60)
{
r ->classsmark++;
flag = 0;
break;
}
}
p = p ->next;
}//while
if (flag == 0)
break;
}//if
}//for
}//if
r = r ->next;
}//while
//判斷懲處情況
head_com = loadstCominfo();
r = head_con;
while (r)
{
if (r ->classsmark == 0)
{
q = head_com;
while (q)
{
if (strcmp(q ->stnum, r ->stnum) == 0)
if (q ->pmark < 0)
r ->classsmark++;
q = q ->next;
}
}//if
r = r ->next;
}//while
struct stCondSc *head_new, *s;
head_new = (struct stCondSc *)malloc(sizeof(struct stCondSc));
s = head_new;
r = head_con;
while (r)
{
if (r ->classsmark == 0)
{
s ->next = r;
s = r;
}
r = r ->next;
s ->next = NULL;
}//while
cnt = 1;
s = head_new ->next = SortStcondSc(head_new ->next);
while (s)
{
if (cnt > 6)
break;
else if (cnt == 4)
printf("\n\t\t ** 三等獎 **\n");
else if (cnt == 2)
printf("\n\t\t ** 二等獎 **\n");
else if (cnt == 1)
printf("\n\n\t\t ** 一等獎 **\n");
cnt++;
printf("\t\t %s", s ->stnum);
t = head_st;
while (t)
{
if (strcmp(t ->stnum, s ->stnum) == 0)
printf("\t %s\n", t ->stname);
t = t ->next;
}
s = s ->next;
}//while
printf("\n\n **獎學金評定完成,按Enter返回!\n");
}//schoshipAsse
//刪除學生基本信息
void deleteStudent()
{
char stnum[12];
struct student *head_st, *head, *p, *q;
head = (struct student *)malloc(sizeof(struct student));
head ->next = head_st = loadStudent();
printf("請輸入要刪除的學生的學號:");
scanf("%s", stnum);
p = head_st;
q = head;
while (p && strcmp(stnum, p ->stnum) != 0)
{
q = p;
p = p ->next;
}
if (p)
{
int key;
printf("\n 您要刪除的學生信息\n");
printf(" 學號:%s\n", p ->stnum);
printf(" 姓名:%s\n", p ->stname);
printf("\n **確定刪除?\n");
printf(" 1 - 確定 0 - 取消\n");
scanf("%d", &key);
if (key == 1)
{
q ->next = p ->next;
free(p);
printf("\n **刪除成功!");
fprintfStudent(head ->next);
}
}//if
else
printf("\n **未找到,刪除失敗!");
printf("\n **按Enter返回!");
}//deleteStudent
//刪除課程信息
void deleteSubject()
{
char subnum[12];
struct subject *head_sub, *head, *p, *q;
head = (struct subject *)malloc(sizeof(struct subject));
head ->next = head_sub = loadSubject();
printf("請輸入要刪除的課程的課程號:");
scanf("%s", subnum);
p = head_sub;
q = head;
while (p && strcmp(subnum, p ->subNum) != 0)
{
q = p;
p = p ->next;
}
if (p)
{
int key;
printf("\n 您要刪除的課程信息\n");
printf(" 課程號:%s\n", p ->subNum);
printf(" 課程名:%s\n", p ->subName);
printf("\n **確定刪除?\n");
printf(" 1 - 確定 0 - 取消\n");
scanf("%d", &key);
if (key == 1)
{
q ->next = p ->next;
free(p);
printf("\n **刪除成功!");
fprintfsubject(head ->next);
}
}//if
else
printf("\n **未找到,刪除失敗!");
printf("\n **按Enter返回!");
}//deleteSubject
//刪除課程成績信息
void deleteStScore()
{
int t, cnt;
char term[3];
char stnum[12], subname[20];
struct subject *head_sub, *r, *a[10];
struct stscore *head_stsc, *head, *p, *q;
head = (struct stscore *)malloc(sizeof(struct stscore));
printf("請輸入學期:");
scanf("%s", term);
t = 0 + term[0] - '0';
r = head_sub = loadSubject();
printf(" 第%d學期課程\n", t);
printf(" =========================\n");
cnt = 1;
while (r)
{
if (r ->term == t)
{
a[cnt] = r;
printf(" %d -- %s\n", cnt++, r ->subName);
}
r = r ->next;
}
printf(" 請選擇:");
scanf("%d", &t);
strcpy(subname, a[t] ->subName);
strcat(subname, "_");
strcat(subname, term);
strcat(subname, ".txt");
printf("請輸入要刪除成績的學生學號:");
scanf("%s", stnum);
head ->next = head_stsc = loadStscore(subname);
p = head_stsc;
q = head;
while (p && strcmp(stnum, p ->stnum) != 0)
{
q = p;
p = p ->next;
}
if (p)
{
int key;
printf("\n\n 您要刪除的信息\n");
printf(" 課程名:%s\n", a[t] ->subName);
printf(" 學號:%s\n", stnum);
printf("\n **確定刪除成績信息?\n");
printf(" 1 - 確定 0 - 取消\n");
scanf("%d", &key);
if (key == 1)
{
q ->next = p ->next;
free(p);
printf("\n **刪除成功!");
fprintfstscore(head ->next, subname);
}
}//if
else
printf("\n **未找到,刪除失敗!");
printf("\n **按Enter返回!");
}//deleteStScore
//刪除品行成績信息
void deleteStCondSc()
{
char stnum[12];
struct stCondSc *head_st, *head, *p, *q;
head = (struct stCondSc *)malloc(sizeof(struct stCondSc));
head ->next = head_st = loadstCondSc();
printf("請輸入要刪除的學生的學號:");
scanf("%s", stnum);
p = head_st;
q = head;
while (p && strcmp(stnum, p ->stnum) != 0)
{
q = p;
p = p ->next;
}
if (p)
{
int key;
printf("\n 您要刪除的學生信息\n");
printf(" 學號:%s\n", p ->stnum);
printf("\n **確定刪除?\n");
printf(" 1 - 確定 0 - 取消\n");
scanf("%d", &key);
if (key == 1)
{
q ->next = p ->next;
free(p);
printf("\n **刪除成功!");
fprintfstCondSc(head ->next);
}
}//if
else
printf("\n **未找到,刪除失敗!");
printf("\n **按Enter返回!");
}//deleteStCondSc
//刪除綜合信息
void deleteCominfo()
{
char stnum[12];
struct cominfo *head_st, *head, *p, *q;
head = (struct cominfo *)malloc(sizeof(struct cominfo));
head ->next = head_st = loadstCominfo();
printf("請輸入要刪除的學生的學號:");
scanf("%s", stnum);
p = head_st;
q = head;
while (p && strcmp(stnum, p ->stnum) != 0)
{
q = p;
p = p ->next;
}
if (p)
{
int key;
printf("\n 您要刪除的學生信息\n");
printf(" 學號:%s\n", p ->stnum);
printf(" 姓名:%s\n", p ->stname);
printf("\n **確定刪除?\n");
printf(" 1 - 確定 0 - 取消\n");
scanf("%d", &key);
if (key == 1)
{
q ->next = p ->next;
free(p);
printf("\n **刪除成功!");
fprintfStCominfo(head ->next);
}
}//if
else
printf("\n **未找到,刪除失敗!");
printf("\n **按Enter返回!");
}//deleteCominfo