1 Востаннє редагувалося ProgNob (09.03.2017 19:58:12)

Тема: Вивести матрицю по малюнку

Доброго дня. Почали вчити динамічне виділення пам'яті в С++. Там, начебто, все зрозуміло, але я не можу розібратись з завданням, де потрібно написати функцію, яка заповняє заштриховану область(малюнок нижче) квадратної матриці, в якої всі елементи є одиницями, нулями. Ось код, де я намагався відштовхнутись від заповнення по діагоналі:

#include <iostream>
#include <stdio.h>
#include <iomanip>
using namespace std;

//функція
void func(int** arr, int n)
{

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            arr[j][i] = 0;
            arr[i][j] = 1;
            
        }
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
            cout << setw(4) << arr[i][j];
            cout << endl;
    }
}

int main()
{
    int **arr, n;
    cout << "Enter order of matrix: ";
    cin >> n;
    cout << "--------------------------------" << "\n" << endl;
    arr = new int*[n];
    for (int i = 0; i < n; i++)
    {
        arr[i] = new int[n];
    }
    
    func(arr, n);

    for (int i = 0; i < n; i++)
    {
        delete[] arr[i];
    }
    delete[] arr;
    return 0;
}

Мені тільки потрібно пояснити або показати, який алгоритм дії має бути у функції, щоб вийшла відповідна матриця. З динамічною пам'яттю в мене проблем немає. Дякую!

Post's attachments

f.png 1.23 kb, 231 downloads since 2017-03-09 

2

Re: Вивести матрицю по малюнку

1. Ви маєте розуміти, що в C++ немає ніяких матриць чи двовимірних масивів.  Є масив масивів, масив вказівників на масиви, масив векторів, вектор вказівників і т.д., наскільки фантазії вистачить. У вас arr - це вказівник на масив вказівників на масиви, який використовується для моделювання матриці.
2. Давайте ідентифікаторам зрозумілі назви. func ні про що не говорить. А от, наприклад, set_zero_hourglass ("зробити пісочні часи з нулів") - краще.
3. Не треба обробляти об'єкт і виводити його в одній функції.
4. В умові сказано "заповняє область матриці, в якої всі елементи є одиницями, нулями". Тобто спершу треба сформувати матрицю з одиниць, а потім заповнити решту нулями. Звісно, результат буде той самий, що й у вас, але умови треба виконувати якомога ближче до тексту.
5. Тепер по вашому питанню - якби ви робили все за умовою, то вам треба було б у зовнішньому циклі змінювати межі внутрішнього: перша ітерація - від 0 до n, друга - від 1 до n-1 і т.д. до центру, а потім знову збільшувати межі. Але якщо робите так, як робите - вам треба оцінити, в яку область потрапляє точка, і залежно від цього ставити 0 чи 1. Якщо не виходить скласти умову одразу - краще її розписати з частин:

bool higher_then_main_diagonal = j>=i;   //вище головної діагоналі
bool higher_then_antidiagonal    = n-j>=i; //вище побічної діагоналі
if(higher_then_main_diagonal && higher_then_antidiagonal ) { //верхній трикутник
  arr[i][j] = 0;
} else if(!higher_then_main_diagonal && !higher_then_antidiagonal ) {//нижній трикутник
  arr[i][j] = 0;
} else {
  arr[i][j] = 1;
}

Але, схоже, перші дві умови можна об'єднати в

if( (higher_then_main_diagonal && higher_then_antidiagonal) || (!higher_then_main_diagonal && !higher_then_antidiagonal) )

Якщо ви вчили різні булеві функції, то маєте помітити, що (A&&B) || (!A&&!B) є виразом для еквівалентності A==B:

if(higher_then_main_diagonal == higher_then_antidiagonal)

Ну і оскільки вираз вже склався, гадаю, нічого страшного не станеться, якщо ми підставимо початкові вирази:

if( (j>=i)==(n>=i+j) ) {
  arr[i][j] = 0;
} else {
  arr[i][j] = 1;
}

Я б це залишив так, але для особливих гурманів можу зазначити, що true має числове значення 1, а false - 0, тому це можна скоротити аж до

arr[i][j]=(j>=i)!=(n>=i+j);
Подякували: 0x9111A, ProgNob2

3

Re: Вивести матрицю по малюнку

І ніколи не робіть як у рядку 23.

4

Re: Вивести матрицю по малюнку

koala написав:

3. Не треба обробляти об'єкт і виводити його в одній функції.

Це входить в умову завдання.

5

Re: Вивести матрицю по малюнку

koala написав:

Ви маєте розуміти, що в C++ немає ніяких матриць чи двовимірних масивів.  Є масив масивів, масив вказівників на масиви, масив векторів, вектор вказівників і т.д., наскільки фантазії вистачить. У вас arr - це вказівник на масив вказівників на масиви, який використовується для моделювання матриці.

Дуже дякую, я вивів потрібну матрицю.

koala написав:

І ніколи не робіть як у рядку 23.

Чому?

6

Re: Вивести матрицю по малюнку

ProgNob написав:

Це входить в умову завдання.

Не бачу такого в умові.

ProgNob написав:

Чому?

Бо не зрозуміло, що в циклі, а що ні.

Подякували: ProgNob1

7

Re: Вивести матрицю по малюнку

koala написав:

Бо не зрозуміло, що в циклі, а що ні.

Ви про відсутність фігурних дужок?

koala написав:

Не бачу такого в умові.

Разом із завданням нам дали зразок, а там така структура.

8

Re: Вивести матрицю по малюнку

ProgNob написав:
koala написав:

Бо не зрозуміло, що в циклі, а що ні.

Ви про відсутність фігурних дужок?

Швидше про форматування коду.

Подякували: ProgNob1

9

Re: Вивести матрицю по малюнку

ProgNob написав:
koala написав:

Бо не зрозуміло, що в циклі, а що ні.

Ви про відсутність фігурних дужок?

Відсутність дужок припустима, але відступи мають відповідати рівню вкладеності. В даному випадку, інструкція після циклу (рядок 23) має той же відступ, що й інструкція в циклі (рядок 22), тоді як мала б бути на тому ж рівні, що й рядок 21.

Подякували: ProgNob1