1.项目简介
学生成绩管理是学校教务部门日常工作的重要组成部分,其处理信息量很大。本项目是对学生成绩管理的简单模拟,用菜单选择方式完成下列功能:输入学生数据;输出学生数据;学生数据查询;添加学生数据;修改学生数据;删除学生数据。
2.设计思路
本项目的实质是完成对学生成绩信息的建立、查找、插入、修改、删除等功能,可以首先定义项目的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运行结果。
3.数据结构
本项目的数据是一组学生的成绩信息,每条学生的成绩信息由学号、姓名和成绩组成,这组学生的成绩信息具有相同特性,属于同一数据对象,相邻数据元素之间存在序偶关系。由此可以看出,这些数据具有线性表中数据元素的性质,所以该系统的数据采用线性表来存储。
顺序表是线性表的顺序存储结构,是指用一组连续的内存单元依次存放线性表的数据元素。在顺序存储结构下,逻辑关系相邻的两个元素在物理位置上也相邻,这是顺序表的特点。本项目可以采用顺序表的线性表顺序存储结构。
若一个数据元素仅占一个存储单元,第i个数据元素的地址为:
Loc(ai)=loc(a1)+(i-1)
假设线性表中每个元素占用k个存储单元,那么在顺序表中,线性表的第i个元素的存储位置与第1个元素的存储位置的关系是:
Loc(ai)=loc(a1)+(i-1)*k
这里Loc(ai)是第i个元素的存储位置,loc(a1)是第1个元素的存储位置,也称为线性表的基址。显然,顺序表便于进行随机访问,故线性表的顺序存储结构是一种随机存储结构。
顺序表适宜于做查找这样的静态操作;顺序存储的优点是存储密度大,存储空间利用率高。缺点是插入或删除元素时不方便。
由于C语言的数组类型也有随机存储的特点,一维数组的机内表示就是顺序结构。因此,可用C语言的一维数组实现线性表的顺序存储。数组实现线性表的顺序存储的优点是可以随机存取表中任一元素O(1),存储空间使用紧凑;缺点是在插入,删除某一元素时,需要移动大量元素O(n),预先分配空间需按最大空间分配,利用不充分,表容量难以扩充。
用结构体类型定义每个学生数据,故该数组中的每个数据的结构可描述为:
typedef struct STU
{ char stuno[10]; //学号
char name[10]; //姓名
float score; //成绩
} ElemType;
1.调用函数void input( )输入相对应学生的学号、姓名和成绩
2.调用函数void ListDelete_Sq ( )删除学生成绩则必须对链表结点进行 删除意味着将某个要删除结点前后的连续打断去掉该结点,使前后指针变量重新连接,完成结点删除任务
3.调用函数void LocateElem_Sq( )查询所储存的元素
4.调用函数void ListInsert_Sq( )进行修改
5.调用函数void ListTraverse_Sq()进行输出
1.删除学生信息
输入要删除的学生的学号,调用删除函数int ListDelete_Sq()。
判断学号sno是否存在的实现方法或关键代码:
cout<<"请输入要删除的学生的学号:";
cin>>e.id;
char yn;
i=LocateElem_Sq(L,e);
if(i==0)
{
cout<<"学号为:"<
删除学号为sno的学生信息的方法或关键代码:
cout<<"你确实要删除么?";
cin>>yn;
if(yn=='Y'||yn=='y')
ListDelete_Sq(L,i,e);
else
{ cout <<"!!不删除!!"<
2.添加学生信息
{
int n;
Student e;
ofstream wfile;
wfile.open(tid,ios_base::binary);
cout<<"请输入信息表中的联系人人数:";
cin>>n;
cout<<"请输入学生的学号、姓名、性别、班级、科目、成绩:\n";
for(int i=1 ;i<=n;i++)
{
cin>>e.id>>e.name>>e.sex>>e.class_number>>e.class_name>>e.score;
ListInsert_Sq(L,e);
wfile.write((char *)(&e),sizeof(Student));
}
wfile.close();
}
3.修改学生信息
cout<<"请输入要修改的学生的学号:";
cin>>e.id;
i=LocateElem_Sq(L, e);
if(i!=0)
{ GetElem_Sq(L,i,e);
SingleOut(e);
cout<<"确实要修改么Y/N?";
cin>>yn;
if(yn=='y'||yn=='Y')
{
ListDelete_Sq(L,i,e);
cout<<"请输入该学生新的学号、姓名、性别、班级、科目、成绩:\n";
cin>>e.id>>e.name>>e.sex>>e.class_number>>e.class_name>>e.score;
ListInsert_Sq(L,e);
}
}
4.学生数据查询
{ cout<<"请输入要查找的学生学号:";
cin>>e.id;
i=LocateElem_Sq(L,e);
if(i!=0)
{ GetElem_Sq(L,i,e);
SingleOut(e);
}
else cout<
1、输入学生信息测试结果
2、删除学生信息测试结果
3.修改学生信息
4.学生数据查询
#include
#include
#include
#include
#include
using namespace std;
const int LIST_INIT_SIZE=10;
const int LISTINCREMENT=5;
//student,
typedef struct Contacts
{
char id[10]; //学号
char name[10]; //姓名
char sex[10]; //性别
char class_number[10]; //班级
char class_name[30]; //科目
char score[30]; //成绩
}Student;
//scorebook表
typedef struct scorebook
{
Student *elem;
int length;
int listsize;
int incrementsize;
}scorebook;
//错误运行
void ErrorMessage(char *s)
{
cout<=L.listsize)
increment(L);
if(L.length ==0)
{
L.elem[0]=e;
L.length++;
}
else
{
int i=L.length-1;
while((strcmp(L.elem[i].id,e.id)>0)&&i>=0)
{
L.elem[i+1]=L.elem[i];
i--;
}
L.elem[i+1]=e;
++L.length;
}
}
void ListInsert_Sq(scorebook &L, int i, Student e )
{
if (i<1||i>L.length+1) ErrorMessage(" i 值不合法");
if (L.length>=L.listsize) increment(L);
Student *q = &(L.elem[i-1]);
for (Student *p=&(L.elem[L.length-1]); p>=q;--p)
*(p+1) = *p;
*q = e;
++L.length;
}
//删除信息
void ListDelete_Sq(scorebook &L, int i,Student e)
{
if ((i<1) || (i>L.length)) ErrorMessage("i值不合法");
Student *p=&(L.elem[i-1]);
e=*p;
Student *q=L.elem+L.length-1;
for(++p; p<=q; ++p )
*(p-1)=*p;
--L.length;
}
//销毁表
void DestroyList_Sq(scorebook &L)
{
delete [] L.elem;
L.listsize=0;
L.length=0;
}
//清空表
void ClearList_Sq(scorebook &L)
{
L.length=0;
}
bool ListEmpty_Sq(scorebook &L)
{
if(L.length==0)
return true;
else return false;
}
//输出信息
void ListTraverse_Sq(scorebook &L)
{
cout<<"\n======================== 学生成绩信息表 ========================"<>n;
cout<<"请输入学生的学号、姓名、性别、班级、科目、成绩:\n";
for(int i=1 ;i<=n;i++)
{
cin>>e.id>>e.name>>e.sex>>e.class_number>>e.class_name>>e.score;
ListInsert_Sq(L,e);
wfile.write((char *)(&e),sizeof(Student));
}
wfile.close();
}
void load(char *tid,scorebook &L)
{
Student e;
ifstream rfile;
rfile.open(tid,ios_base::binary);
while(rfile.read((char *)(&e),sizeof(e)))
{
ListInsert_Sq(L,e);
}
rfile.close();
}
void save(char *tid,scorebook &L)
{
ofstream save;
save.open(tid,ios_base::binary);
for(int i=0;i>addlist;
fstream file;
file.open(addlist,ios::in);
if(!file)
{
cout<<"成绩表不存在,建立一个新的成绩表(Y/N)?";
cin>>yn;
if(yn=='Y'||yn=='y')
{ file.close();
input(addlist,L);
}
}
else
{
file.close();
load(addlist,L);
ListTraverse_Sq(L);
}
while(flag)
{
system("cls");
cout<<"\n 学生成绩管理系统主菜单 \n";
cout<<"======================================\n";
cout<<" 1 输入学生信息 \n"<>n;
switch (n)
{
case 1:
cout<<"请输入该学生新的学号、姓名、性别、班级、科目、成绩:\n";
cin>>e.id>>e.name>>e.sex>>e.class_number>>e.class_name>>e.score;
ListInsert_Sq(L,e);
break;
case 2 :
cout<<"请输入要删除的学生的学号:";
cin>>e.id;
char yn;
i=LocateElem_Sq(L,e);
if(i==0)
{
cout<<"学号为:"<>yn;
if(yn=='Y'||yn=='y')
ListDelete_Sq(L,i,e);
else
{ cout <<"!!不删除!!"<>e.id;
i=LocateElem_Sq(L,e);
if(i!=0)
{ GetElem_Sq(L,i,e);
SingleOut(e);
}
else cout<>e.id;
i=LocateElem_Sq(L, e);
if(i!=0)
{ GetElem_Sq(L,i,e);
SingleOut(e);
cout<<"确实要修改么Y/N?";
cin>>yn;
if(yn=='y'||yn=='Y')
{
ListDelete_Sq(L,i,e);
cout<<"请输入该学生新的学号、姓名、性别、班级、科目、成绩:\n";
cin>>e.id>>e.name>>e.sex>>e.class_number>>e.class_name>>e.score;
ListInsert_Sq(L,e);
}
}
else cout<