学生信息管理

(1)问题描述

学生信息包括:学号,姓名,年龄,性别,出生年月,地址,电话,E-mail等。试设计一学生信息管理系统,使之能提供以下功能:

  1. 系统以菜单方式工作
  2. 学生信息录入功能(学生信息用文件保存)---输入
  3. 学生信息浏览功能——输出
  4. 查询、排序功能——算法

1、按学号查询

2、按姓名查询

  1. 学生信息的删除与修改(可选项)

(2)功能要求

  1. 界面简单明了;
  2. 有一定的容错能力,比如输入的成绩不在0~100之间,就提示不合法,要求重新输入;
  3. 最好用链表的方式实现。

(3)算法分析

首先,一个学生包括这么多的属性,应该考虑定义一个结构,其次,我们应该考虑数据的存储形式:是定义一个数组来存储,还是定义一个链表呢?在这里假如我们以数组的方式来存储,当然可以,但是我们知道,假如我们定义一个数组的话,我们首先必须知道学生人数大概是多少,以便我们确定数组的大小,但是题目中没有给出,而且题目要求中有大量的删除、插入操作,所以用链表的方式比较方便。

效果展示:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
#include <string.h>typedef struct Student //学生信息包括:学号,姓名,年龄,性别,出生年月,地址,电话,E-mail。
{int number;char name[20];int age;char sex[6];char birthday[12];char address[20];char phone[12];char email[20];struct Student *next;
} Student;void menu();//函数声明
Student *Read();
void Write(Student *head);
void Scan(Student *current);
Student *Sort(Student *head);
Student *Input();
Student *Delete(Student *head);
Student *Add(Student *head);
void Show(Student *head);
Student *Find(Student *head);
Student *Find(Student *head);
Student *Change(Student *headI);Student *Read()//从文件读出链表的函数
{Student *head=NULL,*pre=NULL,*current=NULL;FILE *fp;if(!(fp=fopen("date.txt","rb")))   //打开文件{printf("此文件不可打开!");system("pause");return head;}char ch=fgetc(fp);rewind(fp);//此处很重要,如果丢失了就会出错 ,因为上一条语句后fp不是指向文件开头了if(ch!=EOF) //判断:判断文件是否为空,解决文件为空的情况{head=pre=current=(Student *)malloc(sizeof(Student));//创建链表fread(current,sizeof(Student),1,fp);while(current->next){pre=current;current=(Student *)malloc(sizeof(Student));pre->next=current;fread(current,sizeof(Student),1,fp);}}else{printf("此文件为空,请先输入数据");//提示system("pause");}fclose(fp);//关闭文件menu();//刷新界面return head;
}void Write(Student *head) //写入数据函数:把数据写入到磁盘中
{FILE *fp;if(!(fp=fopen("date.txt","wb"))) //打开并准备重写文件{printf("此文件不可打开!");system("pause");return;}while(head) //写入数据{fwrite(head,sizeof(Student),1,fp);head=head->next;}fclose(fp);
}void Scan(Student *current)//输入数据,在其他地方可调用
{printf("姓名: ");//namescanf("%s",&current->name);printf("年龄: ");//agescanf("%d",&current->age);while((current->age > 120)||(current->age < 0))//判断是否为合法输入{printf("输入错误,重新输入年龄:");scanf("%d",&current->age);}printf("性别: ");//sexscanf("%s",&current->sex);printf("生日: ");//birthdayscanf("%s",&current->birthday);printf("地址: ");//addressscanf("%s",&current->address);printf("电话: ");//phonescanf("%s",&current->phone);printf("邮箱: ");//emailscanf("%s",&current->email);
}Student *Input()//信息录入与保存函数
{puts("输入学号为0结束");//学号输0表示结束Student *head=NULL,*pre=NULL,*current=NULL;head=pre=current=(Student *)malloc(sizeof(Student));printf("学号: ");scanf("%d",&current->number);if(current->number) Scan(current);else head=NULL;while(current->number){pre=current;current=(Student *)malloc(sizeof(Student));printf("学号: ");scanf("%d",&current->number);if(!current->number){printf("---输入完成---");system("pause");break;}Scan(current);pre->next=current;}pre->next=NULL;head=Sort(head);//排序Write(head);//重写return head;
}Student *Sort(Student *head)//排序函数
{if(head) //判断{Student *pre,*current,*next;pre=current=head;next=head->next;int count=0;while(head) //计算一共有多少条数据{head=head->next;count++;}head=current;//头返回起点int i,j,flag;for(i=count-1; i>0; i--) //冒泡排序法实现{flag=1;for(j=0; j<i; j++){if(current->number>next->number){current->next=next->next;next->next=current;if(j) //不是首节点pre->next=next;elsehead=next;}current=current->next;next=next->next;if(j)pre=pre->next;flag=0;}pre=current=head;next=head->next;if(flag)break;}}else{printf("此文件为空,请先输入数据");//提示system("pause");}return head;
}Student *Delete(Student *head)//删除数据
{if(head) //判断 ,当文件夹为空(链表为空的时候){int num,j=1;puts("请输入您想要删除的学生的学号");scanf("%d",&num);Student *pre=head,*current=head;int count=1;while(current->number!=num) //寻找要删除的数据{count++;pre=current;current=current->next;if(!current){j=0;break;}}if(j) //准备删除{if(count==1){head=head->next;free(pre);}else{pre->next=current->next;free(current);}Write(head);printf("\n");printf("---删除成功!---\n");printf("\n");printf(">>>现在的学生信息为:\n");Show(head);}else{printf("不存在此人!");system("pause");}}else{printf("此文件为空,请先输入数据");//空文件system("pause");}return head;
}Student *Add(Student *head)//添加数据:按排序插入
{Student *pre=head,*current=head;Student *p=(Student*)malloc(sizeof(Student));printf("学号:");scanf("%d",&p->number);Scan(p);if(head) //判断,防止文件夹为空{if( p->number  <=  head->number ){p->next=head;head=p;}else{current=current->next;while(current){if( p->number  <=  current->number ){pre->next=p;p->next=current;break;}else{pre=current;current=current->next;}}if(!current){pre->next=p;p->next=NULL;}}}else{head=p;head->next=NULL;}Write(head);printf("---添加成功!---\n");printf("\n");printf(">>>现在的学生信息为:\n");Show(head);return head;//如果插入在第一个以前,则head变了,于是需要返回head
}void Show(Student *head) //浏览数据
{int n=1;if(head){printf("*************************************************************************************************************************\n");printf("║序号 ║║    学号  ║    姓名  ║  年龄   ║    性别  ║     出生年月    ║║   地址    ║║    电话    ║║      邮箱     ║\n");while(head){printf(" %d\t   %d\t     %s\t   %d\t    %s\t      %s\t       %s\t      %s\t    %s\n ",n,head->number,head->name,head->age,head->sex,head->birthday,head->address,head->phone,head->email);head=head->next;n++;}printf("*************************************************************************************************************************\n");}elseprintf("此文件为空,请先输入数据");system("pause");
}void findmenu()
{printf("\n\n\n");printf("\t\t\t☆☆学生信息查找☆☆\n");printf("\t\t---------------------------------------\n");printf("\t\t\t  1 按学号查找          \n");printf("\t\t\t  2 按姓名查找          \n");printf("\t\t---------------------------------------\n");printf("\t\t\t请输入菜单选项1-2:");
}Student *Ffind(Student *head)//查询函数
{int k=1;if(head) //判断{system("cls");findmenu();int judge;scanf("%d",&judge);Student *p1;p1=head;printf("\t\t\t  输入你想查找的人:");if(judge==1){int num;scanf("%d",&num);while(p1->number!=num){p1=p1->next;if(!p1){puts("此人不存在!\n");k=0;break;}}}else{char name[20];scanf("%s",&name);while(strcmp(name,p1->name)){p1=p1->next;if(!p1){puts("此人不存在!\n");k=0;break;}}}if(k){printf("\n");printf("║    学号  ║    姓名  ║  年龄   ║    性别  ║     出生年月    ║║   地址    ║║    电话    ║║      邮箱     ║\n");printf("    %d\t     %s\t   %d\t    %s\t      %s\t       %s\t      %s\t     %s\n ",p1->number,p1->name,p1->age,p1->sex,p1->birthday,p1->address,p1->phone,p1->email);}}else{k=0;printf("此文件为空,请先输入数据");}system("pause");if(k)return head;elsereturn NULL;
}Student *Find(Student *head)//查找函数(用于修改函数中)界面比Ffind函数简洁
{int k=1;if(head) //判断{printf("---请先查找要修改的人---\n");printf(">>>按学号查找请按1\t按姓名查找请按2\n");//选择根据名字还是根据学号查询int judge;scanf("%d",&judge);Student *p1;p1=head;printf("输入你想修改的人:");if(judge==1){int num;scanf("%d",&num);while(head->number!=num){head=head->next;if(!head){puts("此人不存在!\n");k=0;break;}}}else{char name[20];scanf("%s",&name);while(strcmp(name,head->name)){head=head->next;if(!head){puts("此人不存在!\n");k=0;break;}}}}else{k=0;puts("此文件为空!");}system("pause");if(k)return head;elsereturn NULL;
}void xiugaimenu()
{printf("\n\n\n");printf("\t\t\t☆☆学生信息修改☆☆\n");printf("\t\t---------------------------------------\n");printf("\t\t\t  1 修改学号          \n");printf("\t\t\t  2 修改姓名          \n");printf("\t\t\t  3 修改年龄          \n");printf("\t\t\t  4 修改性别          \n");printf("\t\t\t  5 修改生日          \n");printf("\t\t\t  6 修改地址          \n");printf("\t\t\t  7 修改电话          \n");printf("\t\t\t  8 修改邮箱          \n");printf("\t\t---------------------------------------\n");printf("\t\t\t请输入菜单选项1-8:");
}Student *Change(Student *headI)//修改信息
{int n;Student *head=Find(headI);//由于之前已经定义过find函数,故此处不需要再搜索,直接调用find函数即可getchar();system("cls");xiugaimenu();if(head) //判断{scanf("%d",&n);switch(n){case 1:{printf("\t\t\t 学号修改为:");scanf("%d",&head->number);printf("\t\t\t 修改成功!");//system("pause");break;}case 2:{printf("\t\t\t 姓名修改为:");scanf("%s",&head->name);printf("\t\t\t 修改成功!");system("pause");break;}case 3:{printf("\t\t\t 年龄修改为:");scanf("%d",&head->age);printf("\t\t\t 修改成功!");system("pause");break;}case 4:{printf("\t\t\t 性别修改为:");scanf("%s",&head->sex);printf("\t\t\t 修改成功!");system("pause");break;}case 5:{printf("\t\t\t 生日修改为:");scanf("%s",&head->birthday);printf("\t\t\t 修改成功!");break;}case 6:{printf("\t\t\t 地址修改为:");scanf("%s",&head->address);printf("\t\t\t 修改成功!");system("pause");break;}case 7:{printf("\t\t\t 电话修改为:");scanf("%s",&head->phone);printf("\t\t\t 修改成功!");break;}case 8:{printf("\t\t\t 邮箱修改为:");scanf("%s",&head->email);printf("\t\t\t 修改成功!");system("pause");break;}default:printf("选项错误!按任意键继续!");getchar();system("cls");}head=Sort(headI);Write(headI);}return headI;
}void menu()//主菜单
{system("cls");//清空屏幕printf("\t -----------------------------------------------------\n");printf("\t                                                          \n");printf("\t    ☆☆☆     欢迎使用学生信息管理系统     ☆☆☆                 ");printf("\t                                                          \n");printf("\t -----------------------------------------------------\n");printf("\t          |      1 → 录入学生信息             |\n");printf("\t          |      2 → 浏览学生信息             |\n");printf("\t          |      3 → 查找学生信息             |\n");printf("\t          |      4 → 修改学生信息             |\n");printf("\t          |      5 → 添加学生信息             |\n");printf("\t          |      6 → 删除学生信息             |\n");printf("\t          |      7 → 退出管理系统             |\n");printf("\t -----------------------------------------------------\n");printf("\t\t\t\t\t\t");system("date/t");printf("\t\t\t\t\t\t   ");system("time/t");printf("\t请选择菜单选项1-7:");
}//主函数
int main()
{system("title 学生管理系统");system("color F4");system("mode 130,100");menu();//初始化页面Student *head=NULL;//创建临时链表head=Read();//每次先从文件读出链表int n;while(1){scanf("%d",&n);switch(n){case 1:system("cls");head=Input();break;case 2:system("cls");Show(head);break;case 3:system("cls");Ffind(head);break;case 4:system("cls");head=Change(head);break;case 5:system("cls");head=Add(head);break;case 6:system("cls");head=Delete(head);break;case 7:printf("\n\t\t★★★感谢您的使用,期待下一次相遇★★★\n");exit(0);break;}menu();}return 0;
}

C语言课程设计——学生信息管理系统相关推荐

  1. C语言课程信息管理系统课程设计,c语言课程设计学生信息管理系统.doc

    c语言课程设计学生信息管理系统 课程设计报告 课程名称: 高级语言程序设计课程设计 姓 名: 汤璞君 班级学号: BX1209 121003410937 指导教师: 吉顺如 完成日期: 2013.6. ...

  2. c语言编制学生课程信息管理系统,C语言课程设计-学生信息管理系统.doc

    - III -- III - 中国海洋大学 青岛学院 C语言课程设计报告书 题 目 学生信息管理系统 学生姓名 指导教师 学 院 专业班级 组内分工 姓名 主要任务 占系统比例 学生信息的查看,主函数 ...

  3. c语言课程设计学生信息管理系统

    1. 学生基本信息(包括姓名.性别.学号.班级.成绩等): 2. 新增.删除.修改一名学生信息: 3. 查询学生信息: 4. 可以实现新增.删除.修改学生成绩: 5. 按成绩排序. 6.可保存信息,下 ...

  4. C语言课程设计-学生信息管理系统

    目录 一.开发环境 二.项目需求分析 2.1项目背景及简介 2.2功能需求

  5. c语言课程设计宠物店,c语言课程设计-宠物店信息管理系统.doc

    c语言课程设计-宠物店信息管理系统 合肥学院 计算机科学与技术系 课程设计报告 2012-2013学年第二学期 课程面向过程综合设计课程设计名称宠物(小动物)店信息管理系统 学生姓名宋俊 学号 专业班 ...

  6. c语言课程设计查找分数与删除元素,c语言课程设计学生成绩管理系统

    <c语言课程设计学生成绩管理系统>由会员分享,可在线阅读,更多相关<c语言课程设计学生成绩管理系统(31页珍藏版)>请在人人文库网上搜索. 1.河南理工大学计算机科学与技术学院 ...

  7. C语言成绩统计源代码,C语言课程设计学生成绩管理系统+源码

    <C语言课程设计学生成绩管理系统+源码>由会员分享,可在线阅读,更多相关<C语言课程设计学生成绩管理系统+源码(25页珍藏版)>请在人人文库网上搜索. 1.简易教学管理系统的设 ...

  8. C语言学生成绩管理设计总结,C语言课程设计学生成绩管理系统个人总结

    C语言课程设计学生成绩管理系统个人总结 C语言课程设计--学生成绩管理系统 个人心得体会 (徐州工程学院 14计嵌1班 07组 张凯) 这一周以来的课程设计,不仅让我明白了C语言的确是一门很有用的,但 ...

  9. C语言 课程设计——职工信息管理系统

    C语言 课程设计--职工信息管理系统 提示:该课程设计是本人第一次制作,有诸多不足之处,希望王对你有些许帮助!!! 文章目录 C语言 课程设计--职工信息管理系统 前言 一.首先定义一个结构体数组 二 ...

最新文章

  1. 经常下载的朋友注意了,教你怎样硬盘零伤害(从论坛上拷下来收藏的)
  2. 对于DataSet中的问题真是郁闷啊
  3. 【Linux】一步一步学Linux——rename命令(36)
  4. RuoYi-Cloud 部署篇_03(windows环境 mysql版本)
  5. 深空数据(LRO .etc)处理软件 isis3 + asp 安装流程(基于 ubuntu 18.04)
  6. JT/T808校验码计算(按字节异或求和)
  7. 制造行业mes使用说明书_mes系统操作手册完整版
  8. python必背100源代码下载-100行Python代码实现一款高精度免费OCR工具
  9. 抖音爆火李峋同款爱心代码,简单附带教程,还有烟花代码,手残党也能学会!!
  10. vtop工具使用分析
  11. 微信公众平台开发(六) 翻译功能开发
  12. 解析wiki数据(带标点,保留格式)
  13. cout的格式控制——关于cout.width()和cout.fill()
  14. 神通广大的WiFi劫持工具:Mana
  15. Flink(八)Flink的Parallelism并行度
  16. 华为国际快递被转运至美国 联邦快递致歉:误送
  17. 【NOIP 2017 提高组 DAY1 T1】小凯的疑惑
  18. 被动收入:回归原始且安全的两种赚取方法
  19. 北大光华本科女强人的超长综合面经
  20. 偏导,方向导数以及梯度的理解

热门文章

  1. ElegantLatex:优美的 LATEX 模板 (对文章,书籍进行排版)
  2. 机器人领域的SCI期刊
  3. 【C语言初阶】初识C语言(上)
  4. 服务器向所有浏览器响应数据,浏览器工作原理与实践总结一
  5. 全局分配数组、栈分配数组、堆分配数组在IDA反汇编中的不同——《IDA权威指南》例子尝试
  6. 浪潮之巅--蓝色巨人
  7. 微型计算机可以处理的二进制长度,可以处理的二进制数据长度是多少位
  8. QEMU零知识学习5 —— QEMU安装
  9. YDB基本使用详解(转)
  10. Verilog学习脚印3-简单状态机(三角波)