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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Получить в порядке убывания все делители данного числа http://www.cyberforum.ru/cpp-beginners/thread866248.html
Составьте программу получения в порядке убывания всех делителей данного числа. помогите пожалуйста хотя бы с условием, хотя бы скажите что в while писать... #include<stdio.h> #include<conio.h> main() { int n,count,n1; scanf("%d",&n); count=0, n1=n; while(n!=0)
C++ Непонятные функции std::vector Здорова господа! Тут я решил своими словами описать стандартные контейнеры их всего 14. Решил описать с примерчиками возможности каждого контейнера, оно и мне полезно стл как раз изучу, да и мб новичок новичку пригодится, а то на офф сайте фиг, что поймешь, а русских ресурсов мало, поэтому решил свой ресурс создать по стл. Ну а что там стл маленькая 14 контейнеров и 60 алгоритмов все го то. ... http://www.cyberforum.ru/cpp-beginners/thread866233.html
C++ Динамический массив,двумерный с плавающей точкой(коммент кода)
\\Динамический массив,двумерный с плавающей точкой, выделить из массива максимальный прямоугольный блок не содержащий отрицательных чисел, данные перенести в новый массив.Отсортировать элементы последней строки и последнего столбца совместно по убыванию.(Прокомментируйте пожалуйста каждую строчку) #include <iostream> #include <locale.h> #include <string> #include <stdlib.h> #include...
C++ Интеграция кода c++ в java
Вот решил переписать пример с одной книги где показано как в код java вставить код c++. Но почему-то много ошибок, не подскажете почему? #include <iostream> #include "A.h" #include "jni.h" JNIEXPORT void JNICALL Java_A_show(JNIEnv *env, jobject obj) { jclass cls; jfieldID fid; jint i;
C++ Помощь с фиксом ошибок http://www.cyberforum.ru/cpp-beginners/thread866188.html
Код: // ConsoleApplication2.cpp: определяет точку входа для консольного приложения. // #include "stdafx.h" #include <stdio.h> #define OS_TYPE 0xF0 //0xF0 - Windows, 0x0F - Linux #if OS_TYPE & 0xF0 // Windows
C++ Как контролировать правильность ввода? В переменные типов unsigned и double нужно записать численное значение. Какие есть способы контроля ввода для избежания ввода символов, слов и строк при этом? подробнее

Показать сообщение отдельно
Unreal_Reality
0 / 0 / 0
Регистрация: 09.04.2013
Сообщений: 8
15.05.2013, 19:39     Разреженные массивы. Как?
Задание: Разработать шаблонный класс 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;
}
Проблема: Как ввести эту операторную функцию? С какого конца подойти.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 19:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru