1

Тема: Допоможіть розібратись в коді..

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

#include <stdio.h> 
#include <math.h> 
#define ROWS 10 
#define COLS 10 main() 
{ 
float matrix[ROWS][COLS],a; unsigned int i,j,n,m; printf("n="); scanf("%i",&n); 
printf("m="); scanf("%i",&m); for(i=0;i<n;i++) 
for(j=0;j<m;j++) 
{ 
printf("m[%i][%i]=",i,j); 
scanf("%f",&matrix[i][j]); 
if((!i)&&(i==j)) a=matrix[i][j]; 
else if(fabs(matrix[i][j])>fabs(a)) a=matrix[i][j]; 
} 
printf("max=|%f|\n",a); printf("Source matrix:\n"); 
for(i=0;i<n;i++) 
{ 
for(j=0;j<m;j++) printf("%5.0f",matrix[i][j]); printf("\n"); 
} 
matrix[0][0]=matrix[0][m–1]=matrix[n–1][0]=matrix[n–1][m–1]=a; printf("Destination matrix:\n"); 
for(i=0;i<n;i++) 
{ 
for(j=0;j<m;j++) printf("%5.0f",matrix[i][j]); printf("\n"); 
} 
return 0; 
}

2 Востаннє редагувалося Betterthanyou (15.05.2016 21:38:14)

Re: Допоможіть розібратись в коді..

Дано натуральне число n, що визначає кількість рядків та стовпців

#define ROWS 10 
#define COLS 10

А у вашому коді це постійно 10 рядків і стовпців, створюйте динамічні масиви.




У деякій генерованій квадратній матриці дійсних чисел.

for(j=0;j<m;j++) 
{ 
printf("m[%i][%i]=",i,j); 
scanf("%f",&matrix[i][j]); 
if((!i)&&(i==j)) a=matrix[i][j]; 
else if(fabs(matrix[i][j])>fabs(a)) a=matrix[i][j]; 
} 

Я так розумію генерованій це означає що числа не мають вводитися в ручну тому використаєте наприклад функцію rand()





scanf("%i",&m);


А де в умові сказано про M це непотрібна змінна

3

Re: Допоможіть розібратись в коді..

sn7770666k написав:

Допоможіть розібратись в коді..

А що конкретно складає для вас проблему?
Розставте відступи, перенесіть підлеглі конструкції в if та for на наступний рядок, розкладіть по одному виразу на рядок. І замініть !i на i!=0. Після цього питайте по конкретних рядках, що незрозуміло.

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

4

Re: Допоможіть розібратись в коді..

Які саме у вас запитання по коду? Я його лише трошки поправив, але це не програма яку ви хотіли отримати.

#include <stdio.h> 
#include <math.h> 
int main() 
{
    unsigned int i, j, n, m; 
    printf("n="); scanf("%i", &n);
    printf("m="); scanf("%i", &m); 

    // Створюємо динамічний масив
    float** matrix = new float*[n];
    for (int i = 0; i < n; ++i)
        matrix[i] = new float[m];

    // Вводимо матрицю
    for (i = 0; i<n; i++)
        for (j = 0; j<m; j++)
        {
            printf("m[%i][%i]=", i, j);
            scanf("%f", &matrix[i][j]);
        }
    
    printf("Source matrix:\n");
    for (i = 0; i<n; i++)
    {
        for (j = 0; j<m; j++) 
            printf("%5.0f", matrix[i][j]); 
        printf("\n");
    }

    // Міняємо місцями діагоналі
    // Чи дійсно матриця може бути неквадратною. 
    // Тобто у вас n і m - різні.
    // Вам достатньо читати одне якщо хочете, щоб матриця була квадратною.
    //....

    printf("Destination matrix:\n");
    for (i = 0; i<n; i++)
    {
        for (j = 0; j<m; j++) 
            printf("%5.0f", matrix[i][j]); 
        printf("\n");
    }
    return 0;
}
Подякували: Betterthanyou1

5 Востаннє редагувалося Betterthanyou (16.05.2016 02:52:38)

Re: Допоможіть розібратись в коді..

+

Ех, щось таке
Хотів якось розумно зробити рекурсивну функцію, але там явно краще б було використати цикл

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>     
#include <time.h>   
#include <algorithm> 

class SizeError {};
class InputError {};

class Matrix
{
public:
    Matrix();
    ~Matrix();
    void generationArray();
    void printArray();
    void rearrange(int i = 0);
    int getElement(int i, int j);
private:
    int N;
    int **arr;
};

Matrix::Matrix()
{
    //Вводим N
    printf("Enter N ->");
    scanf("%i", &this->N);

    /*Перевіряємо на помилки, 

    як перевірити на помилку 
    переповнення я й сам 
    не знаю, SizeError - це 
    не зовсім правильно бо 
    можна ввести -1 і отримати 
    помилку переповнення*/
    if (this->N == -1)
        throw SizeError();
    else if (this->N <= 0)
        throw InputError();

    //Створюємо динамічний масив
    this->arr = new int*[this->N];

    for (int i(0); i < this->N; i++)
    {
        this->arr[i] = new int[this->N];
    }

    //Генеруємо випадкові числа
    this->generationArray();
}

Matrix::~Matrix()
{
    /*
    Знищуємо динамічний масив

    Я не знаю чи правильно його знищую, 
    але й принаймні помилок при завершенні 
    програми не має
    */
    for (int i(0); i < this->N; i++)
    {
        delete []this->arr[i];
    }

    delete []arr;
}

void Matrix::generationArray()
{
    //Генеруємо випадкові числа
    for (int i = 0; i < this->N; i++)
        for (int j = 0; j < this->N; j++)
            this->arr[i][j] = rand();
}

void Matrix::printArray()
{
    //Виводимо на екран масив
    for (int i = 0; i < this->N; i++)
    {
        for (int j = 0; j < this->N; j++)
        {
            printf("%i\t", this->arr[i][j]);
        }
        printf("\n");
    }
}

void Matrix::rearrange(int i)
{
    /*
    Рекурсивне переставлення місцями 
    елементів головної та побічної 
    діагоналей
    */
    int *var = &this->arr[i][i];

    if (++i != N)
        rearrange(i);

    std::swap(*var, this->arr[i - 1][this->N - i]);
    
}

int Matrix::getElement(int i, int j)
{
    /* 
    На всякий випадок щоб 
    можна було дістати елемент 
    масиву 
    */
    return this->arr[i][j];
}

int main() try
{
    srand(time(NULL));

    Matrix *matrix = new Matrix;

    printf("Matrix 1\n");
    matrix->printArray();

    matrix->rearrange();

    printf("\nMatrix 2\n");
    matrix->printArray();
    
    delete matrix;

    getch();
    return 0;
}
catch (SizeError)
{
    printf("Error: Size");
    getch();
}
catch (InputError)
{
    printf("Error: Input");
    getch();
}
catch (...)
{
    printf("Error: Unknown");
    getch();
}

http://s8.hostingkartinok.com/uploads/images/2016/05/db0447af4251db9482a21ae6dd4dbe08.png


Я знайшов невеличкий bag якщо прописати "spoiler= " то spoiler не можливо буде відкрити

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