C++_第十一周做题总结_继承基础

id:68 A圆和圆柱体积算(继承)

题目描述

定义一个CPoint点类,包含数据成员x,y(坐标点)。

以CPoint为基类,派生出一个圆形类CCircle,增加数据成员r(半径)和一个计算圆面积的成员函数。

再以CCircle做为直接基类,派生出一个圆柱体类CCylinder,增加数据成员h(高)和一个计算体积的成员函数。

生成圆和圆柱体对象,调用成员函数计算面积或体积并输出结果。

输入

输入圆的圆心位置、半径

输入圆柱体圆心位置、半径、高

输出

输出圆的圆心位置 半径

输出圆面积

输出圆柱体的圆心位置 半径 高

输出圆柱体体积

输入样例

0 0 1
1 1 2 3

输出样例

Circle:(0,0),1
Area:3.14
Cylinder:(1,1),2,3
Volume:37.68

题解

  • 首先看Cpoint类的使用,定义两个私有变量用于存储点的横纵坐标,实现的方法有有参构造
  • 然后定义他的派生类CCircle,定义有私有变量半径,实现的方法有构造和计算圆的面积,注意,在派生类的构造里面要给基类的构造函数提供参数,后面的派生类的定义大同小异
  • 在主函数中,输入有关值,然后使用两个派生类作为数据类型定义两个变量,进行有参构造,然后调用计算函数进行计算输出

代码实现

#include <iostream>
using namespace std;

class Cpoint
{
protected:
    int x, y;
public:
    Cpoint(int x1, int y1); // 构造
};

Cpoint::Cpoint(int x1, int y1) // 构造
{
    x = x1;
    y = y1;
}

class CCircle : public Cpoint
{
protected:
    int r;
public:
    CCircle(int r1, int x1, int y1);
    void calCi(); // 计算圆面积
};

CCircle::CCircle(int r1, int x1, int y1)
    : Cpoint(x1, y1)
{
    r = r1;
    cout << x << "," << y << ")," << r;
}

void CCircle::calCi() // 计算圆面积
{
    double S;
    S = 3.14 * r * r;
    cout << endl << "Area:" << S << endl;
}

class CCylinder : public CCircle
{
private:
    int h;
public:
    CCylinder(int h1, int r1, int x1, int y1);
    void calCy(); // 计算体积
};

CCylinder::CCylinder(int h1, int r1, int x1, int y1)
    : CCircle(r1, x1, y1)
{
    h = h1;
    cout << "," << h << endl;
}

void CCylinder::calCy() // 计算体积
{
    double V, S;
    S = 3.14 * r * r;
    V = S * h;
    cout << "Volume:" << V << endl;
}

int main()
{
    int ix, iy, ir, yx, yy, yr, yh;
    cin >> ix >> iy >> ir; // 圆的圆心位置、半径
    cin >> yx >> yy >> yr >> yh; // 圆柱体圆心位置、半径、高

    cout << "Circle:(";
    CCircle p1(ir, ix, iy); // 圆的构造
    p1.calCi();
    cout << "Cylinder:(";
    CCylinder p2(yh, yr, yx, yy); // 圆柱的构造
    p2.calCy();

    return 0;
}

id:69 B.三维空间的点(继承)

题目描述

定义一个平面上的点C2D类,它含有一个getDistance()的成员函数,计算该点到原点的距离;从C2D类派生出三维空间的点C3D类,它的getDistance()成员函数计算该点到原点的距离。试分别生成一个C2D和C3D的对象,计算它们到原点的距离。
三维空间的两点(x, y, z)和(x1, y1, z1)的距离公式如下:
[(x-x1)2+(y-y1)2+(z-z1)2](1/2)

输入

第一行二维坐标点位置

第二行三维坐标点位置1

第三行三维坐标点位置2

输出

第一行二维坐标点位置到原点的距离

第二行三维坐标点位置1到原点的距离

第三行三维坐标点位置2到原点的距离

第四行三维坐标点位置2赋值给二维坐标点变量后,二维坐标点到原点的距离

输入样例

3 4
3 4 5
6 8 8

输出样例

5
7.07107
12.8062
10

题解

  • 首先看C2D类的定义,首先定义两个私有变量用于存储点的横纵坐标,类中实现的方法有构造和计算距离
  • 然后再定义一个派生类C3D,在这个类里面定义一个私有变量表示z轴坐标,类里面实现构造和计算到原点的距离
  • 在主函数中,输入值,然后按照题目要求用不同的类定义变量,然后调用计算距离函数

代码实现

#include <iostream>
#include <cmath>
using namespace std;

class C2D
{
protected:
    int x, y;
public:
    C2D(int x1, int y1); // 构造
    void getDistance(); // 计算该点到原点的距离
};

C2D::C2D(int x1, int y1) // 构造
{
    x = x1;
    y = y1;
}

void C2D::getDistance() // 计算该点到原点的距离
{
    double dis;
    dis = sqrt(x * x + y * y);
    cout << dis << endl;
}

class C3D : public C2D
{
private:
    int z;
public:
    C3D(int x1, int y1, int z1); // 构造
    void getDistance(); // 计算该点到原点的距离
};

C3D::C3D(int x1, int y1, int z1) // 构造
    :C2D(x1, y1)
{
    z = z1;
}

void C3D::getDistance() // 计算该点到原点的距离
{
    double dis;
    dis = sqrt(x * x + y * y + z * z);
    cout << dis << endl;
}

int main()
{
    int x1, y1, x2, y2, z2, x3, y3, z3;
    cin >> x1 >> y1; // 二维
    cin >> x2 >> y2 >> z2 >> x3 >> y3 >> z3; // 三维

    C2D c1(x1, y1);
    c1.getDistance(); // 二维距离输出

    C3D c2(x2, y2, z2);
    c2.getDistance();

    C3D c3(x3, y3, z3);
    c3.getDistance();

    C2D c4(x3, y3);
    c4.getDistance();

    return 0;
}

id:175 C.学生成绩计算(继承)

题目描述

定义Person类具有姓名、年龄等属性,具有输出基本信息的display函数。

选修《面向对象程序设计》课程的学生在Person类的基础上,派生出子类:免听生和非免听生。子类继承父类成员,新增其他成员、改写display函数。

非免听生具有平时成绩、考试成绩和总评成绩三个属性,总评成绩根据(平时成绩40%+考试成绩60%)计算的结果,85分(包含)以上为A,75分(包含)-85分(不包含)为B,65分(包含)-75分(不包含)为C,60分(包含)-65分(不包含)为D,60分(不包含)以下为F。

免听生只有考试成绩和总评成绩两个属性,总评成绩100%根据考试成绩对应上述等级制成绩。

定义上述类并编写主函数,输入类型符号,若输入R,根据学生基本信息、平时成绩和考试成绩,建立非免听生对象,若输入S,根据学生基本信息、考试成绩,建立免听生对象。计算学生的总评成绩,并输出。

输入

测试次数t

随后每行输入学生类型 相关信息,姓名的最大字符长度为20

输出

每个学生基本信息和总评成绩

输入样例

2
R cindy 18 100 100
S sandy 28 59

输出样例

cindy 18 A
sandy 28 F

题解

  • 首先看Person类的定义,定义两个私有变量,一个用于存储名字,一个用于存储年龄,在类里面实现构造和输出基本信息
  • 然后定义一个Person类的派生类RPerson表示非免听生,定义两个私有变量一个是平时成绩,一个是期末成绩,在类里面实现构造和计算输出
  • 再定义一个Person类的派生类SPerson类表示免听生,定义一个私有变量,表示期末成绩,在类里面实现构造和计算输出
  • 在主函数中,输入相应的值,然后根据题目要求的类型定义不同类型的变量

代码实现

#include <iostream>
using namespace std;

class Person
{
protected:
    string name;
    int age;
public:
    Person(string n1, int a1);
    void display1(); // 输出基本信息
};

Person::Person(string n1, int a1)
{
    name = n1;
    age = a1;
}

void Person::display1() // 输出基本信息
{
    cout << name << " " << age << " ";
}

class RPerson : public Person
{
private:
    int usual, test;
public:
    RPerson(int u1, int t1, string n1, int a1); // 构造
    void display2(); // 输出
};

RPerson::RPerson(int u1, int t1, string n1, int a1) // 构造
    : Person(n1, a1)
{
    usual = u1;
    test = t1;
}

void RPerson::display2() // 输出
{
    int ans;
    ans = usual * 0.4 + test * 0.6;

    if (ans >= 85)
    {
        cout << 'A' << endl;
    }
    else if (ans >= 75)
    {
        cout << 'B' << endl;
    }
    else if (ans >= 65)
    {
        cout << 'C' << endl;
    }
    else if (ans >= 60)
    {
        cout << 'D' << endl;
    }
    else
    {
        cout << 'F' << endl;
    }
}

class SPerson : public Person
{
private:
    int test;
public:
    SPerson(int t1, string n1, int a1); // 构造
    void display3(); // 输出
};

SPerson::SPerson(int t1, string n1, int a1) // 构造
    : Person(n1, a1)
{
    test = t1;
}

void SPerson::display3() // 输出
{
    int ans;
    ans = test * 0.6;

    if (ans >= 85)
    {
        cout << 'A' << endl;
    }
    else if (ans >= 75)
    {
        cout << 'B' << endl;
    }
    else if (ans >= 65)
    {
        cout << 'C' << endl;
    }
    else if (ans >= 60)
    {
        cout << 'D' << endl;
    }
    else
    {
        cout << 'F' << endl;
    }
}

int main()
{
    int t, i, us, te, age;
    char type;
    string name;
    cin >> t; // 测试次数

    for (i = 0; i < t; i++)
    {
        cin >> type;
        if (type == 'R') // 非免听生
        {
            cin >> name >> age >> us >> te;
            RPerson p1(us, te, name, age);
            p1.display1();
            p1.display2();
        }
        else // 免听生
        {
            cin >> name >> age >> te;
            SPerson p2(te, name, age);
            p2.display1();
            p2.display3();
        }
    }

    return 0;
}

id:73 D.时钟模拟(继承)

题目描述

定义计数器类,包含保护数据成员value,公有函数increment计数加1。

定义循环计算器继承计数器类,增加私有数据成员:最小值minValue,maxValue,

重写公有函数increment,使得value在minValue~maxValue区间内循环+1。

定义时钟类,数据成员是私有循环计数器对象小时hour、分钟minute、秒second,公有函数time(int s)计算当前时间经过s秒之后的时间,即hour,minute,second的新value值。

定义时钟类对象,输入当前时间和经过的秒数,调用time函数计算新时间。

根据题目要求,增加必要的构造函数、析构函数和其他所需函数。

因为clock和time是系统内置函数,为了避免重名,请不要使用clock或者time作为类名或者函数名

输入

第一行测试次数n

2行一组,第一行为当前时间(小时 分钟 秒),第二行为经过的秒数。

输出

输出n行

每行对应每组当前时间和经过秒数后计算得到的新时间(小时:分钟:秒)。

输入样例

2
8 19 20
20
23 30 0
1801

输出样例

8:19:40
0:0:1

题解

  • 首先看Counter类,类里面定义一个整形的私有变量表示 值,实现的功能是让这个值加一,且将Clock类视为友元类
  • 然后定义一个Counter类的派生类Cire,在这个类里面定义两私有变量,最大值和最小值,表示这个变量的最大值和最小值,这个类实现的方法有构造,还有使得value在minValue~maxValue区间内循环加一,即是当value的值大于等于最大值时,value的值变为最小值,因为时分秒没有等于最大值的说法。因为基类的实现里面没有构造函数,所以派生类的构造函数不需要给基类传递参数,即不需要初始化基类的参数
  • 然后额外定义一个Clock类,定义Cire类型的三个私有变量,定义成这个类型是为了能使用这个Cire类里面的函数进行在范围内的value的值的加一操作,这个类的实现有构造和计算当前时间经过s秒之后的时间,构造函数中,因为变量的类型是Cire类型,所以首先要给Cire类的构造函数传递参数,调用Cire的构造函数初始化时分秒的最大值的最小值,然后因为时分秒是Cire类型的,所以其存在成员value,所以也需要对这个value值,即时分秒的大小初始化,即为参数的值
  • Clock类里面计算函数的过程是,因为调用的increment函数可以使得这个值在范围内加一,所以我们不需要考虑轮回的情况,直接把传入的,所需要加上的秒数作为循环的判断依据,在循环的内部,使用秒的变量调用increment函数首先实现秒的增加,因为秒的增加会影响到分的增加,再影响到时的增加,反之则不会,调用后对这个秒的大小进行判断,如果这个值等于0,则说明这个秒转了一轮,相应的分钟就要加一,加一则是调用分的increment函数进行操作,如果不等于0,则进入循环的下一轮,如果分钟等于0,同理,调用时的increment函数对时的大小进行加一操作,然后进行输出
  • 在主函数中,读取输入进来的数,然后定义一个Clock的对象,进行有参构造,然后调用计算函数计算加秒数之后的时间

遇到的问题

在写计算加秒数后的的时间时,把时分秒进行割裂计算,导致当秒走过一轮后没有对分钟进行加一操作,单纯的把秒数换算成秒,分,时分别要进行多少次加一操作,后面考虑到存在秒数走过一轮后会对分钟产生影响,但是没有懂得从循环内部进行操作,没有思考到当秒数等于0时,即为转过了一轮,反而考虑在循环外部操作,从而导致无从下手,焦头烂额

代码实现

#include <iostream>
using namespace std;
class Clock;

class Counter
{
protected:
    int value;
public:
    void increment(); // 计数加1
    friend Clock;
};

void Counter::increment() // 计数加1
{
    value++;
}

class Cire : public Counter // 继承
{
private:
    int minValue, maxValue;
public:
    Cire(int min1, int max1); // 构造
    void increment(); // 使得value在minValue~maxValue区间内循环+1
};

Cire::Cire(int min1, int max1) // 构造
{
    minValue = min1;
    maxValue = max1;
}

void Cire::increment() // 使得value在minValue~maxValue区间内循环+1
{
    value++;
    if (value >= maxValue)
    {
        value = minValue;
    }
}

class Clock
{
private:
    Cire hour, minute, second;
public:
    Clock(int h1, int m1, int s1);
    void time(int s); // 计算当前时间经过s秒之后的时间
};

Clock::Clock(int h1, int m1, int s1)
    : hour(0, 24), minute(0, 60), second(0, 60)
{
    hour.value = h1;
    minute.value = m1;
    second.value = s1;
}

void Clock::time(int s) // 计算当前时间经过s秒之后的时间
{
    int i;
    for (i = 0; i < s; i++)
    {
        second.increment();
        if (second.value == 0)
        {
            minute.increment();
            if (minute.value == 0)
            {
                hour.increment();
            }
        }
    }
    cout << hour.value << ":" << minute.value << ":";
    cout << second.value << endl;
}

int main()
{
    int n, i, h, m, s, ss;
    cin >> n;

    for (i = 0; i < n; i++)
    {
        cin >> h >> m >> s >> ss;
        Clock c1(h, m, s); // 构造初始化
        c1.time(ss); // 重新计算时间
    }

    return 0;
}

id:74 E.新旧身份证(继承)

题目描述

按下述方式定义一个日期类CDate和描述15位身份证号的旧身份证类COldId:

class CDate
{
private:
	int year, month, day;
public:
	CDate(int, int, int);
	bool check(); //检验日期是否合法
	bool isLeap();
	void print();
};

class COldId
{
protected:
	char* pId15, * pName; //15位身份证号码,姓名
	CDate birthday; //出生日期
public:
	COldId(char* pIdVal, char* pNameVal, CDate& day);
	bool check(); //验证15位身份证是否合法
	void print();
	~COldId();
};

然后以COldId为基类派生18位身份证号的新身份证类CNewId,并增加3个数据成员:pId18(18位号码)、issueDay(签发日期)和validYear(有效期,年数),并重新定义check()和print()。

15位身份证号扩展为18位身份证号的规则为:前6位号码保持一致,年份由2位变为4位(在前面加上19,例如88变为1988),剩余号码都保持一致,再加上第18位校验码。

身份证第18位校验码的生成方法:

  1. 将身份证号码前17位数分别乘以7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2。然后将其相加。

  2. 将17位数字与系数乘加的和除以11,得到余数。

  3. 余数与校验码的对应关系为1,0,X,9,8,7,6,5,4,3,2。也即:如果余数是3,身份证第18位就是9。如果余数是2,身份证的最后一位号码就是X。

主函数定义一个派生类对象,并用派生类对象调用check(),若返回false则输出“illegal id”否则调用print()输出身份证信息。check()对身份证合法性进行验证的规则:

  1. 确认18位号码是从15位号码扩展的,且第18位校验码正确.

  2. 身份证中的出生日期合法.

  3. 身份证号码中不含非法字符.

  4. 身份证号码的长度正确.

  5. 身份证目前处于有效期内,假设当前日期为2021年11月9日。

  6. 签发日期合法

输入

测试数据的组数 t

第一个人姓名、出生日期年月日、15位身份证号码、18位身份证号码、签发日期年月日、有效期(100年按长期处理)

第二个人姓名、出生日期年月日、15位身份证号码、18位身份证号码、签发日期年月日、有效期(100年按长期处理)

姓名的最大字符长度为20

输出

第一个人姓名

第一个人18位身份证号信息(号码、签发日期和有效期)或"illegal id"

第二个人姓名

第二个人18位身份证号信息(号码、签发日期和有效期)或"illegal id"

输入样例

10
AAAA 1988 2 28 440301880228113 440301198802281133 2006 1 20 20
BBBB 1997 4 30 440301980808554 440301199808085541 2015 2 2 10
CCCC 1920 5 8 530102200508011 53010219200508011X 1980 3 4 30
DDDD 1980 1 1 340524800101001 340524198001010012 1998 12 11 20
EEEE 1988 11 12 110203881112034 110203198811120340 2007 2 29 20
FFFF 1964 11 15 432831641115081 432831196411150810 2015 8 7 100
GGGG 1996 12 10 44030196121010 44030119961210109 2014 6 7 20
HHHH 1988 7 21 440301880721X12 44030119880721X122 2006 5 11 20
IIII 1976 3 30 440301760330098 440301197603300983 2003 4 15 20
JJJJ 1955 9 5 440301550905205 440301195509051052 2004 6 4 100

输出样例

AAAA
440301198802281133 2006年1月20日 20年
BBBB
illegal id
CCCC
illegal id
DDDD
illegal id
EEEE
illegal id
FFFF
432831196411150810 2015年8月7日 长期
GGGG
illegal id
HHHH
illegal id
IIII
illegal id
JJJJ
illegal id

题解

  • 首先看CDate类,类里面定义了三个私有变量,年月日,实现的方法有构造,检验日期是否合法,判断是否是闰年,打印日期,然后把CNewId类视为友元类,在检验日期是否合法的函数中,主要是检验这个日期是否超过当前题目说明的日期,然后判断这个月份是否超过了一月或者十二月,还有这个天数是否在正常的天数内,注意,返回bool类型的函数,即使每一个判断语句都有返回true或者false,函数的最后仍然要返回一个true或者false
  • 然后看COldId类,在类里面定义三个私有变量,15位身份证号码,姓名和出生日期,其中,出生日期是CDate类,实现的方法是构造,验证15位身份证是否合法和析构,在构造里面输出姓名,煮波赌15位身份证一定正确,所以bool COldId::check()函数返回true
  • 再定义一个派生类CNewId,定义三个私有变量,18位号码,签发日期和有效期年数,实现的方法是构造,验证18位身份证是否合法,输出和析构,在构造函数中,因为基类存在构造函数,所以派生类的构造函数需要给基类的构造函数提供参数
  • 在验证18位身份证是否合法的函数中,因为余数与校验码的对应关系中存在字符型,所以我们需要将这个数组定义为char类型,注意,里面的数字也需要用单引号,首先我们需要检验确认18位号码是从15位号码扩展的,所以需要一位位的对比,然后在这个循环里面检验不含非法字符,及全部都是数字,然后顺便计算验证码,注意,18位身份证的类型是字符型,所以要把他们转换为数字,得到校验码后检验是否正确,再检验长度是否正确,检查出生日期合法,检查签发日期合法性,检查身份证是否在有效期内
  • 在主函数中,进行数据输入,然后有参构造,控制输出

遇到的问题

余数与校验码的对应关系中的数组中的数字没有用单引号,计算校验码时,没有把18位身份证转换为数字来进行计算

代码实现

#include <iostream>
#include <cstring>
using namespace std;

class CDate
{
private:
	int year, month, day;
public:
	CDate(int y1, int m1, int d1);
	bool check();  // 检验日期是否合法
	bool isLeap(); // 判断闰年
	void print();
	friend class CNewId;
};

CDate::CDate(int y1, int m1, int d1)
{
	year = y1;
	month = m1;
	day = d1;
}

bool CDate::check() // 检验日期是否合法
{
	// 检查年份是否有效
	if (year > 2021)
	{
		return false;
	}
	else if (year == 2021)
	{
		if (month > 11 || (month == 11 && day > 9))
		{
			return false;
		}
	}

	// 检查月份是否有效
	if (month < 1 || month > 12)
	{
		return false;
	}

	// 检查天数是否有效
	int daysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
	if (isLeap())
	{
		daysInMonth[1] = 29;
	}
	if (day < 1 || day > daysInMonth[month - 1])
	{
		return false;
	}
	return true;
}

bool CDate::isLeap() // 判断闰年
{
	return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}

void CDate::print()
{
	cout << year << "年" << month << "月" << day << "日 ";
}

class COldId
{
protected:
	char *pId15, *pName; // 15位身份证号码,姓名
	CDate birthday;		 // 出生日期
public:
	COldId(char *pIdVal, char *pNameVal, CDate &day);
	bool check(); // 验证15位身份证是否合法
	~COldId();
};

COldId::COldId(char *pIdVal, char *pNameVal, CDate &day)
	: birthday(day)
{
	int len;
	pId15 = new char[16];
	strncpy(pId15, pIdVal, 15);
	pId15[15] = '\0';

	len = strlen(pNameVal);
	pName = new char[len + 1];
	strncpy(pName, pNameVal, len);
	pName[len] = '\0';
	cout << pName << endl; // 输出姓名
}

bool COldId::check() // 验证15位身份证是否合法
{
	return true;
}

COldId::~COldId()
{
	delete[] pId15;
	delete[] pName;
}

class CNewId : public COldId
{
private:
	char *pId18;	// 18位号码
	CDate issueDay; // 签发日期
	int validYear;	// 有效期,年数
public:
	CNewId(char *pId18, CDate &iss, int valid, char *pId15, char *name, CDate birth);
	bool check(); // 验证18位身份证是否合法
	void print();
	~CNewId();
};

CNewId::CNewId(char *pId, CDate &iss, int valid, char *pId15, char *name, CDate birth)
	: COldId(pId15, name, birth), issueDay(iss)
{
	pId18 = new char[19];
	strncpy(pId18, pId, 18);
	pId18[18] = '\0';
	validYear = valid;
}

bool CNewId::check() // 验证18位身份证是否合法
{
	int code, i, biryear;
	int a[17] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
	char b[11] = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
	code = 0;

	for (i = 0; i < 17; i++)
	{
		if (i < 6) // 确认18位号码是从15位号码扩展的
		{
			if (pId18[i] != pId15[i])
			{
				return false;
			}
		}
		if (i > 7 && i < 15)
		{
			if (pId18[i] != pId15[i - 2])
			{
				return false;
			}
		}

		if (pId18[i] < '0' || pId18[i] > '9') // 不含非法字符
		{
			return false;
		}
		code += (pId18[i] - '0') * a[i];
	}
	code %= 11;

	if (b[code] != pId18[17]) // 第18位校验码不正确
	{
		return false;
	}

	if (strlen(pId18) != 18) // 长度正确
	{
		return false;
	}

	// 检查出生日期合法
	biryear = (pId18[6] - '0') * 1000 + (pId18[7] - '0') * 100 + (pId18[8] - '0') * 10 + (pId18[9] - '0');
	if (biryear != birthday.year)
	{
		return false;
	}

	if (!issueDay.check()) // 检查签发日期合法性
	{
		return false;
	}

	if (issueDay.year + validYear < 2021) // 检查身份证是否在有效期内
	{
		return false;
	}
	else if (issueDay.year + validYear == 2021)
	{
		if (issueDay.month < 11 || (issueDay.month == 11 && issueDay.day < 9))
		{
			return false;
		}
		}
	return true;
}

void CNewId::print()
{
	cout << pId18 << " ";
	issueDay.print();
	if (validYear != 100)
	{
		cout << validYear << "年" << endl;
	}
	else
	{
		cout << "长期" << endl;
	}
}

CNewId::~CNewId()
{
	delete[] pId18;
}

int main()
{
	int t, i, y1, m1, dd1, y2, m2, dd2, date, result;
	char *name, *num15, *num18;
	name = new char[21];
	num15 = new char[16];
	num18 = new char[19];
	cin >> t;

	for (i = 0; i < t; i++)
	{
		cin >> name >> y1 >> m1 >> dd1 >> num15 >> num18;
		cin >> y2 >> m2 >> dd2 >> date;
		CDate d1(y1, m1, dd1); // 生日
		CDate d2(y2, m2, dd2); // 签发日期
		CNewId id2(num18, d2, date, num15, name, d1);
		result = id2.check();
		if (result == 1)
		{
			id2.print(); // 输出
		}
		else
		{
			cout << "illegal id" << endl;
		}
	}
	delete[] name;
	delete[] num15;
	delete[] num18;

	return 0;
}
  • 16
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本资源是压缩包形式的, 里面包含 本书,里面是pdf格式的, 带书签目录,本书是完整版的。 资源都是我自己用过的,不骗大家。 本书作者: 肖俊宇 吴为胜; 出版社: 电子工业出版社 内容简介: 《由浅入深学C++:基础、进阶与必300(含DVD光盘1张)》是C++语言的入门教程,较为系统地介绍了C++语言的基础内容。本书共分为3篇22章,详细介绍了C++语言的基础知识、面向对象、标准模块、底层开发和综合案例。本书循序渐进地讲述了C++的基础知识、C++程序的组成及其开发过程、C++程序中的数据、表达式和语句、控制程序流程、数组与字符串、指针与引用、使用函数、函数模板、错误和异常处理、宏和预编译、面向对象的开发、封装、继承、多态、类模板、文件流、标准模板库STL和编程实践等内容。 《由浅入深学C++:基础、进阶与必300(含DVD光盘1张)》涉及面广,从基本知识到高级内容和核心概念,再到综合案例,几乎涉及C++开发的所有重要知识。本书适合所有想全面学习C++开发技术的人员阅读,尤其适合没有编程基础的C++语言初学者作为入门教程,也可作为大、中院校师生和培训班的教材,对于C++语言开发爱好者,本书也有较大的参考价值。 章节目录: 第1篇 C++基础篇 第1章 C++概述 1 1.1 引言 1 1.1.1 C++的历史沿革 1 1.1.2 入门C++ 2 1.1.3 编程思想的转变 3 1.2 C++概述 4 1.2.1 C++的特征 5 1.2.2 C与C++的比较 5 1.2.3 C++的应用领域 6 1.3 C++源程序的组成 6 1.3.1 基本组成元素 7 1.3.2 标识符 8 1.3.3 保留字 8 1.3.4 符号 8 1.4 C++集成开发环境——DEV-C++ 9 1.4.1 选择C++编译器 9 1.4.2 安装DEV-C++ 10 1.4.3 DEV-C++ IDE简介 11 1.5 第一个C++程序——Hello World 11 1.5.1 创建源程序 11 1.5.2 编译运行 13 1.6 小结 14 1.7 习 14 第2章 变量与数据类型 18 2.1 常量和变量 18 2.1.1 常量 18 2.1.2 变量 21 2.1.3 变量的定义及赋值 22 2.1.4 变量的应用示例 24 2.2 基本数据类型 25 2.2.1 基本数据类型概述 25 2.2.2 整型数据类型 26 2.2.3 浮点型数据类型 27 2.2.4 字符型数据类型 29 2.2.5 布尔型数据类型 30 2.3 变量的作用域 31 2.4 类型转换 32 2.4.1 隐式转换 32 2.4.2 显式转换 33 2.5 小结 34 2.6 习 34 第3章 表达式与语句 39 3.1 运算符 39 3.1.1 运算符概述 39 3.1.2 算术运算符 40 3.1.3 自增和自减运算符 42 3.1.4 赋值运算符 43 3.1.5 关系运算符 44 3.1.6 逻辑运算符 45 3.1.7 条件运算符 46 3.1.8 逗号运算符 47 3.1.9 位运算符 48 3.1.10 sizeof运算符 49 3.2 运算符的优先级和结合性 50 3.3 表达式 51 3.4 语句 53 3.4.1 空格的作用 53 3.4.2 语句块 54 3.4.3 赋值语句 55 3.4.4 空语句 56 3.5 小结 57 3.6 习 57 第4章 流程控制结构之顺序结构 63 4.1 程序流程图 63 4.2 表达式语句 64 4.3 格式化输入/输出 65 4.3.1 标准输入流cin 65 4.3.2 标准输出流cout 66 4.3.3 输出流cerr和clog 68 4.4 格式控制函数 69 4.5 格式控制符 71 4.5.1 控制不同进制的输出 72 4.5.2 控制输出宽度 72 4.5.3 控制输出精度 73 4.6 顺序结构综合应用 74 4.7 小结 75 4.8 习 75
写在前面的话 引言 1. 前提 2. Java的学习 3. 目标 4. 联机文档 5. 章节 6. 练习 7. 多媒体 8. 源代码 9. 编码样式 10. Java版本 11. 课程和培训 12. 错误 13. 封面设计 14. 致谢 第1章 对象入门 1.1 抽象的进步 1.2 对象的接口 1.3 实现方案的隐藏 1.4 方案的重复使用 1.5 继承:重新使用接口 1.5.1 改善基础类 1.5.2 等价和类似关系 1.6 多形对象的互换使用 1.6.1 动态绑定 1.6.2 抽象的基础类和接口 1.7 对象的创建和存在时间 1.7.1 集合与继承器 1.7.2 单根结构 1.7.3 集合库与方便使用集合 1.7.4 清除时的困境:由谁负责清除? 1.8 违例控制:解决错误 1.9 多线程 1.10 永久性 1.11 Java和因特网 1.11.1 什么是Web? 1.11.2 客户端编程 1.11.3 服务器端编程 1.11.4 一个独立的领域:应用程序 1.12 分析和设计 1.12.1 不要迷失 1.12.2 阶段0:拟出一个计划 1.12.3 阶段1:要制作什么? 1.12.4 阶段2:开始构建? 1.12.5 阶段3:正式创建 1.12.6 阶段4:校订 1.12.7 计划的回报 1.13 Java还是C++? 第2章 一切都是对象 2.1 用句柄操纵对象 2.2 必须创建所有对象 2.2.1 保存在什么地方 2.2.2 特殊情况:主类型 2.2.3 Java中的数组 2.3 绝对不要清除对象 2.3.1 作用域 2.3.2 对象的作用域 2.4 新建数据类型:类 2.4.1 字段和方法 2.5 方法、自变量和返回值 2.5.1 自变量列表 2.6 构建Java程序 2.6.1 名字的可见性 2.6.2 使用其他组件 2.6.3 static关键字 2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入 2.8.4 @see:引用其他类 2.8.5 类文档标记 2.8.6 变量文档标记 2.8.7 方法文档标记 2.8.8 文档示例 2.9 编码样式 2.10 总结 2.11 练习 第3章 控制程序流程 3.1 使用Java运算符 3.1.1 优先级 3.1.2 赋值 3.1.3 算术运算符 3.1.4 自动递增和递减 3.1.5 关系运算符 3.1.6 逻辑运算符 3.1.7 按位运算符 3.1.8 移位运算符 3.1.9 三元if-else运算符 3.1.10 逗号运算符 3.1.11 字串运算符 3.1.12 运算符常规操作规则 3.1.13 造型运算符 3.1.14 Java没有“sizeof” 3.1.15 复习计算顺序 3.1.16 运算符总结 3.2 执行控制 3.2.1 真和假 3.2.3 反复 3.2.6 中断和继续 3.2.7 切换 3.3 总结 3.4 练习 第4章 初始化和清除 4.1 由构建器保证初始化 4.2 方法过载 4.2.1 区分过载方法 4.2.2 主类型的过载 4.2.3 返回值过载 4.2.4 默认构建器 4.2.5 this关键字 4.3 清除:收尾和垃圾收集 4.3.1 finalize()用途何在 4.3.2 必须执行清除 4.4 成员初始化 4.4.1 规定初始化 4.4.2 构建器初始化 4.5 数组初始化 4.5.1 多维数组 4.6 总结 4.7 练习 第5章 隐藏实施过程 5.1 包:库单元 5.1.1 创建独一无二的包名 5.1.2 自定义工具库 5.1.3 利用导入改变行为 5.1.4 包的停用 5.2 Java访问指示符 5.2.1 “友好的” 5.2.2 public:接口访问 5.2.3 private:不能接触 5.2.4 protected:“友好的一种” 5.3 接口与实现 5.4 类访问 5.5 总结 5.6 练习 第6章 类再生 6.1 合成的语法 6.2 继承的语法 6.2.1 初始化基础类 6.3 合成与继承的结合 6.3.1 确保正确的清除 6.3.2 名字的隐藏 6.4 到底选择合成还是继承 6.6 递增开发 6.7 上溯造型 6.7.1 何谓“上溯造型”? 6.8 final关键字 6.8.1 final数据 6.8.2 final方法 6.8.3 final类 6.8.4 final的注意事项 6.9 初始化和类装载 6.9.1 继承初始化 6.10 总结 6.11 练习 第7章 多形性 7.1 上溯造型 7.1.1 为什么要上溯造型 7.2 深入理解 7.2.1 方法调用的绑定 7.2.2 产生正确的行为 7.2.3 扩展性 7.3 覆盖与过载 7.4 抽象类和
JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。 3.封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 4. 多态性: 多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问。 2、String是最基本的数据类型吗? 基本数据类型包括byte、int、char、long、float、double、boolean和short。 java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类 3、int 和 Integer 有什么区别 Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。 原始类型封装类 booleanBoolean charCharacter byteByte shortShort intInteger longLong floatFloat doubleDouble 引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。 4、String 和StringBuffer的区别 JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。 5、运行时异常与一般异常有何异同? 异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。 6、说出Servlet的生命期,并说出Servlet和CGI的区别。 Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。 与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。 7、说出ArrayList,Vector, LinkedList的存储性能和特性 ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。 8、EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。 EJB包括Session Bean、Entity Bean、Message Driven Bea
C、C++语言是IT行业的主流编程语言,也是很多程序员必备的软件基本功,是软件开发行业招聘考查的重点。本书以流行的面试讲解为主要内容,介绍了C、C++语言基本概念,包括保留字、字符串、指针和引用、结构体、库函数等各个方面的基础知识,介绍了面向对象编程基本概念,包括如何实现继承、多态和封装等。还介绍了排序算法及数据结构的实现,包括链表、堆栈、队列和树。此外,本书开始用两章篇幅详细介绍了中英文面试的注意事项、常见问及程序员的职业规划等软件工程师的常识。最后四章详细讲解了现在流行的智力测试。 第一篇 求职 第1章 应聘求职 1.1 企业与人才 1.1.1 企业需要什么样的人才 1.1.2 如何成为企业需要的人才 1.2 好面试的准备 1.2.1 面试衣着 1.2.2 简历 1.3 面试 1.3.1 面试注意事项 1.3.2 面试问分析 问一:“请自我介绍一下。” 问二:“谈谈你的家庭情况。” 问三:“你有什么业余爱好?” 问四:“你最崇拜谁?” 问五:“谈谈你的缺点。” 问六:“谈一谈你的一次失败经历。” 问七:“你为什么选择我们公司?” 问八:“对这项工作,你可预见到哪些困难?” 问九:“如果我们录用你,你将怎样开展工作?” 问十:“与上级意见不一致,你将怎么办?” 问十一:“我们为什么要录用你?” 问十二:“你能为我们什么?” 问十三:“你是应届毕业生,缺乏经验,如何能胜任这项工作?” 问十四:“你希望与什么样的上级共事?” 问十五:“你在前一家公司的离职原因是什么?” 1.4 为明天好计划 第2章 英文面试 2.1 英文电话面试 2.1.1 英文电话面试注意事项 2.1.2 英文电话面试常见   问一:When will you graduate? 问二:How do you normally handle criticism? 问三:Why should we hire you? 问四:Please tell me something unreflected at your resume/about yourself/ your experience/your activities. 2.1.3 英文电话面试常用词汇 2.2 英文面试 2.2.1 英文简历 2.2.2 英文面试流程 2.2.3 英文面试注意事项 2.2.4 英文面试常见问一:What is your strongest trait? 问二:How would your friends or colleagues describe you? 问三:What personality traits do you admire? 问四:What leadership qualities did you develop as an administrative personnel? 问五:How do you normally handle criticism? 问六:What do you find frustrating in a work situation? 问七:How do you handle your failure? 问八:What kinds of people do you like to work with? 2.2.5 英文面试常用词汇 2.3 计算机专业英语面试常用词汇 第二篇 C/C++面试 第3章 C/C++程序基础 3.1 基本概念 面试1:什么是C语言语句 面试2:变量的声明和定义有什么区别 面试3:下列字符中,哪些不是C语言关键字 面试4:下列变量定义中,哪些是合法的 面试5:如何以最简单的方式让电脑蜂鸣器发出声音 3.2 编程规范 面试6:谈谈你对编程规范的理解或认识 面试7:函数、变量等命名都有哪些规则 面试8:写出bool、int、float、指针变量与“零值”比较的if语句 3.3 数据类型 面试9:写出代码的输出结果 面试10:C语言中不合法的整型常数 面试11:short i = 0; i = i + 1L;这两句有错吗 面试12:char x[] = {"abcd"}和 char y[] = {'a','b','c','d'} 有不同吗 面试13:char型数据在内存中的存储形式 3.4 运算符 面试14:请写出下列代码的输出内容 面试15:运算符的优先级问 面试16:&&和&,||和|有什么区别 面试17:什么是左值,什么是右值 面试18:请写出程序的运行结果 面试19:sizeof和strlen的区别 3.5 结构体 面试20:结构体是什么样的数据类型 面试21:结构体可以直接赋值吗 面试22:组织WAV文件头,并解析WAV格式的各项信息 面试23:计算学生不及格的人数打印他们的性别、姓名和成绩 面试24:结构体内存对齐问 3.6 C和C++的区别 面试25:关键字static在C和C++中的区别 面试26:C语言的结构体和C++的有什么区别 面试27:C中的malloc和C++中的new有什么区别 面试28:C++的引用和C语言的指针有什么区别 第4章 预处理、保留字 4.1 预处理 面试1:简述#ifdef、#else、#endif和#ifndef的作用 面试2:宏定义和函数 面试3:用#define声明一个常数 面试4:写一个“标准”宏MIN 面试5:typedef和define有什么区别 面试6:#define CHAR char*和typedef char* CHAR各有什么优劣 面试7:谈谈你对typedef的认识 4.2 const(常量) 面试8:关键字const是什么 面试9:说明以下a声明的含义 面试10:const、define定义常量的区别 4.3 static(静态)和extern 面试11:static有什么作用 面试12:extern有什么作用 面试13:简述变量存储类型 4.4 volatile 面试14:volatile有什么作用 面试15:一个参数可以既是const又是volatile吗 面试16:一个指针可以是volatile吗 第5章 引用和指针 5.1 引用 面试1:什么是引用 面试2:常引用有什么作用 面试3:流操作符重载为什么返回引用 5.2 指针 面试4:说明以下声明的含义 面试5:简述指针常量与常量指针区别 面试6:写出以下代码的输出结果 面试7:找出代码的错误 5.3 指针和数组 面试8:写出代码的输出结果 面试9:请问这段程序有问吗 面试10:a和&a有什么区别 面试11:请问代码有什么问 面试12:数组名和指针的区别 5.4 函数指针 面试13:请解析(*(void (*)())0)()的含义 面试14:指出程序的错误 5.5 “野指针” 面试15:如何避免“野指针” 面试16:程序是否正确 面试17:指出程序的错误 5.6 动态内存 面试18:简述C、C++程序编译的内存分配情况 面试19:以下四段代码中哪段没有错误 第6章 字符串 6.1 数字字符串 面试1:编码实现数字转化为字符串 面试2:编码实现字符串转化为数字 6.2 字符串函数 面试3:编写一个标准strcpy函数 面试4:简述strcpy、sprintf与memcpy的区别 6.3 字符串与数组 面试5:找出程序的错误之处 面试6:判断程序会出现什么问 第7章 嵌入式编程 面试1:编码实现某一变量某位清或置 面试2:用C编写一个死循环程序 面试3:用变量a给出下面的定义 面试4:设置地址为0x67a9的整型变量的值为0xaa66 面试5:评论下面这个中断函数 面试6:评价一个代码片段 第8章 面向对象 8.1 面向对象的基本概念 面试1:谈谈你对面向对象的认识 面试2:面向对象的三大特征 面试3:面向过程和面向对象有什么区别 8.2 类的成员变量和成员函数 面试4:简述类public、protected、private的作用 面试5:写出代码的打印结果 面试6:写出程序的打印结果 面试7:C++的空类有哪些成员函数 8.3 构造函数和析构函数 面试8:构造函数能否为虚函数 面试9:简述子类与父类的析构、构造函数的调用顺序 面试10:编写类String 的构造函数、析构函数和赋值函数 8.4 拷贝构造函数 面试11:谈谈对拷贝构造函数和赋值运算符的认识 面试12:写出当定义#define _INMAIN 0和不定义时代码打印结果 第9章 继承与多态 9.1 继承 面试1:指出程序的错误 面试2:用C++设计一个不能被继承的类 9.2 虚函数和纯虚函数 面试3:下面说法中正确的是哪个 面试4:写出程序的打印结果 面试5:访问基类的私有虚函数 9.3 多态 面试6:简述类成员函数的重写、重载和隐藏的区别 面试7:简述多态实现的原理 第10章 数据结构 10.1 链表 面试1:链表和数组有什么区别 面试2:寻找单链表中间结点 面试3:怎样把一个单链表反序 10.2 单循环链表 面试4:根据需求建立一个单向循环链表 面试5:检测一个较大的单向链表是否带环 10.3 双向链表 面试6:按要求构造一个双向链表 面试7:编程实现双链表插入新结点 面试8:编程实现双链表删除指定结点 10.4 栈和队列 面试9:简述队列和栈的异同 面试10:建立一个链式栈 面试11:建立一个链式队列 面试12:能否用两个栈实现一个队列的功能 10.5 二叉树 面试13:建立一个二叉树 面试14:计算一棵二叉树的深度 面试15:在二元树中找出和为某一值的所有路径 第11章 排序 11.1 插入排序 面试1:编码实现直接插入排序 面试2:编码实现希尔(Shell)排序 11.2 交换排序 面试3:编码实现冒泡排序 面试4:编码实现快速排序 11.3 选择排序 面试5:编码实现直接选择排序 面试6:编程实现堆排序 11.4 基数排序 面试7:编程实现基数排序 第三篇 智力测试 第12章 基本方法 面试1:斯密斯夫妇握手问 面试2:5个强盗分100颗宝石 面试3:分牛 面试4:谁在说谎 面试5:是亏了还是赚了 面试6:小虫分裂问 面试7:飞机绕地球环行问 第13章 数学能力 面试1:用一笔画出经过9个点的4条直线 面试2:在9个点上画10条线 面试3:100盏灯 面试4:找出不同的球 面试5:时针、分针和秒针重合问 面试6:可以喝多少瓶汽水 面试7:怎样拿到第100号球 面试8:烧绳计时 面试9:分金条 面试10:至少有多少人及格 面试11:如何取3升水 面试12:将16升水平均分给四个人 面试13:如何将140克的盐分成50、90克各一份 面试14:蜗牛几天能爬到井口 面试15:100美元的差额到哪里去了 面试16:点击鼠标比赛 面试17:小猴最多能运回多少根香蕉 面试18:算出小张买了几瓶啤酒、几瓶饮料 面试19:牧场有多少匹马 面试20:找出不同的苹果 面试21:如何穿越沙漠 第14章 推理能力 面试1:怎么少了100元 面试2:村里有多少条病狗 面试3:他们都在什么 面试4:躯体与灵魂 面试5:小明一家能否安全过桥 面试6:过河   问 面试7:这是张什么牌 面试8:说谎岛上的两个部落 面试9:谁是特尔斐城的预言家 面试10:哪个政党获胜 面试11:每个护士星期几休息 面试12:每个人系的圆牌都是什么颜色的 面试13:帽子问 面试14:谁是凶手 面试15:他们的头发是什么颜色的 面试16:谁是漂亮的青年 面试17:哪个袋子里有金子 面试18:他们星期几在说谎 面试19:剩下的是什么牌 面试20:老李的儿子们是什么的 面试21:史密斯家的门牌号 面试22:尤克利地区的电话 面试23:乡村庙会的15点游戏 面试24:各家的孩子得了第几名 面试25:经理应该带谁出差 面试26:法官的判决 面试27:张老师的生日是哪一天 面试28:谁是M小姐的情人 面试29:他们分别是哪国人 面试30:他们分别是什么的 面试31:他们都会说什么语言 面试32:怎么把马匹从甲村拉到乙村 面试33:谁打碎了花瓶 面试34:分机票 面试35:石头有多重 面试36:该释放谁 面试37:谁打碎的玻璃 面试38:谁是最优秀的医生 面试39:今天星期几 面试40:五个人进行汽车竞赛 面试41:下一行是什么 面试42:三筐水果各是什么 面试43:最后剩下的是谁 第15章 反应能力 面试1:下水道的井盖 面试2:30秒答 面试3:一分钟答 面试4:镜子中的你 面试5:埃及古币 面试6:投硬币 面试7:他在撒谎吗 面试8:制造零件 面试9:不喜欢正方形窗户的人 面试10:孩子租房 面试11:重男轻女的国度 面试12:分遗产 面试13:栽果树 面试14:聪明的农民 面试15:聪明的死刑犯 面试16:幼儿园中奇怪的人 面试17:奇怪的城镇 面试18:聪明的商人 面试19:渡船过河 面试20:愚蠢的长工 面试21:红球和白球 面试22:小明坐在了哪里 面试23:乌龟赛跑 面试24:老师的爱恋 面试25:爬楼梯 面试26:马丁先生的约会 面试27:巧入房间 面试28:管子中的球 面试29:女儿的错
第一篇 面试 ................................................................................ 8 1.1. 简介 ............................................................................................................... 8 1.2. 面试集合(一) .......................................................................................... 8 1.2.1. 把二元查找树转变成排序的双向链表.................................................... 8 1.2.2. 下排每个数都是先前上排那十个数在下排出现的次数 ..........................11 1.2.3. 设计包含 min 函数的栈 ...................................................................... 14 1.2.4. 求子数组的最大和.............................................................................. 20 1.2.5. 在二元树中找出和为某一值的所有路径 .............................................. 22 1.2.6. Top K 算法详细解析---百度面试 ......................................................... 29 1.2.7. 翻转句子中单词的顺序....................................................................... 31 1.2.8. 判断整数序列是不是二元查找树的后序遍历结果 ................................ 33 1.2.9. 查找最小的 K 个元素-使用最大堆....................................................... 35 1.2.10. 求二叉树中节点的最大距离................................................................ 37 1.3. 面试集合(二) ........................................................................................ 40 1.3.1. 求 1+2+…+n....................................................................................... 40 1.3.2. 输入一个单向链表,输出该链表中倒数第 k 个结点............................. 44 1.3.3. 输入一个已经按升序排序过的数组和一个数字.................................... 46 1.3.4. 输入一颗二元查找树,将该树转换为它的镜像.................................... 48 1.3.5. 输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往 右的顺序打印................................................................................................... 49 1.3.6. 在一个字符串中找到第一个只出现一次的字符。如输入 abaccdeff,则输出 b 52 1.3.7. n 个数字(0,1,…,n-1)形成一个圆圈 .................................................. 53 1.3.8. 定义 Fibonacci 数列 ............................................................................ 58 1.3.9. 左移递减数列查找某一个数.........................................
《高质量C++编程指南》 软件质量是被大多数程序员挂在嘴上而不是放在心上的东西! 除了完全外行和真正的编程高手外,初读本书,你最先的感受将是惊慌:“哇!我以前捏造的C++/C程序怎么会有那么多的毛病?” 别难过,作者只不过比你早几年、多几次惊慌而已。 请花一两个小时认真阅读这本百页经书,你将会获益匪浅,这是前面N-1个读者的建议。 首先请附录B的C++/C试(不要看答案),考查自己的编程质量究竟如何。然后参照答案严格打分。 (1)如果你只得了几十分,请不要声张,也不要太难过。编程质量差往往是由于不良习惯造成的,与人的智力、能力没有多大关系,还是有药可救的。成绩越差,可以进步的空间就越大,中国不就是在落后中赶超发达资本主义国家吗?只要你能下决心改掉不良的编程习惯,第二次考试就能及格了。 (2)如果你考及格了,表明你的技术基础不错,希望你能虚心学习、不断进步。如果你还没有找到合适的工作单位,不妨到上海贝尔试一试。 (3)如果你考出85分以上的好成绩,你有义务和资格为你所在的团队作“C++/C编程”培训。希望你能和我们多多交流、相互促进。半年前我曾经发现一颗好苗子,就把他挖到我们小组来。 (4)如果你在没有任何提示的情况下考了满分,希望你能收我你的徒弟。 前 言 5 第1章 文件结构 10 1.1 版权和版本的声明 10 1.2 头文件的结构 11 1.3 定义文件的结构 12 1.4 头文件的作用 12 1.5 目录结构 13 第2章 程序的版式 14 2.1 空行 14 2.2 代码行 15 2.3 代码行内的空格 16 2.4 对齐 17 2.5 长行拆分 18 2.6 修饰符的位置 18 2.7 注释 19 2.8 类的版式 20 第3章 命名规则 21 3.1 共性规则 21 3.2 简单的WINDOWS应用程序命名规则 22 3.3 简单的UNIX应用程序命名规则 24 第4章 表达式和基本语句 25 4.1 运算符的优先级 25 4.2 复合表达式 26 4.3 IF 语句 26 4.4 循环语句的效率 28 4.5 FOR 语句的循环控制变量 29 4.6 SWITCH语句 29 4.7 GOTO语句 30 第5章 常量 32 5.1 为什么需要常量 32 5.2 CONST 与 #DEFINE的比较 32 5.3 常量定义规则 32 5.4 类中的常量 33 第6章 函数设计 35 6.1 参数的规则 35 6.2 返回值的规则 36 6.3 函数内部实现的规则 38 6.4 其它建议 39 6.5 使用断言 40 6.6 引用与指针的比较 41 第7章 内存管理 43 7.1内存分配方式 43 7.2常见的内存错误及其对策 43 7.3指针与数组的对比 44 7.4指针参数是如何传递内存的? 46 7.5 FREE和DELETE把指针怎么啦? 49 7.6 动态内存会被自动释放吗? 49 7.7 杜绝“野指针” 50 7.8 有了MALLOC/FREE为什么还要NEW/DELETE ? 51 7.9 内存耗尽怎么办? 52 7.10 MALLOC/FREE 的使用要点 53 7.11 NEW/DELETE 的使用要点 54 7.12 一些心得体会 55 第8章 C++函数的高级特性 56 8.1 函数重载的概念 56 8.2 成员函数的重载、覆盖与隐藏 59 8.3 参数的缺省值 62 8.4 运算符重载 63 8.5 函数内联 64 8.6 一些心得体会 67 第9章 类的构造函数、析构函数与赋值函数 68 9.1 构造函数与析构函数的起源 68 9.2 构造函数的初始化表 69 9.3 构造和析构的次序 71 9.4 示例:类STRING的构造函数与析构函数 71 9.5 不要轻视拷贝构造函数与赋值函数 72 9.6 示例:类STRING的拷贝构造函数与赋值函数 72 9.7 偷懒的办法处理拷贝构造函数与赋值函数 74 9.8 如何在派生类中实现类的基本函数 74 9.9 一些心得体会 76 第10章 类的继承与组合 77 10.1 继承 77 10.2 组合 79 第11章 其它编程经验 81 11.1 使用CONST提高函数的健壮性 81 11.2 提高程序的效率 83 11.3 一些有益的建议 84 参考文献 86 附录A :C++/C代码审查表 87 附录B :C++/C试 92 附录C :C++/C试的答案与评分标准 96
int和Integer有什么区别? 答:int是java的原始数据类型,Integer是java为int提供的封装类,java为每个原始数据类型都提供了封装类。 String和StringBuffer的区别? 答:String是不可变的对象,每次对String类型进行改变都相当于产生了一个新的对象,StringBuffer是可变的字符序列,所以如果要经常改变某个字符串的话建议使用StringBuffer。 list、set、map问? 答:set 不允许重复,无序 list 允许重复,有序 map 成对的数据结构,键值必须具有唯一性 Servlet和CGI的区别? 答:Servlet与CGI的区别在于Servlet处于服务器进程中,它通过多线程方式允许其service方法,一个实例可以服务于多个请求,并且其实例一般不会被销毁,而CGI对每个请求都产生新的进程,服务完后就销毁,所以效率上低于Servlet。 面向对象的特征? 答:1:封装:通过定义类并且给类的属性和方法加上访问控制 2:继承:子类继承父类,子类可以拥有父类中已定义的方法,并且子类可以修改父类中的方法使其更适合特殊需求。 3:多台:不同对象对统一消息作出不同响应称之为多态 4:抽象:忽略与当前主无关的那些方面,将注意力集中在与当前目标有关的方面 运行时异常和一般异常有何异同? 答:运行时异常时(JVM)java虚拟机在运行过程中发生的问,比如:内存溢出等问。这类异常没法要求程序员去一一捕获并抛出,一般异常是Java类库或程序员自己写的代码发生的错误,这类异常可以由我们去一一捕获并抛出。 多线程几种实现方法,同步? 答:多线程有两种实现方法,一种是继承Thread类或者实现Runnable接口。同步就是在方法返回类型后面加上synchronized。 c#中的委托,事件是不是委托? 答:委托就是将方法作为一个参数带入另一个方法叫委托,事件是一种特殊的委托。 应用程序域? 答:应用程序域可以理解为一种轻量级的进程,起到安全的作用,占用资源小。 Class.forName作用? 答:调用该访问返回一个以字符串指定类名的类对象。 JDO? 答:JDO是java对象持久化的新的规范,为java data object的简称,也是一个用于存取某种数据仓库中的对象的标准化API。 CORBA? 答:CORBA标准是公共对象请求代理结构,用途为:用不同的程序设计语言书写,在不同的进程中运行,为不同的操作系统开发。 xml解析技术? 答:常用的DOM、SAX等 DOM:处理大型文件时性能下降的非常厉害,适合对xml的随机访问 SAX:事件驱动型的xml解析方法,适合对xml的顺序访问 jsp常用动作? 答:jsp:include 引入一个文件 jsp:useBean 实例化JavaBean jsp:setProperty 设置JavaBean属性 jsp:getProperty 输出JavaBean属性 jsp:forward 转发 CTS、CLS、CLR分别作何解释? 答:CTS 通用类型系统、CLS 通用语言规范、CLR 公共语言运行时。 Struts1和Struts2原理和区别? 答:Struts1和Struts2是两个完全不同的框架,Struts1以ActionServlet作为核心控制器,由ActionServlet负责拦截用户的所有请求。Struts2以核心控制器FilterDispatcher为基础,包含了框架内部的控制流程和处理机制。 Hibernate工作原理,Hibernate数据持久化? 答:Hibernate工作原理: 1:读取并解析映射信息,创建SessionFactory 2:打开Session 3:创建事物 4:持久化操作 5:提交事务 6:关闭Session 7:关闭SessionFactory Hibernate持久化:Hibernate根据定义的映射规则将对象持久化保存到数据库,这就实现了对象的持久化。 Spring由那几个模块组成? 答:Spring主要由7个模块组成: 1:Spring核心容器:提供了Spring框架的基本功能 2:Spring AOP:通过配置管理特性 3:Spring ORM:Spring框架集成了若干ORM框架 4:Spring DAO:打开关闭数据库连接 5:Spring WEB:为基于WEB服务的应用程序提供上下文服务 6:Spring Context:向Spring框架提供上下文信息 7:Spring MVC:分离模型、视图、控制器、以便更容易定制 折构函数和虚函数? 答:折构函数式销毁一个类的函数,虚函数是为了C++的动态绑定而设计的。 描述你的编程风格? 答:类名首字母大写,常量一般全部大写,给自己的代码加注释。 控制流程? 答:控制流程一般使用if判断条件。有第二分支,多分支,循环结构。循环本质上也是通过判断来实现的。 多形与继承? 答:多形:一个类中多个同名方法。继承:子类继承父类。 jsp内置对象? 答:request 用户端请求 response 回应 pageContext 网页属性 session 会话 out 输出 page 当前网页 exception 错误网页 application servlet正在执行的内容 config servlet构架部件 Struts模型驱动? 答:封装请求参数。 简述JDBC? 答:JDBC数据库连接,是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问。 什么情况下不建议使用Hibernate? 答:当数据量大,并且表关系复杂的时候不建议使用。 sleep()和wait()有什么区别? 答:sleep()是线程类的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但监控状态依然保持,到时候会自动恢复。 wait()是Object类的方法,对此对象调用了wait方法导致本线程放弃对象锁,进入等待锁定池,只有针对此对象发出notify方法后本线程才进入对象锁定池准备获得对象锁进入运行状态。 同步和异步,在什么情况下分别使用? 答:如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。 当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步。在很多情况下采用异步往往更有效率。 数据库三大范式? 答:1:确保每列都是不可分割的原子值 2:确保每列都和主键相关 3:确保每列都和主键直接相关,而不是间接相关 单例模式有哪些好处? 答:单例模式是一种比较常见的设计模式,带给我们以下好处: 1:控制资源的使用 2:控制实例的产生数量 3:让多个不相关的两个线程或进程之间实现通信 为什么要用spring? 答:1、主要将各个框架有效的联系起来,缩短实际编程时间。 2、可以将各个框架进行有效的管理和控制,让数据传输安全。 spring的IOC和DI? 答:控制反转和依赖注入是spring的两大基础作用。主要是将所有组件在spring提供的外部容器中加载。提高安全性,减低耦合性,使各个框架或者类之间的依赖性降低。 什么是声明式的事务管理?为什么要用?spring如何实现声明式的事务管理? 答:声明式的事务管理主要是将在进行对数据库中数据的添加或者修改时需要执行事务管理,主要是为了避免在执行添加或修改的时候添加或修改不完全正确,导致数据丢失。spring使用AOP面向切面的思想进行事务管理的。 spring和Hibernate继承后,定义事务管理特性的时候查询为什么要定义为read-only? 答:因为添加、删除和更新都涉及到了数据库的修改,而查询并未涉及到数据库修改,所以只需要定义只读,这样可以提高效率,进行更加方便的事务管理。 请你谈谈对Hibernate OR映射的理解? 答:将数据库中的每一张表都映射成一个实体。 配置了lazy="true"一定会懒加载吗? 答:不一定,如果在配置中你也使用了fetch属性的话此时lazy就会失效。 Hibernate数据库标识与主键之间的认识? 答:标识是为了方便和简介映射文件,主键是为了让数据不会重复。 为什么每次请求都要创建一个Action对象? 答:Struts2每次请求的时候都会创建一个action实例,这样会保证线程的安全。Struts1只是在第一次请求的时候创建一个action实例,以后每次相同的请求都直接从内存中去读取,它是单例模式,安全性较差。 Struts2是如何实现MVC模式的? 答:在Struts2里面是将每次页面的请求进行处理,然后将请求需要输出的数据转发到需要数据显示的页面。Struts2只是起到一个数据接收和转接的功能,就是Controller控制器,而传来数据的页面叫view显示层,Struts2将数据提交给进行处理的类叫Model模型层,专门进行数据处理和数据库的连接。 heap和stack有什么区别? 答:栈是一种线形集合,其添加和删除元素的操作应在同一段完成,栈按照后进先出的方式进行处理。堆是栈的一个组成元素。 EJB和JavaBean的区别? 答:EJB不是一般的JavaBean,EJB是企业级的JavaBean,EJB一共分为3种,实体Bean,消息Bean,会话Bean。书写EJB要遵循一定的规范,另外要运行EJB,你需要有相应的EJB容器,比如WebLogic、jboss等,而JavaBean不需要,只需要安装Tomcat就可以了。EJB用于服务端的应用开发,而JavaBean用于客户端应用开发。 触发器? 答:触发器是一种特殊的存储过程,主要通过事件来触发而被执行。 什么是存储过程?用什么调用? 答:存储过程是一个预编译的SQL语句,优点是允许模块化的设计。就是说只需要创建一次,以后再程序中就可以调用多次。使用存储过程比单纯的SQL语句要快,可以用一个命令对象来调用存储过程。 索引优缺点? 答:索引可以提高对数据库中数据的检索,缺点是减慢了数据录入速度,同时也增加了数据库的尺寸大小。 什么是事务?什么是事锁? 答:事务就是被绑定在一起,作为一个逻辑单元执行的SQL语句。如果任何一个操作失败,那么整个就失败。共同失败或共同成功。锁可以保证事务的完整性和并发性。 什么是视图?游标是什么? 答:视图是一种虚拟的表,具有和物理表相同的功能。游标是对查询出来的结果集作为一个单元来有效的处理,可以对结果集的当前行修改。 select执行顺序? 答:from where group by having select order by Collection和Collections的区别? 答:Collection是集合类的父类,继承它的主要由set和list Collections是针对集合类的帮助类,它提供了一系列针对集合的搜索,排序,线程安全化等操作。 final、finally、finalize的区别? 答:final用于声明属性方法和类,分别表示:属性不可变,方法不可覆盖,类不可继承。 finally是异常处理语句的一部分,表示总是执行。 finalize是Object的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法。 assert是什么?什么时候用到? 答:断言,可以将断言看成是异常处理的一种高级形式,可以用来判断某个特定的表达式或值是否为真。 接口是否可以继承接口?抽象类是否可以实现接口?抽象类是否可以继承实体类? 答:接口可以继承接口,抽象类可以实现接口,抽象类可以继承实体类。 引用传递和值传递? 答:引用传递:形参改变影响实参 值传递:形参改变不影响实参 当一个线程进入一个对象的synchronized方法后,其他线程是否可进入此对象的其他方法? 答:其他方法前是否加了synchronized关键字,如果没加则能。 说出servlet生命期? 答:servlet实例化时调用init方法,得到请求时调用service方法,service方法自动派遣doget或dopost方法,最后当实例销毁时调用destroy方法。 error和exception有什么区别? 答:error是指错误,通常程序员不能通过代码来解决。底层环境或硬件问。 exception是指异常,可以通过代码来解决的问。 forward和redirect的区别? 答:forward是转发,浏览器跳转后不显示新的地址。 redirect是重定向,浏览器跳转后显示新的地址。 对比之下forward更加高效,并且它有助于隐藏实际地址,但是有些情况则必须使用redirect,否则会报异常。 jsp中动态include和静态include的区别? 答:动态include用jsp:include实现,适用于动态页面,可以携带参数 静态include用include伪码实现,适用于静态页面 math.round(11.5)等于多少?math.round(-11.5)等于多少? 答:Math.round()对数字进行四舍五入 Math.round(11.5)=12 Math.round(-11.5)=11 String s=new String("xyz");创建了几个String Object? 答:创建了两个String对象,一个保存的引用地址,一个保存实际的值。 数组有没有length()这个方法?String呢? 答:数组里面没有length()方法,而是length属性。String有length()这个方法。 swtich()能否作用在byte、long、String上? 答:swtich()传递的应该是一个整数表达式,所以它的值只能是:int、short、char、byte所以long和String都不能作用在swtich()上。 jsp和servlet之间的联系? 答:jsp前段动态页面,servlet是纯java类 jsp被编译之后会转换为servlet执行 java基本数据类型有哪些?String是不是基本数据类型,他们有何区别? 答:基本数据类型8种:int、short、byte、long、float、double、char、boolean String不是基本数据类型,引用数据类型。 区别:基本数据类型比较实用“==”,引用数据类型实用equest,并且引用数据类型存放的是地址而不是具体的值。 写一个方法,实现字符串的替换,如:输入bbbwlirbbb,输出bbbhhtccc? 答:String s="bbbwlirbbb"; s.replaceAll("wlirbbb","hhtccc"); 如何将数值型字符转换为数字(Integer,Double)? 答:可以用Integer.parseInt()和Double.parseDouble()方法 如何将数字转换为字符? 答:可以使用String的valueOf()方法。 如何取得1970到现在的毫秒数? 答:可以用getTime()方法。 如何格式化日期? 答:可以用SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd"); 判断是否有子文件?判断是否有子目录?判断文件是否存在? 答:判断是否有子文件使用file.isFile() 判断是否有子目录使用file.isDirectory() 判断文件是否存在使用file.exists() 继承、重载、覆盖问? 答:继承:子类继承父类,子类可以拥有父类中已定义的方法,并且子类可以修改父类中的方法使其更适合特殊需求。 重载:在一个类中方法名和返回类型相同,参数不同。 覆盖:在子类中覆盖父类的某个方法,要求方法名相同,参数类型相同。 Statement和PreparedStatement之间的区别? 答:Statement比PreparedStatement速度慢 PreparedStatement是预编译,插入时速度高于Statement Statement创建速度很慢,常用选择PreparedStatement Session机制? 答:session机制是一种服务器端机制,服务器使用一种类似于散列表的结构来保存信息。 jsp和servlet中的请求转发分别如何实现? 答:jsp可以使用jsp:forward标签转发 servlet可以使用request.getRequestDispatcher()实现转发 介绍j2ee、j2se、j2me的区别? 答:j2ee(企业版):主要用于企业web开发 j2se(标准版):主要用于web开发,但缺少企业版的一些特性 j2me(微小版):主要用于手机开发 J2ee提供的技术? 答:j2ee提供的技术有EJB、servlet、jsp等。 什么是Application Server? 答:Application Server 应用服务器 简单介绍连接池的优点和原理? 答:数据库连接和关闭是比较花费时间的一件事,而连接池可以提高我们的工作效率。 刚开始创建一定数量的池连接,当需要时从池连接中拿出一个,用完之后再把这个连接重新放回连接池。 Web.xml的作用? 答:Web.xml会在程序启动时执行,如果想在程序刚启动的时候执行一些方法的话可以配置在Web.xml中。 简单介绍您所了解的MVC? 答:在项目中使用MVC模式会使项目分工更加明确,结构更加清晰 M model 模型层:JavaBean V view 视图层:jsp html C controller 控制层:servlet 简单介绍你所了解的XML? 答:XML可扩展标记语言,可以用来标记数据,定义数据结构,是一种允许用户自定义标记的语言 简单介绍您所了解的structs、spring和hibernate? 答:struts:控制层Action,页面标签和Model数据,调用业务层 Spring:Aop管理事务控制,IOC管理各个组件的耦合 Hibernate:负责数据库和对象的映射,负责Dao层 因为你去公司面试,公司让你写笔试,不可能说XX一个目写两页纸写的太详细,所以以上答案有的可能比较简短,没有说出重点,请大家补充,如果大家有什么更好的答案请拿出来一起分享
c++入门,简单快捷,很适合c++初学者 目录 目录前篇过程化的程序设计……1 第一章良好的开端……1 1.1 软件与程序……1 1.2 程序设计到底要什么?……1 1.3 选好一种语言……2 1.4Visual C++ 能够些什么?……2 1.5 学习程序设计的方法和一些准备……3 第二章 HELLO,WORLD !……4 2.1 如何创建一个示例程序……4 2.2 创建自己的World……6 2.3 输出与输入……7 习……9 第三章会变的箱子……10 3.1什么是变量?……10 3.2常用的基本数据类型……12 3.3不会变的箱子……12 3.4算术表达式……13习……14第四章要走哪条路?……16 4.1如果…………16 4.2否则…………20 4.3爱判断的问号……234.4 切换的开关……23习……27第五章有个圈儿的程序……31 5.1程序赛车……31 5.2进维修站和退出比赛……34 5.3圈圈里的圈圈……36 5.4当…………38习……41第六章好用的工具……45 6.1简单的工具——函数……45 6.2打造自己的工具……48 6.3多功能开瓶器……52 6.4自动的工具……55 6.5给变量和参数起个绰号……56 6.6*函数里的自己……58习……59第七章好大的仓库……63 7.1方便地让电脑处理更多数据……63 7.2仓库是怎样造成的?……65 目录 7.3 向函数传递数组……69 7.4二维数组……71习……74第八章内存里的快捷方式……78 8.1什么是指针……78 8.2指针变量的定义和使用……78 8.3指针的操作……80 8.4指针与保护……82 8.5指针与数组……83 8.6指针与函数……84 8.7更灵活的存储……86习……88第九章自己设计的箱子……91 9.1我的类型我主……91 9.2设计一个收纳箱……94 9.3结构与函数……96 9.4结构数组与结构指针……98 9.5自行车的链条……100 9.6 链表的实现……101 习……108 中篇实战程序设计……112 第十章如何阅读程序代码……112 10.1整体把握法……112 10.2经验法……114 10.3模拟法……115 习……116 第十一章如何调试程序代码……120 11.1再谈变量……120 11.2头文件的奥秘……126 11.3更快更好地完成程序调试……130 11.4最麻烦的问……134 11.5调试工具——Debug ……138 习……141 第十二章如何编写程序代码……144 12.1程序设计的基本步骤……144 12.2三类问……144 12.3函数的递归……149 习……154 后篇面向对象的程序设计……156 第十三章初识对象……156 13.1对象就是物体……156 13.2一个字符串也是对象……156 13.3面向对象特点一:封装性……159 目录 13.4从数组到向量……159 习……161 第十四章再识对象……16214.1类是一种数据类型……162 14.2公有和私有……163 14.3成员函数……164 14.4对象、引用和指针……167 习……167 第十五章造物者与毁灭者……171 15.1麻烦的初始化……171 15.2造物者——构造函数……172 15.3先有鸡还是先有蛋?……175 15.4克隆技术……180 15.5毁灭者——析构函数……187 习……189 第十六章共有财产好朋友操作符……193 16.1有多少个结点?……193 16.2类的好朋友……197 16.3多功能的操作符……205 习……212 第十七章父与子……213 17.1剑士弓箭手法师的困惑……213 17.2面向对象特点二:继承性……214 17.3继承的实现……214 17.4子类对象的生灭……224 17.5继承与对象指针……228 17.6面向对象特点三:多态性……231 17.7多态与虚函数……231 17.8虚函数与虚析构函数……236 17.9抽象类与纯虚函数……238 17.10 多重继承……241 习……242 第十八章再谈输入与输出……261

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值