资源描述
______________________________________________________________________________________________________________
第八章
1. 请检查下面的程序,找出其中的错误(先不要上机,在纸面上作人工检查),并改正。然后上机调试,使之能正常运行。运行时从键盘输入时、分、秒的值,检查输出是否正确。
原文:
#include <iostream>
using namespace std;
class Time {
void set_time(void) ;
void show_time(void);
int hour;
int minute;
int sec;
};
Time t;
int main() {
set_time();
show_time();
return 0;
}
void set_time(void) {
cin>>t.hour;
cin>>t.minute;
cin>>t.sec;
}
void show_time(void) {
cout<<t.hour<<":"<<t.minute<<":"<<t.sec<<endl;
}
改:
#include <iostream>
using namespace std;
class Time {
public: //成员改为公用的
int hour;
int minute;
int sec;
};
Time t;
void set_time(void) {//在 main 函数之前定义
cin>>t.hour;
cin>>t.minute;
cin>>t.sec;
}
void show_time(void) { //在 main 函数之前定义
cout<<t.hour<<":"<<t.minute<<":"<<t.sec<<endl;
}
int main() {
set_time();
show_time();
return 0;
}
2. 改写例8.1程序,要求:
(1) 将数据成员改为私有的;
(2) 将输入和输出的功能改为由成员函数实现;
(3) 在类体内定义成员函数;
#include <iostream>
using namespace std;
class Time {
public:
void set_time(void) {
cin>>hour;
cin>>minute;
cin>>sec;
}
void show_time(void) {
cout<<hour<<":"<<minute<<":"<<sec<<endl;
}
private:
int hour;
int minute;
int sec;
};
Time t;
int main() {
t.set_time();
t.show_time();
return 0;
}
3. 在第2题的基础上进行如下修改:在类体内声明成员函数,而在类外定义成员函数。
#include <iostream>
using namespace std;
class Time {
public:
void set_time(void);
void show_time(void);
private:
int hour;
int minute;
int sec;
};
void Time::set_time(void) {
cin>>hour;
cin>>minute;
cin>>sec;
}
void Time::show_time(void) {
cout<<hour<<":"<<minute<<":"<<sec<<endl;
}
Time t;
int main() {
t.set_time();
t.show_time();
return 0;
}
4. 在第8.3.3节中分别给出了包含类定义的头文件student.h,包含成员函数定义的源文件studnet.cpp以及包含主函数的源文件main.cpp。请对该程序完善化,在类中增加一个对数据成员赋初值的成员函数set_value。
原文8.3.3:
#include <iostream>
using namespace std;
class Student {
public:
void display() {
cout<<"num:"<<num<<endl;
cout<<"name:"<<name<<endl;
cout<<"sex:"<<sex<<endl;
};
private:
int num;
char name[20];
char sex ;
};
int main() {
Student stud;
stud.display();
return 0;
}
改:
main.cpp
#include<iostream>
#include "student.h"
using namespace std;
int main() {
Student s ;
s.SetValue();
s.Display();
return 0;
}
Student.h
using namespace std;
class Student {
public:
void Display();
void SetValue();
private:
int num;
char name[20];
char sex;
};
Student.cpp
#include<iostream>
#include"student.h"
using namespace std;
void Student :: Display() {
cout << "num:" << num << endl;
cout << "name:" << name << endl;
cout << "sex:" << sex << endl;
}
void Student :: SetValue() {
cin >> num >> name >> sex;
}
5. 将例8.4改写为一个多文件的程序:
(1) 将类定义放在头文件arraymax.h中;
(2) 将成员函数定义放在源文件arrymax.cpp中;
(3) 主函数放在源文件file1.cpp中。
原文例8.4:
#include <iostream>
using namespace std;
class Array_max {
public:
void set_value();
void max_value();
void show_value();
private:
int array[10];
int max;
};
void Array_max::set_value() {
int i;
for (i=0; i<10; i++)
cin>>array[i];
}
void Array_max::max_value() {
int i;
max=array[0];
for (i=1; i<10; i++)
if(array[i]>max) max=array[i];
}
void Array_max::show_value() {
cout<<"max="<<max<<endl;
}
int main() {
Array_max arrmax;
arrmax.set_value();
arrmax.max_value();
arrmax.show_value();
return 0;
}
改:
main.cpp
#include<iostream>
#include"arraymax.h"
using namespace std;
int main() {
ArrayMax arrmax;
arrmax.SetValue();
arrmax.MaxValue();
arrmax.ShowMax();
return 0;
}
arraymax.h
class ArrayMax {
public:
void SetValue(); //设置数组元素值
void MaxValue(); //找出最大值
void ShowMax(); //输出最大值
private:
int array[10]; //整型数组
int max; //数组最大值
};
arraymax.cpp
#include<iostream>
#include"arraymax.h"
using namespace std;
void ArrayMax :: SetValue() {
int i;
for(i = 0; i < 10; i++) {
cin >> array[i];
}
}
void ArrayMax :: MaxValue() {
int i;
max = array[0];
for(i = 1; i < 10; i++) {
if(max < array[i]) {
max = array[i];
}
}
}
void ArrayMax :: ShowMax() {
cout << "max=" << max << endl;
}
6. 需要求3个长方柱的体积,请编写一个基于对象的程序。数据成员包括length(长)、width(宽)和weight(高)。要求用成员函数实现以下功能。
(1) 由键盘分别输入3个长方柱的长、宽和高。
(2) 计算长方柱的体积;
(3) 输出3个长方柱的体积。
#include <iostream>
using namespace std;
class Box {
public:
void get_value();
float volume();
void display();
public:
float lengh;
float width;
float height;
};
void Box::get_value() {
cout<<"please input lengh, width,height:";
cin>>lengh;//由键盘分别输入3个长方柱的长、宽和高。
cin>>width;
cin>>height;
}
float Box::volume() {
return(lengh*width*height);//计算长方体体积。
}
void Box::display() {
cout<<volume()<<endl;
}
int main() {
Box box1,box2,box3;//输出3个长方体的体积。
box1.get_value();
cout<<"volmue of bax1 is ";
box1.display();
box2.get_value();
cout<<"volmue of bax2 is ";
box2.display();
box3.get_value();
cout<<"volmue of bax3 is ";
box3.display();
return 0;
}
第九章
2. 分析下面的程序,写出其运行时的输出结果。
#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;
}
3. 如果将第2题程序的第5行改为用默认参数,即Date(int=1;int=1;int=2005);分析程序有无问题。上机编译,分析出错信息,修改程序使之能通过编译。要求保留上面一行给出的构造函数,同时能输出与第2题程序相同的输出结果。
改:
#include <iostream>
using namespace std;
class Date {
public:
Date(int=1,int=1,int=2005);
void display();
private:
int month;
int day;
int year;
};
Date::Date(int m,int d,int y):month(m),day(d),year(y) { }
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;
}
4. 建立一个对象数组,内放5个学生的数据(学号、成绩),用指针指向数组首元素,输出第1,3,5学生的数据。
#include <iostream>
using namespace std;
class Student {
public:
Student(int n,float s):num(n),score(s) {}
void display();
private:
int num;
float score;
};
void Student::display() {
cout<<"num="<<num<<" "<<"score="<<score<<endl;
}
int main() {
Student stud[5]= {
Student(101,78.5),Student(102,85.5),Student(103,98.5),
Student(104,100.0),Student(105,95.5)
};
Student *p=stud;
for(int i=0; i<=2; p=p+2,i++)
p->display();
return 0;
}
5. 建立一个对象数组,内放5个学生的数据(学号、成绩),设立一个函数max,用指向对象的指针做函数参数,在max函数中找出5个学生中成绩最高者,并输出其学号。
#include <iostream>
using namespace std;
class Student {
public:
Student(int n,float s):num(n),score(s) {}
int num;
float score;
};
int main() {
Student stud[5]= {
Student(101,78.5),Student(102,85.5),Student(103,98.5),
Student(104,100.0),Student(105,95.5)
};
void max(Student* );
Student *p=&stud[0];
max(p);
return 0;
}
void max(Student *arr) {
float max_score=arr[0].score;
int k=0;
for(int i=1; i<5; i++)
if(arr[i].score>max_score) {
max_score=arr[i].score;
k=i;
}
cout<<"num="<<arr[k].num<<" "<<"max_score="<<max_score<<endl;
}
6. 阅读下面程序,分析其执行过程,写出输出结果
#include <iostream>
using namespace std;
class Student {
public:
Student(int n,float s):num(n),score(s) {} void change(int n,float s) {
num=n;
score=s;
} void display() {
cout<<num<<" "<<score<<endl;
}
private:
int num;
float score;
};
int main() {
Student stud(101,78.5);
stud.display();
stud.change(101,80.5);
stud.display();
return 0;
}
7. 将第6题程序分别作一下修改,分析所修改部分的含义以及编译和运行的情况。
(1) 将main函数第2行改为const Student stud(01,78.5);
(2) 在(1)的基础上修改程序,使之能正常运行,用change函数修改数据成员mun和score的值。
(3) 将main函数改为
int main(){
Student stud(101,78.5);
Student *p=&stud;
P- >display();
P->change(101,80.5);
P-display();
return 0;
}
其他部分仍同第6题程序。
(4) 在(2)的基础上将main函数第3行改为 const Student *p=&stud;
(5) 再把main函数第3行改为 Student *const p=&stud;
(1)
[Error] passing 'const Student' as 'this' argument of 'void Student::display()' discards qualifiers [-fpermissive]
[Error] passing 'const Student' as 'this' argument of 'void Student::change(int, float)' discards qualifiers [-fpermissive]
[Error] passing 'const Student' as 'this' argument of 'void Student::display()' discards qualifiers [-fpermissive]
(2)
#include <iostream>
using namespace std;
class Student {
public:
Student(int n,float s):num(n),score(s) {}
void change(int n,float s) const {
num=n;
score=s;
} void display() const {
cout<<num<<" "<<score<<endl;
}
private:
mutable int num;
mutable float score;
};
int main() {
const Student stud(101,78.5);
stud.display();
stud.change(101,80.5);
stud.display();
return 0;
}
(3)
#include <iostream>
using namespace std;
class Student {
public:
Student(int n,float s):num(n),score(s) {}
void change(int n,float s) {
num=n;
score=s;
}
void display() {
cout<<num<<" "<<score<<endl;
}
private:
int num;
float score;
};
int main() {
Student stud(101,78.5);
Student *p=&stud;
p->display();
p->change(101,80.5);
p->display();
return 0;
}
(4)
#include <iostream>
using namespace std;
class Student {
public:
Student(int n,float s):num(n),score(s) {}
void change(int n,float s) {
num=n;
score=s;
}
void display() const {
cout<<num<<" "<<score<<endl;
}
private:
int num;
float score;
};
int main() {
Student stud(101,78.5);
const Student *p=&stud;
p->display();
stud.change(101,80.5);
p->display();
return 0;
}
(5)
#include <iostream>
using namespace std;
class Student {
public:
Student(int n,float s):num(n),score(s) {}
void change(int n,float s) {
num=n;
score=s;
}
void display() {
cout<<num<<" "<<score<<endl;
}
private:
int num;
float score;
};
int main() {
Student stud(101,78.5);
Student * const p=&stud;
p->display();
p->change(101,80.5);
p->display();
return 0;
}
8. 修改第6题程序,增加一个fun函数,改写main函数。改为在fun函数中调用change和display函数。在fun函数中使用对象引用(Student&)作为形参。
#include <iostream>
using namespace std;
class Student {
public:
Student(int n,float s):num(n),score(s) {}
void change(int n,float s) {
num=n;
score=s;
}
void display() {
cout<<num<<" "<<score<<endl;
}
private:
int num;
float score;
};
void fun(Student &stu) {
stu.display();
stu.change(101,80.5);
stu.display();
}
int main() {
Student stud(101,78.5);
void fun(Student&);
fun(stud);
return 0;
}
9. 商店销售某一商品,每天公布统一的折扣(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 Product {
public:
Product(int n,int q,float p):num(n),quantity(q),price(p) {}
void total();
static float average();
static void display();
private:
int num;
int quantity;
float price;
static float discount;
static float sum;
static int n;
};
void Product::total() {
float rate=1.0;
if(quantity>10) rate=0.98*rate;
sum=sum+quantity*price*rate*(1-discount);
n=n+quantity;
}
void Product::display() {
cout<<sum<<endl;
cout<<average()<<endl;
}
float Product::average() {
return(sum/n);
}
float Product::discount=0.05;
float Product::sum=0;
int Product::n=0;
int main() {
Product Prod[3]= {
Product(101,5,23.5),Product(102,12,24.56),Product(103, 100,21.5)
};
for(int i=0; i<3; i++)
Prod[i].total();
Product::display();
return 0;
}
10. 将例9.13程序中的display函数不放在Time类中,而作为类外的普通函数,然后分别在Time和Date类中将display声明为友元函数。在主函数中调用display函数,display函数分别引用Time和Date两个类的对象的私有数据,输出年、月、日和时、分、秒。
#include <iostream>
using namespace std;
class Date;
class Time {
public:
Time(int,int,int);
friend void display(const Date &,const Time &);
private:
int hour;
int minute;
int sec;
};
Time::Time(int h,int m,int s) {
hour=h;
minute=m;
sec=s;
}
class Date {
public:
Date(int,int,int);
friend void display(const Date &,const Time &);
private:
int month;
int day;
int year;
};
Date::Date(int m,int d,int y) {
month=m;
day=d;
year=y;
}
void display(const Date &d,const Time &t) {
cout<<d.month<<"/"<<d.day<<"/"<<d.year<<endl;
cout<<t.hour<<":"<<t.minute<<":"<<t.sec<<endl;
}
int main() {
Time t1(10,13,56);
Date d1(12,25,2004);
display(d1,t1);
return 0;
}
11. 将例9.13中的Time类声明为Date类的友元类,通过Time类中的display函数引用Date类对象的私有数据,输出年、月、日和时、分、秒。
#include <iostream>
using namespace std;
class Time;
class Date {
public:
Date(int,int,int);
friend Time;
private:
int month;
int day;
int year;
};
Date::Date(int m,int d,int y):month(m),day(d),year(y) { }
class Time {
public:
Time(int,int,int);
void display(const Date &);
private:
int hour;
int minute;
int sec;
};
Time::Time(int h,int m,int s):hour(h),minute(m),sec(s) { }
void Time::display(const Date &d) {
cout<<d.month<<"/"<<d.day<<"/"<<d.year<<endl;
cout<<hour<<":"<<minute<<":"<<sec<<endl;
}
int main() {
Time t1(10,13,56);
Date d1(12,25,2004);
t1.display(d1);
return 0;
}
12. 将例9.14改写为在类模板外定义各成员函数。
#include <iostream>
using namespace std;
template<class numtype>
class Compare {
public:
Compare(numtype a,numtype b);
numtype max();
numtype min();
private:
numtype x,y;
};
template <class numtype>
Compare<numtype>::Compare(numtype a,numtype b) {
x=a;
y=b;
}
template <class numtype>
numtype Compare<numtype>::max() {
return (x>y)?x:y;
}
template <class numtype>
numtype Compare<numtype>::min() {
return (x<y)?x:y;
}
int main() {
Compare<int> cmp1(3,7);
cout<<cmp1.max()<<" is the Maximum of two integer numbers."<<endl;
cout<<cmp1.min()<<" is the Minimum of two integer numbers."<<endl<<endl;
Compare<float> cmp2(45.78,93.6);
cout<<cmp2.max()<<" is the Maximum of two float numbers."<<endl;
cout<<cmp2.min()<<" is the Minimum of two float numbers."<<endl<<endl;
Compare<char> cmp3('a','A');
cout<<cmp3.max()<<" is the Maximum of two characters."<<endl;
cout<<cmp3.min()<<" is the Minimum of two characters."<<endl;
return 0;
}
第十章
1. 定义一个复数类Complex,重载运算符“+”,使之能用于复数的加法运算。将运算符函数重载为非成员、非友元的普通函数。编写程序,求两个复数之和。
#include <iostream>
using namespace std;
c
展开阅读全文