1. 程式人生 > >學生成績管理系統 C語言連結串列版本

學生成績管理系統 C語言連結串列版本

部落格搬家了,最近同時更新,沒準什麼時候就完全搬走了-_-
http://blog.just666.cn 這個是新部落格地址,希望大家多多關照

/*********************************************************
*程式描述:學生成績管理系統
*執行環境:Windows 7 SP1 X64
*開發環境:CodeBlocks with Win7
*作者:耗子、
*時間:2015.03
**********************************************************/

#include <stdio.h>
#include <stdlib.h> #include <string.h> #include <ctype.h> const int TRUE = 1; const int FALSE = 0; const char BACK[] = "back"; typedef struct Student //連結串列元素 { char name[100], number[100]; double chinese, math, english; struct Student* next; }LNode, *Student; //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓宣告函式↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓//
Student initLinkList();//初始化 void insLinkList(Student* pHead, char name[],//插入元素 char number[], double chinese, double math, double english); int delLinkList(Student* pHead, char number[]);//刪除元素 int listLength(Student* pHead);//獲取連結串列長度 int findLinkList(Student* pHead, char
number[]);//查詢元素,返回位置 int modLinkList(Student* pHead, char number[],//修改元素 double chinese, double math, double english); void outPutLinkList(Student* pHead);//輸出所有資訊 double scoreLegal(char score[]);//判斷分數合法 int nameLegal(char name[]);//判斷姓名合法 int numberLegal(char number[]);//判斷學號合法 int emptyLinkList(Student* pHead);//判斷連結串列是否為空 void swapNode(Student p, Student q);//負責交換 void putMain();//輸出主UI void putSort();//輸出排序UI int isBack(char str[]);//判斷返回 void error(char []);//錯誤警告 void welcome();//歡迎 void bay();//再見 //↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑宣告函式↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑// //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓主函式↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓// int main() { system("color 0A"); system("mode con cols=80 lines=25"); Student pHead; Student q, p; char name[100], number[100], chinese[100], math[100], english[100]; int op, n; //op是選擇的選項 double cn, ma, eng; int i, j, sum; pHead = initLinkList(); welcome(); while (1) { begin: q = pHead; putMain(); op = (getch() - '0' ); if (op == -1) continue; switch (op) { case 0://退出 { bay(); return 0; } case 1://新增資訊 { for (;;) { printf ("\n\t\t\t叫什麼?"); gets(name); if (isBack(name)) goto begin; if (nameLegal(name) == 0) continue; else break; } number: for (;;) { printf ("\t\t\t學號呢?"); gets(number); if (isBack(number)) goto begin; if (numberLegal(number) == 0) continue; else break; } while (q != NULL) { if (strcmp(q->number, number) == 0) { error("學號重複了噻~"); goto number; } else q = q->next; } for (;;) { printf ("\t\t\t語文多少分?\n\t\t\t"); gets(chinese); if (isBack(chinese)) goto begin; cn = scoreLegal(chinese); if (cn == -1) continue; else break; } for (;;) { printf ("\t\t\t數學呢?\n\t\t\t"); gets(math); if (isBack(math)) goto begin; ma = scoreLegal(math); if (ma == -1) continue; else break; } for (;;) { printf ("\t\t\tEnglish:\n\t\t\t"); gets(english); if (isBack(english)) goto begin; eng = scoreLegal(english); if (eng == -1) continue; else break; } insLinkList(pHead, name, number, cn, ma, eng); printf ("\n\t\t\t學生資訊新增完畢\a"); getch(); break; } case 2://刪除資訊 { for(;;) { if (emptyLinkList(pHead)) break; printf ("\t\t\t要刪除的學生的學號:"); gets(number); if (isBack(number)) goto begin; if (numberLegal(number) == 0) continue; if (delLinkList(pHead, number) == 1) { printf ("\t\t\t刪除成功!"); getch(); break; } else error ("沒有找到該學生!"); continue; } break; } case 3://查詢資訊 { if (emptyLinkList(pHead)) break; printf ("\n\t\t\t要查詢誰的資訊?"); gets(number); if (isBack(number)) goto begin; if (numberLegal(number) == 0) continue; findLinkList(pHead, number); break; } case 4://修改資訊 { if (emptyLinkList(pHead)) break; for (;;) { printf ("\n\t\t\t要修改哪個的資訊?"); gets(number); if (isBack(number)) goto begin; if (numberLegal(number) == 0) continue; else break; } for (;;) { if (strcmp(q->number, number) == 0) break; else q = q->next; if (q == NULL) { error("沒有找到該學生!"); getch(); goto begin; } } for (;;) { printf ("\t\t\t語文多少分?\n\t\t\t"); gets(chinese); if (isBack(chinese)) goto begin; cn = scoreLegal(chinese); if (cn == -1) continue; else break; } for (;;) { printf ("\t\t\t數學呢?\n\t\t\t"); gets(math); if (isBack(math)) goto begin; ma = scoreLegal(math); if (ma == -1) continue; else break; } for (;;) { printf ("\t\t\tEnglish:\n\t\t\t"); gets(english); if (isBack(english)) goto begin; eng = scoreLegal(english); if (eng == -1) continue; else break; } modLinkList(pHead, number, cn, ma, eng); break; } case 5://輸出資訊 { if (emptyLinkList(pHead)) break; q = pHead; p = pHead; sum = listLength(pHead); putSort(); op = (getch() - '0'); switch (op) { case 0://退出 goto begin; case 1://學號 { for (i = 0; i < sum - 1; i++) { for (j = 0; j < sum - i - 1; j++) { if (strcmp(p->number, q->number) > 0) swapNode(p, q); q = q->next; } p = p->next; q = p->next; } break; } case 2://語文 { for (i = 0; i < sum - 1; i++) { for (j = 0; j < sum - i - 1; j++) { if (q->chinese < p->chinese) swapNode(p, q); q = q->next; } p = p->next; q = p->next; } break; } case 3://數學 { for (i = 0; i < sum - 1; i++) { for (j = 0; j < sum - i - 1; j++) { if (q->math < p->math) swapNode(p, q); q = q->next; } p = p->next; q = p->next; } break; } case 4://英語 { for (i = 0; i < sum - 1; i++) { for (j = 0; j < sum - i - 1; j++) { if (q->english < p->english) swapNode(p, q); q = q->next; } p = p->next; q = p->next; } break; } case 5://總分 { for (i = 0; i < sum - 1; i++) { for (j = 0; j < sum - i - 1; j++) { if ((q->chinese + q->math + q->english) < (p->chinese + p->math + p->english)) swapNode(p, q); q = q->next; } p = p->next; q = p->next; } break; } default: break; } if (op >= 1 && op <= 5) outPutLinkList(pHead); break; default: break; } } } return 0; } //↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑主函式↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑// //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓連結串列操作↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓// Student initLinkList() //初始化 { Student pHead; pHead = (Student)malloc(sizeof(LNode)); pHead->next = NULL; return pHead; } void insLinkList(Student* pHead, char name[], //插入元素 char number[], double chinese, double math, double english) { Student p = pHead; Student pNew = (Student)malloc(sizeof(LNode)); while (p->next != NULL) p = p->next; strcpy(pNew->name, name); strcpy(pNew->number, number); pNew->chinese = chinese; pNew->math = math; pNew->english = english; pNew->next = NULL; p->next = pNew; return ; } int delLinkList(Student* pHead, char number[]) //刪除元素 { Student p = pHead, q; while (p->next != NULL) { if (strcmp(p->next->number, number) == 0) { q = p->next->next; free(p->next); p->next = q; free(q); return TRUE; } p = p->next; } return FALSE; } int listLength(Student* pHead) //獲得連結串列長度 { int n = 0; Student p = pHead; while (p != NULL) { p = p->next; n++; } return n; } int findLinkList(Student* pHead, char number[]) //查詢元素 { Student p = pHead; p = p->next; double sum; while (p != NULL) { if (strcmp(p->number, number) == 0) { system ("CLS"); sum = p->chinese + p->math + p->english; printf ("\n\n\t\t\t***********************\n\t\t\t* 該學生成 績如下表 *\n"); printf ("\t\t\t***********************\n"); printf ("\t\t\t* %s *\n", p->number); printf ("\t\t\t***********************\n"); printf ("\t\t\t* 姓名:%-8s *\n", p->name); printf ("\t\t\t* 語文:%-6.2f *\n", p->chinese); printf ("\t\t\t* 數學:%-6.2f *\n", p->math); printf ("\t\t\t* 英語:%-6.2f *\n", p->english); printf ("\t\t\t* 平均:%-7.2f *\n", sum / 3); printf ("\t\t\t* 總分:%-7.2f *\n", sum); printf ("\t\t\t***********************\n"); getch(); return TRUE; } p = p->next; } error("沒有該學生的資訊~"); return FALSE; } int modLinkList(Student* pHead, char number[], //修改元素 double chinese, double math, double english) { Student p = pHead; p = p->next; while (p != NULL) { if (strcmp(p->number, number) == 0) { p->chinese = chinese; p->math = math; p->english = english; return TRUE; } p = p->next; } return FALSE; } void outPutLinkList(Student* pHead) //輸出所有元素 { if (emptyLinkList(pHead)) return ; system ("CLS"); Student p = pHead; p = p->next; printf ("\n\n\t\t\t 所有學生成績如下\n"); printf ("\n *******************************************************************\n"); printf (" * 學 號 * 姓 名 * 語 文 * 數 學 * 英 語 * 總 分 *"); printf ("\n *******************************************************************\n"); while (p != NULL) { printf (" * %s *", p->number); printf (" %-8s *", p->name); printf (" % 6.2f * %6.2f * %6.2f *", p->chinese, p->math, p->english); printf (" %6.2f *\n", p->chinese + p->math + p->english); p = p->next; } printf (" *******************************************************************\n"); getch(); return ; } int emptyLinkList(Student* pHead) //連結串列為否為空 { Student p = pHead; if (p->next == NULL) { error("沒有任何學生資訊!"); return TRUE; } return FALSE; } void swapNode(Student p, Student q) //交換節點內容 { Student temp = initLinkList(); strcpy(temp->name, p->name); strcpy(p->name, q->name); strcpy(q->name, temp->name); strcpy(temp->number, p->number); strcpy(p->number, q->number); strcpy(q->number, temp->number); temp->chinese = p->chinese; p->chinese = q->chinese; q->chinese = temp->chinese; temp->math = p->math; p->math = q->math; q->math = temp->math; temp->english = p->english; p->english = q->english; q->english = temp->english; free(temp); } //↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑連結串列操作↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑// //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓函式定義↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓// int isBack(char ch[]) //判斷返回 { if(strcmp(ch, BACK) == 0) return TRUE; return FALSE; } int numberLegal(char number[]) //判斷學號 { int i; if (strlen(number) != 11)//位數判斷 { error("學號應為十一位純數字"); return FALSE; } for (i = 0; i < 11; i++) if ( ! isdigit(number[i]))//是否是數字 { error("學號應為十一位純數字"); return FALSE; } if (number[0] == 0)//學號首位 { error("學號第一位不能為0"); return FALSE; } return TRUE; } int nameLegal(char name[]) //判斷姓名 { int i, n = strlen(name); if (n <= 3) { error("科普:所謂姓名,一姓一名,最少得倆字兒"); return FALSE; } for (i = 0; i < n; i++) if (name[i] >= 0) { error("既然是中國人,名字當然也是中國字了啊"); return FALSE; } if (strlen(name) > 8) { error ("名字太長的話,請用縮寫"); return FALSE; } return TRUE; } double scoreLegal(char score[]) //判斷分數 { int n = strlen(score); int i, d = 0, g = 0; double q = 1, h = 0.1; double sum = 0; for (i = 0; i < n; i++) if (score[i] != '.' && (isdigit(score[i]) == 0)) { error("分數由數字和小數點組成。。。"); return -1; } for (i = 0; i < n; i++) if (score[i] == '.') { d = i; g++; if (g == 2) { error("小數點好多啊"); return -1; } } if (score[0] == '.' || score[n - 1] == '.') { error("小數點不能出現在這麼詭異的位置"); return -1; } if (g == 1) i = d - 1; else i = n - 1; for ( ; i != -1; i--) { sum = sum + (score[i] - '0') * q; q *= 10; } if (g == 1) { for (i = d + 1; i < n; i++) { sum = sum + (score[i] - '0') * h; h *= 0.1; } } if (sum > 100.000000) { error("分數略大啊~"); return -1; } return sum; } void error(char ch[]) //提示錯誤 { system ("color 0C"); printf ("\n\n\t\t\t"); puts(ch); printf ("\n"); printf ("\a"); getch(); system ("color 0A"); } void welcome() //歡迎 { system("title 學生成績管理系統V1.0 By-耗子、"); printf ("\n\n\n\n\t\t\t\t"); printf ("\n\t\t********************************************"); printf ("\n\t\t* 學生成績管理系統V1.0 *"); printf ("\n\t\t* *"); printf ("\n\t\t* 歡迎使用 *"); printf ("\n\t\t* *"); printf ("\n\t\t* 耗子、 *"); printf ("\n\t\t********************************************"); getch(); } void putMain() //主UI { system ("CLS"); system("title 學生成績管理系統V1.0 By-耗子、"); printf ("\n\n"); printf ("\t\t\t 學生成績管理系統V1.0\n"); printf ("\t\t\t************************\n"); printf ("\t\t\t* 1、新增資訊 *\n"); printf ("\t\t\t* *\n"); printf ("\t\t\t* 2、刪除資訊 *\n"); printf ("\t\t\t* *\n"); printf ("\t\t\t* 3、查詢資訊 *\n"); printf ("\t\t\t* *\n"); printf ("\t\t\t* 4、修改資訊 *\n"); printf ("\t\t\t* *\n"); printf ("\t\t\t* 5、顯示資訊 *\n"); printf ("\t\t\t* *\n"); printf ("\t\t\t* 0、退出系統 *\n"); printf ("\t\t\t************************\n"); printf ("\t\t\t請選擇:(0~5)"); } void putSort() //排序UI { system("title 請選擇排序方式 By-耗子、"); system("CLS"); printf ("\n\n"); printf ("\t\t\t 請選擇排序方式 \n"); printf ("\t\t\t************************\n"); printf ("\t\t\t* 1、學號排序 *\n"); printf ("\t\t\t* *\n"); printf ("\t\t\t* 2、語文成績 *\n"); printf ("\t\t\t* *\n"); printf ("\t\t\t* 3、數學成績 *\n"); printf ("\t\t\t* *\n"); printf ("\t\t\t* 4、英語成績 *\n"); printf ("\t\t\t* *\n"); printf ("\t\t\t* 5、總分排序 *\n"); printf ("\t\t\t* *\n"); printf ("\t\t\t* 0、系統選單 *\n"); printf ("\t\t\t************************\n"); printf ("\t\t\t請選擇:(0~5)"); } void bay() //退出 { system("title 謝謝使用 By-耗子、"); system ("CLS"); printf ("\n\n\n\n\t\t\t\t"); printf ("\n\t\t********************************************"); printf ("\n\t\t* *"); printf ("\n\t\t* *"); printf ("\n\t\t* 謝謝使用 *"); printf ("\n\t\t* *"); printf ("\n\t\t* *"); printf ("\n\t\t********************************************"); printf ("\n\n\n\t\n\t\t -By.耗子\n"); getch(); } //↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑函式定義↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑//