Форум программистов, компьютерный форум CyberForum.ru

Не могу понять условия задачи - C++

Восстановить пароль Регистрация
 
Aliru
0 / 0 / 0
Регистрация: 07.05.2013
Сообщений: 83
21.08.2013, 10:33     Не могу понять условия задачи #1
Есть задача из Прата:
Мы можем дать такое описание простого списка:

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

• Вы можете создать пустой список.

• Вы можете добавлять элементы в список.

• Вы можете узнать, пуст ли список.

• Вы можете проверить, полон ли список.

• Вы можете посещать каждый элемент списка и выполнить над ним определенные действия.

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

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

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

Не могу понять чего хотят чтобы я сделал, можно привести какой-нибудь маленький пример чтобы было от чего отталкиваться
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Hugra
 Аватар для Hugra
47 / 47 / 1
Регистрация: 18.07.2013
Сообщений: 138
Записей в блоге: 1
21.08.2013, 10:56     Не могу понять условия задачи #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// stack.h -- объявление класса для АТД стека
#ifndef STACK_H_
#define STACK_H_
 
typedef unsigned long Item;
 
class Stack
{
private:
    enum {MAX = 10};    // константа специфичная для класса
    Item * items;       // хранит элементы стека
    int size;           // кол-во элементов в стеке
    int top;            // индекс для верхнего элемента в стеке
public:
    Stack(int n = MAX); // создается стек с n элементами
    Stack(const Stack & st);
    ~Stack();
    bool isempty() const;
    bool isfull() const;
    // push() returns false if stack already is full, true otherwise
    bool push(const Item & item);   // add item to stack
    // pop() returns false if stack already is empty, true otherwise
    bool pop(Item & item);          // pop top into item
    Stack & operator=(const Stack & st);
};
#endif
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
// stack.cpp -- Stack member functions
#include "stack.h"
Stack::Stack(int n)    // create an empty stack
{
    items = new Item[n];
    top = 0;
    size = n;
}
Stack::~Stack()
{
    delete [] items;
}
bool Stack::isempty() const
{
    return top == 0;
}
 
bool Stack::isfull() const
{
    return top == MAX;
}
Stack::Stack(const Stack & st)
{
    items = new Item[st.size];
    top = st.top;
    size = st.size;
    for(int i=0;i<st.size;++i)
        items[i] = st.items[i];
 
}
Stack & Stack::operator=(const Stack & st)
{
    if(this == &st)
        return *this;
    delete [] items;
    items = new Item[st.size];
    top = st.top;
    size = st.size;
    for(int i=0;i<st.size;++i)
        items[i] = st.items[i];
    return *this;
}
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; 
}
Aliru
0 / 0 / 0
Регистрация: 07.05.2013
Сообщений: 83
21.08.2013, 10:58  [ТС]     Не могу понять условия задачи #3
Нет, это пример как можно стеком воспользоваться.
А я пытаюсь понять как использовать
Цитата Сообщение от Aliru Посмотреть сообщение
void visit(void (*pf) (Item S));
В данном случае pf указывает на функцию (но не на функцию-элемент), которая принимает ссылку на аргумент Item, где Item — это тип элементов списка. Функция visit() применяет эту функцию к каждому элементу списка.
это с привязкой к стеку и, наверное все данные должны быть public в исходном классе, чтобы функция не член могда ими пользоваться?
lemegeton
 Аватар для lemegeton
2913 / 1342 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
21.08.2013, 12:18     Не могу понять условия задачи #4
Цитата Сообщение от Aliru Посмотреть сообщение
Вы можете добавлять элементы в список.
Цитата Сообщение от Aliru Посмотреть сообщение
он, например, не допускает добавлений и удалений элементов.
Одновременно? Тут какое-то противоречие.

В абзаце явно идет речь про две штуки -- про интерфейс и про передачу функции методу.
Декомпозиция на методы, конечно, фиговая, да и способ обращения к данным тот еще...

Вот пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <iostream>
 
// общий интерфейс для простого списка
template <class Item>
class List {
 public:
  virtual int getSize() const = 0;
  virtual bool isEmpty() const  = 0;
  virtual bool isFull() const = 0;
  virtual void visit(void (*)(Item&)) = 0;
  virtual void add(const Item&) = 0;
  virtual ~List() {}
};
 
template <class Item>
class ArrayList : public List<Item> {
 public:
  ArrayList() : size(0), capacity(10), data(new Item[capacity]) {}
  ArrayList(int capacity) : size(0), capacity(10),
    data(new Item[capacity]) {}
  virtual int getSize() const { return size; }
  virtual bool isEmpty() const { return size == 0; }
  virtual bool isFull() const { return size == capacity; }
  virtual void add(const Item &item) {
    data[size++] = item;
  }
  virtual void visit(void (*visitor)(Item&)) {
    for (int i = 0; i < size; ++i) {
      visitor(data[i]);
    }
  }
  virtual ~ArrayList() {
    delete [] data;
  }
 private:
  int size;
  int capacity;
  Item *data;
};
 
template <class Item>
void outputVisitor(Item &item) {
  std::cout << item << std::endl;
}
 
template <class Item>
void setToZeroVisitor(Item &item) {
  item = Item(0);
}
 
int main(int, char**) {
  List<int> *list = new ArrayList<int>(15);
  
  list->add(1);
  list->add(4);
  list->add(5);
  list->add(7);
  
  list->visit(outputVisitor);
  list->visit(setToZeroVisitor);
  list->visit(outputVisitor);
  
  delete list;
}
Aliru
0 / 0 / 0
Регистрация: 07.05.2013
Сообщений: 83
21.08.2013, 23:27  [ТС]     Не могу понять условия задачи #5
Cпасибо!
Сейчас буду разбираться.
Aliru
0 / 0 / 0
Регистрация: 07.05.2013
Сообщений: 83
23.08.2013, 17:00  [ТС]     Не могу понять условия задачи #6
Скажите пожалуйста, а почему динамически создать массив размером 0 можно, а статически нет.
Как функция не член работает с приватными данными?
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
24.08.2013, 09:59     Не могу понять условия задачи #7
Цитата Сообщение от Aliru Посмотреть сообщение
почему динамически создать массив размером 0 можно
создать то можно, а при освобождении памяти выскакивает ошибка
хотя мне тоже интересно что происходит когда создаешь массив нулевого размера
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
24.08.2013, 11:04     Не могу понять условия задачи #8
Цитата Сообщение от Aliru Посмотреть сообщение
Скажите пожалуйста, а почему динамически создать массив размером 0 можно, а статически нет.
Как функция не член работает с приватными данными?
Зачем вообще может понадобиться создание массива с 0 размером?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.08.2013, 13:48     Не могу понять условия задачи
Еще ссылки по теме:

C++ Не могу понять требование задачи
C++ Непонимание условия задачи
Проверьте пожалуйста правильность решения задачи и не могу понять тернарный оператор C++
Заменить символы табуляции в заданном тексте нужным числом пробелов (не могу понять условие задачи) C++
Построение блок-схем исходя из условия задачи C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
lemegeton
 Аватар для lemegeton
2913 / 1342 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
26.08.2013, 13:48     Не могу понять условия задачи #9
Цитата Сообщение от Nekto Посмотреть сообщение
Зачем вообще может понадобиться создание массива с 0 размером?
Такие штуки возникают при наивных реализациях, не проверяющих пограничные условия или параметры в целом.
Например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Array {
 public:
  Array(int size) : size(size), data(new int[size]){}
  virtual ~Array() {
    delete [] data;
  }
  int &operator[](int position) {
    return data[position];
  }
 private:
  int size;
  int *data;
};
 
int main(int, char**) {
  int i;
  std::cin >> i;
  Array a(i); // вот и new int[<что-угодно>]
}
Учебные и обобщенные реализации часто намеренно делаются наивными для простоты кода и лучшей передачи основного смысла.
Yandex
Объявления
26.08.2013, 13:48     Не могу понять условия задачи
Ответ Создать тему
Опции темы

Текущее время: 06:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru