【问题标题】:Sort elements of secondary diagonal in ascending order C++按升序对辅助对角线的元素进行排序C ++
【发布时间】:2020-12-15 11:00:54
【问题描述】:

正如我所想,我需要将函数printSecondaryDiagonal(实际上打印辅助对角线的元素)转换为一维数组,然后按升序对其元素进行排序,对吧?

附:一开始的二维数组必须是动态数组。此外,不能使用vector 来实现。只有malloccallocnew

#include <iostream>
#include <iomanip>
using namespace std;

void getManual(int** arr, int rows, int columns);
void getRandom(int** arr, int rows, int columns);
void printSecondaryDiagonal(int** arr, int rows, int columns);

void main() {
    int rowCount = 5;
    int colCount = 6;

    cout << "Enter quantity of rows: ";
    cin >> rowCount;
    cout << "Enter quantity of columns: ";
    cin >> colCount;

    int** arr = new int* [rowCount];

    for (int i = 0; i < rowCount; i++) {
        arr[i] = new int[colCount];
    }

    cout << " Array formation algorithm\n";
        start:
    cout << "Input number : \n1 for manual\n2 for random\n";
    int k;
    cin >> k;
    switch (k) {
    case 1: getManual(arr, rowCount, colCount);
        break;
    case 2: getRandom(arr, rowCount, colCount);
        break;
    default:cout << "Input 1 or 2, please.";
        cout << endl << endl;
        goto start;
    }
    cout << endl;

    printSecondaryDiagonal(arr, rowCount, colCount);
        
    for (int i = 0; i < rowCount; i++) { //очищуємо память для кожного рядка
        delete[] arr[i];
    }

    delete[] arr;
}

void getManual(int** arr, int rows, int columns) { //введення з клавіатури
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < columns; j++) {
            cout << "a[" << i << "][" << j << "]=";
            cin >> arr[i][j];
            //cin >> *(*(arr + i) + j); //вказівникова форма
        }
    }
}

void getRandom(int** arr, int rows, int columns) { //випадкова генерація чисел
    int lowest = -21, highest = 34;
    int i, j;
    srand(time(NULL));
    // ініціалізація масива
    for (i = 0; i < rows; i++) {
        for (j = 0; j < columns; j++) {
            arr[i][j] = lowest + rand() % (highest - lowest + 1);
            cout << setw(7) << arr[i][j];
        }
        cout << endl;
    }
}

我需要转换为一维数组的函数,这是我的主要问题:

void printSecondaryDiagonal(int** arr, int rows, int columns) {
    
    cout << "Secondary Diagonal: ";
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < columns; j++) {

            // Condition for secondary diagonal
            if ((i + j) == (columns - 1)) {
                cout << arr[i][j] << setw(7);
            }
        }
    }
    
}

【问题讨论】:

  • “无法使用矢量”。如果您需要矢量提供的动态分配,创建一个简化版本的矢量通常是一个好的开始。

标签: c++ arrays


【解决方案1】:

次对角线的元素可以用一个 for 循环提取,正如我将展示的那样。次对角线将保存在一维数组 `secDiag[i]` 中。然后,使用 `algorithm` 头文件中的 `std::sort` 对这个数组进行升序排序。

void printSecondaryDiagonal(int** arr, int rows, int columns) {

    cout << "Secondary Diagonal: ";
    int *secDiag = new int [rows];
    int r, c;
    for (r = 0; r < rows ; r++) {
              c = columns - r -1;
             if (c < 0) break;
             secDiag[r] = arr[r][c];
        }
    for (int i =0; i<r; i++) std::cout << setw(7) << secDiag[i];
    std::cout << std::endl;
    std::cout << "After sorted: ";
    std::sort(secDiag, secDiag+r);
    for (int i =0; i<r; i++) std::cout << setw(7) << secDiag[i];
    std::cout << std::endl;
    delete [] secDiag;
}

测试运行:

Enter quantity of rows: 3
Enter quantity of columns: 3
 Array formation algorithm
Input number :
1 for manual
2 for random
2
     33    -13     29
     -7     -2     10
     -8     18      6

Secondary Diagonal:      29     -2     -8
After sorted:      -8     -2     29

【讨论】:

    【解决方案2】:
      void printSecondaryDiagonal(int** arr, int rows, int columns) {
            
        cout << "Secondary Diagonal: ";
        int i = 0;
        int j = columns - 1;
        int k = 0;
        int size =0;
        if (rows>columns)
        {
          size = columns;
        }
        else 
        {
          size = rows;
        }
        int *diagonal = new int[size];
        while (i < rows && j >= 0)
        {
          diagonal[k] = arr[i][j];
    
          cout << arr[i][j] << setw (7);
          i++;
          j--;
          k++;
        }
        for (int i = 0; i < size - 1; i++)
        {
          for (int j = 0; j < size - i - 1; j++)
            {
              if (diagonal[j] > diagonal[j + 1])
               {
                // swap arr[j+1] and arr[j] 
                int temp = diagonal[j];
                diagonal[j] = diagonal[j + 1];
                diagonal[j + 1] = temp;
               }
             }
          }
        for (int r = 0; r < size; r++)
        {
          cout << diagonal[r] << endl;
        }
        delete [] diagonal;        
      }
    

    【讨论】:

    • 无论此代码如何回答问题,添加一些描述来捍卫您的代码和观点是一个好习惯。
    • 谢谢。下次我会处理的。
    猜你喜欢
    • 2016-02-01
    • 1970-01-01
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    • 2022-02-12
    • 2013-05-30
    • 2019-07-23
    • 1970-01-01
    相关资源
    最近更新 更多