关于十天集训的收获

A类:

主要关于用c++写一个管理系统能够实现一些管理功能。第一个是学生基本信息管理程序。主要思路是要实现学籍信息管理,就需要能够把每个学生的信息存储起来,并且能够调用,满足题目要求可以使用结构体包含学生信息然后配和主函数创建一系列的对象就可以实现,但不方便。我选择用一个学生类封装,把学生信息当作类的私有数据,功能实现用在主函数中声明函数完成,即安全又方便。在主函数中用switch语句实现用户选择功能,包括创建、添加、修改、删除、查找、文件导入导出。有一点是我一开始忽略掉的,使得我的程序运行不成功,就是我一开始在主函数中声明了类的对象数组,后来改成了在所有函数外声明(红字部分)。(上代码,功能函数部分没给出);第二个和第一个基本类似,就是功能函数改换一下。

#include <iostream>
#include<fstream>
#include <string>
#define N 20
using namespace std;
class Student{
protected:
string stuID;
string stuName;
string stuSex;
string stuAge;
string stuClass;
string stuAcademy;
string stuMajor;
public:
Student(){}
Student(const string &id,const string &name,const string &sex,const string &age,const string &class1,const string &academy,const string &major){
        stuID=id;
        stuName=name;
        stuSex=sex;
        stuAge=age;
        stuClass=class1;
        stuAcademy=academy;
        stuMajor=major;
}
Student(Student &s);
void setstuID(const string &i);
string getstuID();
void setstuName(const string &n);
string getstuName();
void setstuSex(const string &s);
string getstuSex();
void setstuAge(const string &a);
string getstuAge();
void setstuClass(const string &c);
string getstuClass();
void setstuAcademy(const string &d);
string getstuAcademy();
void setstuMajor(const string &m);
string getstuMajor();
friend istream &operator>>(istream &is,Student &a);
friend ostream &operator<<(ostream &os,Student &a);
void show();
~Student(){};
};
Student::Student(Student &s){
        stuID=s.stuID;
        stuName=s.stuName;
        stuSex=s.stuSex;
        stuAge=s.stuAge;
        stuClass=s.stuClass;
        stuAcademy=s.stuAcademy;
        stuMajor=s.stuMajor;
}
void Student::setstuID(const string &i){
    stuID=i;
}
string Student::getstuID(){
    return stuID;
}
void Student::setstuName(const string &n){
    stuName=n;
}
string Student::getstuName(){
    return stuName;
}
void Student::setstuSex(const string &s){
    stuSex=s;
}
string Student::getstuSex(){
    return stuSex;
}
void Student::setstuAge(const string &a){
    stuAge=a;
}
string Student::getstuAge(){
    return stuAge;
}
void Student::setstuClass(const string &c){
    stuClass=c;
}
string Student::getstuClass(){
    return stuClass;
}
void Student::setstuAcademy(const string &d){
    stuAcademy=d;
}
string Student::getstuAcademy(){
    return stuAcademy;
}
void Student::setstuMajor(const string &m){
    stuMajor=m;
}
string Student::getstuMajor(){
    return stuMajor;
}
istream &operator>>(istream &is,Student &a)
{
    is>>a.stuID>>a.stuName>>a.stuSex>>a.stuAge>>a.stuClass>>a.stuAcademy>>a.stuMajor;
    return is;
}
ostream &operator<<(ostream &os,Student &a)
{
    os<<a.stuID<<" "<<a.stuName<<" "<<a.stuSex<<" "<<a.stuAge<<" "<<a.stuClass<<" "<<a.stuAcademy<<" "<<a.stuMajor;
    return os;
}
void Student::show(){
cout<<stuID<<" "<<stuName<<" "<<stuSex<<" "<<stuAge<<" "<<stuClass<<" "<<stuAcademy<<" "<<stuMajor<<" "<<endl;
}
Student a[100];
int creat();
int add(int c);
void inquire(int f);
void amend(int f);
void delete1(int f);
void showa(int n);
void fexport(int n);
void fimport();
int main(void){
    int i=0,c,n,p=0;
    for(i;i<100;i++){
    cout<<"学生成绩管理系统:"<<'\n'<<"      1 创建"<<'\n'<<"      2 添加"<<'\n'<<"      3 查询"<<'\n'<<"      4 修改"<<'\n'<<"      5 删除"<<'\n'<<"      6 显示"<<'\n'<<"      7 文件导入"<<'\n'<<"      8 文件导出"<<'\n'<<"      9 退出"<<'\n'<<"     请选择:"<<endl;
    cout<<"输入:";
    cin>>c;
    switch(c){
    case 1:n=creat();break;
    case 2:n=add(n);break;
    case 3:inquire(n);break;
    case 4:amend(n);break;
    case 5:delete1(n);break;
    case 6:showa(n);break;
    case 7:fimport();break;
    case 8:fexport(n);break;
    case 9:p=1;break;
    default:cout<<"Error!"<<endl;break;
    }
    if(p==1){
      cout<<"退出成功!"<<endl;
      break;
    }
    }
    return 0;
}
 
B类:
第一个空间点线面折磨了我好久,关键是一开始不了解直线、面的不同构建方式用类函数实现是什么意思。后来就根据:“例如,对于空间平面的一般方程为ax+by+cz+d =0,那么私有数据成员为a, b, c和d”这句话决定用直线的标准式来构建它的类,私有数据是直线标准式的方向向量(m、n、p和一个在直线上的定点)然后什么:两个点确定一条直线,两个相交的平面确定一条直线,空间曲线的点斜式,都用类函数来实现。(构建方式的类函数,面类类似就不展示)第二个三角类就比较简单,构建一个点类,再构建一个三角类公有继承点类且私有数据为三个点,计算出三边长度,然后利用三边比较的规则判断三角形的类别,主函数中用户输入三点坐标即可。
void Line::twopoints(Point a1,Point b1){
       m=a1.getX()-b1.getX();
       n=a1.getY()-b1.getY();
       p=a1.getZ()-b1.getZ();
       A=a1;
}
void Line::twoPlanes(Plane pa1,Plane pa2){
    double m1,n1;
    m=pa1.getb()*pa2.getc()-pa1.getc()*pa2.getb();
    n=pa1.getc()*pa2.geta()-pa1.geta()*pa2.getc();
    p=pa1.geta()*pa2.getb()-pa1.getb()*pa2.geta();
    m1=(pa2.getd()*pa1.geta()-pa1.getd()*pa2.geta())/(pa1.getb()*pa2.geta()-pa2.getb()*pa1.geta());
    n1=(pa2.getd()*pa1.getb()-pa1.getd()*pa2.getb())/(pa2.getb()*pa1.geta()-pa1.getb()*pa2.geta());
    A.setZ(0);
    A.setX(n1);
    A.setY(m1);
}
void Line::pointslope(Vector n1,Point p1){
    m=n1.getO();
    n=n1.getT();
    p=n1.getS();
    A=p1;
}
C类:
第一个猜数字游戏比较简单
主要思路:定义一个游戏类,私有数据为本局的正确数字,主函数的随机产生一个数据通过构造函数赋给私有数据。公有函数实现用户输入数字,电脑给出提示并且记时。随机产生一个数是用srand函数:srand(time(0)); //time(0)返回值作种子    n=rand()%10000。我的程序有一个bug就是时间到了它不会马上就停止游戏,而是必须得用户输入数据后才能结束即不能实现时间到了就马上结束游戏。好像是要用线乘库来实现,不过没学会。
第二个人机下棋

主要思路:根据题目要求可知可以创建一个游戏类。用函数来实现初始化棋盘的格式、玩家落子、电脑落子、打印每时每刻的棋盘现况、判断输赢、判断棋盘是否满了等功能,然后把函数封装在游戏类中。私有数据是:玩家的棋子、电脑的棋子、棋盘的行数、棋盘的列数,通过够着函数从主函数中获取棋子的样式和行列数的大小,并且可以供公有函数调用。主函数中声明一个游戏类的对象,初始化对象的数据,调用对象的函数实现下棋。比较苦难的点是电脑落子,我不清楚如何用算法快速计算每个空位的分值,我就用最蠢的方法一个一个的算每个位子的分值,但只能实现3*3的棋盘,用户不能自己设置棋盘大小。(展示一下第一个空位的分值计算代码)

if(chess_board[0][1]=='X'&&chess_board[0][2]=='X')  //计算每个位置的分值 (用了非常蠢的办法)
        sum[1]=sum[1]+50;
    if(chess_board[1][0]=='X'&&chess_board[2][0]=='X')
        sum[1]=sum[1]+50;
    if(chess_board[1][1]=='X'&&chess_board[2][2]=='X')
        sum[1]=sum[1]+50;
    if(chess_board[0][1]=='O'&&chess_board[0][2]=='O')
        sum[1]=sum[1]+25;
    if(chess_board[1][0]=='O'&&chess_board[2][0]=='O')
        sum[1]=sum[1]+25;
    if(chess_board[1][1]=='O'&&chess_board[2][2]=='O')
        sum[1]=sum[1]+25;
    if(chess_board[0][1]=='*'&&chess_board[0][2]=='*')
        sum[1]=sum[1]+4;
    if(chess_board[1][0]=='*'&&chess_board[2][0]=='*')
        sum[1]=sum[1]+4;
    if(chess_board[1][1]=='*'&&chess_board[2][2]=='*')
        sum[1]=sum[1]+4;
    if((chess_board[0][1]=='X'&&chess_board[0][2]=='*')||(chess_board[0][2]=='X'&&chess_board[0][1]=='*'))
        sum[1]=sum[1]+10;
    if((chess_board[1][0]=='X'&&chess_board[2][0]=='*')||(chess_board[2][0]=='X'&&chess_board[1][0]=='*'))
        sum[1]=sum[1]+10;
    if((chess_board[1][1]=='X'&&chess_board[2][2]=='*')||(chess_board[2][2]=='X'&&chess_board[1][1]=='*'))
        sum[1]=sum[1]+10;
    if((chess_board[0][1]=='O'&&chess_board[0][2]=='*')||(chess_board[0][2]=='O'&&chess_board[0][1]=='*'))
        sum[1]=sum[1]+8;
    if((chess_board[1][0]=='O'&&chess_board[2][0]=='*')||(chess_board[2][0]=='O'&&chess_board[1][0]=='*'))
        sum[1]=sum[1]+8;
    if((chess_board[1][1]=='O'&&chess_board[2][2]=='*')||(chess_board[2][2]=='O'&&chess_board[1][1]=='*'))
        sum[1]=sum[1]+8;//1 号位分值

第三个石头剪刀布也比较简单

设计一个游戏类,私有数据为电脑本局的选择(由主函数随机产生并通过构造函数赋给),公有函数中用户输入想出的选择,然后与私有数据进行比较、判断胜负。主函数的switch语句用来供用户选择是否继续游戏。

D类:

第一个是整数链表类

首先得先定义一个节点的结构体(便于链表类的实现),然后构建一个链表类。根据功能要求,在链表类构建相应的函数来实现功能,在主函数中声明一个链表对象,然后调用对应的函数。我本来是想用链表的模板,然后可以方便直接套用在第二个函数上,但是私有数据处理不好就放弃了。

第二个是用链表建一个通讯录

其实跟A类的差不多,只不过是用链表的方式实现。用节点的数据域包含通讯人的信息,链表中把节点连起来,功能的实现用链表类函数实现包括:创建链表、添加节点、查询、修改节点的数据域、删除节点、遍历并显示。主函数中定义一个链表类,再用switch语句实现用户自己选择功能。难点是要理解节点之间如何删除和添加next指针的理解。

 
 
原文地址:https://www.cnblogs.com/chenaiiu/p/11198402.html