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

Первый class Array. Проверить и указать на ошибки, если таковые имеются - C++

Восстановить пароль Регистрация
 
 
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
19.01.2014, 21:42     Первый class Array. Проверить и указать на ошибки, если таковые имеются #1
Доброго всем времени суток!Осмелюсь показать свой первый class Array.Код работает."заточен" он на программу.Большая просьба кому не трудно покритиковать и указать на мои косяки желательно с разъяснениями.Изучаю я с++ самостоятельно и показать код просто больше не кому.За ранее всем спасибо.
Вот мой,наверное далеко не лучший код.
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
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
#include <ctime>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <fstream>
#include <cmath>
#include <iomanip>
#include <cstring>
 
using namespace std;
 
class Array
{
    friend istream &operator>> (istream &, Array &); // перегруженный оператор ввода
    friend ostream &operator<< (ostream &, const Array &); // перегруженный оператор вывода
private:
    double *ptr; // указатель на массив
    size_t size; // размер массива
public:
    Array(); // конструктор по умолчанию
    Array(size_t ); // конструктор с параметрами
    Array( const Array & ); // конструктор копии
    ~Array(); // деструктор
     //set методы
    void setArray(); // заполнение массива с клавиатуры
    bool ReadFile(const char *);//заполняем из файла
     //get методы
    size_t PrintSize() const; // возвратить количество элементов массива
    void PrintMass(); // вывод массива
    //перегруженные операторы
    bool operator== (const Array &) const; // оператор сравнения
    const Array &operator= (const Array &); // оператор присваивания
    double &operator[] (size_t );//взятие индекса
    Array &operator+= (const double &); // оператор добавления элемента в конец массива
    Array &CopiMas (const size_t &,const size_t &);//копируем и определяем размер нового массива
    //поиск
    size_t Search(const double &) const;// поиск по ключу
    size_t IndMin (const double &)const;//минимальный индекс
    size_t IndMax (const double &)const;//максимальный индекс
    void SortMass ();// сортировка
    void InvertMass();
    //вспомогательные ф-ции
    double MaxElement ();//макс элемент
    double MinElement ();//мин элемент
 
};
 
Array::Array() // конструктор по умолчанию, без параметров
{
    size = 28; // по умолчанию размер массива = 10 элементов
    ptr = new double [size]; // выделить место в памяти для массива
   for (size_t i = 0; i < size; i++) // обнуляем массив
        ptr[i] = 0;
}
Array::Array(size_t arraySize) // конструктор с параметрами
{
    // если значение параметра больше 0, присвоить size значение arraySize, иначе - 28
    size = (arraySize > 0 ? arraySize : 0);
    ptr = new double [size]; // выделить место в памяти для массива
 
    for (size_t i = 0; i < size; i++) // обнуляем массив
        ptr[i] = 0;
}
Array::Array( const Array &arrayToCopy ) // конструктор копии
    :size(arrayToCopy.size)              // инициализатор размера массива
{
    ptr = new double [size]; // выделить место в памяти для массива
 
    for (size_t i = 0; i < size; i++)
        ptr[i] = arrayToCopy.ptr[i]; // заполняем массив значениями массива arrayToCopy
}
Array::~Array() // деструктор класса Array
{
    delete  [] ptr; // освободить память, удалив массив
}
istream &operator>> (istream & input, Array &obj)// перегруженный оператор ввода с клавиатуры
{
    for (size_t i = 0; i < obj.size; i++)
        input >> obj.ptr[i]; // заполняем массив объекта obj
    return input; // позволяет множественный ввод
}
ostream &operator<< (ostream &output, const Array &obj)// перегруженный оператор вывода
{
    for (size_t i = 0; i < obj.size; i++)
    {
        output << setw(10)<< setiosflags(ios::left) // под каждое число выделяется 5 позиций
               << obj.ptr[i];
    }
 
    output << endl;
 
    return output; // позволяет множественный вывод
}
void Array::setArray() // заполнение массива
{
    for (size_t i = 0; i < size; i++)
        cin >> ptr[i]; // ввод элемента массива с клавиатуры
}
bool Array::ReadFile(const char *filename)//заполняем из файла
{
    ifstream in(filename);
    if (!in) return false;
        for (size_t i = 0;i< size; i++)  //чтение чисел
    {
    in >> ptr[i];
    //arr[i] = ((arr[i]/2)*(arr[i]/2))*3.14;             //     из файла
    }
    in.close(); //Закрываем файл
  return true;
}
size_t Array::IndMin(const double &key)const//ищем минимальный индекс
{
 size_t min = 0;
    for (size_t i = 0; i < size+1; i++)
        if (fabs(ptr[i]-key)<= fabs(ptr[i+1]-key))//поиск по условию
        return (i >= 2)?min = i - 2: min = 0;//нижняя граница
 
 return -1;
}
 size_t Array::Search(const double &key) const // поиск по ключу
 {
     for (size_t i = 0; i < size; i++)
         if ( key == ptr[i] ) // поиск по ключу
             return (i + 1);             // позиция искомого элемента
     return -1;
 }
double Array::MaxElement ()//вспомогательная ф-ция макс элемент
{
 
double max_el = ptr[0];
for (size_t i =0 ;i< size; i++)
{
    if (max_el < ptr[i])
    max_el= ptr[i];
    }
    return max_el;
}
double Array::MinElement ()//вспомогательная ф-ция min элемент
{
double min_el = ptr[0];
for (size_t i =0 ;i< size; i++)
{
    if (min_el > ptr[i])
    min_el= ptr[i];
    }
    return min_el;
}
size_t Array::IndMax (const double  &key)const//максимальный индекс
{
 int max = 0;
    for (size_t i = 0; i < size+1; i++)
      if (fabs(ptr[i]-key)<= fabs(ptr[i+1]-key))//поиск по условию
      return (i <= size-3)? max=i +3 : max = size;//верхняя граница
 
 return -1;
}
void Array::PrintMass() // вывод массива
{
    for (size_t i = 0; i < size; i++)
        cout << setw(10)<< setiosflags(ios::left)<< ptr[i]; // вывод элементов массива на экран
 
    cout << endl; // новая строка
}
size_t Array::PrintSize() const // возвратить количество элементов массива
{
    return size;
}
const Array &Array::operator= (const Array &mass) // оператор присваивания
{
    if (&mass != this) // чтобы не выполнялось самоприсваивание
    {
        if (size != mass.size)
        {
            delete [] ptr; // освободить пространство
            size = mass.size; // установить нужный размер массива
            ptr = new double [size]; // выделить память под копируемый массив
        }
        for (size_t i = 0; i < size; i++)
            ptr[i] = mass.ptr[i]; // скопировать массив
    }
 
    return *this; // множественное присваивание
}
double &Array::operator[] (size_t index)
{
    if(index < 0 || index >= size)
    {
        std::cerr << "\n Ошибка индекса: " << index << std::endl;
        exit(1); // завершить работу программы, неправильный индекс
    }
    return ptr[index]; // возврат ссылки на элемент массива
}
bool Array::operator== (const Array &mass) const// оператор сравнения
{
    if (size != mass.size)
        return false; // массивы с разным количеством элементов
    for (size_t i = 0; i < size; i++)
        if (ptr[i] != mass.ptr[i])
            return false; // массивы не равны
 
    return true; // массивы равны
}
 Array &Array::CopiMas (const size_t &max,const size_t &min)//копируем и определяем размер нового массива
{
 Array temp(size);
     temp = *this; // сохраняем текущий массив во временный объект
     delete [] ptr; // освобождае память
     size = max-min; // переопределяем размер
     ptr = new double [size];
 size_t i,len = 0;
    for ( i = min; i < max; i++ )//читаем в ptr
    for ( i = min; i < max; i++ )//переносим в temp
     {if (temp[i]!=0) ptr[len++]= temp[i];}//переприсваиваем из temp в ptr
     return *this;
   }
 Array &Array::operator+= (const double &num) // оператор добавления элемента в конец массива
{
    Array result(size);
    result = *this; // временно сохраним текущий массив
    delete [] ptr; // освобождаем память
    size = size + 1; // увеличиваем размер массива на 1
    ptr = new double [size]; // выделяем память
    for (size_t i = 0; i < (size - 1); i++)
        ptr[i] = result.ptr[i]; // скопировать массив
        ptr[size - 1] = num; // добавляем число в конец массива
 
    return *this; // вызов перегруженного оператора
}
void Array::SortMass ()
{
 for (size_t i = 0; i < size; i++)
    {
        for (size_t j= i+ 1; j< size; j++)
           {
             if (ptr[j] < ptr[i]) swap (ptr[i], ptr[j]);
           }
    }
}
void Array::InvertMass()
{
 double temp;
   for(size_t i = 0; i < size / 2; i++)//делим пополам
     {
       temp = ptr[i];
       ptr[i] = ptr[size - i - 1];
       ptr[size - i - 1] = temp;//меняем половины местами
     }
}
 
int main()
{
system("chcp 1251 > nul");
 
 double d;
 int N =0,i = 0;
 
 Array Ar1(i); // создаем объект класса Ar1, используя конструктор аргументированный
 Array Ar(Ar1);  // создаем объект класса Ar, используя конструктор копирования
 Array Ar2;    // создаем объект класса Ar2, используя конструктор по умолчанию
 //выбираем как заполнять массив
  cout << "Как заполнить массив массив?  \n";
  cout << "Из файла-введите 0, с клавиатуры-введите 1.  \n";
  cin>>N;
 
 if (N == 1)
  {
    while (d!= 0)//заполняем перегруженным оператором += пока не введен 0
    {  cin>>d; if (d !=0) { Ar1 += d; i++; }}
       cout << "Начальный массив: \n";
       cout << Ar1; //вывод массива с помощью перегруженного оператора вывода <<
       Ar = Ar1; // присваиваем массиву Ar массив Ar1
       Ar.CopiMas(i,0);
       cout<< "Размер массива: " << Ar.PrintSize() << "\n";
       Ar.SortMass ();
       cout << "Сортированный массив: \n";
       cout << Ar; //вывод
  }
 if (N == 0)
  {
    cout << "Начальный массив: \n";
    Ar2.ReadFile("D:\\моя колликция\\символьная переменная\\мой файл.txt");
    Ar = Ar2; // присваиваем массиву Ar массив Ar2
    cout << Ar.CopiMas(Ar.PrintSize(),0)<< "Размер массива: " << Ar.PrintSize() << "\n";
  }
  cout <<"Макс элемент=  "<<Ar.MaxElement ()<<"    Мин элемент=   "<<Ar.MinElement ()<<"\n";
 
 int pos = 0;
    cout << " Введите число \n";
    cin >>d;
    if ((pos = Ar.Search(d)) != -1)//поиск элемента по значению
        cout << "Позиция искомого элемента: " << pos << "\n";
    else
        cout << "Искомый элемент не найден!\n";
 
    cout << "Инвертированный массив: \n";
    Ar.InvertMass ();//инверсия массива
    cout << Ar; //вывод
    cout << "Элемент массива = " << Ar[Ar.PrintSize() -2] << "\n";//поиск элемента по индексу
 
    cout << "Инвертированный массив: \n";
    Ar.InvertMass ();//инверсия массива
    cout << Ar; //вывод
 
 int min = Ar.IndMin (d);
 int max = Ar.IndMax (d);
 
    cout << "Минимальный индекс=   "<<min<<" Максимальный индекс=    "<<max<<"\n";
    Array Ar3(Ar); // 5-ти элементный объект класса Array
    cout << "Полученный массив: \n";
    Ar3.CopiMas(max,min);
    cout << "Размер массива: " << Ar3.PrintSize() << "\n";
    cout << Ar3; //вывод
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.01.2014, 21:42     Первый class Array. Проверить и указать на ошибки, если таковые имеются
Посмотрите здесь:

class array - начинающему C++
Выяснить, имеются ли во введенной строке соседние символы, первый из которых – ‘f’, а второй – ‘ ; ‘. C++
выяснить имеются ли в матрице ненулевые элементы, если имеются, то указать индексы всех ненулевъх элементов C++
C++ Прошу сказать, правильно ли я решил, и , если не правильно, то указать ошибки
Массив. Проверить имеются ли в нем элементы, значения которых больше нуля C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
23.01.2014, 02:24  [ТС]     Первый class Array. Проверить и указать на ошибки, если таковые имеются #21
Цитата Сообщение от MrGluck Посмотреть сообщение
Еще надо добавить
C++
1
#include <algorithm>
в Array.cpp
Сам не проверил, а у вас его не было.
Я его сам добавил.Первоначально он был.Я его пропустил когда переписывал.Спасибо вам огромное.Думаю следующий будет уже лучше.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
23.01.2014, 06:59     Первый class Array. Проверить и указать на ошибки, если таковые имеются #22
C++
1
2
3
4
5
6
// конструктор с параметрами
Array::Array(const size_t arraySize) :
    ptr(new double[arraySize]), size(arraySize)
{
    ptr = {0}; // обнуляем массив
}
MrGluck, штоа?
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
23.01.2014, 09:44  [ТС]     Первый class Array. Проверить и указать на ошибки, если таковые имеются #23
Цитата Сообщение от Tulosba Посмотреть сообщение
MrGluck, штоа?
Я это исправил.Такое работает только со статическим массивом.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
23.01.2014, 10:16     Первый class Array. Проверить и указать на ошибки, если таковые имеются #24
Цитата Сообщение от Genn55 Посмотреть сообщение
Такое работает только со статическим массивом.
Более того, только при определении массива.
Потому что например такой вариант не прокатит и со статическим:
C++
1
2
int a[42];
a = {0}; // ошибка
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.01.2014, 10:33     Первый class Array. Проверить и указать на ошибки, если таковые имеются
Еще ссылки по теме:

Разъясните код пжлст(выдает ошибку:cannot convert from 'class std::list<class c_bullet *,class std::allocator<class c_bullet *> >::iterator' to 'int') C++
Class Array. Прокоментируйте программу C++
Блок-схемы: проверить, указать ошибки C++

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

Или воспользуйтесь поиском по форуму:
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
23.01.2014, 10:33  [ТС]     Первый class Array. Проверить и указать на ошибки, если таковые имеются #25
Можно вопрос по коду? Можно в конструкторе копирования использовать такую конструкцию
C++
1
2
3
  for (size_t i = 0; i < size; i++)
        //ptr[i] = arrayToCopy.ptr[i]; // заполняем массив значениями массива arrayToCopy
        swap (this->ptr[i],arrayToCopy.ptr[i]);
и обязательно освобождать память вручную?Я читал,что после работы swap автоматически срабатывает деструктор.Спасибо.
Yandex
Объявления
23.01.2014, 10:33     Первый class Array. Проверить и указать на ошибки, если таковые имеются
Ответ Создать тему
Опции темы

Текущее время: 07:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru