c语言实现学生管理系统详解
目录
- infor.h
- test.c
- infor.c
该学生管理系统的实现是通过分文件的方式来写的,infor.h 文件为头文件,源文件infor.c实现源文件test.c中封装函数,建议 读者在做较大的系统是分文件来实现,可以提高代码的运行效率。 (该学生管理系统由b站鹏哥c语言通讯录视频改进而来)
infor.h
//头文件 实现引用函数头文件,定义常量,以及源文件中封装函数的声明
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<string.h> #include<stdlib.h> #include <windows.h> #define MAX_NAME 20 //都用define定义 为了后期的可改性 #define MAX_SEX 10 #define MAX_TELE 15 #define MAX_ADDR 30 #define begin 3 //初始开辟动态内存容量 #define add 2 //每次容满后增容数量 //#define MAX 1000 typedef struct Student //定义学生信息结构体变量 { char name[MAX_NAME]; char sex[MAX_SEX]; int age; char tele[MAX_TELE]; char addr[MAX_ADDR]; }Student; //typedef struct student //结构体套结构体 //{ // Student data[MAX]; //存放添加进来的个人信息 // int sz; //记录当前系统中有效信息个数 //}student; typedef struct student //结构体嵌套结构体 { Student*data; //指向动态申请空间,用来存放个人信息 int sz; //记录当前系统中有效信息个数 int capacity; //记录当前通讯录最大容量 }student; void Initstudent(student*pc);//初始化结构体 void ADDstudent(student* pc);//增加学生信息 void PRINTstudent(student* pc);//浏览学生信息 void SEARCHstudent(student* pc);//查找学生信息 void MODIFYstudent(student* pc);//修改学生信息 void DELETEstudent(student* pc);//删除学生信息 void DESETORYstudent(student* pc);//销毁学生信息
test.c
//主文件的测试 该文件为实现学生管理系统的核心
#define _CRT_SECURE_NO_WARNINGS 1 #include"infor.h" //注意分文件写时 源文件中都需要引用头文件 void menu() { system("color fc"); printf("\n"); printf("\n"); printf("\n"); printf(" ***********郑州轻工业大学学生信息管理系统************\n"); printf(" *-------0.退出 1.增加学生信息-------*\n"); printf(" *-------2.浏览学生信息 3.查找学生信息-------*\n"); printf(" *-------4.修改学生信息 5.删除学生信息-------*\n"); printf(" *****************************************************\n"); printf("\n"); printf("\n"); printf("\n"); } enum option { //通过枚举常量,使得主函数中的switch语句更明了的实现不同的功能 EXIT, ADD, PRINT, SEARCH, MODIFY, Delete }; int main() { int input = 0; student stu; Initstudent(&stu); //结构体数组的初始化 do { menu(); printf("请选择:>\n"); scanf("%d", &input); switch(input) //封装多个函数实现多个功能 { //函数的声明位于头文件中,实现在infor.c中实现 case EXIT: DESETORYstudent(&stu); printf("退出系统\n"); break; case ADD: ADDstudent(&stu); break; case PRINT: PRINTstudent(&stu); break; case SEARCH: SEARCHstudent(&stu); break; case MODIFY: MODIFYstudent(&stu); break; case Delete: DELETEstudent(&stu); break; default: printf("选择错误,重新选择\n"); break; } } while (input); return 0; }
infor.c
//该文件为test.c中封装函数的实现
#define _CRT_SECURE_NO_WARNINGS 1 #include"infor.h" //静态 //void Initstudent(student* pc) //{ // pc->sz = 0; // memset(pc->data, 0, sizeof(pc->data));//memset()内存设置 使整个结构体数组初始化 //} //动态 void Initstudent(student* pc) { //指针data维护开辟的动态内存空间 calloc初始化开辟空间 pc->data = (Student*)calloc(begin,sizeof(Student)); pc->sz = 0; //sz为有效信息个数 pc->capacity = begin; //定义目前容量为初始容量 } void ADDstudent(student* pc) { if (pc->sz == pc->capacity) //容量满了完成增容 { Student* ptr = (Student*)realloc(pc->data, (pc->capacity + add)*sizeof(Student)); if (ptr != NULL) { pc->data = ptr; pc->capacity += add; printf("~~~增容成功~~~\n"); } else { perror("ADDstudent");//失败报错 printf("增加联系人失败\n"); return; } } //增加一个人的信息 printf("请输入姓名:\n"); scanf("%s", pc->data[pc->sz].name); printf("请输入性别:\n"); scanf("%s", pc->data[pc->sz].sex); printf("请输入年龄:\n"); scanf("%d", &(pc->data[pc->sz].age)); printf("请输入电话:\n"); scanf("%s", pc->data[pc->sz].tele); printf("请输入地址:\n"); scanf("%s", pc->data[pc->sz].addr); pc->sz++; printf("增加成功\n"); } void DESETORYstudent(student* pc) //销毁个人信息 { free(pc->data); //释放内存 pc->data = NULL; //回归为0 pc->capacity = 0; pc->sz = 0; } //void ADDstudent(student* pc) //{ // if (pc->sz == MAX) // { // printf("通讯录已满,无法添加\n"); // return; // } // //增加一个人的信息 // printf("请输入姓名:\n"); // scanf("%s", pc->data[pc->sz].name); // printf("请输入性别:\n"); // scanf("%s", pc->data[pc->sz].sex); // printf("请输入年龄:\n"); // scanf("%d", &(pc->data[pc->sz].age)); // printf("请输入电话:\n"); // scanf("%s", pc->data[pc->sz].tele); // printf("请输入地址:\n"); // scanf("%s", pc->data[pc->sz].addr); // pc->sz++; // printf("增加成功\n"); //} void PRINTstudent(student* pc) { int i = 0; printf("%-10s%-10s%-10s%-15s%-30s\n", "姓名", "性别", "年龄", "电话", "地址"); for (i = 0; i < pc->sz; i++) { printf("%-10s%-10s%-10d%-15s%-30s\n", pc->data[i].name, pc->data[i].sex, pc->data[i].age, pc->data[i].tele, pc->data[i].addr ); } } static int Findbyname(student* pc, char name[]) //通过名字来查找学生 stadic静态局部变量 该函数只在本文件中应用 保护该函数 { int i = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(pc->data[i].name, name) == 0) //利用strcmp函数的返回值判断是否找到了该人 { return i; //找到了就返回学生信息的角标 } } return -1; //没找到 } void SEARCHstudent(student* pc) { char name[MAX_NAME] = { 0 }; printf("请输入要查找学生姓名:\n"); scanf("%s", name); int end = Findbyname(pc, name); if (end == -1) { printf("你所要查找的人不存在"); } else { printf("%-10s%-10s%-10s%-15s%-30s\n", "姓名", "性别", "年龄", "电话", "地址"); printf("%-10s%-10s%-10d%-15s%-30s\n", //Findbuname函数如果找到对应学生,返回对应下标,输出对应下标学生信息 pc->data[end].name, pc->data[end].sex, pc->data[end].age, pc->data[end].tele, pc->data[end].addr ); } } void MODIFYstudent(student* pc) { char name[MAX_NAME] = { 0 }; printf("请输入要修改学生信息的学生姓名:\n"); scanf("%s", name); int end = Findbyname(pc, name); if (end == -1) { printf("你所要修改学生信息的人不存在"); } else { printf("请输入性别:\n"); scanf("%s", pc->data[end].sex); printf("请输入年龄:\n"); scanf("%d", &(pc->data[end].age)); printf("请输入电话:\n"); scanf("%s", pc->data[end].tele); printf("请输入地址:\n"); scanf("%s", pc->data[end].addr); printf("修改成功\n"); } } void DELETEstudent(student* pc) { char name[MAX_NAME] = { 0 }; printf("请输入要删除学生信息的学生姓名:\n"); scanf("%s", name); int end = Findbyname(pc, name); if (end == -1) { printf("你所要删除学生信息的人不存在"); } int i = 0; for (i = end; i < pc->sz - 1; i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("删除成功"); }
赞 (0)