原题目及解答见第4周-任务4-设计工资类(Salary):
【拓展1】使用salary[50]有限制,实际人数少浪费空间,人数多时无法完成任务。程序执行中先输入职工人数,然后利用教材P217所讲的动态分配内存的运算符new,开辟一个大小正好的连续空间,完成上面的工作(排序需要采用指针完成)。
【参考解答】
#include<iostream> using namespace std; class Salary { public: void input_salary(); void add_salary(); void order_salary(); void show_salary(); private: double *salary; int number; }; int main() { Salary sal1; sal1.input_salary(); sal1.add_salary(); sal1.order_salary(); cout << "增加工资且排序后的工资是:" << endl; sal1.show_salary(); system("pause"); return 0; } void Salary::input_salary() { int i; cout << "职员的人数是:" ; cin >> number; salary = new double[number]; //这是最为关键的一句,根据职工人数,确定分配空间的大小 cout << "请输入职工工资:" << endl; for(i = 0; i < number; ++i) { cin >> *(salary+i); } return ; } void Salary::add_salary() { for(int i = 0; i < number; ++i) { *(salary+i) = *(salary+i) + 100; } } void Salary::order_salary()//排序 { int i, j; double t; for(i = 0; i < number; ++i) { for(j = 0; j < number - i - 1; ++j) { if(*(salary + j) < *(salary + j + 1)) { t = *(salary + j); *(salary + j) = *(salary + j + 1); *(salary + j + 1) = t; } } } return ; } void Salary::show_salary() { for(int i = 0; i < number; ++i) { cout << *(salary+i) << endl; } return ; }
【讨论】此程序的关键是第34行,在获得实际人数后,分配大小合适的数组存放数据。指向double的指针salary实际上充当了指向这个一维数组首地址的角色。
【未尽事项】由于使用了动态内存分配,在程序退出前应该用delete操作符释放salary指向的空间。合理的做法应该是为Salary类写一个析构函数,在其中写delete[ ] salary;。但是这个程序很简单,程序直接结束,占用的所有内存也就释放了,这个工作不做也无妨。
<全文完>
时间: 2024-10-25 06:31:23