1 Востаннє редагувалося leofun01 (31.05.2019 12:43:25)

Тема: Проблема з виводом масива за допомогою функції!

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <ctime>
#include <iomanip>
using namespace std;

bool N_goodDisposition(int x1, int x2)
{
    if(x1 % 2 != x2 % 2) //Якщо одне число парне а друге непарне, то меншим буде парне
        return x1 % 2 < x2 % 2;
    else if(x1 % 2 == 1) // Числа непарні, має бути спаданні
        return x1 < x2;
}
bool P_goodDisposition(int x1, int x2)
{
    if(x1 % 2 != x2 % 2) //Якщо одне число парне а друге непарне, то меншим буде парне
        return x1 % 2 < x2 % 2;
    else if(x1 % 2 == 0)  // Числа парні, має бути спадання
        return x1 < x2;
}
void Sort_p(int* arr, int size)
{
    for(int i = 0; i < size - 1; i++)
    {
        if(arr[i] % 2 == 0)
            for(int j = i + 1; j < size; j++)
            {
                if(!P_goodDisposition(arr[i], arr[j]))
                {
                    int x = arr[i];
                    arr[i] = arr[j];
                    arr[j] = x;
                }
            }
    }
}
void Sort_np(int* arr, int size)
{
    for(int i = 0; i < size - 1; i++)
    {
        if(arr[i] % 2 == 1)
            for(int j = i + 1; j < size; j++)
            {
                if(N_goodDisposition(arr[i], arr[j]))
                {
                    int x = arr[i];
                    arr[i] = arr[j];
                    arr[j] = x;
                }
            }
    }
}
int show(int** arr, int rows, int columns)
{
    cout << "Matrix:" << endl;
    for(size_t i = 0; i < rows; i++)
    {
        for(size_t j = 0; j < columns; j++)
        {
            cout << setw(3) << arr[i][j] << ' ';
        }
        cout << endl;
    }
}

int main() {
    setlocale(0, "");
    ofstream fin("text.txt");
    if(!fin.is_open())
        cout << "not file\n";
    size_t N, M;
    int V, B, d = 0;
    cout << setw(4) << "write N:" << " ";
    cin >> N;
    cout << setw(4) << "write M:" << " ";
    cin >> M;
    cout << setw(4) << "write V:" << " ";
    cin >> V;
    cout << setw(4) << "write B:" << " ";
    cin >> B;
    cout << "\n";
    int i, j;
    int arr[N][M];
    int *temp = new int[N * M];
    size_t k = 0;
    srand(time(NULL));

    for(i = 0; i < N; i++)
    {
        for(j = 0; j < M; j++)
        {
            arr[i][j] = V + rand() % (B - V + 1);
            cout << setw(6) << arr[i][j];
            fin << setw(6) << arr[i][j];
        }
        fin << endl;
        cout << endl;
    }
    // show((inarr, N, M);
    cout << endl;
    for(size_t i = 0; i < N; i++)
    {
        for(size_t j = 0; j < M; j++)
        {
            if(arr[i][j] % 2 == 0)
            {
                d = d + 1;
            }
            temp[k] = arr[i][j];
            k++;
        }
    }
    fin << "d=" << d;
    Sort_p(temp, N * M);
    Sort_np(temp, N * M);
    k = 0;
    for(size_t i = 0; i < N; i++)
    {
        for(size_t j = 0; j < M; j++)
        {
            arr[i][j] = temp[k];
            k++;
        }
    }
    delete[]temp;
    // show(arr, N, M);
    cout << "Matrix:" << endl;
    for(int i = 0; i < N; i++)
    {
        for(int j = 0; j < M; j++)
        {
            cout << setw(6) << arr[i][j];
        }
        cout << endl;
    }
    system("pause");
    return 0;
}

2

Re: Проблема з виводом масива за допомогою функції!

Проблема з вказівником int** ,як правильно його виводити за допомогою файла?

3

Re: Проблема з виводом масива за допомогою функції!

І де саме (в якому рядку) проблема? Що це за проблема? Екстрасенси у відпустці.

4

Re: Проблема з виводом масива за допомогою функції!

Ви напевне не вкурсі, що імя масиву конвертується у вказівник на його перший елемент?
Тобто це така конструкція int*, а ваша функція show приймає вказівник на вказівник на тип, тобто int**, відчуваєте різницю?

5

Re: Проблема з виводом масива за допомогою функції!

я пробував записувати int*, але помилка не зникає.

6

Re: Проблема з виводом масива за допомогою функції!

Яка помилка? Де? Покажіть як ви це робили? Кажу ж екстрасенсів тут нема.

7

Re: Проблема з виводом масива за допомогою функції!

 show(arr, N, M);

-помилка тут але в коді цей рядок закоментований ,але якщо все зробити правильно то появляється така помилка.

error: cannot convert 'Int(*)[M] to 'int**' for argument '1' to 'void show(int**,int,int)'

8

Re: Проблема з виводом масива за допомогою функції!

Добре, почнімо з банального, нащо вам два масиви?
arr i temp? І чому один з них виділений динамічно?

9

Re: Проблема з виводом масива за допомогою функції!

два масива мені потрібно,щоб перетворити двовимірний масив в одновимірний,тоді легше буде посортувати його.

10

Re: Проблема з виводом масива за допомогою функції!

то вам треба не масив змінювати, а те. як ви з ним взаємодієте

11

Re: Проблема з виводом масива за допомогою функції!

voloday455 написав:
 show(arr, N, M);

-помилка тут але в коді цей рядок закоментований ,але якщо все зробити правильно то появляється така помилка.

error: cannot convert 'Int(*)[M] to 'int**' for argument '1' to 'void show(int**,int,int)'

Ось вам приклад, як можна зручно працювати
з масивами і як можна їх передавати у функцію.
Взагалі, масиви в С++ неможна передавати у
функції аргументом, можна передати або вказівник
на масив або посилання.

Прихований текст
#include <iostream>
#include <cstdlib>
#include <ctime>

inline std::size_t constexpr N = 10;
inline std::size_t constexpr M = 10;

int zrand() noexcept {
    [[maybe_unused]] static bool const seed = 
        (std::srand(std::time(0)), true);
    return rand();
}

template <typename T, std::size_t N, std::size_t M>
void print(T(&arr)[N][M]) noexcept {
    for (std::size_t i = 0; i < N; i++) {
        for (std::size_t j = 0; j < N; j++) {
            std::cout << arr[i][j] << ' ';
        }
        std::cout << std::endl;
    }
}

template <typename T, std::size_t N, std::size_t M>
void randfill(T(&arr)[N][M]) noexcept {
    for (std::size_t i = 0; i < N; i++) {
        for (std::size_t j = 0; j < N; j++) {
            arr[i][j] = 10 + zrand() % 90;
        }
    }
}

int main() {
    int arr[N][M];
    randfill(arr);
    print(arr);
}

https://wandbox.org/permlink/cjzEeRBQh3YjRQnX

12

Re: Проблема з виводом масива за допомогою функції!

В C++ немає двовимірних масивів, але є купа конструкцій, покликаних їх замінити.

int  arr[N][M];

Це масив масивів. У пам'яті - просто неперервний шматок, який неможливо відрізнити від

int arr[N*M];

але компілятор трохи не так обробляє ці змінні. В принципі, можна привести і перше, і друге, до int *. Друге до нього саме приводиться.

int **arr;

А це вже складніше. Це вказівник на вказівник. Якщо ми створимо масив вказівників, то arr може на нього вказувати; а якщо кожен із цих вказівників вказуватиме на масив int-ів, то ваша програма працюватиме.
Оскільки зараз мені ліньки (та й вам, бачу, теж, інакше ви б знайшли будь-яке з десятка пояснень, які я вже тут лишав), то раджу зробити так:

int show(int* arr, int rows, int columns)
...
            cout << setw(3) << arr[i*rows+j] << ' ';
...
show(&a[0][0],N,M);
Подякували: voloday4551

13

Re: Проблема з виводом масива за допомогою функції!

Дуже дякую. Все вийшло.