четверг, 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 &)); ... хм... однако можно

Комментариев нет: