1

Тема: С++ Матриці

У  частинi матрицi, розташованій під допоміжною діагоналлю, знайти стовпчик, в якому середнє арифметичне значення, знайдене з додатних елементів має мінімальне значення. С++

ось текст програми , тільки тут рахує елементи які вище допоміжної діагоналі , як зробити так щоб рахувало елменти стопчика який  нище допоміжної діагоналі????допоможіть буду дуже вдячний

2

Re: С++ Матриці

#include <iostream>
#include <conio.h>
#define _USE_MATH_DEFINES
#include <math.h>
using namespace std;

int main()
{
    int const size = 4;
    int A[size][size] = { { 1, 2, 3, 4 }, { 2, 3, 4, 5 }, { 3, 4, 5, 6 }, { 4, 5, 6, 7 } };
    double k = 0, kp = 0;
    int index = 0;
    
    for (int i = 0; i < size; i++)
    {
        k = 0;
        for (int j = 0; j < size-i; j++)
        
        
        {

            cout << Aj i << " ";
            k += abs(Aj i);
        }
        k /= size - i;
        if (k < kp)
        {
            k = kp;
            index = i;
        }
        kp = k;
        cout << endl;
    }
    cout << "Najmenshe seredn'e u " << index << " stovpci = " << k << endl;
    _getch();
    return 0;
}

Bartash: код слід брати у теги code.

3

Re: С++ Матриці

Отут

 k += abs(Aj i);

щось незрозуміле.

Спробуйте змінити < на > в 17-му рядку.

4

Re: С++ Матриці

Ось код, один нюанс, якщо при виведенні матриці замінити пробіл на табуляцію, то невідомо чого, вивід спотворюється. Прошу також форумчан покритикувати код:

/* 
 * Yaroslav
 * lun-bilyi@meta.ua
 */

#include <cstdlib>
#include <cstdio>
#include <iostream>

using namespace std;

/*
 * 
 */
/* create_matrix приймає в якості аргументу розмір сторони квадратної матриці
 * і повертає покажчик на перший елемент створеної матриці */
int* create_matrix(int size);
/* sum_row_elements приймає покажчик на початок квадратної матриці, розмір сторони, номер
 * рядка, в якому треба порахувати суму елементів, повертає суму ел. рядка */
int sum_row_elements(int *ptr, int size, int rowNumber);
/* sum_row_elements приймає покажчик на початок квадратної матриці, розмір сторони, номер
 * стовпчика, в якому треба порахувати суму елементів, повертає суму ел. стовпчика */
int sum_column_elements(int *ptr, int size, int clmNumber);
/* sum_maindiag_elements приймає покажчик на початок матриці, розмір сторони 
 * і повертає суму елементів головної діагоналі*/
int sum_maindiag_elements(int *ptr, int size);
/* sum_maindiag_elements приймає покажчик на початок матриці, розмір сторони 
 * і повертає суму елементів побічної діагоналі*/
int sum_minordiag_elements(int *ptr, int size);

int main(int argc, char** argv) {
    int *matrix_pointer; // Покажчик для матриці
    int i = 0,           // Лічильник
        j = 0,           // Лічильник
        result = 0,      // 
        size = 0;        // Розмір матриці
    
    while(size < 1 || size > 10){      // Визначення розміру матриці
        cout << "Input matrix size: ";
        cin >> size;
    }
    
    matrix_pointer = create_matrix(size); // Створюємо матрицю і встановлюємо
                                          // покажчик на її початок
    if(result >= 0){                      // Виводимо утворену матрицю
        cout << "Your matrix\n";
        for(i = 0; i < size*size; i++){
            j++;
            cout << matrix_pointer[ i ];
            cout << "  ";
            if(j == size){
                putchar('\n');
                j = 0;
            }
        }
    } else {
        cout << "Error 1: Fail to create matrix\n";
    }
    
    /* Вивід суми рядків */
    for(i = 0; i < size; i++){
        cout << "Sum of the " << i << " row = ";
        cout << sum_row_elements(matrix_pointer, size, i) << "\n";
    }
    
    /* Вивід суми колонок */
    for(i = 0; i < size; i++){
        cout << "Sum of the " << i << " column = ";
        cout << sum_column_elements(matrix_pointer, size, i) << "\n";
    }
    
    /* Вивід суми елементів головної діагоналі */
    cout << "Sum of the main diagonal elements = ";
    cout << sum_maindiag_elements(matrix_pointer, size) << "\n";
    
    /* Вивід суми елементів побічної діагоналі */
    cout << "Sum of the minor diagonal elements = ";
    cout << sum_minordiag_elements(matrix_pointer, size) << "\n";

    return 0;
}

int* create_matrix(int size){
    int i, j; // Лічильники
    int *ptr; // Покажчик на перший елемент матриці
    
    ptr = (int*) calloc(size*size, sizeof(int)); // Виділяємо пам’ять для матриці
    if(ptr == NULL){ // Якщо щось пішло не так
        return NULL; // Повертаємо нульове значення
    }
    
    for(i = 0; i < size*size; i++){
        ptr[ i ] = rand() % 11; // Заповнюємо матрицю числами від 0 до 10
    }
    
    return ptr; // Повертаємо покажчик на адресу першого елемента матриці
}

int sum_row_elements(int *ptr, int size, int rowNumber){
    int current = size * rowNumber; // Розраховуємо позицію першого елемента
                                    // в потрібному рядку
    int last = current + size;      // Розраховуємо останню позицію
                                    // в потрібному рядку
    int result = 0;                 // Результат
    
    while(current < last){
        result+= ptr[ current ];    // Додажмо елементи
        current++;                  // Просуваємось по рядку
    }
    
    return result;                  // Повертаємо результат
}

int sum_column_elements(int *ptr, int size, int clmNumber){
    int i = 0;                      // Лічильник
    int first = 0;                  // Перший елемент рядка
    int result = 0;                 // Результат
    
    while(i < size){
        first = size * i;                   // Розраховуємо позицію першого елемента
                                            // поточного рядка
        result += ptr[ clmNumber + first ]; // Додаємо значення елемента із нашої колонки
                                            // до result
        i++;                                // Просуваємось до кінця матриці
    }
    
    return result;                  // Повертаємо результат
}

int sum_maindiag_elements(int *ptr, int size){
    int i = 0,       // Лічильник
        current = 0, // Поточний елемент головної діагоналі
        result = 0;  // Результат
    
    for(; i < size; i++){
        current = size * i + i;  // Розраховуємо поточний елемент на головній діагоналі
        result += ptr[ current ]; // Додаємо до результату
    }
    
    return result;
}

int sum_minordiag_elements(int *ptr, int size){
    int i = 0,       // Лічильник
        j = 0,       // Лічильник
        first = 0,   // Перший елемент поточного рядка
        current = 0, // Поточний елемент побічної діагоналі
        result = 0;  // Результат
    
    for(i = size-1, j = 0; i >= 0; i--, j++){
        first = i * size;         // Перший елемент поточного рядка
        current = first + j;      // Розраховуємо поточний елемент на побічній діагоналі
        result += ptr[ current ]; // Додаємо до результату
    }
    
    return result;
}

5

Re: С++ Матриці

Пане Ярославе, якщо це C++, то не користуйте calloc (а як користуєте, не забувайте за free), а якщо C - то юзайте printf. Тут або хрестик, або труси.

6

Re: С++ Матриці

Багато коментів, вони лякають.

Змінні типу всяких i та j видно там, де не треба, щоб їх було видно.

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

7

Re: С++ Матриці

А взагалі питання в тому, до якого ступеня блиску треба довести код. От мені трохи муляє те, що індекси - не size_t.

8

Re: С++ Матриці

Також я помітив, що я не виконав самого завдання автора. Ось воно:

/* 
 * Yaroslav
 * lun-bilyi@meta.ua
 */

#include <cstdlib>
#include <cstdio>
#include <iostream>

using namespace std;

/*
 * 
 */
/* create_matrix приймає в якості аргументу розмір сторони квадратної матриці
 * і повертає покажчик на перший елемент створеної матриці */
int* create_matrix(int size);

/* sum_row_elements приймає покажчик на початок квадратної матриці, розмір сторони, номер
 * рядка, в якому треба порахувати суму елементів, повертає суму ел. рядка */
int sum_row_elements(int *ptr, int size, int rowNumber);

/* sum_row_elements приймає покажчик на початок квадратної матриці, розмір сторони, номер
 * стовпчика, в якому треба порахувати суму елементів, повертає суму ел. стовпчика */
int sum_column_elements(int *ptr, int size, int clmNumber);

/* sum_maindiag_elements приймає покажчик на початок матриці, розмір сторони 
 * і повертає суму елементів головної діагоналі*/
int sum_maindiag_elements(int *ptr, int size);

/* sum_maindiag_elements приймає покажчик на початок матриці, розмір сторони 
 * і повертає суму елементів побічної діагоналі*/
int sum_minordiag_elements(int *ptr, int size);

/* custom приймає покажчик на початок квадратної матриці, розмір сторони, і
 * повертає номер стовпчика, в якому середнє арифметичне невід’ємних елементів
 * мінімальне */
int custom(int *ptr, int size);

int main(int argc, char** argv) {
    int *matrix_pointer; // Покажчик для матриці
    int j = 0,           // Лічильник
        result = 0,      // 
        size = 0;        // Розмір матриці
    
    while(size < 1 || size > 10){      // Визначення розміру матриці
        cout << "Input matrix size: ";
        cin >> size;
    }
    
    matrix_pointer = create_matrix(size); // Створюємо матрицю і встановлюємо
                                          // покажчик на її початок
    if(result >= 0){                      // Виводимо утворену матрицю
        cout << "Your matrix\n";
        for(int i = 0; i < size*size; i++){
            j++;
            cout << matrix_pointer[ i ];
            cout << "    ";
            if(j == size){
                putchar('\n');
                j = 0;
            }
        }
    } else {
        cout << "Error 1: Fail to create matrix\n";
    }
    
    /* Вивід суми рядків */
    for(i = 0; i < size; i++){
        cout << "Sum of the " << i << " row = ";
        cout << sum_row_elements(matrix_pointer, size, i) << "\n";
    }
    
    /* Вивід суми колонок */
    for(i = 0; i < size; i++){
        cout << "Sum of the " << i << " column = ";
        cout << sum_column_elements(matrix_pointer, size, i) << "\n";
    }
    
    /* Вивід суми елементів головної діагоналі */
    cout << "Sum of the main diagonal elements = ";
    cout << sum_maindiag_elements(matrix_pointer, size) << "\n";
    
    /* Вивід суми елементів побічної діагоналі */
    cout << "Sum of the minor diagonal elements = ";
    cout << sum_minordiag_elements(matrix_pointer, size) << "\n";
    
    /* Номер стовпчика, в якому під допоміжною діагоналлю 
     * сума невід’ємних елементів найменша */
    cout << "In the " << custom(matrix_pointer, size) << " column";
    cout << " sum of the positive elements is smallest\n";

    return 0;
}

int* create_matrix(int size){
    int *ptr; // Покажчик на перший елемент матриці
    
    ptr = (int*) calloc(size*size, sizeof(int)); // Виділяємо пам’ять для матриці
    if(ptr == NULL){ // Якщо щось пішло не так
        return NULL; // Повертаємо нульове значення
    }
    
    for(int i = 0; i < size*size; i++){
        ptr[ i ] = rand() % 21 - 10; // Заповнюємо матрицю числами від -10 до 10
    }
    
    return ptr; // Повертаємо покажчик на адресу першого елемента матриці
}

int sum_row_elements(int *ptr, int size, int rowNumber){
    int current = size * rowNumber; // Розраховуємо позицію першого елемента
                                    // в потрібному рядку
    int last = current + size;      // Розраховуємо останню позицію
                                    // в потрібному рядку
    int result = 0;                 // Результат
    
    while(current < last){
        result += ptr[ current ];    // Додажмо елементи
        current++;                  // Просуваємось по рядку
    }
    
    return result;                  // Повертаємо результат
}

int sum_column_elements(int *ptr, int size, int clmNumber){
    int i = 0;                      // Лічильник
    int first = 0;                  // Перший елемент рядка
    int result = 0;                 // Результат
    
    while(i < size){
        first = size * i;                   // Розраховуємо позицію першого елемента
                                            // поточного рядка
        result += ptr[ clmNumber + first ]; // Додаємо значення елемента із нашої колонки
                                            // до result
        i++;                                // Просуваємось до кінця матриці
    }
    
    return result;                  // Повертаємо результат
}

int sum_maindiag_elements(int *ptr, int size){
    int current = 0, // Поточний елемент головної діагоналі
        result = 0;  // Результат
    
    for(int i = 0; i < size; i++){
        current = size * i + i;  // Розраховуємо поточний елемент на головній діагоналі
        result += ptr[ current ]; // Додаємо до результату
    }
    
    return result;
}

int sum_minordiag_elements(int *ptr, int size){
    int i = 0,       // Лічильник
        j = 0,       // Лічильник
        first = 0,   // Перший елемент поточного рядка
        current = 0, // Поточний елемент побічної діагоналі
        result = 0;  // Результат
    
    for(i = size-1, j = 0; i >= 0; i--, j++){
        first = i * size;         // Перший елемент поточного рядка
        current = first + j;      // Розраховуємо поточний елемент на побічній діагоналі
        result += ptr[ current ]; // Додаємо до результату
    }
    
    return result;
}

int custom(int *ptr, int size){
    bool positive = false;  // Прапор свідчить про те, чи число додатнє
    int i = 0,              // Лічильник
        j = 0,              // Лічильник
        column = 0,         // Тут зберігається номер колонки, в якій сума додатніх 
                            // елементів під побічною діагоналлю найменша
        current = 0,        // Поточний елемент, з яким ведемо роботу
        result = 0,         // Результат додавання елементів із поточної колонки
        smallest;           // Найменша сума
    
    for(i = 1; i < size; i++){
        j = i; // Поточний стовпчик
        result = 0; //Обнуляємо результат для наступного рядка
        while(j > 0){
            current = size * (size - j) + i; // Поточний елемент
            positive = (ptr[ current ] > 0) ? true : false;
            if( positive ){
                result += ptr[ current ]; // Додаємо поточний елемент
            }
            j--;
        }
        
        if(result < smallest && result != 0){
            smallest = result; // Записуємо найменший результат
            column = i;        // Записуємо номер колонки
        }
    }
    
    return column;
}