编程练习
1.为复习题5描述的类提供定义,并编写一个小程序来演示所有的特性
bank.h
#include <string>
class Bank
{
private:
std::string name;
std::string account;
double money;
public:
Bank(const std::string &name,const std::string &account,double m=0.0);
void show() const;
void deposit(double number);
void withdraw(double number);
};
bank.cpp
#include "bank.h"
#include <iostream>
#include <string>
Bank::Bank(const std::string &user_name, const std::string &user_account, double m) {
name=user_name;
account=user_account;
money=m;
}
void Bank::show() const
{
std::cout << "name:" << name << std::endl;
std::cout << "Bank account:" << account << std::endl;
std::cout << "balance:" << money << std::endl;
}
void Bank::deposit(double number)
{
money+=number;
}
void Bank::withdraw(double number)
{
money-=number;
}
main.cpp
#include "bank.h"
#include <iostream>
int main()
{
Bank b1=Bank("Reza","reza123",0.0);
b1.show();
std::cout << "add 30 yuan to my account"<< std::endl;
b1.deposit(30);
b1.show();
std::cout << "withdraw 15 yuan from my account"<< std::endl;
b1.withdraw(15);
b1.show();
}
2.请提供未定义的方法的代码,以完成这个类的实现。再编写一个使用这个类的程序,它使用了三种可能的构造函数调用(没有参数、一个参数、两个参数)以及两种显示方法
person.h
#include <string>
class Person{
private:
static const int LIMIT=25;
std::string lname;
char fname[LIMIT];
public:
Person() {lname="";fname[0]='\0';}
Person(const std::string &ln,const char *fn="Heyyou");
void Show() const;
void Formalshow() const;
};
person.cpp
#include "person.h"
#include <iostream>
#include <cstring>
Person::Person(const std::string &ln, const char *fn) {
lname=ln;
strcpy(fname,fn);
}
void Person::Show() const {
std::cout <<" lastname is: " << lname
<< " firstname is: " << fname << std::endl;
}
void Person::Formalshow() const {
std::cout << " lastname is: " << fname
<< " firstname is: " << lname << std::endl;
}
main.cpp
#include "person.h"
#include <iostream>
int main()
{
Person one;
Person two("Smythecraft");
Person three("Dimwiddy","sam");
one.Show();
one.Formalshow() ;
two.Show();
two.Formalshow();
three.Show();
three.Formalshow();
}
3.完成第9章的编程练习1,但要用正确的golf类声明替换那里的代码。
golf.h
class Golf{
private:
static const int Len=40;
char fullname[Len];
int handicap;
public:
Golf();
Golf(const char *fn,int hd);
const Golf & setglof(const Golf &g);
void re_handicap(int re_value);
void showgolf();
};
golf.cpp
#include "golf.h"
#include <iostream>
#include <cstring>
Golf::Golf() {
strcpy(fullname,"noname");
handicap=0;
}
Golf::Golf(const char *fn, int hd) {
strcpy(fullname,fn);
handicap=hd;
}
const Golf &Golf::setglof(const Golf &g) {
strcpy(fullname,g.fullname);
handicap=g.handicap;
return *this;
}
void Golf::re_handicap(int re_value) {
handicap=re_value;
}
void Golf::showgolf() {
std::cout <<" fullname is: "<<fullname
<< " handicap is: "<<handicap << std::endl;
}
main.cpp
#include "golf.h"
int main()
{
Golf g1=Golf("reza",60);
g1.showgolf();
g1.re_handicap(30);
g1.showgolf();
Golf g2;
g2.setglof(g1);
g2.showgolf();
}
4.完成第9章的编程练习4,但将Sales结构及相关的函数转换为一个类及其方法。
sales.h
#include <iostream>
namespace SALES {
class Sales {
private:
static const int QUARTERS = 4;
double sales[QUARTERS];
double average;
double max;
double min;
public:
Sales();
Sales(const double *s,int l);
void setSales();
void showSales();
};
}
sales.cpp
#include "sales.h"
#include <iostream>
using namespace SALES;
Sales::Sales() {
for (int i = 0; i < QUARTERS; ++i) {
sales[i]=0;
}
max=0,min=0,average=0;
}
Sales::Sales(const double *s,int l) {
double min_value=s[0],max_value=s[0],sum=0;
for (int i=0;i<QUARTERS;i++) {
sales[i] = s[i];
sum+=s[i];
if(sales[i]>max)
max_value=sales[i];
else if(sales[i]<min_value)
min_value=sales[i];
}
max=max_value;
min=min_value;
average=sum/QUARTERS;
}
void Sales::setSales() {
for(int i=0;i<QUARTERS;i++)
{
std::cout << "sales["<<i<<"] ";
std::cin >> sales[i];
}
double min_value=sales[0],max_value=sales[0],sum=0;
for (int i=0;i<QUARTERS;i++) {
sum+=sales[i];
if(sales[i]>max)
max_value=sales[i];
else if(sales[i]<min_value)
min_value=sales[i];
}
max=max_value;
min=min_value;
average=sum/QUARTERS;
};
void Sales::showSales() {
for(int i=0;i<QUARTERS;i++)
{
std::cout << " sales["<<i<<"]="<<sales[i];
}
std::cout << std::endl <<" average= "<< average <<
" max value= "<< max << " min value= "<<
min << std::endl;
}
main.cpp
#include "sales.h"
int main()
{
using SALES::Sales;
const double s[4]={1,2,3,4};
Sales S1=Sales();
S1.showSales();
Sales S2=Sales(s,4);
S2.showSales();
S1.setSales();
S1.showSales();
}
5.考虑下面的结构类声明:(略)
编写一个程序,它从栈中添加或删除customer结构(栈用Stack类声明表示)。每次customer结构被删除时,其payment的值被加入到总数中,并报告总数。
stack.h
typedef struct Customer{
char fullname[35];
double payment;
};
class Stack
{
private:
enum {MAX=10};
Customer items[MAX];
int top;
double payment_sum;
public:
Stack();
bool isempty() const;
bool isfull() const;
bool push(const Customer & item);
bool pop(Customer & item);
};
stack.cpp
#include "stack.h"
#include <iostream>
Stack::Stack() {
top=0;
}
bool Stack::isempty() const {
return top == 0;
}
bool Stack::isfull() const {
return top == MAX;
}
bool Stack::push(const Customer &item) {
if(top <MAX)
{
items[top++]=item;
return true;
} else
return false;
}
bool Stack::pop(Customer &item) {
if(top > 0)
{
item = items[--top];
payment_sum+=item.payment;
std::cout <<" payment is: "<<payment_sum << std::endl;
return true;
} else
return false;
}
main.cpp
#include <iostream>
#include "stock00.h"
const int STKS=4;
int main() {
Stock stocks[STKS] = {
Stock("NanoSmart", 12, 2.0),
Stock("Boffo Object", 200, 2.0),
Stock("Monolithic Obelisks", 130, 3.25),
Stock("Fleep", 60, 6.5),
};
std::cout << "Stock holding:\n";
int st;
for (st = 0;st < STKS; st++)
stocks[st].show();
const Stock *top=&stocks[0];
for(st=1;st<STKS;st++)
top=&top->topval(stocks[st]);
std::cout << "\nMost valuable holding:\n";
top->show();
return 0;
}
6.下面是一个类声明:(略)
请提供成员函数的定义和测试这个类的程序。
move.h
class Move
{
private:
double x;
double y;
public:
Move(double a=0,double b=0);
void showmove() const;
Move add(const Move &m) const;
void reset(double a=0,double b=0);
};
move.cpp
#include "move.h"
#include <iostream>
Move::Move(double a, double b) {
x=a;
y=b;
}
void Move::showmove() const {
std::cout << " x= "<< x
<<" y= " << y << std::endl;
}
Move Move::add(const Move &m) const {
Move n=Move(x+m.x,y+m.y);
return n;
}
void Move::reset(double a, double b) {
x=a;
y=a;
}
main.cpp
#include "move.h"
int main()
{
Move x=Move();
x.showmove();
Move y=Move(1,2);
y.showmove();
y.add(x);
y.showmove();
y.reset();
y.showmove();
}
7.Betelgeusean plorg有这些特征。
plorg.h
class Plorg
{
private:
char name[19];
int satisfaction;
public:
Plorg();
Plorg(const char new_name[19]);
void re_CI(const int st);
void show();
};
plorg.cpp
#include "plorg.h"
#include <cstring>
#include <iostream>
Plorg::Plorg() {
strcpy(name,"Plorga");
satisfaction=0;
}
Plorg::Plorg(const char *new_name) {
strcpy(name,new_name);
satisfaction=50;
}
void Plorg::re_CI(const int st) {
satisfaction=st;
}
void Plorg::show() {
std::cout << " name: " << name << std::endl;
std::cout << " satis: " << satisfaction << std::endl;
}
main.cpp
#include "plorg.h"
int main()
{
Plorg p1;
p1.show();
char name[19]="p2";
Plorg p2=Plorg(name);
p2.show();
p2.re_CI(66);
p2.show();
}
8.可以将简单列表描述成下面这样:
list.h
const int MAX=10;
typedef struct list {
char list_name[20];
int list_num;
}Item;
class List
{
private:
Item item[MAX];
int cur;
public:
List();
void add_item(Item item);
bool isempyt();
bool isfull();
void visit(void (*pf)(Item &));
};
list.cpp
#include "list.h"
#include <iostream>
#include <cstring>
List::List() {
cur=0;
}
bool List::isempyt() {
return cur==0;
}
bool List::isfull() {
return cur==MAX;
}
void List::add_item(Item add_item) {
if (List::isfull())
std::cout << "List is full!" << std::endl;
else if (!List::isfull())
{
strcpy(item->list_name,add_item.list_name);
cur+=1;
}
}
void List::visit(void (*pf)(Item &)) {
for(int i = 0; i < cur; ++i)
(*pf)(item[i]);
}
main.cpp
#include "list.h"
#include <iostream>
void zero_num(Item &item);
int main(){
List l1;
Item add_l1={
"Reza",
666,
};
std::cout <<"empty?: "<<l1.isempyt() << std::endl;
l1.add_item(add_l1);
std::cout << "empty?: "<<l1.isempyt() << std::endl;
std::cout << "full?: "<<l1.isfull() << std::endl;
l1.visit(zero_num);
}
void zero_num(Item &item)
{
item.list_num=0;
}