Форум программистов, компьютерный форум 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}} подробнее

Показать сообщение отдельно
MrGluck
Модератор
Эксперт CЭксперт С++
7162 / 4328 / 631
Регистрация: 29.11.2010
Сообщений: 11,750
23.01.2014, 01:58     Первый class Array. Проверить и указать на ошибки, если таковые имеются
Что исправлено:
- улучшено форматирование кода
- исходник разделен по файлам, реализация вынесена от объявления
- исправлены некоторые неверные комментарии
- исправлены ошибки в копировании в конструкторе копий и операторе присваиваний
- убраны ненужные ссылки в параметрах методов
- добавлен квалификатор const к некоторым параметрам функций
- некоторые методы стали константными (добавлен const в конце)
- добавлен конструктор по умолчанию
- инициализация в конструкторе использует список инициализации конструктора
- добавлен недостающий заголовочный файл, ввод вывод объединен в iostream
- изменен порядок следования методов в заголовочном файле (поделено по категориям)
- изменен порядок следования в файле реализаций (соответствует порядку следования в заголовочном файле
- добавлен using namespace std; использовать - так использовать. Лишние std:: убраны
- Copi поменял на Copy - смотреть невозможно
- переписан оператор += (избавление от утечки памяти)

Вообщем то тут много чего еще меня не устраивает - например я методы всегда с маленькой буквы называю, избегаю транслит(Mass), считаю, что setArray должен принимать указатель на массив, а не требовать ввод с клавиатуры, функция сортировки должна называться просто sort(), мы же итак с массивом работаем, и прочее и прочее...
Смысл работы функции CopyMass я так и не понял, поэтому тело оставил как есть.

Почти все делал на автомате, все-таки целый день работал, а время уже немалое. Наверняка что-нибудь оставил концептуально неверное. Основная задача ставилась показать пример правильного (на мой взгляд, разумеется) форматирования кода. А уж вышло что вышло. Проект для CB 10.05 (в котором работает ТС) прикрепляю.

Array.h
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
//--------------------Заголовочный файл класса Array.------------------------------------------
#ifndef ARRAY_H
#define ARRAY_H
 
#include <cstddef>
#include <iostream>
 
 
class Array
{
    double *ptr; // указатель на массив
    size_t size; // размер массива
public:
    Array();                      // конструктор по умолчанию
    Array(const size_t new_size); // конструктор с параметрами
    Array(const Array &);         // конструктор копии
    ~Array();                     // деструктор
 
    // перегруженные операторы
    Array&  operator=  (const Array &);       // оператор присваивания
    bool    operator== (const Array &) const; // оператор сравнения
    double& operator[] (const size_t);        // взятие индекса
    Array&  operator+= (const double );       // оператор добавления элемента в конец массива
 
    // set методы
    void setArray(); // заполнение массива с клавиатуры
 
    // get методы
    size_t getSize() const; // возвратить количество элементов массива
 
    // поиск
    size_t Search(const double) const; // поиск по ключу
    int    IndMin(const double) const; // минимальный индекс
    int    IndMax(const double) const; // максимальный индекс
 
    // прочие методы
    void SortMass();             // сортировка
    void InvertMass();           // инверсия
    bool ReadFile(const char *); // заполняем из файла
    void PrintMass() const;      // вывод массива
    Array& CopyMas(const size_t, const size_t); // копируем и определяем размер нового массива
 
    // вспомогательные ф-ции
    double MaxElement(); // макс элемент
    double MinElement(); // мин элемент
 
    friend std::istream &operator>> (std::istream &, Array &);       // перегруженный оператор ввода
    friend std::ostream &operator<< (std::ostream &, const Array &); // перегруженный оператор вывода
};
 
#endif // ARRAY_H
Array.cpp
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
//----------- Файл реализации класса Array------------------
#include <cmath>
#include <cstdlib>
#include <cstddef>
#include <fstream>
#include <iomanip> // для манипулятора setw
#include <iostream>
#include "Array.h"
 
using namespace std;
 
 
Array::Array() :
    ptr(NULL), size()
{}
 
// конструктор с параметрами
Array::Array(const size_t arraySize) :
    ptr(new double[arraySize]), size(arraySize)
{
    ptr = {0}; // обнуляем массив
}
 
// конструктор копий
Array::Array(const Array &arrayToCopy) :
    ptr(new double[arrayToCopy.size]), size(arrayToCopy.size) // инициализатор размера массива
{
    for (size_t i=0; i < size; i++)
        ptr[i] = arrayToCopy.ptr[i]; // заполняем массив значениями массива arrayToCopy
}
 
Array::~Array() // деструктор класса Array
{
    delete[] ptr; // освободить память, удалив массив
}
 
 
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; // возвращаем указатель на сформированный объект (на самого себя)
}
 
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; // массивы равны
}
 
double& Array::operator[] (const size_t index)
{
    if (index >= size) // size_t всегда больше нуля
    {
        // тут надо бы исключение кинуть
        cout << " Ошибка индекса    " << index << endl;
        return ptr[index] = -1;
    }
    return ptr[index]; // возврат ссылки на элемент массива
}
 
Array& Array::operator+= (const double num) // оператор добавления элемента в конец массива
{
    size++;
    double *result_ptr = new double[size + 1];
 
    for (size_t i=0; i < size-1; i++)
        swap(this->ptr[i], result_ptr[i]); // скопировать массив
    result_ptr[size - 1] = num; // добавляем число в конец массива
 
    delete[] ptr;
    ptr = result_ptr;
 
    return *this; // возвращаем сформированный объект (себя)
}
 
 
void Array::setArray() // заполнение массива
{
    for (size_t i=0; i < size; i++)
        cin >> ptr[i]; // ввод элемента массива с клавиатуры
}
 
 
size_t Array::getSize() const // возвратить количество элементов массива
{
    return size;
}
 
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;
}
 
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;
}
 
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::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]);
}
 
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;
}
 
void Array::PrintMass() const // вывод массива
{
    for (size_t i=0; i < size; i++)
        cout << setw(10) << std::setiosflags(std::ios::left) << ptr[i]; // вывод элементов массива на экран
    cout << std::endl; // новая строка
}
 
Array& Array::CopyMas(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;
}
 
 
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;
}
 
 
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) // под каждое число выделяется 10 позиций
               << obj.ptr[i];
    }
    output << endl;
 
    return output; // возвращаем поток
}
main.cpp
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
//-------------Главная функция main----Работа с классом--------------------------------------------------
#include <cstdlib>
#include <iostream>
#include "Array.h"
using namespace std;
 
 
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.CopyMas(i, 0);
        cout<< "Размер массива: " << Ar.getSize() << "\n";
        Ar.SortMass();
        cout << "Сортированный массив: \n";
        cout << Ar; //вывод
    }
 
    else if (N == 0)
    {
        cout << "Начальный массив: \n";
        Ar2.ReadFile("D:\\моя колликция\\символьная переменная\\мой файл.txt"); // использовать абсолютные пути, а уж тем более с русскими символами это очень плохо
        Ar = Ar2; // присваиваем массиву Ar массив Ar2
        cout << Ar.CopyMas(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.CopyMas(max,min);
        cout << "Размер массива: " << Ar3.getSize() << "\n";
        cout << Ar3; //вывод
    }
    else
        cout << " Такого элемента нет в массиве!";
 
    return 0;
}
Вложения
Тип файла: rar Array.rar (99.9 Кб, 2 просмотров)
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru