、
目錄
搭建offer.h文件
搭建offer.c中的main函數
密碼登入系統
搭建my_oferr.c中的接口函數?
使用幫助菜單接口函數
增加學生信息接口函數?
查詢學生信息接口函數
刪除學生信息接口函數?
保存學生信息接口?
打開文件fopen
關閉文件fclose
?判斷是否保存文件fwrite
退出執行文件exit
顯示學生信息接口函數
?修改學生信息接口函數
?學生排名信息接口函數
--------------------------------------
----------------?
每次歸程,都是為了更好出發;
每次停歇,都是為了積攢力量?。
最近大家C語言是不是都進入了實訓階段呢?
還在為寫不出代碼而苦惱嗎?
接下來我將帶領大家一起完成!
C語言的一個簡單項目-學生管理系統!
主要運用了數組和指針函數
關于鏈表的搭建后續會更新
題目:學生管理系統
學生數據由學號、姓名、性別、年齡、三門課(C語言、高數、大物)的成績構成?實現功能包括:
(1)密碼登入
(2)使用提示
(3)信息錄入
(4)查詢信息
(5)刪除信息
(6)保存信息
(7)顯示信息(8)修改信息
(9)成績排名
對于這種代碼量超百位數的,大家最好養成分模塊寫代碼的習慣:
我創建了一個.h文件和兩個.c 文件,.h一般放頭文件和結構體類型,.c文件一個設置主函數main,一個完善相應的函數接口。這樣分工明確,不會混亂,可以提高敲代碼的效率哦~
首先明白我們要實現的項目功能:密碼登入系統、使用幫助菜單、增加學生信息、查詢學生信息、刪除學生信息、保存當前信息、顯示當前信息、修改學生信息、學生成績排名
搭建offer.h文件
因為學生有以下幾個基本信息:姓名、年齡、學號、性別,依次由name、age、id和sex來表示,所以可以通過結構體實現,struct語句定義存儲不同類型的數據項,定義一個結構體數組Stu,用于存儲每個學生的信息
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void TiShi(); //提示功能
void StuXinXi(); //增加信息
void ChaZhao(); //查找信息
void ShanGai(); //刪改信息
void BaoCun(); //保存信息
void XianShi(); //顯示信息
void XiuGai(); //修改信息
void PaiMing(); //學生排名
#define N 20
#define Number sizeof(struct Student)//求結構體的大小
//創建結構體包含學生信息
struct Student
{char Stuid[N]; //學號char Stuname[N]; //名字int Stuage; //年齡char Stusex[N]; //性別double score[3]; //成績
}Stu[Number];
//枚舉體美化選項
enum menu2
{Quit = 0,Resume = 1
};
enum ChaZhao
{CaoZuo1 = 1,CaoZuo2 = 2,CaoZuo3 = 3
};
1.這里最好定義一個宏#define不然以后修改將會很麻煩
2.枚舉體美化選項在我之前的博客講過,提高代碼的可讀性
3.剩下的就是頭文件的引入和函數的聲明以及結構體的創建
搭建offer.c中的main函數
?要使用我們在offer.h中設置的頭文件要在offer.c中加上#include"offer.h"
#include"offer.h"
?整體的框架如下:
#include"offer.h"
int sum = 1;
int main()
{int i = 0;int input = 0, count = 0;char mima[20] = "123";//登入的密碼char shuru[20];system("color F4");printf("\t\t\t **************************************\n");printf("\t\t\t | *歡迎使用學生管理系統* |\n");printf("\t\t\t | *管理員: 小唐* |\n");printf("\t\t\t ------------------------------------\n");printf("請輸入管理員密碼:\n");while ((count = _getch()) != '\r') {if (count == '\b'){i--;printf("\b \b");}else{shuru[i++] = count;printf("*");}}shuru[i++] = '\0'; //getch賦值的是單個字符,所以為了比較兩個字符串的大小要給shuru數組后面添加'\0'if (strcmp(mima, shuru) == 0){printf("\n密碼正確,您已進入系統!\n");}else{printf("\n密碼錯誤,請重新輸入!\n");return 0;}system("pause");system("cls");do{menu2();printf("請選擇繼續還是結束操作:\n");scanf("%d", &sum);switch (sum){case Quit:system("cls");//清除屏幕printf("您已退出學生管理系統!\n");break;case Resume:menu1();void(*p[9])() = { NULL,TiShi,StuXinXi,ChaZhao,ShanGai,BaoCun,XianShi,XiuGai,PaiMing };//指針數組函數printf("請輸入你要進行的操作\n");scanf("%d", &input);system("cls");(*p[input])();break;default:printf("輸入錯誤,重新輸入!\n");break;}} while (sum);return 0;
}
接下來我將帶領大家解讀以上代碼
密碼登入系統
在進入學生管理系統之前,我設置了一個小型的系統密碼登入界面來判斷是進入還是退出
int count = 0;char mima[20] = "123";//登入的密碼char shuru[20];system("color F4");printf("\t\t\t **************************************\n");printf("\t\t\t | *歡迎使用學生管理系統* |\n");printf("\t\t\t | *管理員: 小唐* |\n");printf("\t\t\t ------------------------------------\n");printf("請輸入管理員密碼:\n");while ((count = _getch()) != '\r') {if (count == '\b'){i--;printf("\b \b");}else{shuru[i++] = count;printf("*");}}shuru[i++] = '\0'; //getch賦值的是單個字符,所以為了比較兩個字符串的大小要給shuru數組后面添加'\0'if (strcmp(mima, shuru) == 0){printf("\n密碼正確,您已進入系統!\n");}else{printf("\n密碼錯誤,請重新輸入!\n");return 0;}
1.我們這里利用了while去進行getch輸入,getch輸入單個字符是不會顯示信息的,但我們按下回車鍵輸入結束,循環停止
2.' \r '就是回車鍵的意思,而' \b '就是刪除鍵的意思
3.每循環一次就輸入一個字符count賦值給數組shuru,并打印" * "
4.getch賦值的是單個字符,所以為了比較兩個字符串的大小要給shuru數組后面添加' \0 '
5.strcmp是比較兩個字符串的大小,詳細可以看我之前的博客
以上就是我們密碼登入系統的全部內容
接下來我將講解接下來的代碼實現
?menu2()的作用就是選擇繼續操作還是退出系統
void menu2()
{system("color F4");printf("\t\t\t*********************\n");printf("\t\t\t*********************\n");printf("\t\t\t-------1.Resume------\n");printf("\t\t\t-------0.Quit--------\n");printf("\t\t\t*********************\n");
}
1.system("cls")-清屏函數,會將顯示過的內容清空,被#include<stdlib.h>包含
2.system("color F4");是改變背景顏色的函數,被#include<stdlib>包含
3.我們用枚舉類型美化選項Quit就是0,Resume就是1
4.我們采用了指針數組函數可以直接調用接口函數,因為沒有返回值函數類型就是void,這樣減少了重復代碼的編寫,如果大家不適應也可以用switch
搭建my_oferr.c中的接口函數?
首先定義我們my_oferr.c中的全局變量
#include"offer.h"
int m = 0; //記錄錄入學生的人數
由于是顯示一個管理系統
所以我們設計一個主菜單
通過定義一個函數menu2()來實現這個功能:
void menu1()
{printf("\n");system("color F4");printf("\t\t\t*****************************************************\n");printf("\t\t\t*---------------------------------------------------*\n");printf("\t\t\t* 學生管理系統 *\n");printf("\t\t\t*****************************************************\n");printf("\t\t\t********************系統功能菜單*********************\n");printf("\t\t\t---------------------- --------------------------\n");printf("\t\t\t*****************************************************\n");printf("\t\t\t** 1、使用幫助菜單 * 2、增加學生信息 **\n");printf("\t\t\t*****************************************************\n");printf("\t\t\t** 3、查詢學生信息 * 4、刪除學生信息 **\n");printf("\t\t\t*****************************************************\n");printf("\t\t\t** 5、保存當前信息 * 6、顯示當前信息 **\n");printf("\t\t\t*****************************************************\n");printf("\t\t\t** 7、修改學生信息 * 8、學生成績排名 **\n");printf("\t\t\t*****************************************************\n");printf("\t\t\t*****************************************************\n");printf("\t\t\t---------------------- --------------------------\n");
}
這個大家可以自己隨喜好設置~?
?使用幫助菜單接口函數
void TiShi()
{printf("歡迎來到學生管理系統:\n");printf("在這個管理系統中,教師和學生都不需要去了解自己的信息,只需通過網絡就能實現自己的信息管理。\n");printf("教師可以輕松便捷地掌握學生相關情況、姓名、學號以及考試成績等基本信息。\n");printf("它還提供一個搜索功能和設置權限,可以將學生的信息進行搜索,\n也可根據關鍵字或其他方式對其進行定位,并且還能顯示出該人的相關基本資料。\n");printf("如果由技術上的缺陷還請聯系項目負責人:\n17817473648\n");system("pause");system("cls");
}
?system("pause")是暫停函數,按任意鍵重新啟動,被#include<stdlib.h>包含
本函數接口主要起到提示作用,小伙伴們可以自行添加自己的管理需求?
?增加學生信息接口函數?
void StuXinXi()
{int i = m,flag,n = 0;printf("請輸入你要添加的學生人數:\n");scanf("%d", &n);printf("--------------------------*學生信息錄入系統*--------------------------------\n");if (n > 0){do {flag = 1;while (flag){flag = 0;printf("請輸入第%d位學生的學號:\n", i + 1);scanf("%s", Stu[i].Stuid);for (int j = 0; j < i; j++){if (strcmp(Stu[i].Stuid, Stu[j].Stuid) == 0)//判斷是否重復{printf("該學生已經錄入,請重新選擇!\n");flag = 1;break;}}}printf("請輸入第%d學生的姓名:\n", i + 1);scanf("%s", Stu[i].Stuname);printf("請輸入第%d學生的年齡:\n", i + 1);scanf("%d", &Stu[i].Stuage);printf("請輸入第%d學生的性別:\n", i + 1);scanf("%s", &Stu[i].Stusex);printf("請輸入第%d學生的C語言成績:\n", i + 1);scanf("%lf", &Stu[i].score[0]);printf("請輸入第%d學生的高數成績:\n", i + 1);scanf("%lf", &Stu[i].score[1]);printf("請輸入第%d學生的大物成績:\n", i + 1);scanf("%lf", &Stu[i].score[2]);i++;} while (i < n + m);m += n;if (flag == 0){printf("添加完成!請進行下一步操作:\n");}system("pause");system("cls");}
}
1.flag用來判斷最后輸出的提示語句,提示錄入成功與否
2.然后就是whie循環給結構體成員賦初值
3.在將人數累加給全局變量m就好了
查詢學生信息接口函數
void ChaZhao()
{int flag, input;char Stu1[Number];printf("\t\t\t----------*學生信息查找系統*----------\n");printf("\t\t\t**************************************\n");printf("\t\t\t******1.請輸入你要查找的學生名字******\n");printf("\t\t\t******2.請輸入你要查找的學生學號******\n");printf("\t\t\t******------3.退出本次操作------******\n");printf("\t\t\t**************************************\n");while (1){flag = 0;printf("請輸入你要進行的查詢操作:\n");scanf("%d", &input);switch (input){case CaoZuo1:printf("請輸入你要查找的學生名字:\n");scanf("%s", Stu1);for (int i = 0; i < m; i++){if (strcmp(Stu[i].Stuname, Stu1) == 0){flag = 1;printf("學號:\t\t名字:\t年齡:\t性別:\tC語言成績:\t高數成績:\t大物成績:\n");printf("%s\t%s\t%d\t%s\t%.2lf\t\t%.2lf\t\t%.2lf\n", Stu[i].Stuid, Stu[i].Stuname, Stu[i].Stuage, Stu[i].Stusex, Stu[i].score[0], Stu[i].score[1], Stu[i].score[2]);}}break;case CaoZuo2:printf("請輸入你要查找的學生學號:\n");scanf("%s", Stu1);for (int i = 0; i < m; i++){if (strcmp(Stu[i].Stuid, Stu1) == 0){flag = 1;printf("學號:\t\t名字:\t年齡:\t性別:\tC語言成績:\t高數成績:\t大物成績:\n");printf("%s\t%s\t%d\t%s\t%.2lf\t\t%.2lf\t\t%.2lf\n", Stu[i].Stuid, Stu[i].Stuname, Stu[i].Stuage, Stu[i].Stusex, Stu[i].score[0], Stu[i].score[1], Stu[i].score[2]);}}break;case CaoZuo3:return;default:printf("輸入錯誤,重新選擇!\n");}if (flag == 0){printf("該學生沒有錄入系統,請重新查找!\n");}}system("pause");
}
刪除學生信息接口函數?
void ShanGai()
{int flag = 0;char arr[Number]; //定義一個數組printf("----------------------------------*學生名單*----------------------------------------------------------\n");printf("學號:\t\t名字:\t年齡:\t性別:\tC語言成績:\t高數成績:\t大物成績:\n");for (int i = 0; i < m; i++){printf("%s\t%s\t%d\t%s\t%.2lf\t\t%.2lf\t\t%.2lf\n", Stu[i].Stuid, Stu[i].Stuname, Stu[i].Stuage, Stu[i].Stusex, Stu[i].score[0], Stu[i].score[1], Stu[i].score[2]);}printf("請輸入你要刪除學生的學號:\n");scanf("%s", arr);for (int i = 0; i < m; i++){if (strcmp(Stu[i].Stuid, arr) == 0) //查找對應的學號{flag = 1;for (int j = i; j < m - 1; j++) //m-1防止越界訪問{Stu[j] = Stu[j + 1]; //整個結構體后一個覆蓋前一個}}}if (flag == 0){printf("無法查找該學生信息!\n");}else{printf("刪除成功,請查詢系統!\n");m--; //刪除成功總人數減一printf("----------------------------------*學生名單*----------------------------------------------------------\n");printf("學號:\t\t名字:\t年齡:\t性別:\tC語言成績:\t高數成績:\t大物成績:\n");for (int i = 0; i < m; i++){printf("%s\t%s\t%d\t%s\t%.2lf\t\t%.2lf\t\t%.2lf\n", Stu[i].Stuid, Stu[i].Stuname, Stu[i].Stuage, Stu[i].Stusex, Stu[i].score[0], Stu[i].score[1], Stu[i].score[2]);}}system("pause");
}
保存學生信息接口?
這里穿插一下文件的保存的函數內容:?
打開文件fopen
可以使用?fopen( )?函數來創建一個新的文件或者打開一個已有的文件,這個調用會初始化類型?FILE?的一個對象,類型?FILE?包含了所有用來控制流的必要的信息。下面是這個函數調用的原型:
FILE *fopen( const char *filename, const char *mode );
在這里,filename?是字符串,用來命名文件,訪問模式?mode?的值可以是下列值中的一個:
關閉文件fclose
為了關閉文件,請使用 fclose( ) 函數。函數的原型如下:
int fclose( FILE *fp );
如果成功關閉文件,fclose( )?函數返回零,如果關閉文件時發生錯誤,函數返回?EOF。這個函數實際上,會清空緩沖區中的數據,關閉文件,并釋放用于該文件的所有內存。EOF 是一個定義在頭文件 #include<stdio.h>?中的常量。
?判斷是否保存文件fwrite
fwrite(file,string,length)
file | 必需。規定要寫入的打開文件。 |
string | 必需。規定要寫入打開文件的字符串。 |
length | 可選。規定要寫入的最大字節數。 |
fwrite() 函數將內容寫入一個打開的文件中。
函數會在到達指定長度或讀到文件末尾(EOF)時(以先到者為準),停止運行。
如果函數成功執行,則返回寫入的字節數。如果失敗,則返回 FALSE。
退出執行文件exit
void exit(int status)?
立即終止調用進程。任何屬于該進程的打開的文件描述符都會被關閉,該進程的子進程由進程 1 繼承,初始化,且會向父進程發送一個 SIGCHLD 信號。?
void BaoCun()
{FILE* fp; //文件指針char filename[Number];printf("------------------------------\n");printf("---*請輸入你要保存的文件名*---\n");printf("------------------------------\n");scanf("%s", filename);if (fp = fopen("filename.txt", "a")== NULL)//fopen以.txt的形式打開文件函數{printf("打開文件失敗!\n");exit(0);}for (int i = 0; i < m; i++){if (fwrite(&Stu[i], sizeof(struct Student), 1, fp) != 1){printf("保存失敗!\n");}else{printf("保存成功!\n"); //返回字節數,則成功保存}}fclose(fp); //關閉文件system("pause");
}
我們保存之后在這里查看保存過的文件:?
顯示學生信息接口函數
void XianShi()
{if (m == 0){printf("您好!現在還暫未錄入學生信息,請稍后重試");}else {printf("現在有%d名學生:\n", m);printf("-------------------------------------*成績顯示*----------------------------------------------\n");printf("學號:\t\t名字:\t年齡:\t性別:\tC語言成績:\t高數成績:\t大物成績:\n");for (int i = 0; i < m; i++){printf("%s\t%s\t%d\t%s\t%.2lf\t\t%.2lf\t\t%.2lf\n", Stu[i].Stuid, Stu[i].Stuname, Stu[i].Stuage, Stu[i].Stusex, Stu[i].score[0], Stu[i].score[1], Stu[i].score[2]);}}system("pause");
}
?
?修改學生信息接口函數
void XiuGai()
{int input = 0;int flag;char id[Number], name[Number], sex[Number];int age;double score;printf("請輸入要修改的學生學號:\n");scanf("%s", &id);while (1){flag = 0;for (int i = 0; i < m; i++){if (strcmp(id, Stu[i].Stuid) == 0){flag = 1;printf("學號:\t\t名字:\t年齡:\t性別:\tC語言成績:\t高數成績:\t大物成績:\n");printf("%s\t%s\t%d\t%s\t%.2lf\t\t%.2lf\t\t%.2lf\n", Stu[i].Stuid, Stu[i].Stuname, Stu[i].Stuage, Stu[i].Stusex, Stu[i].score[0], Stu[i].score[1], Stu[i].score[2]);printf("**************************************************\n");printf("----1.修改學生性別 2.修改學生姓名-----\n");printf("----3.修改學生年齡 4.修改C語言成績----\n");printf("----5.修改高數成績 6.修改大物成績-----\n");printf("********************7.退出本菜單******************\n");printf("請輸入你要修改的選項:\n");scanf("%d", &input);switch (input){case 1:printf("請輸入要修改的性別:\n");scanf("%s", sex);strcpy(Stu[i].Stusex, sex);break;case 2:printf("請輸入要修改的姓名:\n");scanf("%s",name);strcpy(Stu[i].Stuname, name);break;case 3:printf("請輸入要修改的年齡:\n");scanf("%d", &age);Stu[i].Stuage = age;break;case 4:printf("請輸入要修改的C語言成績:\n");scanf("%lf", &score);Stu[i].score[0] = score;break;case 5:printf("請輸入要修改的高數成績:\n");scanf("%lf", &score);Stu[i].score[1] = score;break;case 6:printf("請輸入要修改的大物成績:\n");scanf("%lf", &score);Stu[i].score[2] = score;break;case 7:return;default:printf("選擇錯誤,請重新選擇!\n");break;}}if (1 <= input && input <= 6){printf("恭喜你修改成功!\n");break;}if (flag == 0){printf("沒有找到該學生信息,請重新輸入學生學號:\n");gets(name);}}}system("pause");
}
char* strcpy(char * destination, const char * source );?
strcpy:拷貝函數,將括號右邊的值拷貝到左邊,詳細可看我之前的博客
?學生排名信息接口函數
int PaiXu(const void* e1, const void* e2)
{return ((struct Student*)e2)->score[0] - ((struct Student*)e1)->score[0];
}
int PaiXu1(const void* e1, const void* e2)
{return ((struct Student*)e2)->score[0] - ((struct Student*)e1)->score[0];
}
int PaiXu2(const void* e1, const void* e2)
{return ((struct Student*)e2)->score[2] - ((struct Student*)e1)->score[2];
}
void PaiMing()
{int input = 0;while (1){printf("\t\t**************************************************\n");printf("\t\t---------------------***光榮榜***-----------------\n");printf("\t\t**************************************************\n");printf("\t\t********1.C語言-------------------2.高數**********\n");printf("\t\t********3.大物--------------------4.退出系統******\n");printf("\t\t**************************************************\n");printf("請輸入你要查詢的排名:\n");scanf("%d", &input);switch (input){case 1:printf("\t學號:\t\t名字:\tC語言成績:\n");int rs = sizeof(Stu) / sizeof(Stu[0]);qsort(Stu, rs, sizeof(Stu[0]), PaiXu);//排序for (int i = 0; i < m; i++){printf("第%d名\t%s\t%s\t%.2lf", i+1, Stu[i].Stuid, Stu[i].Stuname, Stu[i].score[0]);printf("\n");}break;case 2:printf("\t學號:\t\t名字:\t高數成績:\n");int rs1 = sizeof(Stu) / sizeof(Stu[0]);qsort(Stu, rs1, sizeof(Stu[0]), PaiXu1);for (int i = 0; i < m; i++){printf("第%d名\t%s\t%s\t%.2lf", i+1, Stu[i].Stuid, Stu[i].Stuname, Stu[i].score[0]);printf("\n");}break;case 3:printf("\t學號:\t\t名字:\t大物成績:\n");int rs2 = sizeof(Stu) / sizeof(Stu[0]);qsort(Stu, rs, sizeof(Stu[0]), PaiXu2);for (int i = 0; i < m; i++){printf("第%d名\t%s\t%s\t%.2lf", i+1, Stu[i].Stuid, Stu[i].Stuname, Stu[i].score[0]);printf("\n");}break;case 4:return;default:printf("選擇錯誤,重新選擇!\n");break;}}
}
我們采用qsort排序法:
void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*));
base首元素地址-數組名
num元素個數
size數據類型的大小
int (*compar)(const void*,const void*))比較大小的函數指針?
以下是整個代碼的實現:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 20
#define Number sizeof(struct Student)
struct Student
{char Stuid[N]; char Stuname[N]; int Stuage; char Stusex[N]; double score[3];
}Stu[Number];
enum menu2
{Quit = 0,Resume = 1
};
enum ChaZhao
{CaoZuo1 = 1,CaoZuo2 = 2,CaoZuo3 = 3
};int m = 0;
void menu1()
{printf("\n");system("color F4");printf("\t\t\t*****************************************************\n");printf("\t\t\t*---------------------------------------------------*\n");printf("\t\t\t* 學生管理系統 *\n");printf("\t\t\t*****************************************************\n");printf("\t\t\t********************系統功能菜單*********************\n");printf("\t\t\t---------------------- --------------------------\n");printf("\t\t\t*****************************************************\n");printf("\t\t\t** 1、使用幫助菜單 * 2、增加學生信息 **\n");printf("\t\t\t*****************************************************\n");printf("\t\t\t** 3、查詢學生信息 * 4、刪除學生信息 **\n");printf("\t\t\t*****************************************************\n");printf("\t\t\t** 5、保存當前信息 * 6、顯示當前信息 **\n");printf("\t\t\t*****************************************************\n");printf("\t\t\t** 7、修改學生信息 * 8、學生成績排名 **\n");printf("\t\t\t*****************************************************\n");printf("\t\t\t*****************************************************\n");printf("\t\t\t---------------------- --------------------------\n");
}
void menu2()
{system("color F4");printf("*********************\n");printf("*********************\n");printf("-------1.Resume------\n");printf("-------0.Quit--------\n");printf("*********************\n");
}
void TiShi()
{printf("歡迎來到學生管理系統:\n");printf("在這個管理系統中,教師和學生都不需要去了解自己的信息,只需通過網絡就能實現自己的信息管理。\n");printf("教師可以輕松便捷地掌握學生相關情況、姓名、學號以及考試成績等基本信息。\n");printf("它還提供一個搜索功能和設置權限,可以將學生的信息進行搜索,\n也可根據關鍵字或其他方式對其進行定位,并且還能顯示出該人的相關基本資料。\n");printf("如果由技術上的缺陷還請聯系項目負責人:\n唐工:2172227341@qq.com\n");system("pause");system("cls");
}
void StuXinXi()
{int i = m,flag,n = 0;printf("請輸入你要添加的學生人數:\n");scanf("%d", &n);printf("--------------------------*學生信息錄入系統*--------------------------------\n");if (n > 0){do {flag = 1;while (flag){flag = 0;printf("請輸入第%d位學生的學號:\n", i + 1);scanf("%s", Stu[i].Stuid);for (int j = 0; j < i; j++){if (strcmp(Stu[i].Stuid, Stu[j].Stuid) == 0){printf("該學生已經錄入,請重新選擇!\n");flag = 1;break;}}}printf("請輸入第%d學生的姓名:\n", i + 1);scanf("%s", Stu[i].Stuname);printf("請輸入第%d學生的年齡:\n", i + 1);scanf("%d", &Stu[i].Stuage);printf("請輸入第%d學生的性別:\n", i + 1);scanf("%s", &Stu[i].Stusex);printf("請輸入第%d學生的C語言成績:\n", i + 1);scanf("%lf", &Stu[i].score[0]);printf("請輸入第%d學生的高數成績:\n", i + 1);scanf("%lf", &Stu[i].score[1]);printf("請輸入第%d學生的大物成績:\n", i + 1);scanf("%lf", &Stu[i].score[2]);i++;} while (i < n + m);m += n;if (flag == 0){printf("添加完成!請進行下一步操作:\n");}system("pause");system("cls");}
}
void ChaZhao()
{int flag, input;char Stu1[Number];printf("\t\t\t----------*學生信息查找系統*----------\n");printf("\t\t\t**************************************\n");printf("\t\t\t******1.請輸入你要查找的學生名字******\n");printf("\t\t\t******2.請輸入你要查找的學生學號******\n");printf("\t\t\t******------3.退出本次操作------******\n");printf("\t\t\t**************************************\n");while (1){flag = 0;printf("請輸入你要進行的查詢操作:\n");scanf("%d", &input);switch (input){case CaoZuo1:printf("請輸入你要查找的學生名字:\n");scanf("%s", Stu1);for (int i = 0; i < m; i++){if (strcmp(Stu[i].Stuname, Stu1) == 0){flag = 1;printf("學號:\t\t名字:\t年齡:\t性別:\tC語言成績:\t高數成績:\t大物成績:\n");printf("%s\t%s\t%d\t%s\t%.2lf\t\t%.2lf\t\t%.2lf\n", Stu[i].Stuid, Stu[i].Stuname, Stu[i].Stuage, Stu[i].Stusex, Stu[i].score[0], Stu[i].score[1], Stu[i].score[2]);}}break;case CaoZuo2:printf("請輸入你要查找的學生學號:\n");scanf("%s", Stu1);for (int i = 0; i < m; i++){if (strcmp(Stu[i].Stuid, Stu1) == 0){flag = 1;printf("學號:\t\t名字:\t年齡:\t性別:\tC語言成績:\t高數成績:\t大物成績:\n");printf("%s\t%s\t%d\t%s\t%.2lf\t\t%.2lf\t\t%.2lf\n", Stu[i].Stuid, Stu[i].Stuname, Stu[i].Stuage, Stu[i].Stusex, Stu[i].score[0], Stu[i].score[1], Stu[i].score[2]);}}break;case CaoZuo3:return;default:printf("輸入錯誤,重新選擇!\n");}if (flag == 0){printf("該學生沒有錄入系統,請重新查找!\n");}}system("pause");}
void ShanGai()
{int flag = 0;char arr[Number];printf("----------------------------------*學生名單*----------------------------------------------------------\n");printf("學號:\t\t名字:\t年齡:\t性別:\tC語言成績:\t高數成績:\t大物成績:\n");for (int i = 0; i < m; i++){printf("%s\t%s\t%d\t%s\t%.2lf\t\t%.2lf\t\t%.2lf\n", Stu[i].Stuid, Stu[i].Stuname, Stu[i].Stuage, Stu[i].Stusex, Stu[i].score[0], Stu[i].score[1], Stu[i].score[2]);}printf("請輸入你要刪除學生的學號:\n");scanf("%s", arr);for (int i = 0; i < m; i++){if (strcmp(Stu[i].Stuid, arr) == 0) {flag = 1;for (int j = i; j < m - 1; j++) {Stu[j] = Stu[j + 1]; }}}if (flag == 0){printf("無法查找該學生信息!\n");}else{printf("刪除成功,請查詢系統!\n");m--; printf("----------------------------------*學生名單*----------------------------------------------------------\n");printf("學號:\t\t名字:\t年齡:\t性別:\tC語言成績:\t高數成績:\t大物成績:\n");for (int i = 0; i < m; i++){printf("%s\t%s\t%d\t%s\t%.2lf\t\t%.2lf\t\t%.2lf\n", Stu[i].Stuid, Stu[i].Stuname, Stu[i].Stuage, Stu[i].Stusex, Stu[i].score[0], Stu[i].score[1], Stu[i].score[2]);}}system("pause");
}
void BaoCun()
{FILE* fp; char filename[Number];printf("------------------------------\n");printf("---*請輸入你要保存的文件名*---\n");printf("------------------------------\n");scanf("%s", filename);if (fp = fopen("filename.txt", "a")== NULL){printf("打開文件失敗!\n");exit(0);}for (int i = 0; i < m; i++){if (fwrite(&Stu[i], sizeof(struct Student), 1, fp) != 1){printf("保存失敗!\n");}else{printf("保存成功!\n");}}fclose(fp);system("pause");
}
void XianShi()
{if (m == 0){printf("您好!現在還暫未錄入學生信息,請稍后重試");}else {printf("現在有%d名學生:\n", m);printf("-------------------------------------*成績顯示*----------------------------------------------\n");printf("學號:\t\t名字:\t年齡:\t性別:\tC語言成績:\t高數成績:\t大物成績:\n");for (int i = 0; i < m; i++){printf("%s\t%s\t%d\t%s\t%.2lf\t\t%.2lf\t\t%.2lf\n", Stu[i].Stuid, Stu[i].Stuname, Stu[i].Stuage, Stu[i].Stusex, Stu[i].score[0], Stu[i].score[1], Stu[i].score[2]);}}system("pause");
}
void XiuGai()
{int input = 0;int flag;char id[Number], name[Number], sex[Number];int age;double score;printf("請輸入要修改的學生學號:\n");scanf("%s", &id);while (1){flag = 0;for (int i = 0; i < m; i++){if (strcmp(id, Stu[i].Stuid) == 0){flag = 1;printf("學號:\t\t名字:\t年齡:\t性別:\tC語言成績:\t高數成績:\t大物成績:\n");printf("%s\t%s\t%d\t%s\t%.2lf\t\t%.2lf\t\t%.2lf\n", Stu[i].Stuid, Stu[i].Stuname, Stu[i].Stuage, Stu[i].Stusex, Stu[i].score[0], Stu[i].score[1], Stu[i].score[2]);printf("**************************************************\n");printf("----1.修改學生性別 2.修改學生姓名-----\n");printf("----3.修改學生年齡 4.修改C語言成績----\n");printf("----5.修改高數成績 6.修改大物成績-----\n");printf("********************7.退出本菜單******************\n");printf("請輸入你要修改的選項:\n");scanf("%d", &input);switch (input){case 1:printf("請輸入要修改的性別:\n");scanf("%s", sex);strcpy(Stu[i].Stusex, sex);break;case 2:printf("請輸入要修改的姓名:\n");scanf("%s",name);strcpy(Stu[i].Stuname, name);break;case 3:printf("請輸入要修改的年齡:\n");scanf("%d", &age);Stu[i].Stuage = age;break;case 4:printf("請輸入要修改的C語言成績:\n");scanf("%lf", &score);Stu[i].score[0] = score;break;case 5:printf("請輸入要修改的高數成績:\n");scanf("%lf", &score);Stu[i].score[1] = score;break;case 6:printf("請輸入要修改的大物成績:\n");scanf("%lf", &score);Stu[i].score[2] = score;break;case 7:return;default:printf("選擇錯誤,請重新選擇!\n");break;}}if (1 <= input && input <= 6){printf("恭喜你修改成功!\n");break;}if (flag == 0){printf("沒有找到該學生信息,請重新輸入學生學號:\n");gets(name);}}}system("pause");
}int PaiXu(const void* e1, const void* e2)
{return ((struct Student*)e2)->score[0] - ((struct Student*)e1)->score[0];
}
int PaiXu1(const void* e1, const void* e2)
{return ((struct Student*)e2)->score[0] - ((struct Student*)e1)->score[0];
}
int PaiXu2(const void* e1, const void* e2)
{return ((struct Student*)e2)->score[2] - ((struct Student*)e1)->score[2];
}
void PaiMing()
{int input = 0;while (1){printf("\t\t**************************************************\n");printf("\t\t---------------------***光榮榜***-----------------\n");printf("\t\t**************************************************\n");printf("\t\t********1.C語言-------------------2.高數**********\n");printf("\t\t********3.大物--------------------4.退出系統******\n");printf("\t\t**************************************************\n");printf("請輸入你要查詢的排名:\n");scanf("%d", &input);switch (input){case 1:printf("\t學號:\t\t名字:\tC語言成績:\n");int rs = sizeof(Stu) / sizeof(Stu[0]);qsort(Stu, rs, sizeof(Stu[0]), PaiXu);//排序for (int i = 0; i < m; i++){printf("第%d名\t%s\t%s\t%.2lf", i+1, Stu[i].Stuid, Stu[i].Stuname, Stu[i].score[0]);printf("\n");}break;case 2:printf("\t學號:\t\t名字:\t高數成績:\n");int rs1 = sizeof(Stu) / sizeof(Stu[0]);qsort(Stu, rs1, sizeof(Stu[0]), PaiXu1);for (int i = 0; i < m; i++){printf("第%d名\t%s\t%s\t%.2lf", i+1, Stu[i].Stuid, Stu[i].Stuname, Stu[i].score[0]);printf("\n");}break;case 3:printf("\t學號:\t\t名字:\t大物成績:\n");int rs2 = sizeof(Stu) / sizeof(Stu[0]);qsort(Stu, rs, sizeof(Stu[0]), PaiXu2);for (int i = 0; i < m; i++){printf("第%d名\t%s\t%s\t%.2lf", i+1, Stu[i].Stuid, Stu[i].Stuname, Stu[i].score[0]);printf("\n");}break;case 4:return;default:printf("選擇錯誤,重新選擇!\n");break;}}
}
#include"offer.h"
int sum = 1;
int main()
{int i = 0;int input = 0, count = 0;char mima[20] = "123";//登入的密碼char shuru[20];char mingzi[20];system("color F4");printf("\t\t\t **************************************\n");printf("\t\t\t | *歡迎使用學生管理系統* |\n");printf("\t\t\t | *管理員: 小唐* |\n");printf("\t\t\t ------------------------------------\n");printf("請輸入管理員密碼:\n");while ((count = _getch()) != '\r'){if (count == '\b'){i--;printf("\b \b");}else{shuru[i++] = count;printf("*");}}shuru[i++] = '\0'; if (strcmp(mima, shuru) == 0){printf("\n密碼正確,您已進入系統!\n");}else{printf("\n密碼錯誤,請重新輸入!\n");return 0;}system("pause");system("cls");do{menu2();printf("請選擇繼續還是結束操作:\n");scanf("%d", &sum);switch (sum){case Quit:system("cls");printf("您已退出學生管理系統!\n");break;case Resume:menu1();void(*p[9])() = { NULL,TiShi,StuXinXi,ChaZhao,ShanGai,BaoCun,XianShi,XiuGai,PaiMing };//指針數組函數printf("請輸入你要進行的操作\n");scanf("%d", &input);system("cls");(*p[input])();break;default:printf("輸入錯誤,重新輸入!\n");break;}} while (sum);return 0;
}