1.阅读下面程序,分析其执行过程,写出输出结果。

参考代码一

#include <iostream>
using namespace std;

class Date {
public:
    Date(int, int, int);
    Date(int, int);
    Date(int);
    Date( );
    void display( );
private:
    int month;
    int day;
    int year;
};

Date::Date(int m, int d, int y): month(m), day(d), year(y) { }

Date::Date(int m, int d): month(m), day(d) { year = 2005; }

Date::Date(int m): month(m) {
    day = 1;
    year = 2005;
}

Date::Date( ) {
    month = 1;
    day = 1;
    year = 2005;
}

void Date::display() {
    cout << month << "/" << day << "/" << year << endl;
}

int main() {
    Date d1(10, 13, 2005);
    Date d2(12, 30);
    Date d3(10);
    Date d4;
    d1.display();
    d2.display();
    d3.display();
    d4.display();
    return 0;
}

二.创建一个学生类,该类有姓名、学号、语文成绩数据成员。构造函数初始化每一个数据成员,成员函数changeValue是改变该学生的语文成绩,然后利用display将数据输出出来。

程序要求:
(1)对构造函数进行重载
(2)建立作用域不同的类对象,查看其析构函数的析构顺序。

参考代码二

#include <iostream>
#include <string>

using namespace std;

class Student {
public:
    // 构造函数重载
    Student() : name(""), id(0), chinese_score(0) {}
    Student(string n, int i, double c) : name(n), id(i), chinese_score(c) {}

    // 改变语文成绩
    void changeValue(double new_score) {
        chinese_score = new_score;
    }

    // 输出学生信息
    void display() {
        cout << "姓名:" << name << ",学号:" << id << ",语文成绩:" << chinese_score << endl;
    }

    ~Student() {
        cout << "学生:" << name << "析构" << endl;
    }

private:
    string name;
    int id;
    double chinese_score;
};

int main() {
    {
        Student stu1("张三", 1001, 89.5);
        stu1.display();
        stu1.changeValue(90.5);
        stu1.display();
    }

    {
        Student stu2("李四", 1002, 88.5);
        stu2.display();
        stu2.changeValue(92.5);
        stu2.display();
    }

    return 0;
}

代码解析二

这个程序首先定义了一个名为Student的类,包含姓名、学号和语文成绩三个私有数据成员,以及一个改变语文成绩的公有成员函数。 Student类的构造函数被重载,可以接受零个参数(默认构造函数),或三个参数(带有姓名、学号和语文成绩的构造函数)。

在main函数中,我们在两个不同的作用域内创建了两个Student类对象,即stu1和stu2。 这两个对象有不同的生命周期,它们的析构函数将在它们各自的作用域结束时被调用。注意,析构函数的调用顺序总是与构造函数的调用顺序相反,也就是说,最后创建的对象将首先被析构。

三.商店销售某一商品,商店每天公布统一的折扣(discount)。同时允许销售人员在销售时灵活掌握售价(price),在此基础上,对一次购10件以上者,还可以享受9.8折优惠。现已知当天3名销货员的销售情况为:

销货员号(num) 销货件数(quantity) 销货单价(price)
101 5 23.5
102 12 24.56
103 100 21.5
请编程序,计算出当日此商品的总销售款sum,以及每件商品的平均售价。要求用静态数据成员和静态成员函数。
(提示: 将折扣discount、总销售款sum和商品销售总件数n声明为静态数据成员,再定义静态成员函数average(求平均售价)和display(输出结果)。

参考代码三

#include <iostream>

using namespace std;

class Salesman {
public:
    Salesman(int num, int quantity, double price)
        : num(num), quantity(quantity), price(price) {
        n += quantity;
        if (quantity >= 10) {
            sum += quantity * price * discount * 0.98;
        } else {
            sum += quantity * price * discount;
        }
    }

    // 计算平均售价
    static double average() {
        return sum / n;
    }

    // 输出结果
    static void display() {
        cout << "总销售款:" << sum << "元,平均售价:" << average() << "元/件" << endl;
    }

private:
    int num;
    int quantity;
    double price;

    static double discount;  // 折扣
    static double sum;  // 总销售款
    static int n;  // 商品销售总件数
};

// 静态成员数据初始化
double Salesman::discount = 1.0;
double Salesman::sum = 0.0;
int Salesman::n = 0;

int main() {
    Salesman s1(101, 5, 23.5);
    Salesman s2(102, 12, 24.56);
    Salesman s3(103, 100, 21.5);
    Salesman::display();

    return 0;
}

代码解析三

在上面的程序中,首先定义了一个名为Salesman的类,包含销售员号,销售件数和销售单价的数据成员,以及计算平均售价和输出结果的静态成员函数。注意,每次创建Salesman类的新对象时,总销售款和商品销售总件数都会根据新对象的销售情况进行更新。

然后在main函数中,我们创建了三个Salesman类的对象,即s1,s2和s3,分别代表三名销售员的销售情况。最后,我们调用静态成员函数Salesman::display()输出当日的总销售款和每件商品的平均售价。