Мы можем дать такое описание простого списка:
- Простой список может содержать нуль или большее число элементов некоторого конкретного типа.
- Вы можете создать пустой список
- Вы можете добавлять элементы в список.
- Вы можете узнать, пуст ли список.
- Вы можете проверить, полон ли список.
- Вы можете посещать каждый элемент списка и выполнить над ним определенные действия.
Нетрудно убедиться, что этот список и в самом деле простой, он, например, не допускает добавлений и удалений элементов. Такой список может быть использован главным образом в простых программных проектах. В этом случае разработайте класс, соответствующий этому описанию. Вы можете реализовать этот список в виде массива или в виде связанных списков, если вы знакомы с таким типом данных. Однако общедоступный интерфейс не должен зависеть от этого вашего выбора. Другими словами, общедоступный интерфейс не должен содержать в себе индексов массива, указателей на вершину и пр. Он должен быть выражен в обобщенных понятиях, таких как создание списка, добавление элемента в список и т.п. Обычный способ посещения каждого элемента и выполнения над ним конкретного действия осуществляется путем использования функции, которая принимает указатель на функцию как аргумент.
void visit(void (*pf) (Item S));
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 &)); ... хм... однако можно
Комментариев нет:
Отправить комментарий