南阳理工学院·软件学院
课程设计报告
课程名称:
C++面向对象程序设计(课程设计)
课题名称:
新生基本信息统计软件
姓 名:
学 号:
专 业:
软件工程
年 级:
2021级
指导教师:
2021年12月
一,课程设计目的
选择这个课程设计是因为有我们现在有比较密切的关系,可以了解我们学生自己个人信息的管理与录入是怎样的过程,而且C++是实践性很强的课程。课程设计是加强我们实践能力的一个强有力手段。要求我们在完成程序设计的同时能够写出比较规范的设计报告。学生管理系统是一个教育单位不可缺少的部分,它的内容对于学校的决策者和管理者来说都至关重要,所以学生管理系统应该能够为用户提供充足的信息和快捷的查询手段。但一直以来人们使用传统人工的方式管理文件,这种管理方式存在着许多缺点,如:效率低、保密性差,另外时间一长,将产生大量的文件和数据,这对于查找、更新和维护都带来了不少的困难。在各大中小学校,用计算机管理学校的信息已经越来越普遍了。用计算机不但可以提高工作效率,而且还节省了许多人力物力,增强了学校资料的安全性。提高了学校的管理能力,为此,用计算机来管理学校的信息,是非常必要的。
二,课程设计内容
- 课程设计的题目及简介
题目:新生基本信息统计软件
有新生来报到,要逐个录入其信息,如:学生姓名,性别,专业,出生日期,家庭地址,英语入学成绩。要求设计链表类来实现,并统计学生人数。
简介及要求:
① 新增学生信息
② 删除学生信息
③导入学生信息(已经保存于的文件信息)
④ 学生信息搜索(按姓名)
⑤ 学生信息统计(按专业或性别或年龄---年龄要自动计算)
⑥ 按英语成绩排序
⑦学生信息保存
⑧ 退出
2、设计说明
①类设计
设计了一个人类和学生类
Class person
Class student
学生类继承人类
②函数设计
一共涉及12个函数
分别是
void create();//建立链表
void find();//查找函数
void add();//增加函数
void modify();//修改学生信息
void bianli();//遍历函数
void delet();//删除函数
void paixu();//排序函数
void census();//按性别统计人数
void read();//读取文件信息函数
void save();//信息保存到文件函数
int fangzhichongfu(int n);//防止学号重复
void show();//菜单
3,程序流图
4、程序清单
①先设计一个人类
class person//人类
{
public:
person()
{
a=1;
}
~person(){};
virtual void setb()
{
b=1;
}
private:
int a,b;
};
②再定义学生类
class student:public person //学生类继承人类
{
public:
student()//初始化头结点并给其申请空间
{
head=new STU;head->next=NULL;
}
void create();//建立链表
void find();//查找函数
void add();//增加函数
void modify();//修改学生信息
void bianli();//遍历函数
void delet();//删除函数
void paixu();//排序函数
void census();//按性别统计人数
void read();//读取文件信息函数
void save();//信息保存到文件函数
int fangzhichongfu(int n);//防止学号重复
void show();//菜单
~student(){};
private:
STU *head;
STU *tail;
};
③构建学生信息结构体
typedef struct StuNode//学生信息的结构体
{
int num;
string name;
string sex;
int english;
string major;
string address;
StuNode *next;
}STU;
④主函数
int main()
{
student gn;
while(1)
{
gn.show();
char select[128];
cout<<"请输入调用功能"< cin>>select; int a=strlen(select); if(a==1) { switch(select[0]) { case '1':system("cls");gn.create();break; case '2':system("cls");gn.delet();break; case '3':system("cls");gn.read(); break; case '4':system("cls");gn.find();break; case '5':system("cls");gn.census();break; case '6':system("cls");gn.paixu();break; case '7':system("cls");gn.save();break; case '8':system("cls");gn.add();break; case '9':return 0; } } else if(a>=2&&a<=3) { switch(select[0]+select[1]) { case 'a':system("cls");gn.modify();break; case 'b':system("cls");gn.bianli();break; default:system("cls");printf("输入指令错误n");system("pause");break; } } else if(a>3) { printf("指令错误n"); system("pause"); } } } ⑤菜单 void student::show()//菜单显示函数 { cout<<"*************************************************"< cout<<" 1. 创建一个学生链表 "< cout<<" 2. 删除学生信息 "< cout<<" 3. 导入学生信息 "< cout<<" 4. 学生信息搜索 "< cout<<" 5. 统计学生人数 "< cout<<" 6. 按英语成绩排序 "< cout<<" 7. 学生信息保存 "< cout<<" 8. 增加学生信息 "< cout<<" 9. 退出系统 "< cout<<" 10. 修改学生信息 "< cout<<" 11. 遍历链表数据 "< cout<<" 请选择:"< } ⑥建立链表创建学生信息 void student::create()//链表的建立函数 { tail=head; STU *p,*bl; bl=head; int n; int h;//此处不会用c++清除缓存防止输入人数时乱输用c代替 tt:printf("请输入学生个数n"); h=scanf("%d",&n); if(h!=1) {fflush(stdin); goto tt; } for(n;n>0;n--) { p=new STU;//给p申请个结构体大小的空间 int m; while(1) { cout<<"请输入学号"< cin>>p->num; m=fangzhichongfu(p->num); if(m==0) {cout<<"输入学号重复请重输入"< continue; } else break; } cout<<"请输入名字"< cin>>p->name; cout<<"请输入性别性别只存在 男 m 女 w"< string j="m";//这里可以限制性别只为男女 string q="w"; while(1) { cin>>p->sex; if(!strcmp(p->sex.c_str(),j.c_str())) break; else if(!strcmp(p->sex.c_str(),q.c_str())) break; else {printf("你输入了新物种请重新输入n"); continue;} } cout<<"请输入英语成绩"< cin>>p->english; cout<<"所选专业:"< cin>>p->major; cout<<"请输入家庭住址"< cin>>p->address; p->next=NULL;// tail->next=p;//让tail的指针域指向p tail=p;//让p变成tail可以连接下一次循环 } cout<<"创建链表成功" < system("pause"); } ⑦遍历函数 void student::bianli()//遍历函数 { STU *bl; bl=head->next; while(bl) { cout<<"学号:"< cout<<"姓名:"< cout<<"性别:"< cout<<"英语成绩:"< cout<<"所选专业:"< cout<<"家庭住址:"< bl=bl->next; }system("pause"); } ⑧查找学生信息 void student::find()//查找函数 { STU *f; f=head->next;//定义一个f指针指向head后面的节点 STU *q; q=head->next; if(q==NULL) { cout<<"暂无学生信息请指令功能一后调用此功能n"< system("pause"); return; } string fname; cout<<"请输入所要查询的学生姓名"< cin>>fname; while(f) { if(!strcmp(fname.c_str(),f->name.c_str()))//比较所找名字与链表中的名字 { cout<<"学号:"< cout<<"姓名:"< cout<<"性别:"< cout<<"英语成绩:"< cout<<"所选专业:"< cout<<"家庭住址:"< f=f->next; //使其遍历链表 } system("pause"); } ⑨修改学生函数 void student::modify()//修改学生信息函数 { STU *mod; mod=head->next; if(mod==NULL) { cout<<"暂无学生信息请指令功能一后调用此功能n"< system("pause"); return; } int numm; cout<<"请输入所要修改的学生的学号"< cin>>numm; while(mod) { if(numm==mod->num) { cout<<"请重新输入学号"< cin>>mod->num; cout<<"请重新输入名字"< cin>>mod->name; cout<<"请重新输入性别性别只存在 男 m 女 w"< string j="m"; string q="w"; while(1) { cin>>mod->sex; if(!strcmp(mod->sex.c_str(),j.c_str())) break; else if(!strcmp(mod->sex.c_str(),q.c_str())) break; else {printf("你输入了新物种请重新输入n"); continue;} } cout<<"重新请输入英语成绩"< cin>>mod->english; cout<<"重新输入所选专业:"< cin>>mod->major; cout<<"请重新输入家庭住址"< cin>>mod->address; break; } else mod=mod->next; } cout<<"修改成功" < system("pause"); } ⑩增加学生信息 void student::add()//增加学生信息函数 { if(head->next==NULL) { cout<<"请先导入学生信息或者创建一个学生链表"< } else { STU* f=head; STU* p=new STU;//增加学生信息需要一个有空间的指针接收学生信息并插入到链表当中 cout<<"请输入你想添加的学生信息"< int m; while(1) { cout<<"请输入学号"< cin>>p->num; m=fangzhichongfu(p->num); if(m==0) {cout<<"输入学号重复请重输入"< continue; } else break; } cout<<"请输入名字"< cin>>p->name; cout<<"请输入性别性别只存在 男 m 女 w"< string j="m"; string q="w"; while(1) { cin>>p->sex; if(!strcmp(p->sex.c_str(),j.c_str())) break; else if(!strcmp(p->sex.c_str(),q.c_str())) break; else {printf("你输入了新物种请重新输入n"); continue;} } cout<<"请输入英语成绩"< cin>>p->english; cout<<"所选专业:"< cin>>p->major; 8cout<<"请输入家庭住址"< cin>>p->address; while(f->next!=NULL)//这个地可以让f指针指向尾节点增加学生信息时直接插入到尾节点 { f=f->next; tail=f; } tail->next=p;//让tail的指针域指向p; tail=p;//使p便成尾节点; p->next=NULL; cout<<"添加成功"< } } ⑪删除学生信息 void student::delet()//删除学生信息函数 { if(head->next==NULL) { cout<<"空链表无学生信息返回主菜单"< system("pause"); return; } STU *de1,*de2; de1=head; de2=head->next; int n; cout<<"请输入所要删除学生的学号"< cin>>n; while(de2) { if(n==de2->num) { int quxiao; cout<<"是否确定删除该学生信息按1确定按0取消"< cin>>quxiao; if(quxiao==0) break; de1->next=de2->next;//如果找到学生信息使该节点前一个节点指向该节点后一个节点; delete de2;//释放该节点 de2=NULL; break; } else { de1=de2; de2=de2->next; } } cout<<"删除成功"< system("pause"); } ⑫按照英语成绩排序 void student::paixu()//排序函数 { STU *p,*q,*r,*w; p=head; q=head->next; if(p->next==NULL){ printf("无学生信息"); system("pause"); return ;} while(p->next!=NULL) { while(q->next!=NULL) { if(p->next->english r=p->next;//使定义的一个容器指针接收p的指针域数据 p->next=q->next;//让p的指针域接收q的指针域; q->next=q->next->next;//让q的指针域接收q后面的节点的指针域; p->next->next=r; } else { q=q->next; } } p=p->next;//移动排序 q=p->next; } w=head->next; cout<<"按英语成绩排名如下"< while(w) { cout<<"学号:"< cout<<"姓名:"< cout<<"性别:"< cout<<"英语成绩:"< cout<<"所选专业:"< cout<<"家庭住址:"< w=w->next; } system("pause"); } ⑬统计学生信息 void student::census()//统计学生人数函数 { cout<<"********************************"< cout<<" 1.输出当前所有学生数量 "< cout<<" 2.输出你所要查询性别的人数 "< cout<<"********************************"< char cen[10]; cout<<"请输入选择的功能"< cin>>cen; if(cen[0]=='1') { int tt=0; STU *t; t=head->next; while(t) { tt++; t=t->next; } cout<
system("pause"); } else if(cen[0]=='2') { STU *tj; tj=head->next; if(tj==NULL) { cout<<"暂无学生信息请指令功能一后调用此功能n"< system("pause"); return; } int sexshu=0; string fname; cout<<"请输入所要查询的学生性别"< cin>>fname; while(tj) { if(!strcmp(fname.c_str(),tj->sex.c_str())) { sexshu++; } tj=tj->next; } cout<<"统计该性别人数为"< system("pause"); } else cout<<"输入指令有误"< } ⑭文件 void student::save()//学生信息的保存函数 { ofstream of1;//定义一个写的文件指针 of1.open("D:\caozuo.txt",ios::out);//打开一个文件 if(!of1.is_open()) { cout<<"open caozuo.txt error!"< } else { STU* s=head->next; while(s) { of1< s=s->next; } of1.close();//关闭文件 }ofstream of2; of1.open("D:\guankan.txt",ios::out); if(!of1.is_open()) { cout<<"open guankan.txt error!"< } else { STU* b=head->next; while(b) { of1<<"学号:"< b=b->next; } of1.close(); } cout<<"保存成功!"< system("pause"); } ⑮导入学生信息 void student::read()//学生信息的导入函数 { ifstream ifs;//定义一个读文件的指针 ifs.open("D:\caozuo.txt",ios::in); //以读的方式打开文件 if(!ifs.is_open()) { cout<<"open caozuo.txt error!"< } STU* p; p=head; while(!ifs.eof()) { STU* s=new STU; ifs>>s->num>>s->name>>s->sex>>s->english>>s->major>>s->address; if(ifs.get()==-1) { break; } p->next=s; p=s; p->next=NULL; } ifs.close(); cout<<"读取成功!"< } 在本次设计的全过程中,我对所学的知识有了一个比较系统的认识和理解。涉及了各方面的知识,大大扩展了我的知识面,同时是我学会了如何使用所学的知识去解决一些实际的问题此系统是,这是一个简单的学生管理系统,它的有点在于简单明了,容易上手 *** 作,便于修改内容,系统代码也比较容易修改,缺点是功能不是很强大,而且代码有些地方比较繁琐,确实仅仅是一个设计,在教学实际用途中还是有一定的技术差距。 在设计中我深知自己掌握的知识还远远不够,掌握的一些理论知识应用到实践中去,总会出现这样或那样的问题,不是理论没有掌握好,而是光知道书本上的知识是远远不够的,一定要把理论知识和实践结合起来。把学到的知识应用到时间中去,多做多练,才可以把理论的精华发挥出来。知识不是知道,了解就好,一定要去应用它,发展它,让它在现实生活中得到充分的应用,从而解决一些问题,这才是学习的根本目的。而且知识又不是单一的,它是互相联系的,学科与学科之间都有着内在的联系。计算机是一门非常复杂且庞大的学科,一项课题往往需要多项技术才可以完成的。在设计阶段,通过对课题的深入分析与研究,迫使我对技术有了一定的了解。在遇到问题时,得到了指导老师与同学的悉心帮助,使我感受到集体的力量是无穷的。 通过这次设计,我学到了许多书本上学不到的知识,增强了自己的动手能力。但由于自己的知识水平有限,仍然存在很多的不足之处,恳请老师多多指教!当今的社会是竞争的社会,而人才的竞争则是竞争的焦点。 计算机技术的高速发展,使我深深地认识到只有不断的加强学习,才能在计算机技术方面不至于被淘汰,今后,我还要加强学习,努力使自己成为一位专业的计算机人员,为我自己所从事的工作服务。 欢迎分享,转载请注明来源:内存溢出
评论列表(0条)