客户管理系统课程设计总结报告

漳州师范学院计算机科学与工程系

软件工程课程设计总结报告

注:该表格由学生填写,内容采用小四号宋体。

 

第二篇:C++学生成绩管理系统课程设计报告

C++课程设计报告书

题目:学生成绩管理系统

                业:信息与计算科学

                级:0208403

                号:020840306 

                名:张亚炬     

            任课老师:文  军

学生成绩管理系统课程设计报告

摘要:

本系统主要用于对学生的成绩进行管理。通过本系统,可以将各个学生的成绩记录输入到系统中,保存到文件,便于查阅和相关管理。此外,该系统还能实现对学生成绩记录的显示,查询以及插入或删除学生的成绩记录等功能。

一、         问题描述

编写一个简单的学生成绩管理系统。学生成绩管理系统有若干学生成绩记录组成,每个记录由学号、姓名、性别和成绩四部分组成,学号不超过11个字符,姓名不超过21个字符,性别为’m’(male)或’f’(female),成绩为double型数据。该系统具有以下功能:

(1)       程序开始执行时显示如下版权信息和主菜单:

       *******学生成绩管理系统*************

l  *1.添加学生成绩记录    

l  *2.显示学生成绩记录  

l  *3.查找学生成绩记录

l  * 4.删除学生成绩记录 

l  * 5.保存学生成绩记录

l  * 6.加载学生成绩记录

l  * 7.退出学生成绩管理系统

   ************************************

请输入(1~7):

        

(2)       通过键盘输入数字1~7后,程序能够执行相应的功能,执行完后回到上述主菜单继续等待用户输入,输入数字7后退出程序。

(3)       选择“添加学生成绩记录”后,输入要插入记录的位置。按程序提示依次输入学号,姓名,性别,成绩,插入记录成功。

(4)       选择“显示学生成绩记录”,显示学生成绩表中已有的学生记录的个数,并显示出各个学生记录的相关信息。

(5)       选择“查找学生成绩记录”,按提示输入要查找的学生的学号,输入学号,若该学号存在,则输出相应的学生记录,如该学号不存在,则按任意键返回主菜单。

(6)       选择“删除学生成绩记录”,按提示输入要删除的学生的学号,输入学号,若改学号存在,则删除相应的学生记录,如果该学号不存在,则按任意键返回主菜单。

(7)       选择“保存学生成绩记录”,系统会将已有的学生记录保存在默认的文件名为fname.txt的文件中。

(8)       选择“加载学生成绩记录”,系统会提示输入文件名,输入默认的文件名为fname.txt,则可将文件中的相关信息导出。

(9)       选择“退出学生成绩管理系统”,按任意键退出系统。

二、         解决方案

这是一个很实际的编程实例。编程要求很详细,内容也比较多,有一定难度。首先,学生成绩记录是一个复杂的数据结构,至少应包括学号,姓名,性别和成绩。所以,必须建立一个类student,用来记录学号,姓名,性别和成绩。此外还得建立一个类stuscore,用来记录多个学生的成绩记录。

1、              建立类学生类student,它至少包括学号number,姓名name,性别sex,成绩chengji。具体如下:

           class student

{

      public:

      char name[21];       //姓名

      char number[11];     //学号

      char sex;  //性别

      double chengji;  //成绩

      student *next;  //类指针,用来指向下一个记录

    student();

      void init(string &Name,string &Number,char Sex,double Chengji);  //输入学生成绩记录

      virtual ~student();

};

函数init(string &Name,string &Number,char Sex,double Chengji)用于输入学生记录,相当于一个注册。其具体实现如下:

void student::init(string &Name,string &Number,char Sex,double Chengji)

{

      int len;

      len=Name.length();

      if(len>20)len=20;

        Name.copy(name,len,0);

        name[len]=0;

      len=Number.length();

      if(len>10)len=10;

      Number.copy(number,len,0);

      number[len]=0;

      sex=((sex=='m')?'m':'f');

      chengji=Chengji;

}

2、              建立学生成绩记录类stuscore,该类是学生成绩记录的集合。其成员函数则是问题中要求的添加、显示、查找、删除、保存、导出等各种操作。改类具体如下:

            class stuscore 

{

      student* head;

public:

      bool add_record();//添加学生成绩记录

      void display_record();//显示学生成绩记录

      int length();//学生成绩记录个数

      bool delete_record();//删除学生成绩记录

      void save_record();//保存学生成绩记录

      void load_record();//加载学生成绩记录

      bool find_record();//查找学生成绩记录

      stuscore();

      virtual ~stuscore();

};

现在就要编写各个功能的函数实体了:

①       添加学生成绩记录add_record(),建立一个链表:

bool stuscore::add_record()

{

      int i;

      int j=1;

      string Name;

    string Number;

      char Sex;

      double Chengji;

      student *newnode,*current,*previous;

      current=previous=head;

      cout<<"请输入插入的位置:";

             cin>>i;

    if(i<=0||i>length()+1)

      {

             cout<<"输入的位置不正确!";

          return false;

      }

      cout<<"请输入学号:";

          cin>>Number;

      cout<<"请输入姓名:";

             cin>>Name;

    cout<<"请输入性别:";

             cin>>Sex;

      cout<<"请输入成绩:";

          cin>>Chengji;

      newnode=new student();

    newnode->init(Name,Number,Sex,Chengji);

    newnode->next=null;

    if(!newnode)

      {

             cout<<"内存已满!";

          return false;

      }    

      if(i==1)

      {

             newnode->next=head;

             head=newnode;

             return true;

      }

    else

      {

             while(current&&j<i)

             {

                    previous=current;

                 current=current->next;

                 j++;

             }

             newnode->next=current;

             previous->next=newnode;

             return true;

      }

}

 

②       显示学生成绩记录display_record(),具体实现如下:

void stuscore::display_record()

{

      student*current;

      current=head;

      cout<<"表中有"<<length()<<"条记录!\n";

      if(length())

      {

             cout<<setiosflags(ios::left)<<setw(15)<<"学号"<<setw(15)<<"姓名"<<setw(12)<<"性别"<<setw(5)<<"成绩"<<endl;

          while(current)

             {

                cout<<current;

                current=current->next;

             }

      }

}

           另外,对<<运算符进行了重载,这样就可以直接用cout输出学生成绩记录,函数重载如下:

ostream&operator<<(ostream&output,const student *addr)

{

output<<setiosflags(ios::left)<<setw(15)<<addr->number<<setw(15)<<addr->name<<setw(12)<<addr->sex<<setw(5)<<addr->chengji<<endl;

       return output;

}

③       查找学生成绩记录find_record(),具体实现如下:

bool stuscore::find_record()

{    student *current,*previous;

      string Number;

      cout<<"请输入要查找的学生的学号:";

      cin>>Number;

      current=previous=head;

      while(current)

      {

            

             if(current->number==Number)

             {

                    cout<<setiosflags(ios::left)<<setw(15)<<"学号"<<setw(15)<<"姓名"<<setw(12)<<"性别"<<setw(5)<<"成绩"<<endl;

                    cout<<current;

                 return true;

             }

             else

             {

                    previous=current;

                    current=current->next;

                   

             }

      }

      if(!current)

      {

             cout<<"没有找到该学生!";

             return false;

      }

return true;

}

④       删除学生记录delete_record(),具体实现如下:

bool stuscore::delete_record()

{

      string s;

      student*current,*previous;

      current=previous=head;

      cout<<"成绩表中有"<<length()<<"个学生成绩记录"<<endl;

      if(!length())

      {

             cout<<"学生成绩表已空!\n";

             return false;

      }

      else{

    cout<<"请输入要删除的学生记录的学号:";

      cin>>s;

      while(current)

      {

             if(current->number==s)

             {

                    if(current==head)

                    {

                           head=head->next;

                           delete current;

                           cout<<"删除成功!";

                           return true;

                    }

                    else

                    {

                           previous->next=current->next;

                        delete current;

                           cout<<"删除成功!";

                        return true;

                    }

             }

             else

             {

                    previous=current;

                 current=current->next;

             }

      }

      if(!current)

      {

             cout<<"没有找到该学号所对应的学生记录!";

          return false;

      }

      }

      return true;

}

   

⑤  保存学生成绩记录save_record(),具体实现如下:

void stuscore::save_record()

{

  

ofstream file;

student*current=head;

file.open("./fname.txt",ios::out);

if(!file)

{

   cout<<"打开文件失败!";

   cin.get();

}

else

{

   while(current)

   {

       if(file&&!file.eof())

       file.write((char*)current,sizeof(*current));

       current=current->next;

   }

   cout<<"保存完成!";

   file.close();

}

}

⑥  加载学生成绩记录load_record(),具体实现如下:

void stuscore::load_record()

{

   ifstream file;

   char fname[20];

   student *n;

   n=new student();

   cout<<"请输入要打开的文件名(fname.txt):";

   cin>>fname;

   file.open(fname,ios::in);

    if(!file)

   {

        cout<<"文件打开失败!";

       cin.get();

   }

   else

   {

      

       cout<<setiosflags(ios::left)<<setw(21)<<"姓名"<<setw(11)<<"学号"<<setw(5)<<"性别"<<setw(5)<<"成绩"<<endl;

       while(file&&file.peek()!=EOF)

   {

           file.read((char*)n,sizeof(*n));

           cout<<n<<endl;

   }

       file.close();

   }

}

⑦  计算学生成绩记录的个数length(),具体实现如下:

int stuscore::length()

{

   int j=0;

   student*current;

   current=head;

   while(current)

   {current=current->next;

   j++;

   }

   return j;

}

三、   程序运行结果:

 主菜单界面 :

 

①  添加学生成绩记录:

②  显示学生成绩记录:

③  按照①所示再添加几个学生成绩记录,显示结果为:

④  查找学生成绩记录:

⑤  删除学生成绩记录:

删除记录后再显示学生成绩记录:

⑥  保存学生成绩记录:

⑦  加载学生成绩记录:

⑧  退出学生成绩系统:

四、         课程设计总结

这是一个综合性较强,很实际的一个编程实例。刚学C++时候,感觉类和对象还挺有意思的,刚接触到这个题目时,觉得应该没什么大问题吧,因为,我自认为一些基本知识点都已经掌握了。可是,真的当我动手编程的时候,才发现并没有想象中的那么简单。单个知识点是弄清了,但是,将所有的知识点综合起来运用时,就碰到了各种各样的问题了。有时候,一个错误得找好久,才能发现。

本系统的重点就是要会建立两个类。一个是学生类student,用来存放一个学生的成绩记录,相当于一个结构体的功能吧。另一个类是学生成绩记录系统类stuscore,该类用来存放多个学生的成绩记录。难点就是stuscore类里的各个功能的实现。总的来说,添加,显示,查找,这三个功能比较容易,但是,删除,保存,加载这三个功能就需要花点心思了,可能是平时用的比较少吧,生疏了。可见只有通过平时多加练习,才能有助于自己巩固知识点。

最后想说的是,调试程序真的很关键。调试程序需要较大的耐心。可能调试程序的时间比自己编写整个程序的时间还要长,下的工夫还要深,但这是一个程序员必须了解,也必须接受的事实。有好几次,几个错误让我很是头疼啊,很想删了,重新来过,可是最后发现,还是得有耐心去调试程序。

通过这个实验的练习,我也学到了很多东西,特别是加深了对类和对象理解和应用方面,也很谢谢老师给我的帮助。

参考文献:C++程序设计教程(第二版),罗建军等编著,高等教育出版社

  

相关推荐