1.需求分析
学生信息管理系统是针对学校人事处的大量业务处理工作而开发的管理软件,主要用于学校学生信息管理,总体任务是实现学生信息的系统化、科学化、规范化和自动化,其主要任务是用计算机对学生的各种信息进行日常管理,如查询、增加、显示、删除,另外还考虑到学生的选课情况,针对这些要求来设计学生信息管理系统。
1.设计和实现线性表的数据结构。
2.基于1所设计的线性表数据结构,实现线性表的初始化、插入、删除、查找等基本操作。
3.利用所实现的线性表存储学生及成绩信息。
4.利用线性表的基本操作,实现学生成绩的插入、保存、查找、删除等操作。
5.利用文件实现学生信息的保存、读取操作。
2.系统设计
设计目的
1.系统界面简洁易操作
2.能够从磁盘文件中加载数据
3.可以将信息保存到磁盘中
4.系统具有增加、查询、显示和删除的功能系统功能
1.插入学生信息
2.保存学生信息
3.加载学生信息
4.显示学生信息
5.查找学生信息
6.删除学生信息模块划分
1.插入学生信息模块:该模块根据提示信息分别输入学生的学号、姓名、性别、年龄以及语文、数学和英语三门课程的考试成绩,输入的信息保存在内存的链表中。
2.保存学生信息模块:该模块将存储在链表中的学生信息保存到磁盘文件中。
3.加载学生信息模块:该模块将磁盘文件中保存的学生信息读取到内存的链表中。
4.显示学生信息模块:该模块显示链表中所有学生信息。
5.查找学生信息模块:该模块将通讯录中的所有联系人按照姓名的字母顺序进行排序。
如图所示:
主功能菜单设计
数据结构设计:
定义学生结构体
struct student{
int num; /*学号*/
char name[15]; /*姓名*/
char sex[2]; /*性别*/
int age; /*年龄*/
double score[3]; /*三门课程的分数*/
double sum; /*总分*/
double ave; /*平均分*/
};
定义链表结点
typedef struct node /*定义学生链表的结点结构*/
{
struct student data;
struct node *next;
}Node,*link;
3.主函数设计
malloc()函数,原型在头文件stdlib.h中定义
(1)调用方式
void * malloc(unsigned size)
(2)功能
在内存中分配size个字节存储空间,并返回指向被分配存储区起始地址的指 针;如果不能获得需要的存储空间,将返回空指针。
注意:当把返回值赋给具有某一特定数据类型的指针变量时,应该对返回值作强制类型转换。
calloc()函数,原型在头文件stdlib.h中定义
(1)调用方式
void *calloc(unsigned n, unsigned size)
(2)功能
分配n个具有size个字节的存储空间,并返回一个指向被分配内存起始地址的指针;如果没有足够的内存可供分配,则返回一个空指针。
free()函数,原型在头文件stdlib.h中定义
(1)调用方式
void free(void *ptr)
(2)功能
释放由ptr指向的内存空间,并将它返回给堆。free函数无返回值。
注意:
ptr是最近一次调用malloc函数或calloc函数时返回的值。
动态分配的存储单元在用完后一定要释放,否则内存会因为申请空间过多引起资源不足而出现故障。
注意!
*动态分配的存储单元在用完后一定要释放,否则内存会因为申请空间过多引起资源不足而出现故障。
malloc()函数以及其它内存分配函数所获得的内存块都来自内存中一块称为堆(heap)的区域。堆的容量是有限的,而频繁调用内存分配函数则很容易就会耗尽堆中的内存,有时要求分配的内存区过大也可能会耗尽堆,一旦堆中的内存被耗尽,内存分配就失败了,函数的返回值就是空指针。*
具体代码实现:
/*
* stu.cpp
*
* Created on: 2017年3月19日
* Author: 10497
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <dos.h>
#include "stu.h"
int menu_select(){
int i;
printf("\n\n\t*********************STUDENT LIST*********************\n");
printf("\t|* 1.input record *|\n");
printf("\t|* 2.delete record *|\n");
printf("\t|* 3.list record *|\n");
printf("\t|* 4.search record *|\n");
printf("\t|* 5.save record *|\n");
printf("\t|* 6.load record *|\n");
printf("\t|* 7.quit *|\n");
// printf("\t|* 8.exit *|\n");
printf("\t******************************************************\n");
do{
printf("\n\tPlease Enter Your Choice:");
scanf("%d", &i);
} while (i <= 0 || i>7);
return i;
}
void input(link l){
int i;
Node *p, *q;
while (1){
p = (Node *)malloc(sizeof(Node));
if (!p){
printf("\tmenory malloc failure!\n");
}
printf("\tInput Your Number:(if you want to exit,you can input '0'!) \n");
scanf("%d", &p->data.num);
if (p->data.num == 0) break;
for (q = l; q->next != NULL; q = q->next)
if (q->data.num == p->data.num){
printf("the Number has existed ,please input again:\n");
scanf("%d", &p->data.num);
}
printf("\tinput name\n");
scanf("%s", &p->data.name);
printf("\tinput sex:\n");
scanf("%s", &p->data.sex);
printf("\tinput age\n");
scanf("%d", &p->data.age);
printf("\tplease input your Chinese,Math,English score:\n");
for (i = 0; i < 3; i++)
scanf("%lf", &p->data.score[i]);
p->data.sum = p->data.score[0] + p->data.score[1] + p->data.score[2];
p->data.ave =(p->data.sum)/3;
p->next = NULL;
q->next = p;
q = p;
}
}
void del(link l){
int num;
Node *p, *q;
q = l;
p = q->next;
printf("\tplease input the number of student which you want to delete:\n");
scanf("%d", &num);
while (p){
if (num == p->data.num){
q->next = p->next;
free(p);
printf("\tdelete successful!\n");
break;
}
else{
q = p;
p = q->next;
}
}
if (p == NULL){
printf("\tcan not find the student which you want to delete!\n");
}
}
void search(link l){
int num;
Node *p;
p = l->next;
printf("\tplease input number of the student:\n");
scanf("%d", &num);
while (p){
if (p->data.num == num){
display(p);
_getch();
break;
}
p = p->next;
}
if (p == NULL){
printf("\tcan not find the student:\n");
}
}
void list(link l){
Node *p;
p = l->next;
if (p == NULL)
printf("\tno student record!\n");
while (p != NULL){
display(p);
p = p->next;
}
_getch();
}
void display(Node *p){
printf("\tstudent's infomation:\n");
printf("\tnumber is:%d\n", p->data.num);
printf("\tname is:%s\n", p->data.name);
printf("\tsex is:%s\n", p->data.sex);
printf("\tage is:%d\n", p->data.age);
printf("\tChinese score:%lf\n", p->data.score[0]);
printf("\tMath score:%lf\n", p->data.score[1]);
printf("\tEnglish score:%lf\n", p->data.score[2]);
printf("\tsum:%lf\n", p->data.sum);
printf("\taverage score:%lf\n", p->data.ave);
printf("\n\n\t******************************************\n");
}
void save(link l){
//将存储在链表中的内容保存到磁盘文件当中;
Node *p;
FILE *fp;//文件指针
p = l->next;//头结点不存放数据
if ((fp = fopen("F:\\studentlist", "wb")) == NULL){
printf("\tcan not open the file!\n");
exit(1);
}
printf("\n\tSaving file\n");
while (p){
fwrite(p, sizeof(Node), 1, fp);
p = p->next;
}
fclose(fp);
_getch();//C++用_getch代替getch
}
void load(link l){
Node *p, *r;
FILE *fp;
l->next = NULL;
r = l;//指向头结点
if ((fp = fopen("F:\\studentlist", "rb")) == NULL){
printf("\tcan not open the file!\n");
exit(1);
}
printf("\n\tLoading file......\n");
while (!feof(fp)){//如果没有到达文件的尾部
p = (Node*)malloc(sizeof(Node));
if (!p)
{
printf("\tmenory malloc failure!\n");
return;
}
if (fread(p, sizeof(Node), 1, fp) != 1) break;//数字1
else{
p->next = NULL;
r->next = p;//新创建的节点连接到链表中
r = p;
}
fclose(fp);
_getch();
}
}
调试截图: