четверг, 11 сентября 2008 г.

глава 9 упражнение 6

Мы можем дать такое описание простого списка:

  • Простой список может содержать нуль или большее число элементов некоторого конкретного типа.
  • Вы можете создать пустой список
  • Вы можете добавлять элементы в список.
  • Вы можете узнать, пуст ли список.
  • Вы можете проверить, полон ли список.
  • Вы можете посещать каждый элемент списка и выполнить над ним определенные действия.

Нетрудно убедиться, что этот список и в самом деле простой, он, например, не допускает добавлений и удалений элементов. Такой список может быть использован главным образом в простых программных проектах. В этом случае разработайте класс, соответствующий этому описанию. Вы можете реализовать этот список в виде массива или в виде связанных списков, если вы знакомы с таким типом данных. Однако общедоступный интерфейс не должен зависеть от этого вашего выбора. Другими словами, общедоступный интерфейс не должен содержать в себе индексов массива, указателей на вершину и пр. Он должен быть выражен в обобщенных понятиях, таких как создание списка, добавление элемента в список и т.п. Обычный способ посещения каждого элемента и выполнения над ним конкретного действия осуществляется путем использования функции, которая принимает указатель на функцию как аргумент.

void visit(void (*pf) (Item S));

В данном случае pf указывает на функцию (но не на функцию-элемент), которая принимает ссылку на аргумент Item, где Item - это тип элементов списка. Функция visit() применяет эту функцию к каждому элементу списка. Требуется также написать короткую программу, которая реализует этот проект.


spisok.h


#ifndef _SPISOK_H_
#define _SPISOK_H_
#include <iostream>
using namespace std;
struct razmer_xuja {
char name[20];
int xuj;
};
typedef razmer_xuja Item;

class Spisok {
private:
enum { MAX = 3 };
Item spis[MAX];
int top;
public:
Spisok();
bool isempty() const;
bool isfull() const;
bool add(const Item & item);
void visit (void (*pf)(Item & ));
};
#endif

spisok.cpp



#include "spisok.h"

Spisok::Spisok()
{
top = 0;
}
bool Spisok::isempty() const
{
return top == 0;
}
bool Spisok::isfull() const
{
return top == MAX;
}
bool Spisok::add(const Item & item)
{
if (top < MAX)
{
spis[top++] = item;
return true;
}
else
return false;
}
void Spisok::visit(void (*pf)(Item &))
{
int elem = 0;
cout << " vvedite nomer elementa kotoryj nuzhno posetit: " ;
cin >> elem;
cin.get();
if (elem <= top)
(*pf)(spis[elem-1]);
else cout << " takoj element ne sushestvuet... \n";
}

main.cpp



#include <iostream>
using namespace std;
#include "spisok.h"

void my_func (Item &);
int main()
{
Spisok Sp;
char c;
Item po;

cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";
cout << "+ vyberite nuzhnoe dejstvie: +\n";
cout << "+ a) dobavit v stek p)operacii nad elementom +\n";
cout << "+ q)quit +\n";
cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";

while (cin >> c && toupper(c) != 'Q')
{
while (cin.get() != '\n')
continue;
if (!isalpha(c))
{
cout << '\a';
continue;
}
switch (c)
{
case 'A' :
case 'a' : if (Sp.isfull())
cout << "\n +++!!!! spisok polnyj, operacija nevozmozhna\n\n";
else
{
cout << "vvedite infu : \n";
cout << " name : ";
cin.getline(po.name, 20);
cout << " razmer xuja : ";
cin >> po.xuj;
Sp.add(po);
break;
}
case 'P' :
case 'p' : Sp.visit(my_func);
break;
default : cout << "vy vveli ne vernyj simvol, povtorite vvod\n";
}
cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";
cout << "+ vyberite nuzhnoe dejstvie: +\n";
cout << "+ a) dobavit v stek p)operacii nad elementom +\n";
cout << "+ q)quit +\n";
cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";
}
system("PAUSE");
return 0;
}
void my_func(Item & po)
{
int v;
cout << "vvedite 1(odin) esli nuzno izmenit... inache posmotret: \n";
cin >> v;
cin.get();
if (v == 1){
cout << "vvedite name : ";\
cin.getline(po.name, 20);
cout << "vvedite razmer XU9l v sm. : ";
cin >> po.xuj;
}
else {
cout << "\n element ";
cout << "\n -name : " << po.name;
cout << "\n -razmer xuja : " << po.xuj << "\n";
}
}

прога написана уебищно, но мне впадлу ее делать, и так молодец))) -=-=-=- долго думал как так можно void visit (void (*pf)(Item &)); ... хм... однако можно

среда, 10 сентября 2008 г.

глава 9 упражнение 5

Класс Betelgeusean plorg обладает следующими свойствами:

• Данные

- У plorg имеется имя, содержащее не более 19 букв.
- plorg характеризуется индексом удовлетворенности (CI- contentment index), который представлен целым числом.

• Операции

- plorg начинается с имени и значения CI, равного 50.
- Значение CI может изменяться.
- plorg может отображать свое имя и CI.
- plorg по умолчанию имеет имя "Plorga".

• Сформулируйте определение класса Plorg (элементы данных и прототипы функций-элементов) который представляет plorg. Дайте определения функций-элементов. Напишите короткую программу, которая демонстрирует все свойства класса Plorg.


plorg.h



#ifndef _PLORG_H_
#define _PLORG_H_

class Plorg
{
private:
char name[19] ;
int CI;
public:
Plorg(char * co = "Plorg");
~Plorg();
void func1(int i);
void showplorg()const;
};
#endif



plorg.cpp



#include <cstring>
#include <iostream>
#include "plorg.h"
using namespace std;

Plorg::Plorg(char * co)
{
strcpy(name, co);
CI = 50;
}
Plorg::~Plorg()
{
}

void Plorg::func1(int i)
{
CI = i;
}
void Plorg::showplorg()const
{
cout << "name :" << name << "\n";
cout << "contentment index : " << CI << "\n";
}



move.h



#include <cstdlib>
#include <cctype>
#include <iostream>
#include "plorg.h"
using namespace std;

int main()
{
char nama[19];
char c;
cout << " sosdadim class Plorg. vvedite slovo : ";

cin.getline(nama, 19);
Plorg Pl(nama);
int ci = 0;
cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";
cout << "+ vyberite nuzhnoe dejstvie: +\n";
cout << "+ a) izmenit CI p)vyvesti na ekran +\n";
cout << "+ q)quit +\n";
cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";

while (cin >> c && toupper(c) != 'Q')
{
while (cin.get() != '\n')
continue;
if (!isalpha(c))
{
cout << '\a';
continue;
};
switch (c)
{
case 'A' :
case 'a' : cout << "vvedite novyj CI : ";
cin >> ci;
Pl.func1(ci);
break;

case 'P' :
case 'p' : Pl.showplorg();
break;

default : cout << "vy vveli ne vernyj simvol, povtorite vvod\n";
}
cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";
cout << "+ vyberite nuzhnoe dejstvie: +\n";
cout << "+ a) izmenit CI p)vyvesti na ekran +\n";
cout << "+ q)quit +\n";
cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";
}
system("PAUSE");
return 0;
}

опять все дерьмо.. кажеться че-то я недоделал.. имхо мало моска еще ...

глава 9 упражнение 4

Дан класс move.h



#ifndef _MOVE_H_
#define _MOVE_H_

//Объявление класса имеет вид:
class Move
{
private:
double x;
double y;
public:
//присваивает х, у значения a, b
Move(double a , double b );
//отображает текущие значения х, у
void showmove()const;
//данная функция присваивает х из m для переменной х из вызывающего
//объекта, чтобы получить новое х, прибавляет у из m для у вызывающего
//объекта, чтобы получить новое у, создает новый объект,
//инициализированный новыми значениями х,у, и возвращает его
Move add(const Move & m)const;
// присваивает х,у значения a, b
void reset(double a = 0, double b =0 );
};
#endif


Дайте определение функции-элемента и напишите программу, которая использует этот класс.


move.h




#ifndef _MOVE_H_
#define _MOVE_H_

class Move
{
private:
double x;
double y;
public:
Move(double a , double b );
void showmove()const;
Move add(const Move & m)const;
void reset(double a = 0, double b =0 );
};
#endif


move.cpp




#include <iostream>
#include "Move.h"
using namespace std;
Move::Move(double a , double b )
{
x = a;
y = b;
}
void Move::showmove()const
{
cout << " x = " << x ;
cout << "\n y = " << y <<"\n";
}
Move Move::add(const Move & m)const
{
return Move (m.x, (this->y+m.y));
}
void Move::reset(double a , double b)
{
x = a;
y = b;
}


main.cpp




#include <iostream>
#include <stdlib.h>
#include "Move.h"
using namespace std;

int main()
{
cout << "fuck pizda Xyu\n\n\n";
Move A(1.5, 2.3);
Move B(3.4, 3.6);
cout << " move aaaaa::::: \n";
A.showmove();
cout << " move bbbbbb::::: \n";
B.showmove();
Move C = A.add(B);
cout << ".............pizdec.................\n";
cout << "new move:::::::::: \n";
C.showmove();
cout << " move aaaaa!!!!!!!!!!:::: \n";
A.reset();
A.showmove();
cout << " move bbbbbb!!!!!!!!!::::: \n";
B.reset();
B.showmove();

system("PAUSE");
return 0;
}


хмммм... неплохо-неплохо :))

глава 9 упражнение 3

Рассмотрите следующее определение структуры:



struct customer {
char fullname[35];
double payment;
};


Напишите программу, которая добавляет и удаляет структуры из стека, описанного в объявлении класса. Каждый раз, когда удаляется запись о заказчике, его платеж прибавляется к текущей сумме, а сама текущая сумма выводится на экран. Примечание: нужно иметь возможность сохранять класс Stack неизменным; достаточно изменить объявление typedef так, чтобы Item имел тип customer, а не тип unsigned long. __________________________________________________________________________




golf.cpp




#ifndef _STACK_H_
#define _STACK_H_

struct customer {
char fullname[35];
double payment;
};
typedef customer Item;

class Stack
{
private:
enum {Max = 10};
Item Items[Max];
int top;
public:
Stack();
bool isempty() const;
bool isfull() const;
bool push(const Item & item);
bool pop(Item & item);
};
#endif


golf.cpp




#include <iostream>
#include "stack.h"

Stack::Stack()
{
top = 0;
}
bool Stack::isempty() const
{
return top == 0;
}
bool Stack::isfull() const
{
return top == Max;
}
bool Stack::push(const Item & item)
{
if (top < Max)
{
Items[top++] = item;
return true;
}
else
return false;
}
bool Stack::pop(Item & item)
{
if (top > 0)
{
item = Items[--top];
return true;
}
else
return false;
}


golf.cpp




#include <cstdlib>
#include <iostream>
#include <cctype>
#include "stack.h"

using namespace std;

int main()
{
Stack st;
char c;
customer po;

cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";
cout << "+ vyberite nuzhnoe dejstvie: +\n";
cout << "+ a) dobavit v stek p)udalit iz steka +\n";
cout << "+ q)quit +\n";
cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";

while (cin >> c && toupper(c) != 'Q')
{
while (cin.get() != '\n')
continue;
if (!isalpha(c))
{
cout << '\a';
continue;
}
switch (c)
{
case 'A' :
case 'a' : if (st.isfull())
cout << "\n +++!!!! stack polnyj, operacija nevozmozhna\n\n";
else {
cout << "vvedite infu : \n";
cout << " fullname : ";
cin.getline(po.fullname, 35);
cout << " pay : ";
cin >> po.payment;
st.push(po);
}
break;
case 'P' :
case 'p' : if (st.isempty())
cout << "stack pustoj\n";
else {st.pop(po);
cout << "zapis : " << po.fullname << " poped \n";
};
break;
default : cout << "vy vveli ne vernyj simvol, povtorite vvod\n";
}
cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";
cout << "+ vyberite nuzhnoe dejstvie: +\n";
cout << "+ a) dobavit v stek p)udalit iz steka +\n";
cout << "+ q)quit +\n";
cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";
}
return 0;
}


ООП ... её мать...

глава 9 упражнение 2

Выполните упражнение 4 из главы 8, но при этом замените программный код, приведенный там, на соответствующее объявление класса golf. Используйте конструктор с соответствующими аргументами для назначения начальных значений.


golf.h




#ifndef _GOLF_H_
#define _GOLF_H_

class Golf
{
private:
enum {Len = 40};
char fullname[Len];
int handicap;
public:
Golf();
~Golf();
int setgolf();// функция требует от пользователя сообщить ей имя и гандикап и присваивает элементам g введенные значения - возвращает 1, если введено имя, и 0, если введена пустая строка
void setgolf(const char * name, int hc);// Функция вводит в структуру golf полученное имя и гандикап переданные значения используются как аргументы функции
void hcap (int hc);// функция устанавливает новое значение гандикапа
void showgolf() ;// функция отображает содержимое
};
#endif


golf.cpp




#include <iostream>
#include <cstring>
#include "golf.h"
using namespace std;
Golf::Golf()
{
handicap = 0;
}
Golf::~Golf()
{
}
int Golf::setgolf()
{
cout << "Vvedite imja igroka : ";
cin.getline(fullname, Len);
cout << "Vvedite handicap : ";
cin >> handicap;
cin.get();
if (strlen(fullname) != 0)
return 1;
else return 0;
}

void Golf::setgolf(const char * name, int hc)
{
strcpy(fullname, name);
handicap = hc;
}

void Golf::hcap (int hc)
{
handicap = hc;
}

void Golf::showgolf()
{
cout << "name: " << fullname << " handicap: " << handicap << endl;
}


main.cpp




#include <iostream>
#include <cstring>
#include <cctype>
#include "golf.h"
using namespace std;
const int f = 4;

int main (int argc, char *argv[])
{
Golf players[f];
char c;
int nomer,ihc ;
char chName[40];

//cout << " SNACHALA VVEDITE DANNYE O IGROKAX \n";
for (int i = 0; i<f; i++)
{
cout << "igrok #" << i+1 << "\n";
if (players[i].setgolf() == 0)
break;
};
cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";
cout << "+ vyberite nuzhnoe dejstvie: +\n";
cout << "+ a)izmenit' dannye b)izmenit' tol'ko handicap +\n";
cout << "+ c)posmotret' vse q)quit +\n";
cout << "+ dannye o igrokax +\n";
cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";

while (cin >> c && toupper(c) != 'Q')
{
while (cin.get() != '\n')
continue;
if (!isalpha(c))
{
cout << '\a';
continue;
}
switch (c)
{
case 'A' :
case 'a' : cout << "Izmenit' dannye igroka pod nomerom #: ";
(cin >>; nomer).get();
cout << "name: ";
cin.getline (chName, 40);
cout << "handicap: ";
(cin >>; ihc).get();
players[nomer-1].setgolf(chName, ihc);
break;
case 'B' :
case 'b' : cout << "Izmenit' handicap igroka pod nomerom #: ";
(cin >> nomer).get();
cout << "handicap: ";
(cin >> ihc).get();
players[nomer-1].hcap(ihc);
break;
case 'C' :
case 'c' : for (nomer=0; nomer<f; nomer++)
players[nomer].showgolf ();
break;

default : cout << "vy vveli ne vernyj simvol, povtorite vvod\n";
}
cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";
cout << "+ vyberite nuzhnoe dejstvie: +\n";
cout << "+ a)izmenit' dannye b)izmenit' tol'ko handicap +\n";
cout << "+ c)posmotret' vse q)quit +\n";
cout << "+ dannye o igrokax +\n";
cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";
}
return 0;
}

глава 9 упражнение 1

Дайте определение класса, представляющего банков банковский счет. Элементы данных должны содержать имя вкладчика, номер счета (использовать строку) и сальдо. Функции-элементы должны выполнять такие действия, как:
• Создание объекта и его инициализация.
• Назначение начальных значений элементам данных.
• Отображение имени вкладчика, номера счета и сальдо.
• Вклад на банковский счет суммы, заданной аргументом.
• Снятие с банковского счета суммы, заданной аргументом.
напишите короткую программу, иллюстрирующую все эти свойства.


#include < iostream >
#include < cstring >
#include < stdlib.h >
#include "bank.h"
using namespace std;
int main()
{
const int max = 20;
char n1[max];
char n2[max];
double s1 = 0.0;
char c;
Bank Mybank;
cout << "Vvedite name : ";
cin.getline(n1,max);
cout << "Vvedite nomer scheta : ";
cin.getline(n2,max);
cout << "Vvedite saldo : ";
cin >> s1;
Mybank.init(n1, n2, s1);
cout << "\a \n Vyberite dejstvie : \n" ;
cout << " a) popolnit' schet r) snjat' so scheta \n" ;
cout << " s) pokazat' vse dannye q) vyxod!! \n";
while (cin >> c && toupper(c) != 'Q')
while (cin.get() != '\n')
continue;