标题:9.9的实例讲解
关键词:错综复杂
内容
A. 一句话概括今日目标完成情况
(a)出摊 100%
(b)9.9的学习 100%
B.具体内容
今天看9.9这个面目狰狞的老师讲了学生类信息录入的定义,醍醐灌顶啊感觉,长见识了。
先贴出第一版的代码把(为什么是第一版呢?因为他说后面会有更牛逼的了)
#include<iostream>坦率地讲,这个老师还是有点意思的,刚开始就在那边恐吓我说这种复杂类的代码写起来一般都比较长,动不动就上一百行了(呵呵),然后这并没有什么卵用,吓不倒我这个正经的程序员。所以他说啊,他这个课都是分开两节讲的,怕我听不懂,理解不了(呵呵)。定义这个类的时候啊,尽量把所有的成员函数都定义成私有的,这样对于程序运行的 安全性是有保障的,应该通过public里面定义的那些函数来对成员内容进行修改(间接修改),而不是在主程序里面直接修改。(这时程序的安全性会受到一定程度的威胁)
#include<cstring>
using namespace std;
//设置信息函数Set_info
class Info
{
private: //我还是喜欢把private打出来
int Id;
char Name[20];
int Programming;
int Network;
int Database;
int Total;
public:
void Set_info(int id,char *name,int programming,int network,int database);
int Get_Pro();
int Get_Net();
int Get_Dat();
int Get_Tol();
void Show();
};
void Info::Set_info(int id,char *name,int programming,int network,int database)
{
Id=id;
strcpy(Name,name);
Programming=programming;
Network=network;
Database=database;
Total=programming+network+database;
}
int Info::Get_Pro()
{
return Programming;
}
int Info::Get_Net()
{
return Network;
}
int Info::Get_Dat()
{
return Database;
}
int Info::Get_Tol()
{
return Total;
}
//显示信息函数Show
void Info::Show()
{
cout<<Id<<'\t';
cout<<Name<<'\t';
cout<<Programming<<'\t';
cout<<Network<<'\t';
cout<<Database<<'\t';
cout<<Total<<endl;
}
int main()
{
const int COUNT=5;
int i=0,j=0;
int id;
char name[20];
int programming;
int network;
int database;
Info student[COUNT],tmp;
cout<<"请输入学生成绩的信息:"<<endl;
cout<<"学号 姓名 程序设计 计算机网络 数据库"<<endl;
for(i=0;i<COUNT;i++){
cin>>id>>name>>programming>>network>>database;
student[i].Set_info(id,name,programming,network,database);
}
cout<<"学号 姓名 程序设计 计算机网络 数据库 总分"<<endl;
for(i=0;i<COUNT;i++){
student[i].Show();
}
cout<<endl;
cout<<"Thanks for using!";
return 0;
}
(为什么他们老师写类定义的时候都喜欢省略private,我觉得如果是为了简洁那是没必要的啊,可能是强迫症吧,如果没有东西和下面的public对齐我可是会崩溃的)好了,这第一个学生信息类简易版并不是重点,重点在后面
而在第二个课件里面,老师讲的代码风格问题,我觉得也是个重点:C++里通常用纯大写字母来表示常量或者宏(经常听说,感觉很牛逼。惭愧的是,还没学到那里),而用纯的小写字母来表示变量。这虽然只是习惯问题, 但遵守的话有助于养成良好的代码风格,这对以后的团队协作开发是有很大的帮助的。
贴出2.0版本的代码,感觉也不怎么难啊……
#include<iostream>在定义学生人数上限MAX_COUNT时,用const定义的话太占据内存了,所以根据老师的话可以用 动态定义数组,这样可以节省内存空间,修改代码如下(int *p;我在上面定义了,没有贴出来)
#include<cstring>
using namespace std;
//设置信息函数Set_info
class Info
{
private: //我还是喜欢把private打出来
int Id;
char Name[20];
int Programming;
int Network;
int Database;
int Total;
public:
void Set_info(int id,char *name,int programming,int network,int database);
int Get_Pro();
int Get_Net();
int Get_Dat();
int Get_Tol();
void Show();
};
void Info::Set_info(int id,char *name,int programming,int network,int database)
{
Id=id;
strcpy(Name,name);
Programming=programming;
Network=network;
Database=database;
Total=programming+network+database;
}
int Info::Get_Pro()
{
return Programming;
}
int Info::Get_Net()
{
return Network;
}
int Info::Get_Dat()
{
return Database;
}
int Info::Get_Tol()
{
return Total;
}
//显示信息函数Show
void Info::Show()
{
cout<<Id<<'\t';
cout<<Name<<'\t';
cout<<Programming<<'\t';
cout<<Network<<'\t';
cout<<Database<<'\t';
cout<<Total<<endl;
}
int main()
{
const int MAX_COUNT=100;
int count;
int i=0,j=0;
int id;
char name[20];
int programming;
int network;
int database;
Info student[MAX_COUNT],tmp;
cout<<"请输入学生人数:";
cin>>count;
while(count>MAX_COUNT){
cout<<"学生人数不能超过"<<MAX_COUNT<<"人,请重新输入:";
cin>>count;
}
cout<<"请输入学生成绩的信息:"<<endl;
cout<<"学号 姓名 程序设计 计算机网络 数据库"<<endl;
for(i=0;i<count;i++){
cin>>id>>name>>programming>>network>>database;
student[i].Set_info(id,name,programming,network,database);
}
cout<<"按总分高低排名如下:"<<endl;
for(i=0;i<count;i++){
for(j=count-1;j>i;j=j-1){
if(student[j].Get_Tol()>student[j-1].Get_Tol()){
tmp=student[j];
student[j]=student[j-1];
student[j-1]=tmp;
}
}
}
cout<<"学号 姓名 程序设计 计算机网络 数据库 总分"<<endl;
for(i=0;i<count;i++){
student[i].Show();
}
cout<<"每门课程成绩都大于85分的学生名单:"<<endl;
cout<<"学号 姓名 程序设计 计算机网络 数据库 总分"<<endl;
for(i=0;i<count;i++){
if(student[i].Get_Pro()>85&&student[i].Get_Net()>85&&student[i].Get_Dat()>85){
student[i].Show();
}
}
cout<<endl;
cout<<"Thanks for using!";
return 0;
}
Info student[MAX_COUNT],tmp;cout<<"请输入学生人数:";cin>>count;p=new int[count];while(count>MAX_COUNT){cout<<"学生人数不能超过"<<MAX_COUNT<<"人,请重新输入:";cin>>count;p=new int[count];}
至于delete p;的操作我放在最后面的return 0;上面了,程序可以运行,应该是没问题的吧。
delete p;这个学生类到这里基本上我就差不多了。开始第十章好了。
cout<<endl;
cout<<"Thanks for using!";
return 0;
构造函数的定义:
OOP的封装嘛,再写一遍以加深记忆吧,就是将数据成员与函数成员集成封装在类体中,核心是将实体设计成“统一体”去进行各种处理。
我们一般都把数据函数设置为私有化成员,外界是不能直接访问的,所有我们要在弄一个成员函数,用来设置数据成员,该函数可以在需要时调用从而达到用户随时修改数据成员的目的。而数据成员值的读出必须要通过相关成员函数。这是类的共性。
对象初始化实质上就是对所有数据成员赋值。有一个成员的值不确定,该对象的值就都不完整。构造函数的函数名必须与类名相同,且没有返回值。由系统在声明对象时自动调用。
下面是使用了构造函数的源程序(关于日期类的)
#include<iostream>额……怎么说呢。构造函数这一节,构造函数的函数名就是类名,不用起别的名字或者区分大小写了。视频教材里的东西写的可以了。在主程序里因为是系统自动调用的缘故也蛮简单的。
using namespace std;
class Date
{
private:
int year,month,day;
public:
Date(int y=1900,int m=1,int d=1) //名字相同,这就是构造函数
{
year=y;
month=m;
day=d;
}
void init(int,int,int);
void print_ymd();
void print_mdy();
};
void Date::init(int yy,int mm,int dd) //有效性检验
{
month=(mm>=1&&mm<=12)?mm:1;
year=(yy>=1900&yy<=9999)?yy:1900;
day=(dd>=1&&dd<=31)?dd:1;
}
void Date::print_ymd()
{
cout<<year<<"-"<<month<<"-"<<day<<endl;
}
void Date::print_mdy()
{
cout<<month<<"-"<<day<<"-"<<year<<endl;
}
int main()
{
Date date1; //创建一个日期类对象,并初始化
cout<<"输出对象date1的数据成员值:"<<endl;
date1.print_ymd(); //显示初始化数据的情况
system("pause");
date1.init(2006,3,28); //修改数据成员
date1.print_ymd(); //显示修改数据的情况
system("pause");
Date date2(2013,11,26); //再创建一个日期类对象,并初始化
cout<<"输出对象date2的数据成员值:"<<endl;
date2.print_mdy();
system("pause");
date2.init(2006,13,38);
date2.print_ymd();
cout<<endl;
cout<<"Thanks for using!";
return 0;
}
明天又是周一。神烦周一啊现在……上一天课。明天要去医务室找老头结账。想想都痛苦。
C.明日计划
时间仓促,完成前面的复习和10.2的学习就可以了把