实例介绍
【实例简介】
学习c语言使用链表,文件存储等功能进行项目开发。学生
【实例截图】
【核心代码】
/** * @author Shen * @description 学生管理系统 * @copyright 南京晓庄学院 * @time 2019-11-11 17:48 */ #include <stdio.h> #include <stdlib.h> #include <string.h> /* 学生结点 */ typedef struct _STU { char arrStuNum[10]; // 学号 char arrStuName[10]; // 姓名 float fStuScore; // 成绩 struct _STU *pNext; // 指针域 } STUNODE; // 声明链表的头和尾 STUNODE *g_pHead = NULL; STUNODE *g_pEnd = NULL; /* 函数声明 */ void menu(); // 添加一个学生 void AddStuMSG(char *cNum, char *cName, float fScore); // 清空链表 void FreeLinkData(); // 链表打印 void ShowStuData(); // 查找信息 void SearchStuData(char *); // 修改指定学生分数 void UpdateStuByName(char *cStuName, float fNewScore); // 删除指定学生信息 void DeleteStuByName(char *cStuName); // 保存到文件 void SaveInfoToFile(char *filePath, char *fileMode); // 从文件读取信息 void ReadInfoFromFile(char *filePath, char *fileMode); int main() { int iOrder = -1; int nFlag = 1; // 循环标记 char arrStuNum[10] = {'\0'}; // 学号 char arrStuName[10] = {'\0'}; // 姓名 float fStuScore = -1; // 成绩 menu(); while (nFlag) { printf("请选择系统指令(查看指令:8):"); // 输入系统指令 scanf("%d", &iOrder); switch (iOrder) { case 0: printf("正在退出系统\n"); getchar(); nFlag = 0; break; case 1: // 添加学生信息 printf("请输入学号: "); scanf("%s", arrStuNum); fflush(stdin); printf("请输入姓名: "); scanf("%s", arrStuName); fflush(stdin); printf("请输入分数:"); scanf("%f", &fStuScore); AddStuMSG(arrStuNum, arrStuName, fStuScore); getchar(); getchar(); break; case 2: printf("请输入学生姓名: "); // 查找指定学生信息(姓名/学好) scanf("%s", arrStuName); SearchStuData(arrStuName); getchar(); getchar(); break; case 3: // 修改指定学生信息 printf("请输入学生姓名: "); scanf("%s", arrStuName); printf("请输入学生成绩:"); scanf("%f", &fStuScore); UpdateStuByName(arrStuName, fStuScore); getchar(); getchar(); break; case 4: // TODO: 保存学生信息到文件 SaveInfoToFile("./stu.txt", "wb "); getchar(); getchar(); break; case 5: // 读取学生文件信息 ReadInfoFromFile("./stu.dat", "rb "); getchar(); getchar(); break; case 6: // 删除指定学生信息 printf("请输入学生姓名: "); scanf("%s", arrStuName); DeleteStuByName(arrStuName); getchar(); getchar(); break; case 7: // 显示所有学生信息 ShowStuData(); getchar(); getchar(); break; case 8: menu(); break; default: printf("输入指令不正确!\n"); getchar(); getchar(); break; } } SaveInfoToFile("./stu.dat", "wb "); // 释放链表 FreeLinkData(); system("clear"); return 0; } /** * @brief 打印菜单 */ void menu() { printf("************************学生管理系统********************************\n"); printf("************************本系统操作指令如下***************************\n"); printf("*** 1、增加一个学生信息 ***\n"); printf("*** 2、查找指定学生信息(姓名/学好) ***\n"); printf("*** 3、修改指定学生信息 ***\n"); printf("*** 4、保存学生信息到文件 ***\n"); printf("*** 5、读取学生文件信息 ***\n"); printf("*** 6、删除指定学生信息 ***\n"); printf("*** 7、恢复删除学生信息 ***\n"); printf("*** 8、菜单提示 ***\n"); printf("*** 0、退出系统 ***\n"); printf("*******************************************************************\n"); } /** * @brief 添加学生信息 */ void AddStuMSG(char *num, char *name, float score) { // 检验参数的合法性 if (NULL == num || NULL == name || score < 0) { return; } // 逻辑处理 // 创建一个结点 STUNODE *pTemp = (STUNODE *) malloc(sizeof(STUNODE)); strcpy(pTemp->arrStuNum, num); strcpy(pTemp->arrStuName, name); pTemp->fStuScore = score; pTemp->pNext = NULL; // 接链表 两种情况 头尾空 if (NULL == g_pHead) { g_pHead = pTemp; g_pEnd = pTemp; // 指针移动 } else { g_pEnd->pNext = pTemp; // 链接 g_pEnd = pTemp; // 指针移动 } } /** * @brief 清空链表 */ void FreeLinkData() { STUNODE *pTemp = g_pHead; while (g_pHead != NULL) { pTemp = g_pHead; // 链表移动 g_pHead = g_pHead->pNext; // 释放结点 free(pTemp); } printf("空间释放成功^_^...\n"); } /** * @brief 链表打印 */ void ShowStuData() { STUNODE *pMov = g_pHead; printf("*** 学号 *** *** 姓名 *** *** 分数 ***\n"); while (pMov != NULL) { printf(" %s %s %.2f \n", pMov->arrStuNum, pMov->arrStuName, pMov->fStuScore); pMov = pMov->pNext; } printf("打印结束^_^...\n"); } /** * @brief 查找信息 */ void SearchStuData(char *string) { if (NULL == string) { printf("参数不符合!\n"); return; } STUNODE *pMov = g_pHead; while (pMov != NULL) { if (strcmp(pMov->arrStuName, string) == 0 || strcmp(pMov->arrStuNum, string) == 0) { printf("*** 学号 *** *** 姓名 *** *** 分数 ***\n"); printf(" %s %s %.2f \n", pMov->arrStuNum, pMov->arrStuName, pMov->fStuScore); } pMov = pMov->pNext; } printf("搜索成功^_^...\n"); } /** * @brief 根据学生更新成绩 */ void UpdateStuByName(char *cStuName, float fNewScore) { if (NULL == cStuName || fNewScore < 0) { printf("输入参数不正确\n"); return; } // 定义辅助指针变量 STUNODE *pMov = g_pHead; while (pMov != NULL) { if (strcmp(pMov->arrStuName, cStuName) != 0) { pMov = pMov->pNext; } break; } // 判断当前pMov 是否为空 if (NULL == pMov) { printf("未找到学生信息,无法更改成绩\n"); return; } pMov->fStuScore = fNewScore; printf("更新成功^_^...\n"); } /** * @brief 删除指定学生结点 */ void DeleteStuByName(char *cStuName) { if (NULL == cStuName) { printf("输入参数不正确\n"); return; } // 定义辅助指针变量 STUNODE *pMov = g_pHead; STUNODE *pCurrent = pMov; while (pMov != NULL) { if (strcmp(pMov->arrStuName, cStuName) != 0) { pCurrent = pMov; pMov = pMov->pNext; } break; } // 判断当前pMov 是否为空 if (NULL == pMov) { printf("未找到学生信息,无法删除学生信息\n"); return; } pCurrent->pNext = pMov->pNext; free(pMov); pMov = NULL; // 进行删除 // 1.只有一个结点 // if (g_pHead == g_pEnd) // { // free(g_pHead); // g_pHead = NULL; // g_pEnd = NULL; // } // else if (g_pHead->pNext == g_pEnd) // { // if (pMov == g_pHead) // { // free(g_pHead); // g_pHead = g_pEnd; // g_pEnd->pNext = NULL; // } // else // { // free(g_pEnd); // g_pEnd = g_pHead; // g_pEnd->pNext = NULL; // } // } // 两个结点 // else // { // // 删除 // } printf("数据删除成功^_^...\n"); } /** * @brief 保存信息到文件 * @param filePath * @param fileMode */ void SaveInfoToFile(char *filePath, char *fileMode) { if (NULL == filePath || NULL == fileMode) { printf("保存参数存在问题\n"); return; } if (g_pHead == NULL) { printf("暂无数据,无需保存\n"); return; } STUNODE *pMov = g_pHead; FILE *fp = fopen(filePath, fileMode); if (NULL == fp) { fp = fopen(filePath, "wb "); } fprintf(fp, "学号\t\t姓名\t\t分数\r\n"); while (pMov != NULL) { fprintf(fp, "%s\t\t%s\t\t%f", pMov->arrStuNum, pMov->arrStuName, pMov->fStuScore); fprintf(fp,"\r\n"); pMov = pMov->pNext; } fclose(fp); } /** * @brief 从文件读取信息 * @param filePath * @param fileMode */ void ReadInfoFromFile(char *filePath, char *fileMode) { if (NULL == filePath || NULL == fileMode) { printf("保存参数存在问题\n"); return; } FILE *fp = fopen(filePath, fileMode); char num[10] = {'\0'}; char name[10] = {'\0'}; char score1[10] = {'\0'}; float score = -1; int flag; if (NULL == fp) { printf("文件打开失败\n"); return; } flag = fscanf(fp, "%s%s%s", num, name, score1); while (flag > 0) { // 清空 memset(num, 0, 10); memset(name, 0, 10); memset(score1, 0, 10); score = -1; // 数据读取 flag = fscanf(fp, "%s%s%f", num, name, &score); AddStuMSG(num, name, score); } fclose(fp); }
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论