最近学完C++,完成学校布置的学习作业。我是按照b站上黑马教程上C++的学习,然后按照自己的需求去完成了自己的作业。从6.15号开始到6.21号,历时6天把代码写完。自己想把它写下来作为一篇文章,方便后面的人看到。
一、问题分析与需求分析
首先我是学校要求写的课设按照要求,如图所示
我需要开发一个简单的创新活动管理系统,然后需要去实现学院专业等创新活动的基础信息管理。第二个要求是去实现学生信息和指导教师的管理。要求是利用面向对象程序设计方法。
跳出这个题目,我们思考一下。设计这样的一个系统,我们需要设计哪些模块。在要求上告诉我们需要实现创新活动的登记,成绩录入的过程。那首先我们应该创建出应该基础信息类,类里有构造函数……还需要实现学生、老师的管理。这样就总共需要创建三个类。
既然设计一个系统,增删改查的基本都要实现接下来讲的就是具体实现过程。
功能实现
(一)创建项目和类
我使用的是Dev-C++去写代码,所以我就用这个教你创建项目。你用其他的也可以,方法都差不多。
第一步打开Dev-C++在界面上找到文件操作
点击新建,找到新建项目
点击后会进入到这个界面
把名称改成项目名,选择C++语言
随后就创建好了项目。
现在,你已经创建好你自己要写的项目了。
在这你要开始自己写代码了,刚刚一开始,通过分析我们需要创建三个类。并且还需要用到封装等等一些特性。你要开始在自己的项目上开始写下源代码。
在项目中创建基础信息类的头文件和Cpp文件,老师学生也是一样的处理。
在头文件中声明,cpp文件中具体实现。
(二)显示菜单
首先,我们实现的是创新活动管理系统,应该在用户打开时提供菜单以供选择,在选择后做出相应的操作。
basicInformation.h
#include<iostream>
#include<string>
using namespace std;
class basicInformation
{
public:
basicInformation();//构造函数
basicInformation(string,string,string,string,string,int)
~basicInformation();//析构函数
//显示目录
void display_Menu();
private:
string name ;//项目名称
string level; //级别
string category;//类别
string college;//学院
string Specialty; //所属专业
int projetctId ;//项目编号
}
在头文件中写入构造函数、析构函数、私有数据成员。增添了一个显示目录的函数。我们应该遵循头文件声明,cpp文件具体实现。
void basicInformation::display_Menu()
{
cout << "****欢迎使用创新活动管理系统*****" << endl
<< "******** 0 退出程序 ********" << endl
<< "******** 1 增加创新活动 ********" << endl
<< "******** 2 显示操作 ********" << endl
<< "******** 3 删除操作 ********" << endl
<< "******** 4 修改操作 ********" << endl
<< "******** 5 查找操作 ********" << endl
<< "******** 6 排序创新活动 ********" << endl
<< "******** 7 初始化 ********" << endl;
}
显示菜单是最为简单的一个函数。写完后在主函数可以运行测试一下。
test.cpp
#include"basicInformation.h"
void test1()
{
basicInformation b1;
b1.display_Menu();
}
int main()
{
test1();
return 0;
}
出现这样的基本上没什么问题
这样显示菜单的功能就做好了。接下来我们需要在主函数进行操作。
在主函数部分,我们要将根据用户选择进行不同的操作,并且直到用户选择退出程序前,才能结束运行。
#include<iostream>
#include"basicInformation.h"
using namespace std;
int main()
{
//先创建一个对象
basicInformation bs1;
//通过选择决定执行模块
int choice1;
while(true)
{
bs1.display_Menu();
cout << "输入你的选择" << endl;
cin >> choice1;
switch(choice1)
{
case 0://退出程序
break;
case 1://增加创新活动
break;
case 2://显示操作
break;
case 3://删除操作
break;
case 4://修改操作
break;
case 5://查找
break;
case 6://排序
break;
case 7://文件
break;
default:
break;
}
}
return 0;
}
暂时来说主体架构就是这样,我们尝试运行一下。
接下来,我们就可以一个一个去实现功能。
(三)退出程序
我们需要创建一个接口,通过这个接口,即用户选择退出程序,能够重循环跳出来。并且结束运行具体实现如下:
//头文件增加声明
void exit_systerm();
//cpp文件具体实现
void basicInformation::exit_systerm()
{
cout << "欢迎下次使用" << endl;
system("pause");
exit(0);
}
//在主函数
case 0:
bs1.exit_systerm();
break;
首先在头文件增加一个函数声明即退出函数,通过在主函数调用即可以实现退出程序。在cpp文件中实现具体代码,在主函数中选择0的情况下增加调用。
基本上实现完成。
(四)增加创新活动
在增加创新活动前,把Student类的声明和Teacher类的声明都实现一下,这部分比较简单,读者自行实现。并且将构造函数与析构函数的空实现写完。
//老师类的声明
#include<iostream>
#ifndef TEACHER_H
#define TEACHER_H
using namespace std;
class Teacher
{
public:
Teacher();
~Teacher();
private:
string name;
string specialty;
int age;
};
#endif
//学生类的声明
#include<iostream>
#ifndef STUDENT_H
#define STUDENT_H
using namespace std;
class Student
{
public:
Student();
~Student();
private:
string name;
string specialty;
int id;
};
#endif
实现增加创新活动的函数,我们需要根据用户输入增加对应的活动数。当用户输入人数有误时输出提示告诉用户。由于增加的活动数不固定,并且在后续想要继续增加时不能出现活动数有内存不够的情况。我们可以用new关键字去实现动态数组。首先在用户输入后,根据对应数量去开辟一块空间用来存储数据。而由于new返回值是指针。所以我们可以增加一个私有数据成员类本身的指针用来记录数据的地址,一个记录数量的数据成员。根据用户输入,更新数量。
//记录数据地址
basicInformation *activity_empty;
//记录数量
int activity_num;
在未输入数据前,记录数量的activity_num应该初始化为0,并且指针应该指向为空。
在这就要求需要在构造函数里进行初始化,每当创建一个对象,就需要通过初始化。不然系统会自动赋值,出现问题 。
basicInformation::basicInformation()
{
this->activity_num = 0;
this->activity_empty = NULL;
}
输入数据后,根据用户输入,重新计算数量,开辟空间。在空间开辟完成后,我们应该是先将之前记录的数据重新拷贝进入新空间,然后在完成拷贝后,将新数据写入。通过输入结束后,输出提示,成功添加。
//头文件增加函数
void addActivity()
//cpp文件具体实现
void basicInformation::addActivity()
{
cout << "请输入增加活动数量" << endl;
int addnum = 0;
cin >> addnum;
if(addnum > 0)
{
//添加
//计算添加新空间大小
int newNum = this->activity_num + addnum;
//开辟新空间
basicInformation *newSpace = new basicInformation [newNum];
//将原有数据进行拷贝
if(this->activity_empty != NULL)
{
for(int i = 0;i < this->activity_num;i++)
{
newSpace[i] = this->activity_empty[i];
}
}
//将增加的数据拷贝
for(int i = 0;i < addnum;i++)
{
string name ;
string level;
string category;
string college;
string Specialty;
int projetctId;
//输入信息
cout << "输入创新项目名称:" << endl;
cin >> name;
cout << "输入创新项目级别:" << endl;
cin >> level;
cout << "输入创新项目类别:" << endl;
cin >> category;
cout << "输入项目所属学院:" << endl;
cin >> college;
cout << "输入项目所属专业:" << endl;
cin >> Specialty;
cout << "输入创新项目编号:" << endl;
cin >> projetctId;
//将信息增加到新空间下
newSpace[this->activity_num + i] = basicInformation(name ,level , category, college, Specialty, projetctId);
}
//释放原有空间
delete [] this->activity_empty;
//更新项目数
this->activity_num = newNum;
//重新赋值新地址
this->activity_empty = newSpace;
//提示输入成功
cout << "成功添加活动" << endl;
}
else
{
cout <<"输入无效数字。" << endl;
}
//输入完成后清屏
system("pause");
system("cls");
}
注意,由于在这使用有参构造函数但是由于我并未实现,所以把代码抄下是无用的。请读者自行实现有参构造函数,给私有数据赋值。
basicInformation::basicInformation(string n,string l,string c,string co,string s,int p)
{
name = n;//项目名称
level = l; //级别
category = c;//类别
college = co;//学院
Specialty = s; //所属专业
projetctId = p;//项目编号
}
在主函数测试。
case 1://增加创新活动
bs1.addActivity();
break;
可以进行输出测试,看看是否数据是否保存。
for(int i = 0;i < this->activity_num;i++)
{
cout << "输入创新项目名称:" << this->activity_empty[i].name << endl
<< "输入创新项目级别:" << this->activity_empty[i].level << endl
<< "输入创新项目类别:" << this->activity_empty[i].category << endl
<< "输入项目所属学院:" << this->activity_empty[i].college << endl
<< "输入项目所属专业:" << this->activity_empty[i].Specialty << endl
<< "输入创新项目编号:" << this->activity_empty[i].projetctId << endl;
}
到这,我们实现了创新活动项目的增加操作。但是我们要实现的不仅仅是创新活动的管理,还有老师、学生的信息管理。相同的老师、学生的增加操作,也可以像创新活动这样,通过new关键字去开辟空间。并且将其中私有数据在构造函数中初始化。请读者自行按照该部分去写代码,基本上一样。
在写完Student、Teacher类的增加函数后,可以在创新活动项目的cpp文件中的增加活动函数添加代码。但是这样又需要basicInformation类中需要又私有数据成员即Teacher、Student类的一个对象。故现在basicInformation类中私有数据成员为:
private:
string name ;//项目名称
string level; //级别
string category;//类别
string college;//学院
string Specialty; //所属专业
int projetctId ;//项目编号
Teacher t;
Student s;
//记录数据地址
basicInformation *activity_empty;
//记录数量
int activity_num;
记得别忘了,包含Student、Teacher类的头文件。