Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
0 / 0 / 1
Регистрация: 07.05.2013
Сообщений: 83
1

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

21.08.2013, 10:33. Просмотров 614. Ответов 8
Метки нет (Все метки)


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

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

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

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

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

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

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

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

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

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

Не могу понять чего хотят чтобы я сделал, можно привести какой-нибудь маленький пример чтобы было от чего отталкиваться
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.08.2013, 10:33
Ответы с готовыми решениями:

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

Не могу понять обьяснение задачи
Всем доброго дня.. Ребят вот мне объяснил учитель одну задачку, но в этой задаче я не могу понять...

Не могу понять алгоритм задачи
Изучаю язык C, да и в обще программирование совсем не давно. Ни как не могу придумать нормального...

Не могу понять решения задачи
Звучит она так: Составить программу, которая создаёт файл и записывает в него 5 введеных целых...

8
50 / 50 / 9
Регистрация: 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; 
}
1
0 / 0 / 1
Регистрация: 07.05.2013
Сообщений: 83
21.08.2013, 10:58  [ТС] 3
Нет, это пример как можно стеком воспользоваться.
А я пытаюсь понять как использовать
Цитата Сообщение от Aliru Посмотреть сообщение
void visit(void (*pf) (Item S));
В данном случае pf указывает на функцию (но не на функцию-элемент), которая принимает ссылку на аргумент Item, где Item — это тип элементов списка. Функция visit() применяет эту функцию к каждому элементу списка.
это с привязкой к стеку и, наверное все данные должны быть public в исходном классе, чтобы функция не член могда ими пользоваться?
0
3053 / 1458 / 492
Регистрация: 29.11.2010
Сообщений: 2,888
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;
}
2
0 / 0 / 1
Регистрация: 07.05.2013
Сообщений: 83
21.08.2013, 23:27  [ТС] 5
Cпасибо!
Сейчас буду разбираться.
0
0 / 0 / 1
Регистрация: 07.05.2013
Сообщений: 83
23.08.2013, 17:00  [ТС] 6
Скажите пожалуйста, а почему динамически создать массив размером 0 можно, а статически нет.
Как функция не член работает с приватными данными?
0
55 / 55 / 6
Регистрация: 07.07.2013
Сообщений: 345
24.08.2013, 09:59 7
Цитата Сообщение от Aliru Посмотреть сообщение
почему динамически создать массив размером 0 можно
создать то можно, а при освобождении памяти выскакивает ошибка
хотя мне тоже интересно что происходит когда создаешь массив нулевого размера
0
346 / 291 / 37
Регистрация: 23.03.2012
Сообщений: 838
24.08.2013, 11:04 8
Цитата Сообщение от Aliru Посмотреть сообщение
Скажите пожалуйста, а почему динамически создать массив размером 0 можно, а статически нет.
Как функция не член работает с приватными данными?
Зачем вообще может понадобиться создание массива с 0 размером?
0
3053 / 1458 / 492
Регистрация: 29.11.2010
Сообщений: 2,888
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[<что-угодно>]
}
Учебные и обобщенные реализации часто намеренно делаются наивными для простоты кода и лучшей передачи основного смысла.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.08.2013, 13:48

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Не могу понять постановку задачи
Всем доброго времени суток! Есть задача, с помощью перегруженной операции *, создать возможность...

Ну могу понять суть задачи
Вот задача.Я не пойму что делать с х1=х2=х3-1 и хi Найти S...

Не могу до конца понять условие задачи
Здравствуйте. Задача 9.5 из учебника программированию Б. Страуструпа: Классы Book и Patron у...

Не могу понять ошибку .Не выводит ответ задачи
#include &lt;iostream&gt; using namespace std; int main () { setlocale (LC_ALL,&quot; &quot;); int...

Проверьте пожалуйста правильность решения задачи и не могу понять тернарный оператор
Задача из книги Васильева А.Н. &quot;Самоучитель С++&quot; Глава 1-я. Задача №4. Не могу понять как работает...

Заменить символы табуляции в заданном тексте нужным числом пробелов (не могу понять условие задачи)
со &quot;стопами&quot; ясно, но как обрабатывать несколько подряд стоящих символов табуляции: а) заменять их...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.