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

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

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

Разреженные массивы. Как? - C++

15.05.2013, 19:39. Просмотров 989. Ответов 0
Метки нет (Все метки)

Задание: Разработать шаблонный класс SparseArray для работы с разреженным массивом. Класс должен содержать конструктор по умолчанию, основной конструктор и конструктор копирования. Кроме того, класс должен содержать функции для ввода и вывода элементов массива. Определить операторную функцию (знак операции выбрать самостоятельно), которая позволяет ввыводить среднее арифметическое значение положительных элементов массива. В главной программе проверить работу всех функций класса.
То, что есть:
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <assert.h>
using namespace std;
 
// Класс, определяющий один элемент, хранящийся в разреженном массиве:
template <class Type> class SparseList;
template <class Type> class SparseOb
{
    friend class SparseList<Type>; 
// Обратите внимание на то, что класс SparseList предварительно объявлен
    long index; // индекс элемента массива
    SparseOb<Type> *next; // указатель на следующий узел
    SparseOb<Type> *prior; // указатель на предыдущий объект
    SparseOb() { info = 0; index = -1; next = prior = NULL;} 
// конструктор
    public:
        Type info; // элемент данных
};
 
// Класс  списка:
template <class Type> 
class SparseList
{
    SparseOb<Type> *start, *end; // указатели на начало и конец списка
public:
    SparseList() {start = end = NULL;}
    ~SparseList();
    SparseOb<Type> * store(long ix, Type c); // добавление элемента
    void remove(long ix); // удаление элемента
    // возвращение указателя на элемент по заданному индексу:
    SparseOb<Type> * find(long ix);
};
 
// Параметризованный класс разреженного массива:
template <class Type> 
class SparseArray: public SparseList<Type>
{
    long length; // размер массива
    public: 
    SparseArray(long size = 0) : length(size) {} // конструктор
    Type& operator [](long i); // операция [ ]
};
 
// Определение функций:
// Деструктор:
template <class Type> SparseList<Type>::
~SparseList()
{
    SparseOb<Type>* p, *p1  ;
    // удаление всех элементов списка:
    p = start;    
    while (p) 
    { 
        p1 = p->next;  
        delete p;  
        p = p1; 
    }
}
 
// Добавление элемента в список:
template <class Type> SparseOb<Type> * SparseList<Type>::
store (long ix, Type c)
{
    SparseOb<Type> *p = new SparseOb<Type>;
    assert(p); // проверяем, выделена ли память
    p->info = c; 
    p->index = ix;
    if (start == NULL) start = end = p; 
// если добавляется первый элемент списка
    else // добавление элемента в конец списка
    {
        p->prior = end;  end->next = p;  end = p;
    }
    return p;
}
 
// нахождение элемента массива по индексу:
template <class Type> SparseOb<Type> * SparseList<Type>::
find(long ix)
{
    SparseOb<Type> *temp;
    temp = start;
    while(temp)
    {
        if (ix == temp->index) return temp; 
    // если найдено вхождение элемента, возвращается указатель на него
        temp = temp->next;
    }
    return NULL; // если нет в списке
}
 
/* Удаление из списка элемента с указанным индексом и 
 обновление указателей на начало и конец списка: */
template <class Type> void SparseList<Type>::
remove(long ix)
{
    SparseOb<Type> *ob = find(ix); // получаем указатель на элемент
    if (!ob) return; // если элемент не существует
    if (ob->prior) // если удаляется не первый элемент
    {
        ob->prior->next = ob->next;
        if (ob->next)  // если удаляется не последний элемент
            ob->next->prior = ob->prior;
        else // последний
            end = ob->prior;
        delete ob;
    }
    else // удаляется первый
        if (ob->next) // если элемент - не единственный
        {
            ob->next->prior = NULL;
            start = ob->next;
            delete ob;
        }
        else start = end = NULL; // теперь список пуст
}
 
// Индексация в массиве:
template <class Type> Type& SparseArray<Type>::
operator [] (long ix) 
{
    if (ix<0 || ix > length-1)
    {
        cout<<"Индекс выходит за пределы области определения\n\n\n";
        exit(1);
    }
    SparseOb<Type> * p;
    p = find(ix); // получаем указатель на элемент
    if (!p) // эсли это новый элемент
    {
        p = store(ix, 0); // добавляем его в массив со значением 0
    }
    return p->info; 
/* функция возвращает ссылку на эту ячейку, поэтому значение элемента можно изменять */
}
 
// пример использования разреженного массива:
int main()
{
    //Настройки шрифтов и региональных стандартов: 
    if(SetConsoleCP(1251)==0)
    //проверка правильности установки кодировки символов для ввода
    {
        cerr<<"Fialed to set codepage!"<<endl;
    /* если не удалось установить кодовую страницу, вывод сообщения об ошибке */
    }
    if(SetConsoleOutputCP(1251)==0)//тоже самое для вывода
    {
        cerr<<"Failed to set OUTPUT page!"<<endl;
    }
    SparseArray <int> iob(100000); // Объявляем массив целых чисел
    // поместим в массив некоторые значения:
    for (int i=0; i<5; i++) 
        iob[i] = i+1;
    iob[2] = iob[3];
    iob[1000] = 9345;
    iob[2000] = iob[1000]+100;
    // выведем значения элементов на экран:
    cout << "Значения элементов массива:\n";
    for (int i=0; i<5; i++)  cout << iob[i] << " ";
    cout <<iob[1000] << " " << iob[2000] << endl;
    cout << "Удалили элемент с номером 0: ";
    iob.remove(0);
    for (int i=0; i<5; i++)  cout << iob[i] << " ";
    cout << endl;
    // попробуем обратиться к элементу, которому не присваивалось значение:
    cout << "Неприсвоенное значение: " << iob[3000] << " "  << endl;
    // попробуем обратиться к элементу с недопустимым номером:
    cout << iob[100001]<< endl; 
    cout << endl;
    _getch();
    return 0;
}
Проблема: Как ввести эту операторную функцию? С какого конца подойти.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2013, 19:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Разреженные массивы. Как? (C++):

Разреженные матрицы - C++
Даны две разреженные матрицы общего вида. Сложить их и результат занести в разреженную матрицу CSS. с меня +1)) очень нужно! спасибо...

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

Разреженные матрицы - C++
Добрый день, уважаемые пользователи. Задание по &quot;Разреженным матрицам&quot; через динамический список. Собственно сам список: ...

Разреженные матрицы - C++
Почитал теории по разреженным матрицам, как понял это такие матрицы, где большинство элементов равны 0. Теперь пытаюсь разобраться в...

Разреженные матрицы - C++
Как в ражреженной матрице найти количество различных элементов.

Многомерные массивы, как перебирать внутренние массивы - C++
Здравствуйте. Такой учебный код и плохо понимаю как перебираются внутренние массивы, может кто пояснит подоходчивее. Именно внутренний...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2013, 19:39
Привет! Вот еще темы с ответами:

Как создавать массивы объектов, и как к ним обращаться? - C++
как создавать массивы объектов и как к ним обращаться? вот что пишет создатель самого си в своей книге - получается что нельзя...

Массивы. Циклические алгоритмы (Заполнить массивы случайными числами, лежащими в интервале 0 до 100) - C++
Доброго дня, уважаемые форумчане, помогите пожалуйста решить задание. Заполнить массивы случайными числами, лежащими в интервале 0 до...

Указатели и массивы. Индексация с помощью указателей. Передача массивов в функции. Динамические массивы (обработка матриц) - C++
Для каждого элемента , bij, i= 1,...,n , j=1,...,n определяется свой многоугольник местонахождением соответствующего элемента aij (см....

Как вводить массивы? - C++
Я полный чайник в программировании. Пожалуйста, объясните как в C++ можно вводить массивы.


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

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

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