赶集网网站建设费用千库网素材

当前位置: 首页 > news >正文

赶集网网站建设费用,千库网素材,设计软件名称,百度 竞价排名绪论#xff1a; 本篇文章使结构体章节后的习题#xff0c;如果你对C语言有问题#xff0c;或者结构体有什么问题不妨看看我之前所写的文章#xff08;章回体#xff09;,对于文件管理和内存分配问题我将在后面补上#xff0c;对于这个学生信息管理系统我用了多种方法和…绪论 本篇文章使结构体章节后的习题如果你对C语言有问题或者结构体有什么问题不妨看看我之前所写的文章章回体,对于文件管理和内存分配问题我将在后面补上对于这个学生信息管理系统我用了多种方法和分源管理的形式来写可能内容偏多但都有着重大意义可以自行对我的源码进行copy和删减一些用了多种方法的地方当然直接用也是没什么问题的。 附红色部分为重点部分蓝颜色为需要记忆的部分不是死记硬背哈多敲黑色加粗或者其余颜色为次重点黑色为描述需要 思维导图 要XMind思维导图的话可以私信哈 逐步实现的目录 1.界面的创建、和功能的选择 1.1分源管理 1.1.1在主函数内 1.1.3在contact.h 1.1.2在contact.c 2.功能的实现 2.1分源管理 2.1.1在主函数内 2.1.2在contact.h 2.1.3在contact.c 3.文件的保存、和文件的调用 3.1分源管理         3.1.1在主函数内         3.1.2在contact.c         3.1.3在contact.h 补充 对于分源管理这样做的原因是可以将这个程序的实现分开来实现主函数放在了test.c中这里就像一个枢纽主干来选择功能而contact.c 中放着的是这些主干后的分支他代表着所要实现的功能的具体代码而contact.h头文件这里存放着一些在test.c 和 contact.c 同时需要用到的东西如头文件的应用、#define 定义的常量 、以及函数的声明 、这样只需在.c(源文件)中引用#includecontact 即可包含该文件中的内容 下面先上源码 test.c: #define _CRT_SECURE_NO_WARNINGS 1#includecontact.henum function {Exit 0,Add,Del,Search,Modeify,Show,Sort,Refresh };void menu() {printf(*****************************\n);printf(**************************\n);printf(** 1. Add 2.Del **\n);printf(**************************\n);printf(** 3.Search 4.Modeify **\n);printf(**************************\n);printf(** 5.Show 6.Sort **\n);printf(**************************\n);printf(** 7.refresh 0.exit **\n);printf(**************************\n);printf(***************************\n);//1添加学生信息//2删除学生信息//3查询学生信息//4修改学生信息//5展示所有学生信息//6重新排序学生信息//7刷新学生信息 }int main() {int input 0;Info_System con ; //初始化InitCon(con);//初始化方法二Info_System con {0};直接将全部置成0do{menu();printf(请选择:);scanf(%d, input);switch(input){case Add:Add_Stu_message(con);break;case Del:Del_Stu_message(con);break;case Search:Search_Stu_message(con);break;case Modeify:Modeifyh_Stu_message(con);break;case Show:Show_Stu_message(con);break;case Sort:Sort_Stu_message(con);break;case Refresh:Refresh_Stu_message(con);break;case Exit:printf(退出\n);break;default:printf(选择错误重新选择\n);break;}} while (input);return 0; } contact.h: #pragma once#includestdio.h #includestring.h #includestdlib.h #includeassert.h#define Name_Max 20 #define Sex_Max 5 #define Class_Max 20 #define Room_Max 20#define PeoMax 100typedef struct PeoInfo {int ID;// 学号char Name[Name_Max];// 姓名char Sex[Sex_Max];// 性别char Class[Class_Max];// 班级char Room[Room_Max];// 宿舍号int Score;// 成绩}PeoInfo;typedef struct management_System {PeoInfo Contact[PeoMax];//存放人的信息int sz;//已近存放了多少个人}Info_System;void InitCon(Info_System con);void Add_Stu_message(Info_System con);void Show_Stu_message(const Info_System* con);void Del_Stu_message (Info_System* con);void Search_Stu_message(const Info_System* con);void Modeifyh_Stu_message(Info_System* con);void Sort_Stu_message(Info_System* con);void Refresh_Stu_message(Info_System* con); contact.c: #define _CRT_SECURE_NO_WARNINGS 1#includecontact.h//初始化 void InitCon(Info_System* con) {assert(con);con-sz 0;memset(con-Contact, 0, sizeof(Info_System));//利用memset将一块连续的空间初始化成0最后要初始化多少个字节 }int FindById(int Id, const Info_System* con) {int t con-sz;//不要改变sz用t来代替需要查找的人while (t–){if (Id con-Contact[t].ID){return t;}}printf(找不到此人\n);return -1 ;//返回-1是因为区别于返回0返回0表示查找的人的下标为0 } int FindByName(char * name,const Info_System* con) {int t con-sz;//不要改变sz用t来代替需要查找的人while (t–){if (strcmp(name, con-Contact[t].Name) 0)//–ret 是因为ret表示的是总人数而总人数-1才能找到最后一个人{return t;}}printf(找不到此人\n);return -1;//返回-1是因为区别于返回0返回0表示查找的人的下标为0 }//增加 void Add_Stu_message(Info_System* con) {assert(con);if (con-sz PeoMax){printf(信息已满,请删除或刷新后再试\n);return;}printf(依次输入学号 名字 班级 性别 宿舍 计算机成绩\n并且以空格/回车分隔\n);scanf(%d %s %s %s %s %d, con-Contact[con-sz].ID,con-Contact[con-sz].Name,con-Contact[con-sz].Class,con-Contact[con-sz].Sex,con-Contact[con-sz].Room,con-Contact[con-sz].Score);con-sz 1;//con-sz;printf(添加完成\n); }void Show_Stu_message(const Info_System* con) {assert(con);printf(%-10s %-20s %-20s %-5s %-20s %-10s\n, 学号, 名字, 班级, 性别, 宿舍, 计算机成绩);for (int i 0; i con-sz;i)//解引用操作符的优先级都很最高{printf(%-10d %-20s %-20s %-5s %-20s %-10d\n, con-Contact[i].ID,con-Contact[i].Name,con-Contact[i].Class,con-Contact[i].Sex,con-Contact[i].Room,con-Contact[i].Score);}}void Del_Stu_message(Info_System* con) {assert(con);if (con-sz 0){printf(没有学生信息\n);return;}int input 0;printf(输入学号进行删除);scanf(%d, input);int ret FindById(input,con);if (ret ! -1){for (ret; ret con- sz - 1; ret) //sz -1 也要转化成下标{con-Contact[ret] con-Contact[ret1]; //注意返回的就是所对应的下标}con-sz–;printf(删除成功\n);}//if (ret!-1)//{// memmove(con-Contact ret, con-Contact ret 1, (con-sz)*sizeof(PeoInfo) - (ret) * sizeof(PeoInfo));// con-sz–;// printf(删除成功\n);//}}void Search_Stu_message(const Info_System* con) {assert(con);int i 0;printf(1.Id\n2.Name\n选择查找方法);scanf(%d, i);if (i 1){int input 0;printf(输入学号进行查找:);scanf(%d, input);int ret FindById(input, con);if (ret ! -1){printf(%-10s %-20s %-20s %-5s %-20s %-10s\n, 学号, 名字, 班级, 性别, 宿舍, 计算机成绩);printf(%-10d %-20s %-20s %-5s %-20s %-10d\n, con-Contact[ret].ID,con-Contact[ret].Name,con-Contact[ret].Class,con-Contact[ret].Sex,con-Contact[ret].Room,con-Contact[ret].Score);}}else if (i 2){char name[20] { 0 };printf(输入姓名进行查找:);scanf(%s,name);int ret FindByName(name, con);if (ret ! -1){printf(%-10s %-20s %-20s %-5s %-20s %-10s\n, 学号, 名字, 班级, 性别, 宿舍, 计算机成绩);printf(%-10d %-20s %-20s %-5s %-20s %-10d\n, con-Contact[ret].ID,con-Contact[ret].Name,con-Contact[ret].Class,con-Contact[ret].Sex,con-Contact[ret].Room,con-Contact[ret].Score);}}else{printf(选择错误\n);}}void Modeifyh_Stu_message(Info_System* con) {assert(con);int i 0;printf(1.Id\n2.Name\n选择查找方法);scanf(%d, i);if (i 1){int input 0;printf(输入要修改的学生信息的学号:);scanf(%d, input);int ret FindById(input, con);if (ret ! -1){printf(修改\n);printf(依次输入学号 名字 班级 性别 宿舍 计算机成绩\n并且以空格/回车分隔\n);scanf(%d %s %s %s %s %d, con-Contact[ret].ID,con-Contact[ret].Name,con-Contact[ret].Class,con-Contact[ret].Sex,con-Contact[ret].Room,con-Contact[ret].Score);printf(修改完成\n);}}else if (i 2){char name[20] { 0 };printf(输入要修改的学生信息的姓名:);scanf(%s, name);int ret FindByName(name, con);if (ret ! -1){printf(修改\n);printf(依次输入学号 名字 班级 性别 宿舍 计算机成绩\n并且以空格/回车分隔\n);scanf(%d %s %s %s %s %d, con-Contact[ret].ID,con-Contact[ret].Name,con-Contact[ret].Class,con-Contact[ret].Sex,con-Contact[ret].Room,con-Contact[ret].Score);printf(修改完成\n);}}else{printf(选择错误\n);} }int Sort_Name(const void* e1, const void* e2) {return strcmp(((PeoInfo)e1)-Name, ((PeoInfo)e2)-Name);}int Sort_age(const void* e1, const void* e2) {return ((PeoInfo)e1)-ID - ((PeoInfo)e2)-ID; } void Sort_Stu_message(Info_System* con) {assert(con);int input 0;printf(1.以名字排序\n2.以学号排序\n);scanf(%d, input);switch (input){case 1:qsort(con-Contact, con-sz, sizeof(con-Contact[0]), Sort_Name);printf(排序成功\n);break;case 2:qsort(con-Contact, con-sz, sizeof(con-Contact[0]), Sort_age);printf(排序成功\n);break;default:printf(输入错误\n);break;} }void Refresh_Stu_message(Info_System* con) {InitCon(con);printf(刷新成功\n); } 1.界面的创建、和功能的选择 1.1分源管理 1.1.1在主函数内 创建目录界面在main函数内创建一个目录函数 int main() {menu();retrn 0; } 直接通过打印的方法打印出自己所想要的目录界面 void menu() {printf(***************************\n);printf(**************************\n);printf(** 1. Add 2.Del **\n);printf(**************************\n);printf(** 3.Search 4.Modeify **\n);printf(**************************\n);printf(** 5.Show 6.Sort **\n);printf(**************************\n);printf(** 7.refresh 0.exit **\n);printf(**************************\n);printf(****************************\n);//1添加学生信息//2删除学生信息//3查询学生信息//4修改学生信息//5展示所有学生信息//6重新排序学生信息//7刷新学生信息 } 创建选择功能,通过dowhile循环来不断的进行选择并且通过switch语句来控制所选择功能   int main() {int input 0;do{printf(请选择:);scanf(%d, input);switch(input){case Add:Add_Stu_message(con);break;case Del:Del_Stu_message(con);break;case Search:Search_Stu_message(con);break;case Modeify:Modeifyh_Stu_message(con);break;case Show:Show_Stu_message(con);break;case Sort:Sort_Stu_message(con);break;case Refresh:Refresh_Stu_message(con);break;case Exit:printf(退出\n);break;default:printf(选择错误重新选择\n);break;}} while (input);return 0; } 1.1.3在contact.h 创建一个结构体存放学生的信息一个学生的信息可能有   学号、姓名、性别、班级、宿舍、成绩 所以我们可以用一个结构体来存并且用typedef来将复杂的名字简化 typedef struct PeoInfo {int ID;// 学号char Name[Name_Max];// 姓名char Sex[Sex_Max];// 性别char Class[Class_Max];// 班级char Room[Room_Max];// 宿舍号int Score;// 成绩}PeoInfo; 再创建一个结构体来存放每个学生(用数组)以及再通过计数器来计存了几个学生了同样用到typedef来简化 typedef struct management_System {PeoInfo Contact[PeoMax];//存放人的信息int sz;//已近存放了多少个人}Info_System; 1.1.2在contact.c 初始化学生信息对于已经创建好的结构体他们此时还是一些随机值需要初始化 所以写一个初始化函数来进行初始化 void InitCon(Info_System con) {assert(con);con-sz 0;memset(con-Contact, 0, sizeof(Info_System));//利用memset将一块连续的空间初始化成0最后要初始化多少个字节 }其中有到了memset来直接对其初始化  第一个元素放目标地址第二个元素表示要放东西的整形形式如0 - 0 ;而 a - 97第三个元素表示这个目标的大小(byte)具体用法可以看这篇博客进阶C语言第三章——-《字符函数和内存函数》 完整思维导图基本练习题深入细节通俗易懂知识点建议收藏_溟洵的博客-CSDN博客 附首先对于这些进行解释他是通过枚举的办法实现的具体可以看看我写的一篇关于自定义类型的blog其次是对这个的解释 这是引用contact.h头文件包含其里面的内容函数的头文件和函数声明 2.功能的实现   2.1分源管理 2.1.1在主函数内 通过目录的选择后进入功能内部 2.1.2在contact.h 2.1.3在contact.c 添加学生信息 对于下面的scanf操作我们需要引用并且存进结构体中 对于数组来说不需要加上  因为其数组名表示其地址 而对于整形就需要了 先从con这是Info_System结构体的变量所以通过-访问其里面的成员Contact而其又是PeoInfo结构体的数组变量所以就可以通过访问数组空间再用.操作符来找到学生的信息 这里不用- 是因为前面con-Contact[con-sz] 已经表示成Contact[PeoMax]结构体变量了不需要在解引用了  void Add_Stu_message(Info_System con) { assert(con); if (con-sz PeoMax) {printf(信息已满,请删除或刷新后再试\n);return; } printf(依次输入%s %s %s %s %s %s\n, 学号, 名字, 班级, 性别, 宿舍, 计算机成绩); scanf(%d %s %s %s %s %d,
con-Contact[con-sz].ID,
con-Contact[con-sz].Name,
con-Contact[con-sz].Class,
con-Contact[con-sz].Sex,
con-Contact[con-sz].Room,
con-Contact[con-sz].Score ); printf(添加完成\n); } 展示学生信息 void Show_Stu_message(Info_System* con) {assert(con);printf(%-10s %-20s %-20s %-5s %-20s %-10s\n, 学号, 名字, 班级, 性别, 宿舍, 计算机成绩);for (int i 0; i con-sz;i){printf(%-10d %-20s %-20s %-5s %-20s %-10d\n,con-Contact[i].ID,con-Contact[i].Name,con-Contact[i].Class,con-Contact[i].Sex,con-Contact[i].Room,con-Contact[i].Score);} } 对于printf打印只需要满足所给条件%d和所写条件(con-Contact[i].ID)对应的类型一致即可。 删除学生信息 void Del_Stu_message(Info_System* con) {assert(con);if (con-sz 0){printf(没有学生信息\n);return;}int input 0;printf(输入学号进行删除);scanf(%d, input);int ret FindById(input,con);if (ret ! -1){for (ret; ret con- sz - 1; ret) //sz -1 也要转化成下标{con-Contact[ret] con-Contact[ret1]; //注意返回的就是所对应的下标}con-sz–;printf(删除成功\n);}//if (ret!-1)//{// memmove(con-Contact ret, con-Contact ret 1, (con-sz)*sizeof(PeoInfo) - (ret) * sizeof(PeoInfo));// con-sz–;// printf(删除成功\n);//}} 查找函数 int FindByName(char * name,const Info_System* con) {int t con-sz;//不要改变sz用t来代替需要查找的人while (t–){if (strcmp(name, con-Contact[t].Name) 0)//–ret 是因为ret表示的是总人数而总人数-1才能找到最后一个人{return t;}}printf(找不到此人\n);return -1;//返回-1是因为区别于返回0返回0表示查找的人的下标为0 } int FindById(int Id, const Info_System* con) {int t con-sz;//不要改变sz用t来代替需要查找的人while (t–){if (Id con-Contact[t].ID){return t;}}printf(找不到此人\n);return -1 ;//返回-1是因为区别于返回0返回0表示查找的人的下标为0 } 查找学生信息 void Search_Stu_message(const Info_System* con) {assert(con);int i 0;printf(1.Id\n2.Name\n选择查找方法);scanf(%d, i);if (i 1){int input 0;printf(输入学号进行查找:);scanf(%d, input);int ret FindById(input, con);if (ret ! -1){printf(%-10s %-20s %-20s %-5s %-20s %-10s\n, 学号, 名字, 班级, 性别, 宿舍, 计算机成绩);printf(%-10d %-20s %-20s %-5s %-20s %-10d\n, con-Contact[ret].ID,con-Contact[ret].Name,con-Contact[ret].Class,con-Contact[ret].Sex,con-Contact[ret].Room,con-Contact[ret].Score);}}else if (i 2){char name[20] { 0 };printf(输入姓名进行查找:);scanf(%s,name);int ret FindByName(name, con);if (ret ! -1){printf(%-10s %-20s %-20s %-5s %-20s %-10s\n, 学号, 名字, 班级, 性别, 宿舍, 计算机成绩);printf(%-10d %-20s %-20s %-5s %-20s %-10d\n, con-Contact[ret].ID,con-Contact[ret].Name,con-Contact[ret].Class,con-Contact[ret].Sex,con-Contact[ret].Room,con-Contact[ret].Score);}}else{printf(选择错误\n);}} 修改学生信息 void Modeifyh_Stu_message(Info_System* con) {int i 0;printf(1.Id\n2.Name\n选择查找方法);scanf(%d, i);if (i 1){int input 0;printf(输入要修改的学生信息的学号:);scanf(%d, input);int ret FindById(input, con);if (ret ! -1){printf(原信息:\n%-10s %-20s %-20s %-5s %-20s %-10s\n, 学号, 名字, 班级, 性别, 宿舍, 计算机成绩);printf(%-10d %-20s %-20s %-5s %-20s %-10d\n, con-Contact[ret].ID,con-Contact[ret].Name,con-Contact[ret].Class,con-Contact[ret].Sex,con-Contact[ret].Room,con-Contact[ret].Score);printf(修改\n);printf(依次输入学号 名字 班级 性别 宿舍 计算机成绩\n并且以空格/回车分隔\n);scanf(%d %s %s %s %s %d, con-Contact[ret].ID,con-Contact[ret].Name,con-Contact[ret].Class,con-Contact[ret].Sex,con-Contact[ret].Room,con-Contact[ret].Score);}}else if (i 2){char name[20] { 0 };printf(输入要修改的学生信息的姓名:);scanf(%s, name);int ret FindByName(name, con);if (ret ! -1){printf(原信息:\n%-10s %-20s %-20s %-5s %-20s %-10s\n, 学号, 名字, 班级, 性别, 宿舍, 计算机成绩);printf(%-10d %-20s %-20s %-5s %-20s %-10d\n, con-Contact[ret].ID,con-Contact[ret].Name,con-Contact[ret].Class,con-Contact[ret].Sex,con-Contact[ret].Room,con-Contact[ret].Score);printf(修改\n);printf(依次输入学号 名字 班级 性别 宿舍 计算机成绩\n并且以空格/回车分隔\n);scanf(%d %s %s %s %s %d, con-Contact[ret].ID,con-Contact[ret].Name,con-Contact[ret].Class,con-Contact[ret].Sex,con-Contact[ret].Room,con-Contact[ret].Score);}}else{printf(选择错误\n);} } 排序学生信息 int Sort_Name(const void* e1, const void* e2) {return strcmp(((PeoInfo)e1)-Name, ((PeoInfo)e2)-Name);//注意强转要写成 PeoInfo* 结构体类型//返回大于0的数才交换即是升序形式 }int Sort_age(const void* e1, const void* e2) {return ((PeoInfo)e1)-ID - ((PeoInfo)e2)-ID; } void Sort_Stu_message(Info_System* con) {assert(con);int input 0;printf(1.以名字排序\n2.以学号排序\n);scanf(%d, input);switch (input){case 1://ASCII升序qsort(con-Contact, con-sz, sizeof(con-Contact[0]), Sort_Name);//头文件stdlib比较函数int compareconst void *elem1, const void elem2//此处con-Contact 直接找到了数组名传进去所以qsort内所接受到的结构体时PeoInfo类型的printf(排序成功\n);break;case 2://升序qsort(con-Contact, con-sz, sizeof(con-Contact[0]), Sort_age);printf(排序成功\n);break;default:printf(输入错误\n);break;} } 刷新学生信息   void Refresh_Stu_message(Info_System con) {InitCon(con);//直接再次调用初始化函数printf(刷新成功\n); }3.文件的保存、和文件的调用 3.1分源管理          3.1.1在主函数内          3.1.2在contact.c         3.1.3在contact.h 敬请期待持续更新关注喔老铁