Разработать шаблонный класс Array

Модераторы: Romeo, Hawk, Absurd, WinMain, DeeJayC

Ответить
TheSerega
Сообщения: 2
Зарегистрирован: 27 дек 2017, 09:01

27 дек 2017, 09:02

1. Разработать шаблонный класс Array для работы с массивами. Реализовать методы ввода и вывода, а также:
1.1. Сортировки массива методом пузырьков. Метод поиска массива элемента с заданным значением. Переустановку элементов массива, чтобы они шли обратном порядке. CodeBlock C++
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

27 дек 2017, 09:06

Готов помочь. Что именно не получается?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
TheSerega
Сообщения: 2
Зарегистрирован: 27 дек 2017, 09:01

27 дек 2017, 09:10

Написал шаблон верно? а дальше вот не пойму никак...
1.1. Сортировки массива методом пузырьков. Метод поиска массива элемента с заданным значением. Переустановку элементов массива, чтобы они шли обратном порядке.

Код: Выделить всё

#include <iostream>

template<typename T, size_t N>
class Array
{
public:
    constexpr size_t size() const{
        return N;
    }
    T& operator[](size_t index){
        return mArray[index];
    }
    const T& operator[](size_t index) const{
        return mArray[index];
    }
    T* begin() {
        return mArray;
    }
    const T* begin() const{
        return mArray;
    }
        T* end() {
            return mArray+N;
        }
    const T* end() const{
        return mArray+N;
    }
private:
    T mArray[N];
};



int main()
{
    Array<int, 3> arr;
    for(size_t i = 0; i<arr.size(); ++i){
        arr[i] = i*10;
    }
    for(auto e: arr){
        std::cout << e << std::endl;
    }
}
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

27 дек 2017, 10:45

А гуглить не пробовал? Вики великолепно демонстрирует этот метод сортировки.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Слива
Сообщения: 133
Зарегистрирован: 19 мар 2016, 10:15

27 дек 2017, 17:04

TheSergei, все это можете вообще убрать из тела шаблона класса - это все вода. Сконцентрируйтесь на сути проблемы. Вот эта фраза означает:
"1.1. Сортировки массива методом пузырьков. Метод поиска массива элемента с заданным значением. Переустановку элементов массива, чтобы они шли обратном порядке."
- что поиск элемента массива с заданным значением - это самое легкое и его нужно делать первым. Проходитесь циклом for() по всем элементам массива и выдавайте номер и сам элемент при нахождении и выдавайте сообщение в консоль или MessageBox() при не нахождении его. - Это было первое. Теперь второе. Идем по возрастанию сложности.
2) Перестановка значений элементов в обратно порядке. Можно написать самому, а можно использовать готовую фнкцию reverse(). Это все есть в Интернете и Киберфоруме;
3) Сортирока массива Методом Пузырька - самая легкая сортировка, легко реализуется и легко понимается. Все это есть также в Интернете и на Киберфоруме. Я рекомендую ознакомиться с этой сортировкой сначала в теории. Можно даже отдельную программу написать, а потом ее впендюрить в эту свою программу.
Слива
Сообщения: 133
Зарегистрирован: 19 мар 2016, 10:15

27 дек 2017, 17:59

Вот написал код для переворачивания массива, но еще раз повторюсь: в С++ должна быть готовая функция reverse(), но посмотрите код на всякий случай. :D

Код: Выделить всё

//---------------------------------------------------------------------------
#include <vcl>
#include <iostream>
#include <conio>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
using namespace std;

const int N = 35;
int Massiv[N] = {0};

int Reverse()
{
    int h, c = N, temp;

    if(!(N%2)) c--;
    c /= 2;
    for(h = 0; h < c; h++)
    {
        temp = Massiv[N-1-h];
        Massiv[N-1-h] = Massiv[h];
        Massiv[h] = temp;
    }
    return 0;  //NO ERRORS
}

int main(int argc, char* argv[])
{
int f;
for(f = 0; f < N; f++)
    Massiv[f] = f;

Reverse();
for(f = 0; f < N; f++)
    cout << Massiv[f] << " ";

getch();
return 0;
}
//---------------------------------------------------------------------------
Написано на C++Builder 6 - как всегда. Удачи вам всем, пацаны. :D
Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

27 дек 2017, 20:49

Слива писал(а):Вот написал код для переворачивания массива, но еще раз повторюсь: в С++ должна быть готовая функция reverse(), но посмотрите код на всякий случай. :D

С переворачиванием тут уже проскакивала тема год назад или что-то типа того. Проще сделать массив -N..N и менять знак у переменной.

Код: Выделить всё

#include <cassert>
#include <iostream>
#include <algorithm>

template <typename T, int LoBound, int HiBound> class Array {
  T arr_[HiBound - LoBound + 1];
public:
  Array()
  {
    std::fill(arr_, arr_ + sizeof(arr_) / sizeof(arr_[0]), T{});
  }
  Array(const Array& other)
    :arr_(other.arr_)
  {}
  Array(std::initializer_list<T> initList)
  {
    std::copy(initList.begin(), initList.end(), arr_);
  }
  T& operator[](int ix)
  {
    assert(ix >= LoBound && ix <= HiBound);
    return arr_[ix - LoBound];
  }
  const T& operator[](int ix) const
  {
    assert(ix >= LoBound && ix <= HiBound);
    return arr_[ix - LoBound];
  }
};

int main()
{
  enum {LoBound = -2, HiBound = 2};
  using A1D = Array<int, LoBound, HiBound>;
  Array<A1D, LoBound, HiBound> arr =
   { A1D{ 1,  2,  3,  4,  5},
     A1D{ 6,  7,  8,  9, 10},
    A1D{11, 12, 13, 14, 15},
    A1D{16, 17, 18, 19, 20},
    A1D{21, 22, 23, 24, 25} };
  for (int i = LoBound; i <= HiBound; ++i) {
    for (int j = LoBound; j <= HiBound; ++j) {
      std::cout << arr[-i][-j] << " ";
    }
    std::cout << "\n";
  }
  return 0;
}
Слива писал(а):Написано на C++Builder 6 - как всегда.
Зачем такое говно мамонта? Вижуал студию 2017 можно скачать нахаляву, там можно в x64 компилировать и новый стандарт языка поддерживается.
2B OR NOT(2B) = FF
Слива
Сообщения: 133
Зарегистрирован: 19 мар 2016, 10:15

28 дек 2017, 08:34

Какой форум - такая и среда. :D
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

28 дек 2017, 10:31

А форум тут при чём? Даже если он весь такой-растакой, никто тебя не заставляет собираться билдером.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

28 дек 2017, 14:49

Слива писал(а):Какой форум - такая и среда. :D

Ну, это же не обмен колкостями, а разумное замечание. Если есть выбор из очень хороших интрументов - CLang 5.0, GNU C++ 7.2. Все бесплатно. Для личных целей можно также Visual Studio или Intel C++ скачать тоже бесплатно. Нет, давайте пользоваться пиратской копией мертвого продукта от фирмы которой больше нет. Неудивительно что кроме жуликов работу не предлагает.
2B OR NOT(2B) = FF
Ответить