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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Вычисление по формуле http://www.cyberforum.ru/cpp-beginners/thread1075903.html
Дано: x=5; dx=1. Z вычислять по формуле: z= y + \sqrt{y} + \sqrt{y} , где y={e}^{0,2x}. Считать Z до тех пор, пока y < 25. Определить k - количество вычисленных Z. Вывести на экран x, y, Z, k. p/s вычислять по формуле: z= y + \sqrt{y} + \sqrt{y}
C++ Определить количество положительных, отрицательных и нулевых элементов матрицы A(10,15). (Создать три функции для нахождения этих значений) Определить количество положительных, отрицательных и нулевых элементов матрицы A(10,15). (Создать три функции для нахождения этих значений). http://www.cyberforum.ru/cpp-beginners/thread1075899.html
Дан одномерный массив, состоящий из N целочисленных элементов C++
10. Дан одномерный массив, состоящий из N целочисленных элементов. 10.1. Найти максимальный отрицательный элемент. 10.2. Вычислить произведение отрицательных элементов массива.
В бинарном файле поменять местами элементы, что стоят на парных местах с элементами, что стоят на непарных местах C++
Помогите пожалуйста написать код. В бинарном файле поменять местами элементы, что стоят на парных местах с элементами, что стоят на непарных местах. Каждому комментарию - благодарность!
C++ Есть структура, работает, но странно сравнивает( http://www.cyberforum.ru/cpp-beginners/thread1075881.html
Написал программу, но когда она сравнивает номер маршрута с номером введенным с клавиатуры, она всегда пишет Error! , когда сравниваю по порядку то все работает(1=1,2=2,3=3) а если введу 5 то ошибка, хотя в структуре есть эта запись(((( #include "stdafx.h" #include <iostream> #include <fstream> using namespace std; struct marsh
C++ Вычислить значение произведения \prod_{n=1}^{11} \frac{n^3+3n+2.8}{\sqrt{n^2+7n+91}} подробнее

Показать сообщение отдельно
Genn55
358 / 205 / 38
Регистрация: 26.12.2012
Сообщений: 688
22.01.2014, 21:48  [ТС]     Первый class Array. Проверить и указать на ошибки, если таковые имеются
А переписал функции и конструктор копирования правильно?

Добавлено через 19 часов 36 минут
Доброго всем времени суток!
Переписал.Пожалуйста посмотрите получилось ли?Какие еще косяки или неточности?



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
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
//--------------------Заголовочный файл h----------array.h класса Array.------------------------------------------
#ifndef ARRAY_H
#define ARRAY_H
 
#include <istream>
#include <ostream>
using std::istream;
using std::ostream;
 
class Array
{
    friend istream &operator>> (istream &, Array &); // перегруженный оператор ввода
    friend ostream &operator<< (ostream &, const Array &); // перегруженный оператор вывода
private:
    double *ptr; // указатель на массив
    size_t size; // размер массива
public:
    Array(){}; // конструктор по умолчанию
    Array(const size_t new_size ); // конструктор с параметрами
    Array( const Array & ); // конструктор копии
    ~Array(); // деструктор
     //set методы
    void setArray(); // заполнение массива с клавиатуры
    bool ReadFile(const char *);//заполняем из файла
     //get методы
    size_t getSize() const; // возвратить количество элементов массива
    void PrintMass(); // вывод массива
    //перегруженные операторы
    bool operator== (const Array &) 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;// поиск по ключу
    int IndMin (const double &)const;//минимальный индекс
    int IndMax (const double &)const;//максимальный индекс
    void SortMass ();// сортировка
    void InvertMass();//инверсия
    //вспомогательные ф-ции
    double MaxElement ();//макс элемент
    double MinElement ();//мин элемент
 
 
};
#endif // ARRAY_H
 
//-----------Исполняемый файл cpp---------------array.cpp класса Array------------------
#include "array.h"
 
#include <fstream>
#include <iostream>
using std::cout; // пространство имен  для cout
using std::cin; // пространство имен  для cin
using std::swap;// пространство имен  для swap
using std::ifstream;// пространство имен  для ifstream
 
#include <iomanip> // для манипулятора setw
using std::setw;   // пространство имен для setw
 
#include <cmath>
#include <cstdlib>
#include<cstddef>
 
Array::Array(size_t arraySize) // конструктор с параметрами
{
    size = arraySize;
    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++)
    swap (this->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)<<std::setiosflags(std::ios::left) // под каждое число выделяется 10 позиций
               << obj.ptr[i];
    }
 
    output << std::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;             //     из файла
          }
  return true;
}
int Array::IndMin(const double &key)const//ищем минимальный индекс
{
 int min = -1;
    for (size_t i = 0; i < size; i++)
     {
        //пока оставляю magic number
        if (key > (ptr[0]- 0.021))//будет указатель на функцию
             {
                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;
}
int Array::IndMax (const double  &key)const//максимальный индекс
{
 int max = -1;
 
    for (size_t i = 0; i < size; i++)
      {
        if (key < (ptr[i]+ 0.021))//пока оставляю magic number
         {
           if (fabs(ptr[i]-key)<= fabs(ptr[i+1]-key))//поиск по условию
           //пока оставляю magic number
               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)<< std::setiosflags(std::ios::left)<< ptr[i]; // вывод элементов массива на экран
 
    cout << std::endl; // новая строка
}
size_t Array::getSize() const // возвратить количество элементов массива
{
    return size;
}
 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++)
             swap (this->ptr[i],mass.ptr[i]);// скопировать массив
    }
 
    return *this; // множественное присваивание
}
 
double &Array::operator[] (size_t index)
{
    if(index < 0 || index >= size)
    {
        cout<< " Ошибка индекса    " << index << std::endl;
        return ptr [index] = -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)//копируем и определяем размер нового массива
{
 double *temp_ptr = ptr ;//Храним указатель на старую память (не создавая нового объекта и не копируя в него всё старое содержимое)
 
         size = max-min; // переопределяем размер
         ptr = new double [size];
 
 size_t len = 0;
 
    for (size_t i = min; i < max; i++ )//читаем в ptr
         swap (this->ptr[len++],temp_ptr[i]);// скопировать массив
     //должен сработать деструктор
     return *this;
   }
 Array &Array::operator+= (const double &num) // оператор добавления элемента в конец массива
{
 double *result_ptr = ptr ;
 
       size = size + 1; // увеличиваем размер массива на 1
       ptr = new double [size]; // выделяем память
 
    for (size_t i = 0; i < (size - 1); i++)
         swap (this->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 (this->ptr[i],this-> ptr[j]);
           }
    }
}
void Array::InvertMass()
{
    for(size_t i = 0; i < size / 2; i++)//делим пополам
        swap (this->ptr[i],this->ptr[size - i - 1]);
}
 
//-------------Главная функция main----Работа с классом--------------------------------------------------
 
#include <iostream>
using namespace std;
#include "array.h"
int main()
{
system("chcp 1251 > nul");
 
 double d;
 int N =0,i = 0;
 
 Array Ar1(i); // создаем объект класса Ar1, используя конструктор аргументированный
 Array Ar(Ar1);  // создаем объект класса Ar, используя конструктор копирования
 Array Ar2(28);    // создаем объект класса 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.getSize() << "\n";
       Ar.SortMass ();
       cout << "Сортированный массив: \n";
       cout << Ar; //вывод
  }
 if (N == 0)
  {
    cout << "Начальный массив: \n";
    Ar2.ReadFile("D:\\моя колликция\\символьная переменная\\мой файл.txt");
    Ar = Ar2; // присваиваем массиву Ar массив Ar2
    cout << Ar.CopiMas(Ar.getSize(),0)<< "Размер массива: " << Ar.getSize() << "\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; //вывод
    if (Ar[Ar.getSize() -2]!= -1)
        cout << "Элемент массива = " << Ar[Ar.getSize() -2] << "\n";//поиск элемента по индексу
 
        cout << "Инвертированный массив: \n";
    Ar.InvertMass ();//инверсия массива
    cout << Ar; //вывод
 
 int min = Ar.IndMin (d);
 int max = Ar.IndMax (d);
  if ((min != -1)&&(max != -1))
    {
            cout << "Минимальный индекс=   "<<min<<" Максимальный индекс=    "<<max<<"\n";
            Array Ar3(Ar); // 5-ти элементный объект класса Array
             cout << "Полученный массив: \n";
            Ar3.CopiMas(max,min);
            cout << "Размер массива: " << Ar3.getSize() << "\n";
             cout << Ar3; //вывод
    }else
    cout<<" Такого элемента нет в массиве!";
 
 
    return 0;
}
Перегрузку операторов >> и << пока решил оставить.В следующем классе буду пробовать делать по другому.
 
Текущее время: 09:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru