С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
Fakeoke
318 / 317 / 202
Регистрация: 28.07.2011
Сообщений: 1,865
1

Класс массив. Задания произвольных границ индексов массива

14.05.2015, 17:22. Просмотров 1333. Ответов 11
Метки нет (Все метки)

Составить класс для определения одномерных массивов целых чисел .
Предусмотреть возможность обращения к отдельному элементу массива с контролем выхода за пределы массива.
Предусмотреть возможность задания произвольных границ индексов при создании объекта

вот накатал что-то... но когда обращаюсь к cB (который вроде как должен был быть на 4 элемента с нумерацией 2 3 4 5 6),норм выводит cb[1], как быть?
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
 
#include <iostream>
 
using namespace std;
 
class cArray
{
private:
    int *arr;// массив
    int n; //размер массива
public:
    cArray (int k)         //конструктор стандартный
    {
       arr= new int [k]; //выделили память
       n=k;              //запомнили размер
       for (int i=0;i<n;i++)
            arr[i]=rand()%23;    //заполнили числами
    }
    cArray (int a, int b)         //    возможность задания произвольных границ индексов
    {
       arr= new int [b]; //выделили память
       n=b;              //запомнили размер
        for (int i=a;i<b;i++)
            arr[i]=rand()%44;    //заполнили числами
    }
 
     int& operator[] (int k)   //обращения к отдельному элементу массива
    {
        if (k<0 || k>=n)
        {
            cout << endl << "Wrong index of massive!" << endl;
            system("pause");
            exit(1);
        }
        return arr[k];
    }
};
 
int main()
{
     cArray cA(5);  //создали массив из 5 элементов (нумерация 0 1 2 3 4)
     cout << cA[4] << endl;
 
     cArray cB(2,6); //создали массив с нумерацией (2 3 4 5 6)
     cout << cB[6] << endl;
 
    system("pause");
    return 0;
}
Добавлено через 26 минут
неужели хранить еще одну переменную в которую записывать начало массива?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.05.2015, 17:22
Ответы с готовыми решениями:

Написать класс для динамического массива с проверкой границ (что подразумевают под инициализацией?)
Привет, народ, есть такое задание: 2. написать класс для динамического...

Создать массив из индексов положительных элементов другого массива
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; int main()...

Класс: Разработать абстрактный класс класс Point для задания координаты...
Всем привет, помогите пожалуйста решить задачу, я уже всю голову сломал, не...

Сформировать новый массив, состоящий из индексов отрицательных элементов исходного массива
Формировать массив B(n, m) случайных чисел отрезка (-10; 165). Сформировать...

Даны два произвольных одномерных массива действительных чисел М1 и М2. Сформировать слиянием этих массивов упорядоченный массив М3
Помогите с работой на Borland C++ 5.02:Даны два произвольных одномерных массива...

11
mymedia
193 / 193 / 120
Регистрация: 27.05.2011
Сообщений: 544
14.05.2015, 18:29 2
Во втором конструкторе выделяйте памяти на b-a элементов, когда обращаетесь к элементам, вычитайте из запрашиваемгого индекса число a. Однако скорее всего также придётся хранить и b или количество элементов. Так что да, видимо, придётся завести ещё одно поле в классе.

Добавлено через 1 минуту
Незабудьте про деструктор и оператор копирования
0
Fakeoke
318 / 317 / 202
Регистрация: 28.07.2011
Сообщений: 1,865
14.05.2015, 18:33  [ТС] 3
C++
1
2
3
4
5
6
7
8
9
10
        cArray operator= (cArray b)     //оператор = - копирование
    {
        cArray temp(n);            //создали новый массив размером n
        for (int i=0;i<=n;i++)      //цикл по массиву
            temp[i]=b[i];   //заполняем новый массив как массив b
        return temp;               //возвращаем новый массив
    }
 
~cArray ()                 //деструктор
    {delete [] arr;}
п.ц. зачем его писать? его ведь надо в конце применятЬ?))

вообщем сделал еще одну переменную для начала отсчета, но памяти буду также выделять b, не хочу вычитать везде при обращении эту разницу, пусть нулевые элементы будут в начале.. однако если будут делать 3 элемента с 50 до 53... 50 нулей... черт, видимо придется делать как вы сказали
0
mymedia
193 / 193 / 120
Регистрация: 27.05.2011
Сообщений: 544
14.05.2015, 18:45 4
Цитата Сообщение от Fakeoke Посмотреть сообщение
п.ц. зачем его писать? его ведь надо в конце применятЬ?))
Ну, деструктор нужен, чтобы освободить память. Иначе возникнет утечка памяти. Специально вызывать деструктор не надо. Он будет вызван автоматически, когда поток выполнения покинет область видимости объекта.
Цитата Сообщение от Fakeoke Посмотреть сообщение
вообщем сделал еще одну переменную для начала отсчета, но памяти буду также выделять b, не хочу вычитать везде при обращении эту разницу, пусть нулевые элементы будут в начале.. однако если будут делать 3 элемента с 50 до 53... 50 нулей... черт, видимо придется делать как вы сказали
У такого подхода есть ещё один плюс: можно будет задавать отрицательные индексы
0
Fakeoke
318 / 317 / 202
Регистрация: 28.07.2011
Сообщений: 1,865
14.05.2015, 18:51  [ТС] 5
как отсюда просто выйти?
не завершая программу
C++
1
2
3
4
5
6
7
8
9
10
     int& operator[] (int k)   //оператор [] - обращение к отдельному элементу массива
    {
        if (k<m || k>n+m)       //если указан индекс меньше нижней границы или больше размера
        {
            cout << endl << "Wrong index of massive!" << endl; //пишем что нельзя такого делать
            system("pause");
            exit(1);        //выходим
        }
        return arr[k-m];   //если указан верный индекс, возвращаем значение элемента
    }
0
mymedia
193 / 193 / 120
Регистрация: 27.05.2011
Сообщений: 544
14.05.2015, 19:22 6
Цитата Сообщение от Fakeoke Посмотреть сообщение
как отсюда просто выйти?
Куда выйти?
Цитата Сообщение от Fakeoke Посмотреть сообщение
C++
1
2
3
cout << endl << "Wrong index of massive!" << endl; //пишем что нельзя такого делать
 system("pause");
 exit(1); //выходим
Сгенерируйте исключение
0
Fakeoke
318 / 317 / 202
Регистрация: 28.07.2011
Сообщений: 1,865
15.05.2015, 18:08  [ТС] 7
ну ничего не выводить
тут как работает:
он пытается вывести a[11], а такого нет
он пишет a[11]=wrong index
и выходит из программы
мне надо как:
он пишет а11 и не выходит из программы, а дальше что-то делает...
я конечно сделал что бы return a[0], тогда все ок
но все-таки правильноее выходит так-то, а то в вычислениях где-то накосячится так.. хотя сообщение же есть, не накосячит
0
mymedia
193 / 193 / 120
Регистрация: 27.05.2011
Сообщений: 544
17.05.2015, 01:27 8
В таких случаях обычно генерируют исключение
C++
1
throw out_of_range("Wrong index of massive")
Добавлено через 4 минуты
Вызывающая функция затем может перехватить исключение, чтобы продолжить работу
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int main() {
    try {
        cArray cA(5);
        cout << cA[100500] << endl;
        cout << "успешно прочитали элемент массива" << endl;
    } catch (out_of_range) {
        cout << "споткнулись..." << endl;
    }
    cout << "Но продолжили работу дальше" << endl;
 
    system("pause");
    return 0;
}
Добавлено через 1 минуту
Если исключение не будет перехвачено, программа завершит работу
1
Fakeoke
318 / 317 / 202
Регистрация: 28.07.2011
Сообщений: 1,865
17.05.2015, 08:54  [ТС] 9
try catch это одно, а мне надо переопределитть оператор []
0
mymedia
193 / 193 / 120
Регистрация: 27.05.2011
Сообщений: 544
17.05.2015, 13:24 10
Эмм… и почему же нельзя сделать вот так?
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
#include <iostream>    // std::cout, std::endl
#include <stdexcept>   // std::ouf_of_range
 
class cArray {
private:
    int *arr;   // указалеть на массив
    int n;      // размер массива
    int a;      // первый индекс
public:
    cArray(int k)        //конструктор стандартный
        : arr(new int [k]),
          n(k), a(0) { }
    cArray(int a_, int b_)       // возможность задания произвольных границ индексов
        : arr(new int [b_ - a_]),
          n(b_ - a_), a(a_) { }
    ~cArray() {
        delete[] arr;
    }
    int& operator[] (int k) {   //обращения к отдельному элементу массива
        if (k < a or k >= n + a) {
            throw std::out_of_range("Wrong index of massive");
        }
        return arr[k - a];
    }
};
 
int main() {
    using namespace std;
    try {
        cArray cA(5);
        cout << cA[100500] << endl;
        cout << "успешно прочитали элемент массива" << endl;
    } catch (out_of_range) {
        cout << "споткнулись..." << endl;
    }
    cout << "Но продолжили работу дальше" << endl;
}
Оператор перегрузили, ошибку обрабатываем…
0
Fakeoke
318 / 317 / 202
Регистрация: 28.07.2011
Сообщений: 1,865
17.05.2015, 17:39  [ТС] 11
C++
1
`out_of_range' is not a member of `std'
Добавлено через 11 минут
вот код...
компилятор dev c++ ругается, студия тоже...
почему?
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
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
/*
Составить описание класса для определения одномерных массивов целых чисел (векторов).
Предусмотреть возможность обращения к отдельному элементу массива с контролем выхода за пределы массива,
возможность задания произвольных границ индексов при создании объекта
и выполнения операций поэлементного сложения и вычитания массивов с одинаковыми границами индексов
, умножения и деления всех элементов массива на скаляр,
вывода на экран элемента массива по заданному индексу и всего массива.
 
Написать программу, демонстрирующую работу с этим классом.
Программа должна содержать меню, позволяющее осуществить проверку всех методов класса.*/
#include <iostream>
 
using namespace std;
 
class cArray     //клас массив
{
private:
    int *arr;// массив
    int n; //размер массива
    int m; //начало отчета массива
public:
    cArray(int k)         //конструктор стандартный
    {
        m = 0;                //считаем с 0
        arr = new int[k];   //выделили память
        n = k;                 //запомнили размер
        for (int i = 0; i <= n; i++)
            arr[i] = rand() % 23;    //заполнили числами
    }
    cArray(int a, int b)    //  конструктор с возможность задания произвольных границ индексов
    {
        m = a;               //считаем с a
        arr = new int[b - a]; //выделили память
        n = b - a;              //запомнили размер
        for (int i = 0; i <= n; i++)
            arr[i] = rand() % 44;    //заполнили числами
    }
 
 
    int& operator[] (int k)   //оператор [] - обращение к отдельному элементу массива
    {
        if (k<m || k>n + m)       //если указан индекс меньше нижней границы или больше размера
        {
            cout << endl << "Wrong index of massive!" << endl; //пишем что нельзя такого делать
            return arr[0];
            //  cin.get();
            //  exit(1);        //выходим из программы
        }
        return arr[k - m];   //если указан верный индекс, возвращаем значение элемента
    }
 
    void cArray::Print(int k1, int k2)   //процедура вывода чисел с индексами k1..k2 на экран
    {
        for (int i = 0; i <= k2 - k1; i++)    //цикл по таким числам
        {
            cout << arr[i] << " ";      //выводим на экран
        }
        cout << endl;
    }
    cArray operator+ (cArray b)     //оператор + - сложение массивов по одинаковым границам
    {
        cArray temp(n);            //создали новый массив размером n
        for (int i = 0; i <= n; i++)      //цикл по массиву
            temp[i] = arr[i] + b[i];   //заполняем новый массив как сумму массивов
        return temp;               //возвращаем массив сумм
    }
    cArray operator- (cArray b)   // - аналогично
    {
        cArray temp(n);
        for (int i = m; i <= n; i++)
            temp[i] = arr[i] - b[i];
        return temp;
    }
    cArray operator / (int z)    //деление на число
    {
        cArray temp(n);         //создали новый массив
        for (int i = 0; i <= n; i++)   //цикл по массиву
            temp[i] = arr[i] / z;    //разделили на число
        return temp;
    }
    cArray operator * (int z)     //аналогично умножение на число
    {
        cArray temp(n);
        for (int i = 0; i <= n; i++)
            temp[i] = arr[i] * z;
        return temp;
    }
    ~cArray()                 //деструктор
    {
        delete[] arr;
    }
};
 
int main()
{
    char key = 0;        //для менюшки
 
 
    while (1)      //бекс цикл
    {
        //  srand(time(NULL));      //генератор случайных чисел
        cArray cA(10);  //создали массив из 11 элементов (нумерация 0 1 2 3 4 5 6 7 8 9 10)
        cArray cB(2, 6); //создали массив с нумерацией (2 3 4 5 6 )
        //  system("cls");   //чистим экран
        //дальше пункты меню
        cout << "1 - Create mas A(0:10) and test a[0] and a[11]\n";
        cout << "2 - Write mas A(0:10) \n";
        cout << "3 - Create mas B(2:6) and test b[2] and b[7]\n";
        cout << "4 - Write mas B (2:6) \n";
        cout << "5 - Create mas C (0:10) and C+A \n";
        cout << "6 - Create mas D (2:6) and D-B \n";
        cout << "7 - Test * and / for const\n";
        cout << "0 - Exit\n";
        cin >> key;     //выбираем пункт
        cout << '\n';
        switch (key)   //смотря какой выбрали
        {
        case '1':
        {
                    cA.Print(0, 10);                //вывели нумерация 0 - 10
                    cout << "a[0] = " << cA[0] << endl;    //пытаемся вывести 0
                    cout << "a[1] = " << cA[1] << endl;    //пытаемся вывести 1
                    cout << "a[2] = " << cA[2] << endl;    //пытаемся вывести 2
                    cout << "a[3] = " << cA[3] << endl;    //пытаемся вывести 3
                    cout << "a[4] = " << cA[4] << endl;    //пытаемся вывести 4
                    cout << "a[5] = " << cA[5] << endl;    //пытаемся вывести 5
                    cout << "a[6] = " << cA[6] << endl;    //пытаемся вывести 6
                    cout << "a[-1] = " << cA[-1] << endl;  //пытаемся вывести -1
                    cout << "a[11] = " << cA[11] << endl;  //пытаемся вывести 11
                    cin.get();
                    break;
        }
        case '2':
        {cout << "Massive A : " << endl;
        cA.Print(0, 10); //вывели нумерация 0 - 10
        cin.get();
        break;
        }
        case '3':
        { cB.Print(2, 6);  //вывели нумерация 2 - 6
        cout << "b[2] = " << cB[2] << endl;
        cout << "b[3] = " << cB[3] << endl;
        cout << "b[4] = " << cB[4] << endl;
        cout << "b[5] = " << cB[5] << endl;
        cout << "b[6] = " << cB[6] << endl;
        cout << "b[1] = " << cB[1] << endl;
        cout << "b[7] = " << cB[7] << endl;
        cin.get(); }
            break;
        case '4':
        {    cout << "Massive B : " << endl;
        cB.Print(2, 6);  //вывели нумерация 2 - 6
        cin.get(); }
            break;
        case '5':
        {    cout << "Massive C : " << endl;
        cArray cC(10);  //создали массив из 10 элементов (нумерация 0 1 2 3 4 5 6 7 8 9)
        cC.Print(0, 10);   //вывели С
        cout << "+ Massive A : " << endl;
        cA.Print(0, 10); //вывели А
        cout << "Result (C + A) : " << endl;
        cC = cC + cA;          //сложили
        cC.Print(0, 10);    //вывели С
        cin.get();
        break;        }
        case '6':
        { cout << "Massive D : " << endl;
        cArray cD(2, 6);  //создали массив из 10 элементов (нумерация 0 1 2 3 4 5 6 7 8 9)
        cD.Print(2, 6);   //вывели Д
        cout << "+ Massive B : " << endl;
        cB.Print(2, 6);    //вывели Б
        cout << "Result (D - B) : " << endl;
        cD = cD - cB;         //вычли
        cD.Print(2, 6);    //вывели результат
        cin.get();
        break;   }
        case '7':
        { int con;
        con = rand() % 10 + 1;     //констнта - рандомное число от 1 до 10
        cout << "Let us choose const... It would be : " << con << endl;
        cout << "Massive A : " << endl;
        cA.Print(0, 10);   //выводим А
        cout << "Massive B : " << endl;
        cB.Print(2, 6);     //выводим Б
        cout << "Now will calculate A*con and B/con : " << endl;
        cA = cA*con;  //А умножаем на чило
        cB = cB / con;  //Б делим на число
        cout << "Massiva A * con  : " << endl;
        cA.Print(0, 10); //результат выводим
        cout << "Massive B / con : " << endl;
        cB.Print(2, 6);  //результат выводим
        cin.get();
        break;       }
 
        case '0': {exit(0); }   //выходим из прогр
        }
    }
}
0
mymedia
193 / 193 / 120
Регистрация: 27.05.2011
Сообщений: 544
18.05.2015, 18:45 12
Цитата Сообщение от mymedia Посмотреть сообщение
C++
1
#include <stdexcept> // std::ouf_of_range
⁠⁠⁠
1
18.05.2015, 18:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.05.2015, 18:45

Сформировать массив, поместив в него значения индексов тех элементов первого массива, которые являются простыми числами
Доброго времени суток. Мне дали задание:&quot;Дан целочисленный массив A....

Разработать абстрактный класс класс Point для задания координаты
Народ, не буду врать на подобии &quot;помогите, не понимаю как сделать&quot; и т.п.,...

Реализовать класс Triangle (задание 25), опираясь на класс Angle из задания 26 для представления углов
Реализовать класс Triangle (задание 25), опираясь на класс Angle из задания 26...


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

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

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