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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Genn55
367 / 214 / 41
Регистрация: 26.12.2012
Сообщений: 708
#1

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

19.01.2014, 21:42. Просмотров 990. Ответов 24
Метки нет (Все метки)

Доброго всем времени суток!Осмелюсь показать свой первый 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;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.01.2014, 21:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Первый class Array. Проверить и указать на ошибки, если таковые имеются (C++):

Присвоить значения переменных в массив Array (class Array в Turbo C++) - C++
Здравствуйте!!! Изучаю help в Turbo C++ 3.1 дошел до класса Array: main() { //при подключение соответствующих библиотек и...

Можете проверить и указать на ошибки? - C++
Создать файл, состоящий из n целых чисел. Вывести на экран все отрицательные числа данного файла. #include &lt;iostream&gt; #include...

Блок-схемы: проверить, указать ошибки - C++
Снизу два задания, для которых нужно нарисовать блок схемы, я нарисовал, просто хочу чтобы вы проверили и указали на ошибки, если они есть....

Прошу сказать, правильно ли я решил, и , если не правильно, то указать ошибки - C++
Есть задачка \sum_{i=0}^{8}\sum_{j=0}^{10}\sum_{k=0}^{3}\left(\frac{i+3k-4j}{2+3i+4j} \right) и есть мой код (сразу говорю, я...

Class Array. Прокоментируйте программу - C++
#include &lt;iostream.h&gt; #include &lt;stdlib.h&gt; class Array{ int n; int *p; static int count; public: void show(); Array...

Объяснить причины ошибки "Extra qualification 'CLASS CONSTRUCTOR' and 'CLASS' has incomplete type" - C++
Согласно синтаксису, вроде все правильно, но ошибка... что не так? Ошибки компилятора ниже на рисунке... #include &lt;iostream&gt; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
19.01.2014, 22:05 #2
Из того, что бросилось в глаза:
1. using namespace std;
2. отсутствие в объявлении класса имен аргументов (только типы)
3. магические константы (size = 28)
4. странная проверка в 58 строке, учитывая, что тип беззнаковый
5. setArray можно реализовать через operator>>
6. строка 108. закрывать вручную не обязательно
7. в IndMin/IndMax выход за границы массива и снова магические константы
8. почему оператор= возвращает const ref&?
9. почему в Sort - swap, а в InvertMass нет?
1
Croessmah
Эксперт CЭксперт С++
13228 / 7500 / 845
Регистрация: 27.09.2012
Сообщений: 18,419
Записей в блоге: 3
Завершенные тесты: 1
19.01.2014, 22:23 #3
C++
1
2
Array temp(size);
temp = *this; // сохраняем текущий массив во временный объект
Зачем тут лишнее копирование? Не лучше ли просто сохранить указатель пока он нужен?
1
MrGluck
Модератор
Эксперт CЭксперт С++
7239 / 4407 / 642
Регистрация: 29.11.2010
Сообщений: 11,929
19.01.2014, 22:43 #4
Цитата Сообщение от Tulosba Посмотреть сообщение
6. строка 108. закрывать вручную не обязательно
а если захотим записать в тот же файл и еще раз считать? RAII разве не в конце работы программы файл закроет?

Советую использовать список инициализации в конструкторе.
Советовал бы также посмотреть в сторону идиомы copy-and-swap
В 189 строке неверно было бы завершить работу программы, уж лучше кинуть исключение std::out_of_range.

PrintSize я бы назвал getSize(). Потому как get - это не всегда print.

size_t определен в <cstddef>
А вообще, много букаф, нету разделения на определение и реализацию и форматирование не самое лучшее. (Критиковать так критиковать )

Добавлено через 1 минуту
перегрузку операторов для работы с потоками можно и не делать friend-функциями, достаточно апперировать get-set методами.

Добавлено через 28 секунд
Конечно после вылизывания всего и вся, необходимо класс сделать шаблонным.
1
Croessmah
Эксперт CЭксперт С++
13228 / 7500 / 845
Регистрация: 27.09.2012
Сообщений: 18,419
Записей в блоге: 3
Завершенные тесты: 1
19.01.2014, 22:45 #5
Цитата Сообщение от MrGluck Посмотреть сообщение
RAII разве не в конце работы программы файл закроет?
в деструкторе объекта in, то бишь при выходе из функции
2
MrGluck
Модератор
Эксперт CЭксперт С++
7239 / 4407 / 642
Регистрация: 29.11.2010
Сообщений: 11,929
19.01.2014, 22:55 #6

Не по теме:

Croessmah, привык передавать ссылку на fstream в функцию



В 203 строке CopiMas. Думаю, сами поймете, что это неверно
1
Genn55
367 / 214 / 41
Регистрация: 26.12.2012
Сообщений: 708
19.01.2014, 23:11  [ТС] #7
Цитата Сообщение от Tulosba Посмотреть сообщение
Из того, что бросилось в глаза:
1. using namespace std;
2. отсутствие в объявлении класса имен аргументов (только типы)
3. магические константы (size = 28)
4. странная проверка в 58 строке, учитывая, что тип беззнаковый
5. setArray можно реализовать через operator>>
6. строка 108. закрывать вручную не обязательно
7. в IndMin/IndMax выход за границы массива и снова магические константы
8. почему оператор= возвращает const ref&?
9. почему в Sort - swap, а в InvertMass нет?
3. магические константы (size = 28) это размер по умолчанию в программе планируется его менять в настройках с сохранением в отдельном файле то же самое и с другими чисто упрощения.
4. странная проверка в 58 строке, учитывая, что тип беззнаковый.
это не проверка ,а переприсвоение для ввода вручную без определения начального размера.
5. setArray можно реализовать через operator>> . Попробую
1. using namespace std;
2. отсутствие в объявлении класса имен аргументов (только типы)
7. в IndMin/IndMax выход за границы массива и снова магические константы.Сейчас буду проверять.
6. строка 108. закрывать вручную не обязательно.
В нем могут быть пользовательские изменения которые нужно сохранить
9. почему в Sort - swap, а в InvertMass нет? Исправил.
8. почему оператор= возвращает const ref&? и
1. using namespace std;
2. отсутствие в объявлении класса имен аргументов (только типы).Если можно по подробнее.Пишут везде по разному.

Добавлено через 4 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
2
Array temp(size);
temp = *this; // сохраняем текущий массив во временный объект
Зачем тут лишнее копирование? Не лучше ли просто сохранить указатель пока он нужен?
Извините с ходу не понял. Если можно подробнее
0
Croessmah
Эксперт CЭксперт С++
13228 / 7500 / 845
Регистрация: 27.09.2012
Сообщений: 18,419
Записей в блоге: 3
Завершенные тесты: 1
19.01.2014, 23:19 #8
Цитата Сообщение от Genn55 Посмотреть сообщение
это размер по умолчанию
ну так и надо было сделать что-то вроде defaultSize, а не просто 28 писать
Цитата Сообщение от Genn55 Посмотреть сообщение
это не проверка ,а переприсвоение для ввода вручную без определения начального размера.
size = (arraySize > 0 ? arraySize : 0);
false может тут быть только если arraySize == 0, и тогда получится size = 0
так зачем еще условие, если можно просто
size=arraySize?
ибо условие смысла не имеет.
Цитата Сообщение от Genn55 Посмотреть сообщение
В нем могут быть пользовательские изменения которые нужно сохранить
файл закроется при вызове деструктора, а он будет вызван при выходе из функции, то есть почти сразу после Вашего закрытия, поэтому эту строчку можно убрать.

Добавлено через 4 минуты
Цитата Сообщение от Genn55 Посмотреть сообщение
Извините с ходу не понял. Если можно подробнее
что-то вроде этого:
C++
1
2
3
4
5
6
7
8
9
10
11
12
 Array &Array::CopiMas (const size_t &max,const size_t &min)//копируем и определяем размер нового массива
{
     double * temp_ptr = 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_ptr[i]!=0) ptr[len++]= temp_ptr[i];}//переприсваиваем из temp в ptr
     delete [] temp_ptr ;//Старая память более не нужна
     return *this;
   }
1
Genn55
367 / 214 / 41
Регистрация: 26.12.2012
Сообщений: 708
19.01.2014, 23:21  [ТС] #9
Цитата Сообщение от MrGluck Посмотреть сообщение
Советую использовать список инициализации в конструкторе.
Постарался,но наверное плохо.Если можно подскажите.
Цитата Сообщение от MrGluck Посмотреть сообщение
size_t определен в <cstddef> .
Но у меня работает в Code::Block
Цитата Сообщение от MrGluck Посмотреть сообщение
Конечно после вылизывания всего и вся, необходимо класс сделать шаблонным.
Это как.В Code::Block попытался создать файл h потерпел не удачу.Не знаю как делать и не нахожу инструкций на русском,а с английским туго.
0
Croessmah
Эксперт CЭксперт С++
13228 / 7500 / 845
Регистрация: 27.09.2012
Сообщений: 18,419
Записей в блоге: 3
Завершенные тесты: 1
19.01.2014, 23:23 #10
Цитата Сообщение от Genn55 Посмотреть сообщение
Но у меня работает в Code::Block
ну попробуйте создать новый проект и вписать только этот код:
C++
1
2
3
int main () {
    size_t i ;
}
0
MrGluck
Модератор
Эксперт CЭксперт С++
7239 / 4407 / 642
Регистрация: 29.11.2010
Сообщений: 11,929
19.01.2014, 23:32 #11
Цитата Сообщение от Genn55 Посмотреть сообщение
Но у меня работает в Code::Block
Писать надо не под компилятор (кстати IDE - среда разработки, часто поставляется с компилятором mingw) а под стандарт. А стандарт не гарантирует, что без использования cstddef(stddef.h) вы сможете получить объявление данного типа.
Цитата Сообщение от Genn55 Посмотреть сообщение
Это как.В Code::Block попытался создать файл h потерпел не удачу.
шаблонный класс != разделение объявления и реализации.
Прочитайте и про то и про другое у Дейтелов, "как программировать на C++", там весьма подробно данный момент расписан.
1
Genn55
367 / 214 / 41
Регистрация: 26.12.2012
Сообщений: 708
19.01.2014, 23:53  [ТС] #12
Цитата Сообщение от Croessmah Посмотреть сообщение
ну попробуйте создать новый проект и вписать только этот код:
C++
1
2
3
int main () {
    size_t i ;
}
Попробовал.Выдает одинаковый варнинг i не является функцией.

Добавлено через 6 минут
Цитата Сообщение от MrGluck Посмотреть сообщение
шаблонный класс != разделение объявления и реализации.
Прочитайте и про то и про другое у Дейтелов, "как программировать на C++", там весьма подробно данный момент расписан.
Да спасибо конечно я с благодарностью пользуюсь вашими советами.Действительно,что работает у меня может не работать у других.
шаблонный класс != разделение объявления и реализации.С этим еще предстоит разбираться.Более простое получается с трудом!

Добавлено через 9 минут
Всем огромное спасибо.Размышлять есть над чем.Пока постараюсь все переварить.Еще раз огромное спасибо и надеюсь на вашу помощь.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7239 / 4407 / 642
Регистрация: 29.11.2010
Сообщений: 11,929
19.01.2014, 23:59 #13
мануальчик по созданию проекта в CodeBlocks с картинками
1
Genn55
367 / 214 / 41
Регистрация: 26.12.2012
Сообщений: 708
22.01.2014, 01:38  [ТС] #14
Вот что у меня получилось
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
#include <ctime>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <fstream>
#include <cmath>
#include <iomanip>
#include <cstring>
#include<cstddef>
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(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 ();//мин элемент
 
 
};
 
 
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++)
        //ptr[i] = arrayToCopy.ptr[i]; // заполняем массив значениями массива arrayToCopy
        swap (this->ptr[i],arrayToCopy.ptr[i]);
}
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;
}
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)<< setiosflags(ios::left)<< ptr[i]; // вывод элементов массива на экран
 
    cout << 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++)
            //ptr[i] = mass.ptr[i]; // скопировать массив
            swap (this->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)//копируем и определяем размер нового массива
{
     double *temp_ptr = ptr ;//Храним указатель на старую память (не создавая нового объекта и не копируя в него всё старое содержимое)
     size = max-min; // переопределяем размер
     ptr = new double [size];
 size_t len = 0;
    for (size_t i = min; i < max; i++ )//читаем в ptr
    //for ( i = min; i < max; i++ )//переносим в temp
     //if (temp_ptr[i]!=0) ptr[len++]= temp_ptr[i];//переприсваиваем из temp в ptr
     swap (this->ptr[len++],temp_ptr[i]);//должен сработать деструктор
     //delete [] temp_ptr ;//Старая память более не нужна
     return *this;
   }
 Array &Array::operator+= (const double &num) // оператор добавления элемента в конец массива
{
    //Array result(size);
    //result = *this; // временно сохраним текущий массив
    //delete [] ptr; // освобождаем память
    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[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]);
}
 
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; //вывод
    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;
}
0
MrGluck
Модератор
Эксперт CЭксперт С++
7239 / 4407 / 642
Регистрация: 29.11.2010
Сообщений: 11,929
22.01.2014, 02:03 #15
Еще раз повторюсь - разделите объявление и реализацию, подтяните форматирование кода.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.01.2014, 02:03
Привет! Вот еще темы с ответами:

Проверьте правильность кода сетевого приложения и исправьте ошибки, если таковые имеются - C#
Доброго времени. В общем начал программировать на C# ровно 2 часа назад :) . Уровень моих знаний естественно равен нулю. Но тем не...

Удалить из списка L все элементы Е, если таковые имеются - Turbo Pascal
Всем добрый день, пожалуйста, помогите с задачей, вообще не понятно: Дан список L, состоящий из записей: первое поле – вещественное...

Найти сокращенную, минимальную, тупиковую, КН форму F, если таковые имеются - Логика и множества
Найдите КНФ F. Явл ли F тавтологией? Найдите сокращенную, минимальную, тупиковую, КН форму F, если таковые имеются. \left(...

найти точки пересечения (если таковые имеются) параболы(парабола любая) - Pascal
найти точки пересечения (если таковые имеются) параболы(парабола любая) с осями координат, вывести координаты точек.


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
22.01.2014, 02:03
Ответ Создать тему
Опции темы

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