代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
C
】
学生管理系统
作者:
HarryAlex
/ 发布于
2014/4/8
/
740
//======================= // File: StuManagement.c // Time: 2014/04/06 // Vers: Release // Auth: Harry //======================= #include <stdio.h> #include <stdlib.h> #include <string.h> #include <windows.h> // for Sleep() #include <math.h> // for abs() #ifndef FAIL #define FAIL (0) #define SUCCESS (!FAIL) #endif // @ #ifndef FAIL #ifndef FALSE #define FALSE (0) #define TRUE (!FALSE) #endif // @ #ifndef FALSE #define ERR_UNFOUND (-1) #define RELEASE_VERSION SUCCESS // DEBUGGING_VERSION::调试版本,RELEASE_VERSION:发行版本 #define PRINT_ITEM() printf(" Name StuNum Sex ChScore MaScore EnScore SumScore AveScore\n") #define PRINT_LINE() printf(" -----------------------------------------------------------------------------\n") #define IGNORE_2_END_OF_LINE() while ( getchar() != '\n' ) // 忽略多余输入至行尾 // == 类型声明部分 ======================================================================================================= #define STUSTR_SIZE 20 typedef struct StuInfom_ { // 学生信息结构体声明 char name[STUSTR_SIZE]; // 姓名 char StuNum[STUSTR_SIZE]; // 学号 char Sex; // 性别( G:女,B:男 ) float ChScore; // 语文成绩 float MaScore; // 数学成绩 float EnScore; // 英语成绩 struct StuInfom_ *NextStu; } StuInfom; typedef struct SysDevMng__ { // 定义系统管理器 int SumStu; // 当前学生总人数 StuInfom *TheFirstStu; // 学生链表表头指针 StuInfom *TheLeastStu; // 指向最后一个学生结构体 } SysDevMng_; // == 系统全局变量 ======================================================================================================= SysDevMng_ SysDevMng; // 全局变量,系统管理器 #if DEBUGGING_VERSION #define INIT_SIZE 5 StuInfom StuInitTab[INIT_SIZE] = { /* Name StuNum Sex ChScore MaScore EnScore */ { "Jams", "2014243", 'B', 88.5, 92.0, 84.0 }, { "Lily", "2014116", 'G', 92.0, 32.5, 60.0 }, { "Tom", "2014503", 'B', 5.5, 88.0, 72.5 }, { "Lynda", "2014423", 'G', 52.0, 7.0, 65.5 }, { "Philips", "2014368", 'B', 45.0, 65.5, 5.0 } }; #endif // @ #if DEBUGGING_VERSION // == 函数声明部分 ======================================================================================================= /* 与学生链表有关的函数声明 */ void StuSysMngInit(SysDevMng_ *SysMng); // 系统初始化 void EntrStuInfo(StuInfom *StuInfo); // 输入学生信息 int AddStu(void); // 添加学生 int DeleteStuStr(const char *str); // 根据字符串删除学生结点 int DeleteStu(void); // 删除学生 void ShowHomePage(void); // 显示页面,给出系统提示信息 void StuSysMngRun(void); // 系统运行 void AddStuInfo(const StuInfom *StuInfo); // 添加已有信息的学生 void CopyStuInfo(StuInfom *StuInfoDest, const StuInfom *StuInfoSorce); // 复制学生信息结构体 void DispStuInfo(const StuInfom *Stu); // 显示一个学生的所有信息 void DispAllStu(void); // 显示所有学生信息 void DispSelection(void); // 显示所有学生信息 void RunSlection(void); // 根据用户选项执行操作 void QuitSys (void); // 退出系统 void Save2File(void); // 将所有学生信息保存至文件 void LoadFrmFile(void); // 从文件中下载所有学生信息 /* 与排序有关的函数声明 */ int SelecSortedInfo(void); // 用户给出排序方法选项 void DispSortedInfo(void); // 根据用户选项显示排序结果 StuInfom **GetPtrStuTab(void); // 获取指向学生节点的指针的数组 int NameCmp(const void *stu1, const void *stu2); // 比较姓名大小 void SortByName(void); // 按照姓名排序 int StuNumCmp(const void *stu1, const void *stu2); // 比较学号大小 void SortByStuNum(void); // 根据学号排序 int FloatCmp(const float f1, const float f2); // 比较浮点数大小 int SumScoreCmp(const void *stu1, const void *stu2); // 比较学生总分大小 void SortBySumScore(void); // 根据学生总分排序 void SortBySbjct(void); // 按照科目成绩排序 void DispAllStuByPtrStuInfomTab(const StuInfom **tab, const int size); // 根据(StuInfom *)型的数组显示所有学生信息 int SelecOfSortBySbjct(void); void SortByTheSubject(int subject); void SortBySbjct(void); // == 与不及格信息相关的定义和声明 ======================================================================================= typedef struct { // 不及格学生信息 char name[STUSTR_SIZE]; // 不及格学生姓名 char UnpsSubj[STUSTR_SIZE]; // 不及格学生科目:ChScore、MaScore、EnScore float UnpsScore; // 不及格学生科目成绩 } UnpassStuInfo; struct { UnpassStuInfo *pUnpInfo; // 指向不及格学生链表 struct { // 定义不及格位字段 unsigned int Sum : 8; // 不及格总人数 unsigned int Ch : 8; // 语文不及格人数 unsigned int Ma : 8; // 数学不及格人数 unsigned int En : 8; // 英语不及格人数 } UnPassInfo; } UnPassDev; // 全局变量,不及格信息管理器 #define UNPASS_SUM /* 不及格总人数 */ UnPassDev.UnPassInfo.Sum #define UNPASS_CH /* 语文不及格人数 */ UnPassDev.UnPassInfo.Ch #define UNPASS_MA /* 数学不及格人数 */ UnPassDev.UnPassInfo.Ma #define UNPASS_EN /* 英语不及格人数 */ UnPassDev.UnPassInfo.En #define UNPASS_CH_MA_EN (UNPASS_CH + UNPASS_MA + UNPASS_EN) void LoadUnpassStuInfo(StuInfom *stu); // 装载全部有不及格科目的学生信息 void DispUnpassInfo(void); // 显示所有不及格信息 // == 主函数部分 ========================================================================================================= int main (void) { StuSysMngInit ( &SysDevMng ); StuSysMngRun (); return 0; } // == 子函数实现部分 ===================================================================================================== //========================================================== // 函数功能:学生信息管理系统初始化 // 入口参数:系统管理器结构体指针 // 返 回 值:无 //========================================================== // DEBUGGING_VERSION::调试版本,RELEASE_VERSION:发行版本 //========================================================== void StuSysMngInit ( SysDevMng_ *SysMng ) { #if DEBUGGING_VERSION int index; #endif // @ #if DEBUGGING_VERSION SysMng->SumStu = 0; SysMng->TheFirstStu = SysMng->TheLeastStu = NULL; #if DEBUGGING_VERSION for ( index = 0; index < INIT_SIZE; index++) { AddStuInfo ( &StuInitTab[index] ); } #endif // @ #if DEBUGGING_VERSION #if RELEASE_VERSION LoadFrmFile(); #endif // @ #if RELEASE_VERSION } //========================================================== // 函数功能:系统运行 // 入口参数:无 // 返 回 值:无 //========================================================== void StuSysMngRun ( void ) { ShowHomePage(); DispSelection(); RunSlection(); } //========================================================== // 函数功能:显示页面 // 入口参数:无 // 返 回 值:无 //========================================================== void ShowHomePage(void) { putchar('\n'); printf(" =========================================================== \n"); printf(" ** ** \n"); printf(" ** Student Information Management System ** \n"); printf(" ** Copyright(C) of Harry ** \n"); printf(" ** TIME: %s, %s **\n", __DATE__, __TIME__ ); printf(" ** ** \n"); printf(" =========================================================== \n"); putchar('\n'); } //========================================================== // 函数功能:显示用户选项,给出提示信息 // 入口参数:无 // 返 回 值:无 //========================================================== void DispSelection ( void ) { putchar('\n'); puts(" Please input the digit <1-6> to select the items: \n"); puts(" --------------------------------------------------------------- "); puts(" 1> Scan all stus' info 2> Sorted stus' info "); puts(" 3> Add stu's info 4> Delete stu's info "); puts(" 5> Scan Unpass info 6> Quit from Sys "); puts(" --------------------------------------------------------------- "); printf(" Now the SumStu is %d\n", SysDevMng.SumStu); puts(" --------------------------------------------------------------- \n"); putchar('\n'); } //========================================================== // 函数功能:复制一个学生结构体 // 入口参数:StuInfom *StuInfoDest, const StuInfom *StuInfoSorce // 返 回 值:void //========================================================== void CopyStuInfo ( StuInfom *StuInfoDest, const StuInfom *StuInfoSorce ) { strcpy(StuInfoDest->name, StuInfoSorce->name); strcpy(StuInfoDest->StuNum, StuInfoSorce->StuNum); StuInfoDest->Sex = StuInfoSorce->Sex; StuInfoDest->ChScore = StuInfoSorce->ChScore; StuInfoDest->MaScore = StuInfoSorce->MaScore; StuInfoDest->EnScore = StuInfoSorce->EnScore; } //========================================================== // 函数功能:录入一个学生信息 // 入口参数:指向一个StuInfom类型结构体的指针 // 返 回 值:无 //========================================================== void EntrStuInfo ( StuInfom *StuInfomStruct ) { puts(" Please input the stu's name (eg: Sam) :" ); scanf(" %s",StuInfomStruct->name ); IGNORE_2_END_OF_LINE(); puts(" Please input the stu's number (eg: 2014999) :" ); scanf(" %s",StuInfomStruct->StuNum); IGNORE_2_END_OF_LINE(); puts(" Please input the stu's sex (B: boy, G: girl) :" ); scanf(" %c",&StuInfomStruct->Sex); IGNORE_2_END_OF_LINE(); puts(" Please input the stu's ChScore (eg: 95.5) :" ); scanf(" %f",&StuInfomStruct->ChScore); IGNORE_2_END_OF_LINE(); puts(" Please input the stu's MaScore (eg: 95.5) :" ); scanf(" %f",&StuInfomStruct->MaScore); IGNORE_2_END_OF_LINE(); puts(" Please input the stu's EnScore (eg: 95.5) :" ); scanf(" %f",&StuInfomStruct->EnScore ); IGNORE_2_END_OF_LINE(); } //========================================================== // 函数功能:添加一个已有信息的学生 // 入口参数:指向一个StuInfom类型结构体的指针 // 返 回 值:void //========================================================== void AddStuInfo ( const StuInfom *StuInfo ) { StuInfom *TempStu /*= StuInfo*/ ; if ( (TempStu = (StuInfom *)malloc( sizeof(StuInfom) )) == NULL ) { fputs("\n Malloc Failled, unknown error!\n", stderr); return; } if ( !SysDevMng.TheFirstStu ) { SysDevMng.TheFirstStu = TempStu; SysDevMng.TheLeastStu = TempStu; } else { SysDevMng.TheLeastStu->NextStu = TempStu; SysDevMng.TheLeastStu = TempStu; } SysDevMng.TheLeastStu->NextStu = NULL; CopyStuInfo ( SysDevMng.TheLeastStu, StuInfo ); SysDevMng.SumStu++; } //========================================================== // 函数功能:添加一个学生 // 入口参数:无 // 返 回 值:SUCCESS:添加成功,FAIL:添加失败 //========================================================== int AddStu ( void ) { StuInfom *TempStu; if ( (TempStu = (StuInfom *)malloc( sizeof(StuInfom) )) == NULL ) { fputs("\n Malloc Failled, unknown error!\n", stderr); return FAIL; } if ( !SysDevMng.TheFirstStu ) { SysDevMng.TheFirstStu = TempStu; SysDevMng.TheLeastStu = TempStu; } else { SysDevMng.TheLeastStu->NextStu = TempStu; SysDevMng.TheLeastStu = TempStu; } SysDevMng.TheLeastStu->NextStu = NULL; EntrStuInfo ( SysDevMng.TheLeastStu ); SysDevMng.SumStu++; printf("\n Add Stu Successly!\n\n"); DispAllStu (); return SUCCESS; } //========================================================== // 函数功能:定位节点位置(索引方式与数组类似,从0开始) // 入口参数:特征字符串,学生姓名或者学生学号 // 返 回 值:节点位置 //========================================================== // static int GetPos ( const char *str ) // { // int index = 0; // StuInfom *tmpstrptr; // // tmpstrptr = SysDevMng.TheFirstStu; // 指向第一个 // // while (tmpstrptr && ( strcmp(tmpstrptr->name, str) != 0 && strcmp(tmpstrptr->StuNum, str) != 0) ) { // tmpstrptr = tmpstrptr->NextStu; // index++; // } // // if ( tmpstrptr == NULL ) { // 说明这是while结束的原因 // return ERR_UNFOUND; // } else { // return index; // } // // } //========================================================== // 函数功能:根据索引值删除一个学生 // 入口参数:索引值index // 返 回 值:SUCCESS,删除成功;FAIL,删除失败 //========================================================== // int DeleteStuPos ( int index ) // { // int ind = 0; // StuInfom *tmp = SysDevMng.TheFirstStu; // StuInfom *tmpfree; // // if ( index >= SysDevMng.SumStu) { // printf(" The stu Unfound!\n" ); // return FAIL; // } else { // while ( ind++ != (index-1) ) { // tmp = tmp->NextStu; // } // // /* 此时tmp指向索引值为index-1的学生*/ // tmpfree = tmp->NextStu; // 保存学生[index]的地址 // tmp->NextStu = tmp->NextStu->NextStu; // 使学生[index-1]指向学生[index+1] // free ( tmpfree ); // 释放掉学生[index]的内存 // SysDevMng.SumStu--; // return SUCCESS; // } // } //========================================================== // 函数功能:根据字符串删除学生结点 // 入口参数:特征字符串,学生姓名或者学生学号 // 返 回 值:SUCCESS:删除成功,FAIL:删除失败 //========================================================== int DeleteStuStr ( const char *str ) { StuInfom *PrePtr = NULL, *CurPtr = SysDevMng.TheFirstStu; while ( CurPtr && ( strcmp(CurPtr->name, str) != 0 && strcmp(CurPtr->StuNum, str) != 0 ) ) { PrePtr = CurPtr; CurPtr = CurPtr->NextStu; } if ( CurPtr == NULL ) { // 未找到 printf("\n The stu Unfound!\n" ); return FAIL; } if ( CurPtr == SysDevMng.TheFirstStu ) { // 恰好第一个节点为待删节点 SysDevMng.TheFirstStu = CurPtr->NextStu; free(CurPtr); } else { // 节点位于中间或者为最后一个节点 PrePtr->NextStu = CurPtr->NextStu; free(CurPtr); } SysDevMng.SumStu--; return SUCCESS; } //========================================================== // 函数功能:删除一个学生 // 入口参数:无 // 返 回 值:SUCCESS,删除成功;FAIL,删除失败 //========================================================== int DeleteStu ( void ) { int res; char temp[STUSTR_SIZE]; puts("\n Please input Stu's name or number (eg: Tom or 2014999) :\n" ); gets(temp); res = DeleteStuStr(temp); if ( res == SUCCESS ) { puts(" Delete Stu successly!\n\n"); } else { puts(" Delete Stu failly!\n\n"); } DispAllStu(); return res; } //========================================================== // 函数功能:显示一个学生的所有信息 // 入口参数:指向学生结构体的指针 // 返 回 值:无 //========================================================== void DispStuInfo ( const StuInfom *Stu ) { printf(" %10s %7s %c %5.1f %5.1f %5.1f %5.1f %5.1f\n", Stu->name, Stu->StuNum, Stu->Sex, Stu->ChScore, Stu->MaScore, Stu->EnScore, Stu->ChScore + Stu->MaScore + Stu->EnScore, (Stu->ChScore + Stu->MaScore + Stu->EnScore)/3.0 ); } //========================================================== // 函数功能:显示所有学生的信息(按照添加顺序) // 入口参数:无 // 返 回 值:无 //========================================================== void DispAllStu ( void ) { StuInfom *tmp = SysDevMng.TheFirstStu; puts(" All StuInfo: \n"); PRINT_LINE(); PRINT_ITEM(); PRINT_LINE(); while ( tmp ) { DispStuInfo (tmp); tmp = tmp->NextStu; } PRINT_LINE(); printf(" Now the SumStu is %d\n",SysDevMng.SumStu); PRINT_LINE(); //printf("\n\n"); Sleep(750); DispSelection(); } //========================================================== // 函数功能:装载全部有不及格科目的学生信息 // 入口参数:StuInfom *stu:指向不及格学生结点链表 // 返 回 值:无 //========================================================== void LoadUnpassStuInfo( StuInfom *stu ) { UNPASS_SUM = UNPASS_CH = UNPASS_MA = UNPASS_EN = 0; if ( stu == NULL ) { UnPassDev.pUnpInfo = NULL; fputs(" No StuInfo!\n", stderr); return; } while ( stu ) { if ( stu->ChScore < 60.0 || stu->MaScore < 60.0 || stu->EnScore < 60.0 ) { UNPASS_SUM++; if ( stu->ChScore < 60.0 ) { // 语文不及格 UnPassDev.pUnpInfo = (UnpassStuInfo *)realloc( UnPassDev.pUnpInfo, (UNPASS_CH_MA_EN + 1) * sizeof(UnpassStuInfo) ); if ( UnPassDev.pUnpInfo == NULL ) { fputs(" Unknown Error!", stderr); return; } else { strcpy( (UnPassDev.pUnpInfo + UNPASS_CH_MA_EN)->name, stu->name ); strcpy( (UnPassDev.pUnpInfo + UNPASS_CH_MA_EN)->UnpsSubj, "Chinese" ); (UnPassDev.pUnpInfo + UNPASS_CH_MA_EN)->UnpsScore = stu->ChScore; } UNPASS_CH++; } if ( stu->MaScore < 60.0 ) { // 数学不及格 UnPassDev.pUnpInfo = (UnpassStuInfo *)realloc( UnPassDev.pUnpInfo, (UNPASS_CH_MA_EN + 1) * sizeof(UnpassStuInfo) ); if ( UnPassDev.pUnpInfo == NULL ) { fputs(" Unknown Error!", stderr); return; } else { strcpy( (UnPassDev.pUnpInfo + UNPASS_CH_MA_EN)->name, stu->name ); strcpy( (UnPassDev.pUnpInfo + UNPASS_CH_MA_EN)->UnpsSubj, "Math" ); (UnPassDev.pUnpInfo + UNPASS_CH_MA_EN)->UnpsScore = stu->MaScore; } UNPASS_MA++; } if ( stu->EnScore < 60.0 ) { // 英语不及格 UnPassDev.pUnpInfo = (UnpassStuInfo *)realloc( UnPassDev.pUnpInfo, (UNPASS_CH_MA_EN + 1) * sizeof(UnpassStuInfo) ); if ( UnPassDev.pUnpInfo == NULL ) { fputs(" Unknown Error!", stderr); return; } else { strcpy( (UnPassDev.pUnpInfo + UNPASS_CH_MA_EN)->name, stu->name ); strcpy( (UnPassDev.pUnpInfo + UNPASS_CH_MA_EN)->UnpsSubj, "English" ); (UnPassDev.pUnpInfo + UNPASS_CH_MA_EN)->UnpsScore = stu->EnScore; } UNPASS_EN++; } } stu = stu->NextStu; } // end of while (stu) } //========================================================== // 函数功能:显示所有不及格信息 // 入口参数:无 // 返 回 值:无 //========================================================== void DispUnpassInfo ( void ) { unsigned int idx; LoadUnpassStuInfo ( SysDevMng.TheFirstStu ); if ( UnPassDev.pUnpInfo == NULL) { // 如果无不及格学生 fputs(" Not found UnpassStu!\n", stderr); } else { printf(" UnPassesStu info: \n"); printf(" -----------------------------------------------\n"); printf(" UnpassSum UnpassCh UnpassMa UnpassEn \n"); printf(" -----------------------------------------------\n"); printf(" %d %d %d %d \n", UNPASS_SUM, UNPASS_CH, UNPASS_MA, UNPASS_EN); printf(" -----------------------------------------------\n"); printf(" UnpassStuName UnpassSubj UnpassScore \n"); printf(" -----------------------------------------------\n"); for ( idx = 0; idx < (UNPASS_CH_MA_EN); idx++ ) { /* 姓名 科目 成绩 */ printf(" %10s %10s %.1f \n", (UnPassDev.pUnpInfo + idx)->name, (UnPassDev.pUnpInfo + idx)->UnpsSubj, (UnPassDev.pUnpInfo + idx)->UnpsScore); } printf(" -----------------------------------------------\n\n"); Sleep(750); DispSelection(); free(UnPassDev.pUnpInfo); } } //========================================================== // 函数功能:将所有学生信息保存至文件 // 入口参数:无 // 返 回 值:无 //========================================================== void Save2File ( void ) { FILE *pF; StuInfom *pStu; if ( ( pF = fopen( "StuInfo.dat", "wb") ) == NULL ) { // "wb":以只写的方式打开或建立一个二进制文件 fputs(" Can't save stuinfo into file! Please requit the sys.\n", stderr); return; } rewind(pF); // 置首文件指针 /* 首先需要保存的是学生个数 */ fwrite( &SysDevMng.SumStu, sizeof(int), 1, pF); /* 然后依次保存各个学生信息 */ for ( pStu = SysDevMng.TheFirstStu; pStu; pStu = pStu->NextStu ) { fwrite( pStu, sizeof(StuInfom), 1, pF); } printf(" There are %d stu saved!\n", SysDevMng.SumStu); /* * 为什么不能用下面这一句来代替上面这一段for()语句? * * fwrite( pStu, sizeof(StuInfom), SysDevMng.TheFirstStu, pF); * * 因为不及格学生链表只是逻辑上连续,而物理上非连续。 */ fclose(pF); } //========================================================== // 函数功能:从文件中下载所有学生信息 // 入口参数:无 // 返 回 值:无 //========================================================== void LoadFrmFile ( void ) { int tmp, idx; FILE *pF; StuInfom tmpStu; if ( ( pF = fopen( "StuInfo.dat", "rb") ) == NULL ) { // "rb":以只读的方式打开或建立一个二进制文件 fputs(" Can't load stuinfo form system file! Please restart the sys.\n", stderr); return; } rewind(pF); // 置首文件指针 /* 首先需要载入的是学生个数 */ fread( &tmp, sizeof(int), 1, pF); /* 然后依次载入各个学生信息 */ for ( idx = 0; idx < tmp; idx++ ) { fread( &tmpStu, sizeof(StuInfom), 1, pF); AddStuInfo ( &tmpStu ); } printf(" There are %d stu loaded!\n", tmp); /* * 为什么不能用下面这一段来代替上面一段? * * fread( &SysDevMng.TheFirstStu, sizeof(int), 1, pF); * * for ( idx = 0; idx < SysDevMng.TheFirstStu; idx++ ) { * fread( &tmpStu, sizeof(StuInfom), 1, pF); * AddStuInfo ( &tmpStu ); * } * * 因为AddStuInfo()会使SysDevMng.TheFirstStu自增,这样会导致for()陷入死循环。 */ fclose(pF); } //========================================================== // 函数功能:退出系统 // 入口参数:无 // 返 回 值:无 //========================================================== void QuitSys ( void ) { int cnt = 3; Save2File(); do { printf(" Saving StuInfo! Sys will quit in %ds.", cnt); printf("\r"); // 将光标返回至当前行行首 Sleep(1000); // 延迟1s } while (--cnt); printf("\n\n"); exit(0); } #define SCAN_ALL 1 #define SORTED_INF 2 #define ADD_STU 3 #define DEL_STU 4 #define SCAN_UNPASS 5 #define QUIT_SYS 6 //========================================================== // 函数功能:根据用户选项执行操作 // 入口参数:无 // 返 回 值:无 //========================================================== void RunSlection ( void ) { int Selc; while (TRUE) { scanf("%d",&Selc); IGNORE_2_END_OF_LINE(); switch ( Selc) { case SCAN_ALL: DispAllStu(); break; case SORTED_INF: DispSortedInfo(); break; case ADD_STU: AddStu(); break; case DEL_STU: DeleteStu(); break; case SCAN_UNPASS: DispUnpassInfo(); break; case QUIT_SYS: QuitSys(); break; default: printf("\n Error! Please input specific selection <1-6> ! \n\n"); DispSelection (); } } } // == 关于排序的函数 ========================================================================================================= #define SORT_NAME 1 #define SORT_STUNUM 2 #define SORT_SUMSCORE 3 #define SORT_SUBJECT 4 //========================================================== // 函数功能:提示用户选择排序方式并返回用户输入 // 入口参数:无 // 返 回 值:用户输入,int型 //========================================================== int SelecSortedInfo ( void ) { int Selec; puts(" Please input the selection <1-4> of sorted info according to :"); puts(" ----------------------------------------------------"); puts(" 1> Name 2> StuNum "); puts(" 3> SumScore 4> Subject "); puts(" ----------------------------------------------------"); //scanf("%d", &Selec); //IGNORE_2_END_OF_LINE(); while( !( (scanf("%d", &Selec) == 1) && (Selec >= 1 && Selec <= 4) ) ) { IGNORE_2_END_OF_LINE(); puts(" Input Error! Please input the selection <1-4> of sorted info according to :"); } IGNORE_2_END_OF_LINE(); return Selec; } //========================================================== // 函数功能:按照用户要求显示排序信息 // 入口参数:无 // 返 回 值:无 //========================================================== void DispSortedInfo ( void ) { switch ( SelecSortedInfo() ) { case SORT_NAME : // 按姓名 SortByName(); Sleep(750); DispSelection (); break; case SORT_STUNUM: // 按学号 SortByStuNum(); Sleep(750); DispSelection (); break; case SORT_SUMSCORE: // 按总分 SortBySumScore(); Sleep(750); DispSelection (); break; case SORT_SUBJECT: // 按科目 SortBySbjct(); Sleep(750); DispSelection (); break; } } //========================================================== // 函数功能:获得一个数组,数组的元素都是(StuInfo *)型的, // 分别指向链表中的各个节点 // 入口参数:无 // 返 回 值:指向(StuInfo *)型的指针,也即(StuInfo *)型数组的首地址 //========================================================== StuInfom **GetPtrStuTab ( void ) { StuInfom *tmp, **tab, **index; tmp = SysDevMng.TheFirstStu; index = tab = (StuInfom **)malloc( SysDevMng.SumStu * sizeof(StuInfom *) ); if (tab == NULL) { fputs(" Unknown Error! Can't sorting!\n", stderr); return NULL; } while ( tmp ) { *(index++) = tmp; tmp = tmp->NextStu; } return tab; } //========================================================== // 函数功能:根据(StuInfom *)型的数组显示所有学生信息 // 入口参数:tab:(StuInfom *)型数组的首地址,size:数组长度 // 返 回 值:无 //========================================================== void DispAllStuByPtrStuInfomTab ( const StuInfom **tab, const int size ) { int index; PRINT_LINE(); PRINT_ITEM(); PRINT_LINE(); for ( index=0; index < size; index++ ) { DispStuInfo (*tab++); } PRINT_LINE(); printf(" Now the SumStu is %d\n", SysDevMng.SumStu); PRINT_LINE(); //printf("\n\n"); } //========================================================== // 函数功能:比较两个float数大小 // 入口参数:两个浮点数f1、f2 // 返 回 值:1:f1 > f2,0:f1 == f2,-1:f1 < f2 //========================================================== int FloatCmp ( const float f1, const float f2 ) { if ( fabs(f1-f2) < 0.000001 ) { return 0; } else { return (f1-f2) > 0 ? 1 : -1; } } //========================================================== // 函数功能:处理按照学生姓名排序并显示结果 // 入口参数:无 // 返 回 值:无 //========================================================== void SortByName ( void ) { int i, j; StuInfom *tmp, **table; table = GetPtrStuTab(); // table指向(StuInfo *)型数组,该数组的每个元素指向一个学生节点 if (table ==NULL) { fputs(" Unknown Error!\n", stderr); } else { for ( i=0; i<SysDevMng.SumStu-1; i++ ) { for ( j=i+1; j<SysDevMng.SumStu; j++ ) { if ( strcmp( table[i]->name, table[j]->name ) > 0 ) { // 升序排列 tmp = table[i]; table[i] = table[j]; table[j] = tmp; } } } puts(" Sorted stu info by Name: "); DispAllStuByPtrStuInfomTab ( table, SysDevMng.SumStu ); } free(table); } //========================================================== // 函数功能:处理按照学生学号排序并显示结果 // 入口参数:无 // 返 回 值:无 //========================================================== void SortByStuNum(void) { int i, j; StuInfom *tmp, **table; table = GetPtrStuTab(); // table指向(StuInfo *)型数组,该数组的每个元素指向一个学生节点 if (table ==NULL) { printf(" Unknown Error!\n"); } else { for ( i=0; i<SysDevMng.SumStu-1; i++ ) { for ( j=i+1; j<SysDevMng.SumStu; j++ ) { if ( strcmp( table[i]->StuNum, table[j]->StuNum ) > 0 ) { // 升序排列 tmp = table[i]; table[i] = table[j]; table[j] = tmp; } } } puts(" Sorted stu info by StuNum: "); DispAllStuByPtrStuInfomTab ( table, SysDevMng.SumStu ); } free(table); } //========================================================== // 函数功能:处理按照学生总分排序并显示结果 // 入口参数:无 // 返 回 值:无 //========================================================== void SortBySumScore(void) { int i, j; StuInfom *tmp, **table; table = GetPtrStuTab(); // table指向(StuInfo *)型数组,该数组的每个元素指向一个学生节点 if (table ==NULL) { printf(" Unknown Error!\n"); } else { for ( i=0; i<SysDevMng.SumStu-1; i++ ) { for ( j=i+1; j<SysDevMng.SumStu; j++ ) { float sum1 = table[i]->ChScore + table[i]->MaScore + table[i]->EnScore; // table[i]中学生总分 float sum2 = table[j]->ChScore + table[j]->MaScore + table[j]->EnScore; // table[j]中学生总分 if ( FloatCmp( sum1, sum2 ) < 0 ) { // 注意,此处如果table[i]中学生总分小于table[j],则交换之。 tmp = table[i]; // 因为,一般按成绩排序时选择降序排列。 table[i] = table[j]; table[j] = tmp; } } } puts(" Sorted stu info by SumScore: "); DispAllStuByPtrStuInfomTab ( table, SysDevMng.SumStu ); } free(table); } #define SORT_BY_CH 1 #define SORT_BY_MA 2 #define SORT_BY_EN 3 //========================================================== // 函数功能:提示用户需要排序的科目并返回用户的输入 // 入口参数:无 // 返 回 值:用户选项,int型 //========================================================== int SelecOfSortBySbjct(void) { int Selec; puts(" Please input the subject <1-3> of sorted info according to :"); puts(" ----------------------------------------------------"); puts(" 1> Chinese 2> Math 3> English "); puts(" ----------------------------------------------------"); while( !( (scanf("%d", &Selec) == 1) && (Selec >= 1 && Selec <= 3) ) ) { IGNORE_2_END_OF_LINE(); puts(" Input Error! Please input the subject <1-3> of sorted info according to :"); } IGNORE_2_END_OF_LINE(); return Selec; } //========================================================== // 函数功能:按照用户选项进行排序 // 入口参数:subject:科目 // 返 回 值:无 //========================================================== void SortByTheSubject(int subject) { int i, j; StuInfom *tmp, **table; table = GetPtrStuTab(); // table指向(StuInfo *)型数组,该数组的每个元素指向一个学生节点 if (table ==NULL) { fputs(" Unknown Error!\n", stderr); } else { for ( i=0; i<SysDevMng.SumStu-1; i++ ) { for ( j=i+1; j<SysDevMng.SumStu; j++ ) { float score1 = 0.0, score2 = 0.0; if (subject == SORT_BY_CH ) { /* 按照语文成绩排名 */ score1 = table[i]->ChScore ; score2 = table[j]->ChScore ; //puts(" Sorted stu info by ChScore: "); } else if (subject == SORT_BY_MA ) { /* 按照数学成绩排名 */ score1 = table[i]->MaScore ; score2 = table[j]->MaScore ; //puts(" Sorted stu info by MaScore: "); } else { /* 按照英语成绩排名 */ score1 = table[i]->EnScore ; score2 = table[j]->EnScore ; //puts(" Sorted stu info by EnScore: "); } if ( FloatCmp( score1, score2 ) < 0 ) { // 注意,此处如果table[i]中学生总分小于table[j],则交换之。 tmp = table[i]; // 因为,一般按成绩排序时选择降序排列。 table[i] = table[j]; table[j] = tmp; } } } if (subject == SORT_BY_CH ) { /* 按照语文成绩排名 */ puts(" Sorted stu info by ChScore: "); } else if (subject == SORT_BY_MA ) { /* 按照数学成绩排名 */ puts(" Sorted stu info by MaScore: "); } else { /* 按照英语成绩排名 */ puts(" Sorted stu info by EnScore: "); } DispAllStuByPtrStuInfomTab(table, SysDevMng.SumStu); } free(table); } #define SortByChScore() SortByTheSubject( SORT_BY_CH ) #define SortByMaScore() SortByTheSubject( SORT_BY_MA ) #define SortByEnScore() SortByTheSubject( SORT_BY_EN ) //========================================================== // 函数功能:按照用户选项输出排序信息 // 入口参数:无 // 返 回 值:无 //========================================================== void SortBySbjct(void) { switch ( SelecOfSortBySbjct() ) { case SORT_BY_CH : // 按语文成绩 SortByChScore(); break; case SORT_BY_MA: // 按数学成绩 SortByMaScore(); break; case SORT_BY_EN: // 按英语成绩 SortByEnScore(); break; } } //============================================================================================================================ //============================================ 文件结束 ====================================================== //============================================================================================================================
试试其它关键字
学生管理系统
同语言下
.
获取手机通讯录 iOS去除数字以外的所有字符
.
异步加载音乐等资源
.
交通罚单管理系统
.
freemark实现,简单的替换
.
计算斐波那契数列
.
base64解码 包括解码长度
.
图像显示
.
冒泡排序
.
输入十进制数,输出指定进制
.
链式栈
可能有用的
.
C#实现的html内容截取
.
List 切割成几份 工具类
.
SQL查询 多列合并成一行用逗号隔开
.
一行一行读取txt的内容
.
C#动态修改文件夹名称(FSO实现,不移动文件)
.
c# 移动文件或文件夹
.
c#图片添加水印
.
Java PDF转换成图片并输出给前台展示
.
网站后台修改图片尺寸代码
.
处理大图片在缩略图时的展示
HarryAlex
贡献的其它代码
(
3
)
.
当前运行时
.
漂亮的页面加载效果以及表单占位符动画
.
学生管理系统
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3