Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > классы


Автор: Aleksandra24 18.4.2013, 22:26
Привет классным программистам!!
Помогите мне пожалуйста переделать программу в классы...
Пожалуйста написала программу на массив..не могу переделать ее так чтобы эта программа состояла из отдельных классов..
Мне в программе давался массив нужно найти и удалить 2 минимальных элемента.
Я все нашла, можете помочь мне ее разбить на классы, чтоб был класс для хранения памяти,класс на ввод массива, на вычисления минимальных элементов,класс на удаление минимальных элементов, класс на вывод данных.
Можете пожалуйста помочь и объяснить как правильно написать эту программу...
Ребят помогите пожалуйста буду очень благодарна!!!Спасибо )))  
Код
#include <iostream>
#include <conio.h>
using namespace std;

void FindMin(int*,int);

void FindMinTwo(int*,int);

int main()
{
    int n;
  cout<<"\n Vvedite razmer massiva: ";
  cin >> n;
    if(n<=0){
  cout<<"Error"<<"\n";
  system("pause");
    return n;}
    
    int* array = new int[n];
    
    cout<<"\nVvedite elementi massiva:";
    for(int i = 0 ;i < n; i++){
        cin >> array[i];
         }
        FindMin(array, n);
        FindMinTwo(array, n);

        cout<<"Array after changes:";
        cout<<"\n";
        for(int i = 0; i<n-2;i++)
        cout<<array[i]<<endl;
        cout<<"\n";
  system("pause");
  return 0;
 }
 void FindMin(int* array,int n)
    {
        int imin;
        int minel;
        minel = array[0];
        imin = 0;
        for( int i=0;i<n;i++)
        if (minel>array[i])
        {
        minel=array[i];
        imin = i;
        }
       
        for (int i = imin; i<n-1; i++) array[i]=array[i+1];
        n--;
        }

 void FindMinTwo(int* array,int n)
    {
        int imin;
        int minel;
        minel = array[0];
        imin = 0;
        for( int i=0;i<n;i++)
        if (minel>array[i])
        {minel=array[i];
        imin = i;
        }
    
        for (int i = imin; i<n-1; i++) array[i]=array[i+1];
        n--;
        }


Модератор: не забываем пользоваться кнопочкой "Код"

Автор: kolesnle 21.4.2013, 08:28
Код

#include "stdafx.h"
#include <iostream>

class overflow{};

template <typename T>
  void qSort(T* A, size_t low, size_t high) 
  {
      int i = low;                
      int j = high;
      T x = A[(low+high)/2];  // x - опорный элемент посредине между low и high
      do {
          while(A[i] < x) ++i;  // поиск элемента для переноса в старшую часть
          while(A[j] > x) --j;  // поиск элемента для переноса в младшую часть
          if(i <= j){           
              // обмен элементов местами:
              T temp = A[i];
              A[i] = A[j];
              A[j] = temp;
              // переход к следующим элементам:
              i++; 
              j--;
          }
      } while(i < j);
      if(low < j) qSort<T>(A, low, j);
      if(i < high) qSort<T>(A, i, high);
  }



template <typename T> 
class Vector
{
public:
    Vector(size_t _size=0)
    {
        this->arry = new T[_size];
        this->size = _size-1;
    }
        Vector(Vecror<T>& cpy)
        {
        delete this->arry;    
        this->arry = new T[cpy.getSize()-1];
        for (int i = 0; i< cpy.getSize(); i++)
            arry[i] = cpy[i];
        this->size = cpy.getSize()-1;    
        }
    T& operator [](size_t n)
    {
        if (n > (this->size))
            throw overflow();
        return this->arry[n];
    }
    size_t getSize()
    {
        return this->size+1;
    }
    void operator =(Vector<T>& cpy)
    {
        delete this->arry;    
        this->arry = new T[cpy.getSize()-1];
        for (int i = 0; i< cpy.getSize(); i++)
            arry[i] = cpy[i];
        this->size = cpy.getSize()-1;    
    }

    T& at(size_t n)
    {
        return arry[n];
    }
    void push_back(T addel)
    {
        T* arrcopy = new T[this->size];
        for (int i = 0; i<this->size; i++)
            arrcopy[i] = this->arry[i];
        delete[] this->arry;
        arry = new T[this->size+1];
        for (int i = 0; i<(this->size); i++)
            this->arry[i] = arrcopy[i];
        delete arrcopy;
        ++size;
    }
    void pop(size_t n)
    {
        std::cerr << this->size;
        T* arrnew = new T[this->size-1]; //first alloc

        
        for (int i = 0; i<(this->size); i++){
            if (i==n) 
                i++;
            arrnew[i] = arry[i];
        }
        delete arry;
        arry = new T[this->size-1]; //second alloc
        for (int i = 0; i<(this->size); i++){
            arry[i] = arrnew[i];
        }
    }
    size_t find (T el)
    {
        size_t pos=0;
        while (arry[pos] != el)
            pos++;
        return pos;
    }
    void pop_back()
    {
        T* arrnew = new T[this->size-1];
        for (int i = 0; i<(this->size-1); i++)
            arrnew[i] = this->arry[i];
        delete[] arry;
        this->arry = new T[this->size]
        for (int i = 0; i<(size-1); i++)
            arry[i] = arrnew[i];
        --i;
    }
    void sort()
    {
        qSort<T>(arry, 0, this->size);
    }
    ~Vector()
    {
        delete[] arry;
    }
private:
    T* arry;
    size_t size;
};


На сколько я понял, тебе надо именно это. Иначе из тебя вырастит явист.  smile 
Цитата(Aleksandra24 @  18.4.2013,  22:26 Найти цитируемый пост)
Я все нашла, можете помочь мне ее разбить на классы, чтоб был класс для хранения памяти,класс на ввод массива, на вычисления минимальных элементов,класс на удаление минимальных элементов, класс на вывод данных.

Не возможно это! Класс на ввод массива - это вектор(я тебе его написал), в нем есть функция сортировки (функция быстрой сортировки объявлена вне класса, но в классе есть обертка над ней, если хочешь перемести ее, как статическую функцию в класс). Так вот вводишь вектор, копируешь, сортируешь копию, минимальные элементы будут 2 с конца ищешь их в исходном и удаляешь их в исходном. РАБОТА ЗАКОНЧЕНА!

Автор: kolesnle 21.4.2013, 18:32
А вообще STL рулез
Код

#include <iostream>
#include <list>
#include <vector>
#include <locale.h>
#include <iterator>

 int main()
 {
     setlocale(LC_ALL, "rus");
     std::list<int> list;
     size_t n;
     std::cout << "Размер списка: "; 
     std::cin >> n;
     std::cout << "Введите элементы списка:"<<std::endl;
     for (int i=0;i<n; i++){
         int tmp;
         std:: cout << i << ": ";
         std::cin >> tmp;
         list.push_back(tmp);
     }
     --n;
     std::list<int> listcpy = list;
     listcpy.sort();
     std::list<int>::iterator min_it[1];
     min_it[0] = listcpy.end();
     min_it[1] = listcpy.begin();
     std::advance(min_it[1], (n-1) );
     //int min[] = {*min_it[0], *min_it[1]};
     list.remove(*min_it[0]);
     list.remove(*min_it[1]);
     for (auto it = list.begin(); it != list.end(); it++){
         std::cout << " " << *it;
     }
     system("pause");
    return 0;
 }

Автор: NoviceF 30.4.2013, 11:08
случайно наткнулся на эту тему

Код

std::list<int>::iterator min_it[1];
min_it[1] = listcpy.begin();


выход за пределы массива.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)