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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Aliru
0 / 0 / 0
Регистрация: 07.05.2013
Сообщений: 83
#1

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

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

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

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

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

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

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

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

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

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

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

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

Не могу понять чего хотят чтобы я сделал, можно привести какой-нибудь маленький пример чтобы было от чего отталкиваться
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.08.2013, 10:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не могу понять условия задачи (C++):

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

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

Ну могу понять суть задачи - C++
Вот задача.Я не пойму что делать с х1=х2=х3-1 и хi Найти S =\sum_{i=1}^{100}\frac{{x}_{i}}{{2}^{i}} если {x}_{1}={x}_{2}={x}_{3}=1 ; ...

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

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

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

8
Hugra
48 / 48 / 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; 
}
1
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 в исходном классе, чтобы функция не член могда ими пользоваться?
0
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
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
Aliru
0 / 0 / 0
Регистрация: 07.05.2013
Сообщений: 83
21.08.2013, 23:27  [ТС] #5
Cпасибо!
Сейчас буду разбираться.
0
Aliru
0 / 0 / 0
Регистрация: 07.05.2013
Сообщений: 83
23.08.2013, 17:00  [ТС] #6
Скажите пожалуйста, а почему динамически создать массив размером 0 можно, а статически нет.
Как функция не член работает с приватными данными?
0
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
24.08.2013, 09:59 #7
Цитата Сообщение от Aliru Посмотреть сообщение
почему динамически создать массив размером 0 можно
создать то можно, а при освобождении памяти выскакивает ошибка
хотя мне тоже интересно что происходит когда создаешь массив нулевого размера
0
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
24.08.2013, 11:04 #8
Цитата Сообщение от Aliru Посмотреть сообщение
Скажите пожалуйста, а почему динамически создать массив размером 0 можно, а статически нет.
Как функция не член работает с приватными данными?
Зачем вообще может понадобиться создание массива с 0 размером?
0
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.08.2013, 13:48
Привет! Вот еще темы с ответами:

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

Не могу понять ошибку .Не выводит ответ задачи - C++
#include &lt;iostream&gt; using namespace std; int main () { setlocale (LC_ALL,&quot; &quot;); int st,str,n,k=0; cout &lt;&lt; &quot;Vvedite chislo...

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

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


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

Или воспользуйтесь поиском по форуму:
9
Yandex
Объявления
26.08.2013, 13:48
Ответ Создать тему
Опции темы

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