學生成績管理系統 C語言連結串列版本
阿新 • • 發佈:2019-01-25
部落格搬家了,最近同時更新,沒準什麼時候就完全搬走了-_-
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();
}
//↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑函式定義↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑//