Возникли проблемы с применением сортировки к этой программе - PullRequest
0 голосов
/ 03 июня 2019

Целью программы является создание многомерного массива переменного размера, количество столбцов которого равно количеству политических партий, количество строк, являющихся «круглым», в котором мы находимся, и записи первогострока - это число голосов, которое получила каждая политическая партия, затем, когда вы попадаете во второй ряд, во втором раунде, вы делите все значения в первом ряду на 2, в третьем раунде вы делите значения в первом ряду на 3, иТо же самое относится и к тому, сколько строк у этой вещи.Я сделал все это, но после того, как эти операции закончились, я хочу найти N самых больших элементов, n - количество строк, и поместить эти элементы в вектор, по какой-то причине я не могу найти, когда я запускаю его, на консоли ничего не отображается, когда я добираюсь до части, где я хочу, чтобы он отсортировал элементы, он отключался, а затем зависал.

Я пытался что-то изменить,Я не думаю, что проблема в самом алгоритме, так как я попробовал его с помощью статических массивов, которые я заполнил случайным образом, и он разобрался с ними просто отлично.Как я уже сказал, я не знаю, где проблема, поэтому я покажу большую часть, я вырезал все, что не имеет отношения к делу.

 double** ELEITORAL;
 void bubble_sort(double** ELEITORAL)
    {
        int x, y;
        double tItem;
        int PassCount;
        bool Mudou;
for (PassCount = 0; PassCount < (MAX_rows * MAX_columns); PassCount++)       
{
        //orders the rows
        for (y = 0; y < MAX_columns; y++)
         {
            Mudou = true;
            while (Mudou)
            {
            Mudou = false;
        for (x = 1; x < MAX_rows; x++)
            {
            if (ELEITORAL[x - 1][y] > ELEITORAL[x][y])
                {
                Mudou = true;
                tItem = ELEITORAL[x - 1][y];
                ELEITORAL[x - 1][y] = ELEITORAL[x][y];
                ELEITORAL[x][y] = tItem;

                }
            }
        }
}
        //ORDERS THE COLUMNS 
        for (x = 0; x < MAX_rows; x++)
        {
            Mudou = true;
            while (Mudou)
                {
                Mudou = false;
                for (y = 1; y < MAX_columns; y++)
                {
                if (ELEITORAL[x][y - 1] > ELEITORAL[x][y])
                    {
                        Mudou = true; 
                    tItem = ELEITORAL[x][y - 1];
                    ELEITORAL[x][y - 1] = ELEITORAL[x][y];
                    ELEITORAL[x][y] = tItem; 
                    cout << "entrei";
                    system("pause");
                        }

                    }
                }
            }
        }
    }
    void DisplayTheArray(double** ELEITORAL)
    {
        for (int y = 0; y < MAX_columns; y++)
        {
            for (int x = 0; x < MAX_rows; x++)
            {
                cout.width(5);
                cout << ELEITORAL[x][y];
            }
            cout << endl;
        }
        cout << endl;
    }
void fill(double **p, int rowsize, int colsize) {

      std::cout << std::fixed;
      std::cout << std::setprecision(1);
 printf("\n  Introduza o n%cmero de votos nas listas por ordem \n", 163);
    for (int col = 0; col < colsize; col++)
        {
         cin >> p[row][col];
        }
    cout << endl; 
    for (int row = 1; row < rowsize; row++)  
        {                                               
        for (int col = 0; col < colsize; col++) 
                {
                    p[row][col] = (p[0][col]/(row + 1));
                }
                cout << endl; //preenche as linhas 
            }
    }//FILL OUT THE ARRAY

   void print(double **p, int rowsize, int colsize) 
    {
    for (int i = 0; i < header.size(); i++) { //HEADER IS TO STORE THE 
           //NAMES OF THE POLITICAL PARTIES
            cout << setw(9) << header[i] << " ";
        }
        cout << endl;
        for (row = 0; row < rowsize; row++) //IMPRIME A MATRIZ EM SI
        {
            for (col = 0; col < colsize; col++)
               {
                   cout << setw(10) << p[row][col];

               }
            cout << endl;

     }
   }//PRINTS THE ARRAY

    int MATRIZ()
    {
        std::cout << std::fixed;
        std::cout << std::setprecision(1);
        double rows, columns;
        printf("\n Qual o n%cmero de candidatos a eleger? \n", 163);
        cin >> rows;
        printf("\n Qual o n%cmero de listas candidatas? \n", 163);
        cin >> columns;
        for (i = 0; i < columns; i++)
            {
                cout << " Qual o nome da lista " << i+1;
                cout << endl;
                cin >> nomL;
                header.push_back(nomL);
            }
        cout << endl;
        system("cls");
        ELEITORAL = new double*[rows];
        for (int row = 0; row < rows; row++)
         {
            ELEITORAL[row] = new double[columns];
         }
         fill(ELEITORAL, rows, columns);
         cout << endl;
         //After this I have a switch, in case 5 I call the functions 
         //giving me trouble
case '5':
        {
            bubble_sort(ELEITORAL);
            DisplayTheArray(ELEITORAL);
            break;
        }

1 Ответ

1 голос
/ 03 июня 2019

Ваша функция отображения схематична, поскольку вы предполагаете, что массив имеет МАКСИМАЛЬНЫЕ размеры.Так что я держу пари, что ваша программа сегментирует ошибки из-за нарушения доступа к памяти.Пожалуйста, не используйте new, вместо этого используйте vector.Вам не нужно будет передавать длину как отдельный параметр, и в этом случае вы не ошибетесь.Также тип double не подходит для индексации, включения предупреждений компилятора и их исправления.

Вот простой пример использования vector для создания матрицы:

#include <iostream>
#include <vector>


using row_t = std::vector<double>;
using matrix_t = std::vector<row_t>;
//matrix_t = std::vector<std::vector<double>>;  Vector of vectors of double


//Pass by reference to avoid copy
//Pass by const if the matrix should be read-only
void printMatrix(const matrix_t& mat)
{
    for(auto& row: mat)
        for(auto& val: row)
            std::cout<<val << ' ';
        std::cout<<'\n';//Use this instead of endl if you want just a new line
}

void doubleMatrix(matrix_t& mat)
{
    //If you need access to indices during iterating
    for(std::size_t r = 0; r < mat.size();++r)
        for(std::size_t c = 0; c < mat[r].size();++r)
            mat[r][c] *=2.0;
}
int main()
{
    std::size_t rows, columns;

    std::cin >> rows;
    std::cin >> columns;

    double fill_value = 0.0;

    matrix_t matrix(rows);
    //Resize rows to given column width.
    for(auto& row: matrix)
        row.resize(columns, fill_value);

    printMatrix(matrix);
    doubleMatrix(matrix);
    printMatrix(matrix);
}

ПоследнееЯ заметил, если вы хотите поменять местами два значения, используйте std::swap.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...