学生成绩管理

学生成绩管理

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<<"学号为:"<<e.id<<" 的学生不存在,不能被删除!!\n";
            break ;
        }

删除学号为sno的学生信息的方法或关键代码:

   cout<<"你确实要删除么?";
            cin>>yn;
            if(yn=='Y'||yn=='y')
                ListDelete_Sq(L,i,e);
            else
            { cout <<"!!不删除!!"<<endl;}
            break;

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<<endl<<"!!学号为:"<<e.id<<" 的学生不存在!!\n";
            }

执行结果测试

1、输入学生信息测试结果
在这里插入图片描述
2、删除学生信息测试结果
在这里插入图片描述
3.修改学生信息在这里插入图片描述
在这里插入图片描述
4.学生数据查询
在这里插入图片描述

带注释的源程序

#include <iostream>
#include <iomanip>
#include <fstream>
#include <process.h>
#include <string.h>

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<<s<<endl;
    exit(1); //非正常运行导致退出程序
}

//getchar()吸收换行来模拟暂停
void Pause()
{
    cout<<endl<<"按任意键继续......";
    getchar();getchar();
}

//初始化 length=0,获取 maxsize, incresize,new 长度为maxsize的student数组
void InitList_Sq(scorebook &L, int maxsize=LIST_INIT_SIZE, int incresize=LISTINCREMENT)
{
    L.elem=new Student [maxsize];
    L.length=0;
    L.listsize=maxsize;
    L.incrementsize=incresize;
}

//查找元素(按id学号查询)
int LocateElem_Sq(scorebook &L, Student e)
{
    for(int i=0;i<L.length;i++)
        if(strcmp(L.elem[i].id,e.id)==0) return i+1;
    return 0;
}

//获取元素
void GetElem_Sq(scorebook &L, int i, Student &e)
{
    e=L.elem[i-1];
}

//增加存储空间和长度
void increment(scorebook &L)
{
    Student  *p=new Student[L.listsize+L.incrementsize];
    for(int i=0;i<L.length;i++)
        p[i]=L.elem[i];
    delete [] L.elem;
    L.elem=p;
    L.listsize=L.listsize+L.incrementsize;
}

//增加元素
void ListInsert_Sq(scorebook &L, Student e)
{
    if(L.length>=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========================  学生成绩信息表 ========================"<<endl<<endl;
   cout<<"学号、姓名、性别、班级、科目、成绩:\n";
    for(int i=0;i<L.length;i++)
        cout<<setiosflags(ios_base::left)<<setw(12)<<L.elem[i].id
            <<setw(12)<<L.elem[i].name<<setw(15)<<L.elem[i].sex<<setw(10)<<L.elem[i].class_number
            <<setw(12)<<L.elem[i].class_name<<setw(16)<<L.elem[i].score<<resetiosflags(ios_base::left)<<endl;
    Pause();
}

//输入
void input(char *tid,scorebook &L)
{
    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();
}

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<L.length;i++)
        save.write((char *)(&L.elem[i]),sizeof(Student));
    save.close();
}


//单个输出信息
void SingleOut(Student e)
{
cout<<"学号、姓名、性别、班级、科目、成绩: ";
cout<<setiosflags(ios_base::left)<<setw(12)<<e.id
<<setw(12)<<e.name<<setw(15)<<e.sex<<setw(10)<<e.class_number
<<setw(12)<<e.class_name<<setw(16)<<e.score<<resetiosflags(ios_base::left)<<endl;
}


int main()
{
    Student e;
    int i,n;
    bool flag=true;
    char yn;
    char addlist[30];
    scorebook L;
    InitList_Sq(L,LIST_INIT_SIZE,LISTINCREMENT);
    cout<<"请输入成绩表的存盘文件名:";
    cin>>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"<<endl;
        cout<<"          2 删除学生信息 \n"<<endl;;
        cout<<"          3 查询学生信息\n"<<endl;
        cout<<"          4 输出学生信息\n"<<endl;
        cout<<"          5 修改学生信息\n"<<endl;
        cout<<"          6 退出\n"<<endl;

        cout<<"======================================\n";
        cout<<"                              \n";
        cout<<"  Please  select 1、 2、 3、 4、 5、 6:  ";
        cin>>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<<"学号为:"<<e.id<<" 的学生不存在,不能被删除!!\n";
                break ;
            }
            cout<<"你确实要删除么?";
            cin>>yn;
            if(yn=='Y'||yn=='y')
                ListDelete_Sq(L,i,e);
            else
            { cout <<"!!不删除!!"<<endl;}
            break;
          case 3:
            { cout<<"请输入要查找的学生学号:";
              cin>>e.id;
              i=LocateElem_Sq(L,e);
              if(i!=0)
              {     GetElem_Sq(L,i,e);
                    SingleOut(e);
              }
              else cout<<endl<<"!!学号为:"<<e.id<<" 的学生不存在!!\n";
            }
            Pause();
            break;
          case 4:
            ListTraverse_Sq(L);
            break;
     
          case 5:
              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);
                    }
              }
              else cout<<endl<<"!!学号为 "<<e.id<<" 的学生不存在!!\n";
              Pause();
              break;
          case 6:
              flag=false;
              break;
          default:
              cout<<endl<<"!! 选择错误,请重新选择 !!"<<endl;
              Pause();
      }
    }
    return 0;
}
  • 7
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

以山河作礼。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值