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

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

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

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

15.05.2013, 19:39. Просмотров 925. Ответов 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;
}
Проблема: Как ввести эту операторную функцию? С какого конца подойти.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2013, 19:39     Разреженные массивы. Как?
Посмотрите здесь:

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

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

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

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

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

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

массивы, как написать - C++
условие задания: Вводится массив из 10 элементов. Выделить все парные элементы которые стоят на не парных местах.

массивы в с++ как сделать? - C++
нужно переместить файлы с одного txt документа в другой в обратном порядке в файле числа от 0 до 9

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

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

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

Массивы, как параметры функций - C++
Отрицательные элементы матриц A (5,4) , B (3,2 ) , C (4,4 ) записать в одномерный массив .


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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