小学期的历练
6.29-7.6这段日子,被称为完美的小学期,为何呢?在这几天里通过代码的积累,对面向对象程序设计有啦更进一步的了解。
接下来说说我的这段时间的感悟吧
心得体会
通过本次小学期的磨练,让我对面向对象程设计有了更深一步的了解,最深的是学会用类的封装来解决问题,逐步拆解,各个击破。以下是我的感悟
从本次的实验中,在对系统类的实验编程中收获到了用类来封装一个学生管理系统,更深的体会到了,学生类很近似于结构体,他是一个单独的学生个体,通过主函数来调用类中的函数来对学生进行调用。不同的函数执行的是一个学生个体的信息改动。并且在此过程中熟练地运用了重载输入输出流来实现文件的导入和导出。在学生成绩管理程序中,在对于排序的解决方面,我采用了快排的思想,写了一个比较函数,实现了降序排序。
在对数学类的编程中,收获到类与类之间的关系,直线类继承点类,面类继承点类,通过函数来实现直线和平面的构造,进而计算距离,单位法向量,判断点线关系,线线关系,点面关系,线面关系和面面关系。在判断三角形的类别时,将点类的对象内嵌到三角形类中,通过边之间的关系来判断三角形的类别,再此过程中,我遇到一些麻烦,就是当判断两条边相等时不能直接==(因为数据时double类型,需使用fabs(l1-l2)<1e-3)用这样的形式来判断两条边相等。
在对游戏类的编程中,收获到了随机数字的使用,以及设定时间的使用,利用sround(unsigned int)time(0));来获取随机数,并用rand()%1000+1来控制随机数字的范围。
然而对于石头剪子布采取分析用户出拳的概率,来进行出拳,time_t 来定义时间变量,通过nowtime=time(0);来获取当前时间,已达到限制时间的使用。在棋盘类中,在计算机的下棋方式的设定中我采取的是①要赢②不能赢,但也不能输③以上情况都不满足时随机选择下棋地方。在写判断输赢的函数,通过下棋的每行每列以及对角线和反对角线的计算,来判断输赢和平局。对于选择棋子的解决利用两个字符变量一个代表计算机的,另一个代表人的,实现了棋子的选择,对于先手和后手的问题,我采用条件分支语句来分隔他们,调整用户和计算机的下棋顺序。
在对链表的编程中,①先从整数链表说起用类来封装链表的各种操作以及数据,指针域和头指针。操作依然和之前的链表操作一样,在主函数中对函数进行操作即可。②用链表来做简单的通讯录,其实和整数链表差不多,无非是多了点信息,不同的是多了文件的导入和导出,依然采取重载输入输出流的方式,只不过参数应为类对象的指针。③最后是约瑟夫环问题,他较为不同的是他是环形链表,不是线性的。对于创建环形链表,通过头指针依次连接节点,到最后一节点时,让该节点的指针域指向头节点的指针域,就构成了环形链表。其次是找到从第几个人开始报数,利用循环计数,找到该节点,然后开始报数,报到该数时,动态分配一个节点,让该节点的数据等于要删除的节点的数据,并让新的头指针指向该节点,然后如此循环,到最后会出现只有一个节点,并且他的指针域所指向的地址是它本身,就让他的指针域为空接在新的链表后面,并结束循环。最后输出新的链表。
总结:对于此次的小学期任务做概括就是:这半年来学习的面向对象程序设计其实是跟着老师的节奏走,老师写了类,我们对类的功能进行补充,主函数也不用写。而小学期的这几道题,完全交给我们自己去编程,类和功能都需要我们自己去进行封装,极大地锻炼了我的面向对象的封装的能力以及主函数的编程能力。唯一不足的是:并没有用私有类型去封装数据,怕麻烦(需要改进),并没有很熟练的运用继承的关系。因此,暑假要继续提高我的面向对象的继承关系的运用结合用私有类型去封装数据。
话不多说,先上几个优秀的代码!!
这是一个学生信息管理系统!!
#include<iostream> #include<fstream> #include<string> #include<cstdlib> using namespace std; int con=0; class student { public: string name,sex,xuehao,banji,xueyuan,zhuanye; int age; void show(); void deletes(); void creat(); void add(); int find1(string l); int find2(string l); void xiugai(); friend istream &operator>>(istream &is,student &a); friend ostream &operator<<(ostream &os,student &a); }; void student::show() { cout<<"学号:"<<xuehao<<" 姓名:"<<name<<" 性别:"<<sex<<" 年龄:"<<age<<" 班级:"<<banji<<" 学院:"<<xueyuan<<" 专业:"<<zhuanye<<endl; } void student::deletes()//消除学生信息,让学号和年龄为零其他为空 { this->xuehao=" "; this->name=" "; this->sex=" "; this->banji=" "; this->xueyuan=" "; this->zhuanye=" "; this->age=0; } void student::creat() { cout<<"请输入学号"<<endl; cin>>xuehao; cout<<"请输入姓名"<<endl; cin>>name; cout<<"请输入性别"<<endl; cin>>sex; cout<<"请输入年龄"<<endl; cin>>age; cout<<"请输入班级"<<endl; cin>>banji; cout<<"请输入学院"<<endl; cin>>xueyuan; cout<<"请输入专业"<<endl; cin>>zhuanye; } void student::add() { cout<<"请输入添加的学号"<<endl; cin>>xuehao; cout<<"请输入添加的姓名"<<endl; cin>>name; cout<<"请输入添加的性别"<<endl; cin>>sex; cout<<"请输入添加的年龄"<<endl; cin>>age; cout<<"请输入添加的班级"<<endl; cin>>banji; cout<<"请输入添加的学院"<<endl; cin>>xueyuan; cout<<"请输入添加的专业"<<endl; cin>>zhuanye; } int student::find1(string l) { if(xuehao==l) return 1; else return 0; } int student::find2(string l) { if(banji==l) return 1; else return 0; } void student::xiugai() { int c; cout<<"请选择修改的信息"<<endl; cout<<"1.学号 2.姓名 3.性别 4.年龄 5.班级 6.学院 7.专业"<<endl; cin>>c; switch(c) { case 1: cout<<"请输入学号"<<endl; cin>>xuehao; break; case 2: cout<<"请输入姓名"<<endl; cin>>name; break; case 3: cout<<"请输入性别"<<endl; cin>>sex; break; case 4: cout<<"请输入年龄"<<endl; int x; cin>>age; break; case 5: cout<<"请输入班级"<<endl; cin>>banji; break; case 6: cout<<"请输入学院"<<endl; cin>>xueyuan; break; case 7: cout << "请输入专业" << endl; cin>>zhuanye; break; } } istream &operator>>(istream &is,student &a) { is>>a.xuehao>>a.name>>a.sex>>a.age>>a.banji>>a.xueyuan>>a.zhuanye; return is; } ostream &operator<<(ostream &os,student &a) { os<<a.xuehao<<" "<<a.name<<" "<<a.sex<<" "<<a.age<<" "<<a.banji<<" "<<a.xueyuan<<" "<<a.zhuanye; return os; } int main() { int con=0,x; student a[100];//构建学生类数组 cout<<"请选择下面的一个项目:"<<endl; cout<<"1.创建 2.添加 3.查询 4.修改 5.删除 6.显示 7.文件导入 8.文件导出 9.退出"<<endl; while(1) { cin>>x; if(x==1)//创建学生基本信息 { int n; cout<<"请输入创建学生的个数"<<endl; cin>>n; for(int i=0;i<n;i++) { a[con++].creat(); } cout<<"请输入下一步操作"<<endl; } if(x==2)//添加学生的基本信息 { a[con++].add(); cout<<"请输入下一步操作"<<endl; } if(x==3)//查询学生 { int z,k=0; int h; string m; cout<<"请选择查询方式:1.学号 2.班级"<<endl; cin>>z; if(z==1)//按学号进行查询 { cout<<"请输入学号"<<endl; cin>>m; for(int i=0;i<con;i++) { if(a[i].find1(m)) { a[i].show(); k=1; } } if(k==0) cout<<"没有该学生"<<endl; } if(z==2)//按班级进行查询 { cout<<"请输入班级"<<endl; cin>>m; for(int i=0;i<con;i++) { if(a[i].find2(m)) { a[i].show(); k=1; } } if(k==0) cout<<"没有该学生"<<endl; } cout<<"请输入下一步操作"<<endl; } if(x==4)//修改学生信息 { string m; int l,k=0; cout<<"请输入要修改的学号"<<endl; cin>>m; for(int i=0;i<con;i++) { if(a[i].xuehao==m) { a[i].xiugai(); k=1; } } if(k==0) cout<<"没有该学生"<<endl; cout<<"请输入下一步操作"<<endl; } if(x==5)//删除学生信息 { string n; cout<<"请输入要删除的姓名"<<endl; cin>>n; for(int i=0;i<con;i++) { if(a[i].name==n) { a[i].deletes(); } } cout<<"请输入下一步操作"<<endl; } if(x==6)//展示当前学生的基本信息 { for(int i=0;i<con;i++) { if(a[i].xuehao==" ") continue; a[i].show(); } cout<<"请输入下一步操作"<<endl; } if(x==7)//导入文件信息 { char l[100]; cout<<"输入要导入的文件名"<<endl; cin>>l; cout<<"输入要导入几条学生信息"<<endl; int sum; cin>>sum; ifstream infile(l,ios::in); if(!infile) { cout << "open error!" << endl; exit(0); } for(int i=0;i<sum;i++) { infile>>a[con]; con++; } infile.close(); cout<<"请输入下一步操作"<<endl; } if(x==8)//导出到文件里 { char l[100]; cout<<"输入要导出的文件名"<<endl; cin>>l; ofstream out(l, ios::out); if(!out) { cout << "open error!" << endl; exit(0); } for(int i=0;i<con;i++) out<<a[i]<<endl; out.close(); cout<<"请输入下一步操作"<<endl; } if(x==9)//结束整个程序 break; } return 0; }
数学类:判断三角形的类别
#include<iostream> #include<cmath> #include<iomanip> using namespace std; class point//构造点类 { public: double x,y; point(double x1,double y1) { x=x1; y=y1; } point(point &t) { x=t.x; y=t.y; } }; class triangle//三角形类 { public: point a,b,c;//内嵌对象 triangle(point &a1,point &a2,point &a3); void judge(); double bian(point a,point b); }; triangle::triangle(point &a1,point &a2,point &a3):a(a1),b(a2),c(a3) { } double triangle::bian(point a,point b)//计算两点间的距离 { double l; l=sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); return l; } void triangle::judge()//判断三角形的形状 { double l1,l2,l3,l,t,m; l1=bian(a,b); l2=bian(a,c); l3=bian(b,c); if(l1+l2>l3&&l2+l3>l1&&l1+l3>l2) { if(fabs(l1-l2)<0.001&&fabs(l1-l3)<0.001) cout<<"等边三角形"<<endl; else if(l1==l2||l1==l3||l2==l3) { if(fabs((l1*l1)+(l2*l2)-(l3*l3))<0.001||fabs((l2*l2)+(l3*l3)-(l1*l1))<0.001||fabs((l1*l1)+(l3*l3)-(l2*l2))<0.001) cout<<"等腰直角三角形"<<endl; else cout<<"等腰三角形"<<endl; } else if(fabs((l1*l1)+(l2*l2)-(l3*l3))<0.001||fabs((l2*l2)+(l3*l3)-(l1*l1))<0.001||fabs((l1*l1)+(l3*l3)-(l2*l2))<0.001) cout<<"直角三角形"<<endl; else cout<<"一般三角形"<<endl; } else cout<<"不能构成三角形"<<endl; } int main() { double x1,y1,x2,y2,x3,y3; cout<<"请输入三个点的坐标:x y"<<endl; cin>>x1>>y1>>x2>>y2>>x3>>y3; point a(x1,y1),b(x2,y2),c(x3,y3); triangle t(a,b,c); t.judge(); return 0; }
游戏类:人机下棋
#include<iostream> #include<cstring> #include<time.h> #include <stdlib.h> using namespace std; int n; char a; class chess { public: char a,b; int n; int v[50][50]; char map[50][50]; void chushi(); int shuying(); void show(); void user(); void computer(); void play(); }; void chess::chushi() { int i,j; memset(v,0,sizeof(v)); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) cout<<"* "; cout<<endl; } } void chess::show() { int i,j; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(v[i][j]==1) cout<<a<<" "; if(v[i][j]==-1) cout<<b<<" "; if(v[i][j]==0) cout<<"*"<<" "; } cout<<endl; } } int chess::shuying()//根据每行每列或对角线和反对角线是否相加等于n或-n来进行输赢的判断和平局的判断 { int i,t=0,j; for(i=1;i<=n;i++) { t=0; for(j=1;j<=n;j++) t+=v[i][j]; if(t==-n) return -1; if(t==n) return 1; } t=0; for(i=1;i<=n;i++) { t=0; for(j=1;j<=n;j++) t+=v[j][i]; if(t==-n) return -1; if(t==n) return 1; } j=0;t=0; for(i=1;i<=n;i++) { j+=v[i][i]; t+=v[i][n+1-i]; } if(t==-n||j==-n) return -1; if(t==n||j==n) return 1; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(v[i][j]==0) return 0; } } return 3; } void chess::user() { int x,y; cout<<"请输入坐标(x,y)"<<endl; cin>>x>>y; v[x][y]=1; } void chess::computer() { int i,j,t=0,k; //先判断自己下一步棋能否赢,能赢就下,先对行在对列,然后是对角线和反对角线 for(i=1;i<=n;i++) { t=0; for(j=1;j<=n;j++) t+=v[i][j]; if(t==-(n-1)) { for(k=1;k<=n;k++) { if(v[i][k]==0) { v[i][k]=-1; return ; } } } } t=0; for(i=1;i<=n;i++) { t=0; for(j=1;j<=n;j++) t+=v[j][i]; if(t==-(n-1)) { for(k=1;k<=n;k++) { if(v[k][i]==0) { v[k][i]=-1; return ; } } } } j=0;t=0; for(i=1;i<=n;i++) { j+=v[i][i]; t+v[i][n+1-i]; } if(t==-(n-1)) { for(k=1;k<=n;k++) { if(v[k][n+1-k]==0) { v[k][n+1-k]=-1; return ; } } } if(j==-(n-1)) { for(k=1;k<=n;k++) { if(v[k][k]==0) { v[k][k]=-1; return ; } } } //对自己下一步棋不能输进行选择 t=0; for(i=1;i<=n;i++) { t=0; for(j=1;j<=n;j++) t+=v[i][j]; if(t==n-1) { for(k=1;k<=n;k++) { if(v[i][k]==0) { v[i][k]=-1; return ; } } } } t=0; for(i=1;i<=n;i++) { t=0; for(j=1;j<=n;j++) t+=v[j][i]; if(t==n-1) { for(k=1;k<=n;k++) { if(v[k][i]==0) { v[k][i]=-1; return ; } } } } j=0;t=0; for(i=1;i<=n;i++) { j+=v[i][i]; t+=v[i][n+1-i]; } if(t==n-1) { for(k=1;k<=n;k++) { if(v[k][n+1-k]==0) { v[k][n+1-k]=-1; return ; } } } if(j==n-1) { for(k=1;k<=n;k++) { if(v[k][k]==0) { v[k][k]=-1; return ; } } } //如果以上都不满足,则随机选择没有下过的地方进行下棋 while(1) { srand(time(0)); i=rand()%n+1; j=rand()%n+1; if(v[i][j]==0) { v[i][j]=-1; break; } } return ; } void chess::play() { cout<<"请输入棋盘大小(n*n)"<<endl; cin>>n; chushi(); int x; cout<<"请选择 1.先下 2.后下"<<endl; cin>>x; cout<<"请选择棋子 x o(大写):"; cin>>a; if(a=='x')//选棋 b='o'; else b='x'; if(x==1) { while(!shuying())//判断输赢 { user(); show(); cout<<"计算机下"<<endl; if (shuying() == 1) { cout << "赢 "<< endl; break; } if (shuying() == -1) { cout << "输" << endl; break; } if (shuying() == 3) { cout << "平" << endl; break; } computer(); show(); if (shuying() == 1) { cout << "赢" << endl; break; } if (shuying() == -1) { cout << "输" << endl; break; } if (shuying() == 3) { cout << "平" << endl; break; } } } else { while(!shuying()) { computer(); show(); cout<<"人下"<<endl; if (shuying() == 1) { cout << "赢 "<< endl; break; } if (shuying() == -1) { cout << "输" << endl; break; } if (shuying() == 3) { cout << "平" << endl; break; } user(); show(); if (shuying() == 1) { cout << "赢 "<< endl; break; } if (shuying() == -1) { cout << "输" << endl; break; } if (shuying() == 3) { cout << "平" << endl; break; } } } } int main() { chess qi; qi.play(); return 0; }
链表类:约瑟夫退圈问题
#include<iostream> using namespace std; class people { public: string num; people *next; people *head; people *newhead; public: void creat(); void print(); void play(); }; void people::creat() { int n,i; people *p=null; people *q=null; cout<<"请选择创建多少个人围成一个圈"<<endl; cin>>n; for(i=1;i<=n;i++) { q=new people; cout<<"请输入第"<<i<<"个人的编号"<<endl; cin>>q->num; q->next=null; if(i==1) head->next=q; else p->next=q; p=q; } p->next=head->next; } void people::play() { int i,rand,m,k=0; cout<<"请输入从第几个人开始报数"<<endl; cin>>rand; cout<<"报多少个数"<<endl; cin>>m; people *s=null; people *t=null; people *p=head; people *q=p->next; for(i=1;i<rand;i++) { p=q; q=q->next; } while(1) { for(i=1;i<m;i++) { p=q; q=q->next; } t=new people; t->num=q->num; t->next=null; if(k==0) { newhead=t; k++; } else { s->next=t; } s=t; p->next=q->next; q=q->next; if(p==q) { p->next=null; s->next=p; break; } } } void people::print() { int i=0,j; people *p=newhead; while(p!=null) { cout<<p->num<<" "; p=p->next; } cout<<endl; } int main() { people m; m.creat(); m.play(); m.print(); return 0; }
上一篇: 判断两个dataframe中的指定列有无重合的数字(对象)
下一篇: 网关