日记大全

日记大全 > 句子大全

学生信息管理系统(C语言 带文件操作)

句子大全 2017-05-26 15:22:15
相关推荐

前情提示

这是本人大一的C语言程序设计的结课设计作业,由于这段时间一直在学习Java,C语言很久没学了,所以在CSDN上找了很多代码,经过对比最终发现博客C语言 学生成绩管理系统 控制台 文件操作(未涉及数据库)最符合我的需求,然后对这个程序进行了一些修改,于是我的结课设计就诞生了

程序简介

本程序设计具有学生信息的输入、显示、查询、更新、删除、保存等功能,利用清屏函数使操作界面简洁美观,易于操作。程序用了指针、结构体、链表等知识点。运用菜单实现交互式管理,用户轻松的按键即可实现对软件的操作,操作简单易懂,功能丰富,可以很好的满足需要

流程图

源程序函数目录

源代码

#include<stdio.h>#include<stdlib.h>#include<string.h>#define max 100 //数组定义统一大小int g = 0; //全局变量,为登录时输入密码次数int student_number = 5; //全局变量,student_number为学生的人数struct user //定义一个结构体,存储用户登录账号和密码,并初始化五个管理员的信息{ char username[20]; char password[20];}user[5] = { { "蒋超", "1450824311"}, { "李佳树", "2041775273"}, { "刘英杰", "395636706"}, { "胡友亮", "924056026"}, { "黄家杨", "2946644844"}};struct student //定义结构体,包含学生信息,并初始化五个学生的信息 { char name[max]; //姓名 char num[max]; //学号 char sex[max]; //性别 int chinese; //语文成绩 int mathematic; //数学成绩 int english; //英语成绩 int computer; //计算机成绩}s[5] = { { "蒋超", "00001", "boy", 80,90,80,90}, { "李佳树", "00002", "boy", 60,80,90,50}, { "黄家杨", "00003", "girl", 85,65,75,90}, { "胡友亮", "00004", "boy", 55,65,75,80}, { "刘英杰", "00005", "girl", 90,95,98,99}};struct student* p; //定义一个结构体指针//主菜单函数声明void login(); //登入函数void main_menu(); //主界面函数void input_record(); //输入学生成绩处理 1void show_record(); //显示学生成绩处理 2 void search_record(); //查询学生成绩处理 3void change_record(); //更新学生成绩处理 4void delete_record(); //删除学生信息 5void calc_record(); //计算成绩处理 6void save_record(); //保存处理 7void exit_record(); //退出 8//查询子函数声明void search_by_num(); //学号查询void search_by_name(); //姓名查询void search_by_sex(); //性别查询void search_by_exit(); //返回上一级//计算子函数声明void calc_sum(); //计算总成绩void calc_ave(); //计算平均成绩void calc_eixt(); //返回上一级//自定义函数void print_table(); //表头void print_table_sum(); //总成绩表格void print_table_ave(); //平均分表格void read(); //将文件中的数据读入到结构体数组中int main() //*主函数{ login(); //首先进行管理员登录 main_menu(); //登录成功后显示主界面 return 0;}void login() //登录函数,管理员使用该系统前需进行登录,定义密码只允许输错三次 { int i; char id[20], password[20]; printf("****登录界面****\n"); printf("请输入账号名:"); scanf("%s", id); printf("请输入密码:"); scanf("%s", password); for (i = 0; i < 5; i++) //遍历五个管理员的信息,如果输入的信息在初始化的信息中存在则登录成功 { if (strcmp(id, user[i].username) == 0 && strcmp(password, user[i].password) == 0) { printf("登录成功!\n"); system("cls"); //清屏函数 main_menu(); //登录成功,打印主界面 break; } } if (i == 5) //遍历完一轮管理员信息,此时i=5且未找到符合的管理员信息,说明账号密码输入错误 { system("cls"); printf("登录失败!\n\n"); g++; //有三次登录机会,每次登录都遍历一次user结构体 if (g >= 3) //若三次机会都用完,则退出系统 { printf("你已经输错三次,将自动退出系统\n"); exit(1); } else { login(); //否则,登陆成功,进入主界面 } }}void main_menu() //展示主菜单,并对用户的请求做出对应响应 { read(); //将文件中的学生信息读取到链表中 system("cls"); //清屏函数 int x; //主菜单 printf("*************************************************\n"); printf("*\t欢迎使用高校学生成绩管理系统V2.0\t*\n"); printf("*************************************************\n"); printf("*\t\t1.输入学生信息\t\t\t*\n"); printf("*\t\t2.显示学生信息\t\t\t*\n"); printf("*\t\t3.查询学生信息\t\t\t*\n"); printf("*\t\t4.更新学生信息\t\t\t*\n"); printf("*\t\t5.删除学生信息\t\t\t*\n"); printf("*\t\t6.计算学生成绩\t\t\t*\n"); printf("*\t\t7.保存\t\t\t\t*\n"); printf("*\t\t8.退出系统\t\t\t*\n"); printf("*************************************************\n"); printf("请输入你要执行的操作:"); scanf("%d", &x); if (x == 1) input_record(); //输入信息 if (x == 2) show_record(); //显示信息 if (x == 3) search_record(); //查询信息 if (x == 4) change_record(); //更新信息 if (x == 5) delete_record(); //删除信息 if (x == 6) calc_record(); //计算成绩 if (x == 7) save_record(); //保存 if (x == 8) exit_record(); //退出 else { printf("输入错误,即将重新进入主界面\n"); main_menu(); }}void input_record() //输入学生成绩函数 1{ //定义两个char类型变量来获取用户的输入 char v, z; //在开头位置做一个标记 aa: { system("cls"); //清屏函数 printf("请输入学生姓名:"); scanf("%s", s[student_number].name); printf("请输入学生学号(五位):"); scanf("%s", s[student_number].num); printf("请输入学生性别(boy/girl):"); scanf("%s", s[student_number].sex); printf("请输入学生语文成绩:"); scanf("%d", &s[student_number].chinese); printf("请输入学生数学成绩:"); scanf("%d", &s[student_number].mathematic); printf("请输入学生英语成绩:"); scanf("%d", &s[student_number].english); printf("请输入学生计算机成绩:"); scanf("%d", &s[student_number].computer); printf("请选择是否保存(y或n):"); scanf("%s", &z); if (z == "y") //若输入为y,则保存信息到文件中 { student_number++; save_record(); } printf("是否继续添加,请选择(y或n)(否会回到主界面):"); scanf("%s", &v); if (v == "y") //若输入为y,则跳转至开头标记aa处 { goto aa; } else { main_menu(); } }}void show_record() //显示学生信息函数 2 { system("cls"); //清屏函数 int i, k, x; char get; x = student_number; print_table(); //打印表头 for (i = 0; i < x; i++) //打印表格数据 { printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|\n", s[i].name, s[i].num, s[i].sex, s[i].chinese, s[i].mathematic, s[i].english, s[i].computer); } printf("\n1.返回主界面\n2.返回上一级\n"); printf("请输入:"); scanf("%d", &k); if (k == 1) { main_menu(); } else if (k == 2) { main_menu(); }}void search_record() //查询学生成绩函数 3{ system("cls"); //清屏函数 int x; //打印菜单 printf("1 按学号查询\n"); printf("2 按姓名查询\n"); printf("3 按性别查询\n"); printf("4 返回上一级\n"); printf("请输入:"); scanf("%d", &x); if (x == 1) search_by_num(); //按学号查询函数 if (x == 2) search_by_name(); //按姓名查询函数 if (x == 3) search_by_sex(); //按性别查询查询 if (x == 4) search_by_exit(); //返回主界面 else { printf("输入错误\n"); search_record(); //重新查询 }}void print_table() //打印学生信息表格的表头函数 { printf("+----------+----------+----------+------+------+------+------+\n"); printf("| 姓名 | 学号 | 性别 | 语文 | 数学 | 英语 |计算机|\n"); printf("+----------+----------+----------+------+------+------+------+\n");}void search_by_num() //查询学生信息函数的子函数——按学号查询函数 { int i, k; char num1[max]; //用户输入学生学号 system("cls"); //清屏函数 printf("请输入要查找的学号:"); scanf("%s", num1); for (i = 0; i < student_number; i++) //遍历链表,寻找是该学号是否存在 { if (strcmp(num1, s[i].num) == 0) { print_table(); printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|\n", s[i].name, s[i].num, s[i].sex, s[i].chinese, s[i].mathematic, s[i].english, s[i].computer); break; } } if (i == student_number) //student_number为全局变量学生的人数 { printf("不存在这个学号!\n\n"); } printf("1.返回主界面\n2.继续查询\n"); printf("请输入:"); scanf("%d", &k); if (k == 1) { main_menu(); } else { search_record(); }}void search_by_name() //询学生信息函数的子函数——按姓名查询函数 { int i, k; char name1[max]; //用户输入学生姓名 system("cls"); //清屏函数 printf("请输入查找的姓名:"); scanf("%s", name1); for (i = 0; i < student_number; i++) //遍历链表,看该名字是否存在 { if (strcmp(name1, s[i].name) == 0) { print_table(); printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|\n", s[i].name, s[i].num, s[i].sex, s[i].chinese, s[i].mathematic, s[i].english, s[i].computer); break; } } if (i == student_number) { printf("不存在这个姓名\n"); } printf("1.返回主界面\n2.继续查询\n"); printf("请输入:"); scanf("%d", &k); if (k == 1) { main_menu(); } else { search_record(); }}void search_by_sex() //询学生信息函数的子函数——按性别查询函数 { int i, k; char sex1[max]; //用户输入学生的性别 system("cls"); //清屏函数 printf("请输入查找的性别(boy/girl):"); scanf("%s", sex1); print_table(); //表格 for (i = 0; i < student_number; i++) //遍历链表,看该性别是否存在 { if (strcmp(sex1, s[i].sex) == 0) printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|\n", s[i].name, s[i].num, s[i].sex, s[i].chinese, s[i].mathematic, s[i].english, s[i].computer); } if (i == student_number) { printf("1.返回主界面\n2.继续查询\n"); } printf("请输入:"); scanf("%d", &k); if (k == 1) { main_menu(); } else { search_record(); }}void search_by_exit() //返回上一级(返回主菜单)的函数 { main_menu();}void change_record() //更新学生成绩函数 4{ //输入学生学号修改学生信息并保持 system("cls"); //清屏函数 int i; char name2[max], sex2[max]; int chinese2, mathematic2, english2, computer2; char numbefor[max]; printf("请输入要修改的学生的学号:"); //用户输入学生学号 scanf("%s", numbefor); for (i = 0; i < student_number; i++) //遍历链表,看该学号是否存在 { if (strcmp(numbefor, s[i].num) == 0) //存在 { printf("修改前:\n"); print_table(); //打印表格 printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|\n", s[i].name, s[i].num, s[i].sex, s[i].chinese, s[i].mathematic, s[i].english, s[i].computer); printf("请分别输入修改后信息\n"); printf("请输入学生姓名:"); scanf("%s", name2); printf("请输入学生性别:"); scanf("%s", sex2); printf("请输入学生语文成绩:"); scanf("%d", &chinese2); printf("请输入学生数学成绩:"); scanf("%d", &mathematic2); printf("请输入学生英语成绩:"); scanf("%d", &english2); printf("请输入学生计算机成绩:"); scanf("%d", &computer2); printf("请选择是否保存(y或n):"); getchar(); if (getchar() == "y") //修改学生信息 { strcpy(s[i].name, name2); strcpy(s[i].sex, sex2); s[i].chinese = chinese2; s[i].mathematic = mathematic2; s[i].english = english2; s[i].computer = computer2; save_record(); //保存学生信息到文件中 printf("修改后:\n"); printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|\n", s[i].name, s[i].num, s[i].sex, s[i].chinese, s[i].mathematic, s[i].english, s[i].computer); printf("\n"); } break; } } if (i == student_number) { printf("很抱歉!没有这位学生\n"); } printf("是否继续修改,请选择(y/n):"); getchar(); if (getchar() == "y") { change_record(); //继续修改 } else { main_menu(); //返回主界面 }}void delete_record() //删除学生信息函数 5{ //输入学生学号删除学生信息并保存 system("cls"); char num4[max]; char a; int v; printf("请输入要删学生的学号:\n"); scanf("%s", num4); int i, j; for (i = 0; i < student_number; i++) //遍历链表,看学号是否存在 { if (strcmp(num4, s[i].num) == 0) //存在,执行删除操作 { printf("你将要删除该学生信息\n"); printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|\n", s[i].name, s[i].num, s[i].sex, s[i].chinese, s[i].mathematic, s[i].english, s[i].computer); printf("\n"); printf("y 确认删除\tn 取消\n"); printf("请输入:"); scanf("%s", &a); if (a == "y") { for (j = i; j < student_number; j++) //将链表中该节点指向下一节点以实现删除操作 { strcpy(s[j].num, s[j + 1].num); strcpy(s[j].name, s[j + 1].name); strcpy(s[j].sex, s[j + 1].sex); s[j].chinese = s[j + 1].chinese; s[j].mathematic = s[j + 1].mathematic; s[j].english = s[j + 1].english; s[j].computer = s[j + 1].computer; } printf("删除成功!\n"); student_number--; //全局变量,student_number-1 save_record(); //将删除后的信息保存到文件中 } else { printf("已取消操作\n"); } } } if (i == student_number) //该学号不存在 { printf("没有这个学号的学生\n"); } printf("1.继续删除 2.返回主界面\n"); printf("请输入:"); scanf("%d", &v); if (v == 1) { delete_record(); } else { main_menu; }}void calc_record() //计算学生成绩函数 6{ //有两个功能,一个是计算总成绩一个是计算平均分 system("cls"); //清屏函数 int x; printf("1 计算总成绩\n"); printf("2 计算平均分\n"); printf("3 返回上一级\n"); printf("请输入:"); scanf("%d", &x); if (x == 1) calc_sum(); //计算总成绩 if (x == 2) calc_ave(); //计算平均成绩 if (x == 3) main_menu(); //返回主界面 else { printf("输入错误\n"); calc_record(); //重新打印该界面 }}void print_table_sum() //计算总成绩函数的子函数——打印总成绩表格的表头 { printf("+----------+----------+----------+------+------+------+------+------+\n"); printf("| 姓名 | 学号 | 性别 | 语文 | 数学 | 英语 |计算机|总成绩|\n"); printf("+----------+----------+----------+------+------+------+------+------+\n");}void print_table_ave() //计算平均分函数的子函数——打印平均成绩表格的表头 { printf("+----------+----------+----------+------+------+------+------+------+\n"); printf("| 姓名 | 学号 | 性别 | 语文 | 数学 | 英语 |计算机|平均分|\n"); printf("+----------+----------+----------+------+------+------+------+------+\n");}void calc_sum() //计算学生成绩函数的子函数——计算总成绩函数 { print_table_sum(); //打印表头 int i, k, sum = 0; //sum为学生的总成绩 int x = student_number; //student_number为学生人数 for (i = 0; i < x; i++) { sum = s[i].chinese + s[i].mathematic + s[i].english + s[i].computer; printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|%6d\n", s[i].name, s[i].num, s[i].sex, s[i].chinese, s[i].mathematic, s[i].english, s[i].computer, sum); } printf("1 返回上一级\n2 返回主界面\n "); printf("请输入:"); scanf("%d", &k); if (k == 1) calc_record(); if (k == 2) main_menu(); else { printf("输入错误!\n"); calc_record(); }}void calc_ave() //计算学生成绩函数的子函数——计算平均成绩函数 { print_table_ave(); //打印表头 int i, k; int x = student_number; //student_number为学生人数 float ave; //ave为学生平均成绩 for (i = 0; i < x; i++) { ave = (s[i].chinese + s[i].mathematic + s[i].english + s[i].computer) * 0.25; printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|%6.2f\n", s[i].name, s[i].num, s[i].sex, s[i].chinese, s[i].mathematic, s[i].english, s[i].computer, ave); if (i == 6) { break; } } printf("1 返回上一级\n2 返回主界面\n "); printf("请输入:"); scanf("%d", &k); if (k == 1) calc_record(); if (k == 2) main_menu(); else { printf("输入错误!\n"); calc_record(); }}void calc_eixt() //返回上一级(返回主菜单)函数 { main_menu();}void save_record() //保存学生信息函数 7(将结构体数组学生数据写入到文件中) { FILE* fp; //定义一个文件指针 int i; //若文件打开失败 if ((fp = fopen("student-list", "wb")) == NULL) //以二进制方式对文件进行读写 { printf("cannot open file\n"); return; } fwrite(&student_number, 4, 1, fp); //将学生人数写入文件 for (i = 0; i < student_number; i++) //二进制写 { if (fwrite(&s[i], sizeof(struct student), 1, fp) != 1) { printf("file write error\n"); //出错处理 } else { printf("file write sucess\n"); //文件写入成功 } } fclose(fp); //关闭文件指针}void read() //将文件中的数据读入到结构体数组中{ FILE* fp; //定义一个文件指针 int i; //若文件打开失败 if ((fp = fopen("student-list", "rb")) == NULL) //以二进制方式读取文件 { printf("cannot open file\n"); return; } fread(&student_number, 4, 1, fp); //读取学生人数 for (i = 0; i < student_number; i++) //二进制写 { if (fread(&s[i], sizeof(struct student), 1, fp) != 1) { printf("file read error\n"); //出错处理 } else { printf("file read sucess\n"); //文件读取成功 } } fclose(fp); //关闭文件指针}void exit_record() //退出系统函数 8{ printf("感谢您的使用,已退出!"); exit;}

,https://blog.csdn.net/m0_58106367/article/details/117840159

阅读剩余内容
网友评论
相关内容
拓展阅读
最近更新