1

Тема: Вказівники і динамічна пам`ять при опрацюванні двовимірних масивів

Допоможіть будь-ласка виконати завданна на С:

Дано цілочисельну матрицю розміром N x M.
1). Перестановкою її рядків і стовпців досягти того, щоб найбільший елемент опинився у верхньому лівому куті (3 бали);
2). Знайдіть номер першого з рядків, у якому немає однакових елементів (+ 2 бали).

2

Re: Вказівники і динамічна пам`ять при опрацюванні двовимірних масивів

Перестановкою її рядків і стовпців досягти того, щоб найбільший елемент опинився у верхньому лівому куті

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

3

Re: Вказівники і динамічна пам`ять при опрацюванні двовимірних масивів

FakiNyan написав:

Перестановкою її рядків і стовпців досягти того, щоб найбільший елемент опинився у верхньому лівому куті

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

Я думаю, що так.

4

Re: Вказівники і динамічна пам`ять при опрацюванні двовимірних масивів

ну то так і зробіть, в чому проблема?

5 Востаннє редагувалося ReAl (10.05.2019 16:39:12)

Re: Вказівники і динамічна пам`ять при опрацюванні двовимірних масивів

FakiNyan написав:

Перестановкою її рядків і стовпців досягти того, щоб найбільший елемент опинився у верхньому лівому куті

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

Ні, це саме обмінювати місцями рядки і стовпці.
Тобто треба знайти рядок з найбільшим елементом (не важливо у якому стовпці) і свапнути весь рядок з першим рядком.
Потім треба свапнути весь стовпець з найбільшим елементом з першим стовпцем.

p.s. Це використовується при розв'язуванні систем лінійних рівнянь, тоді процес продовжується з підматрицею без перших рядка і стовпця і запам'ятовується матриця перестановок, щоб потім знати, яка xij на якому місці опинилася.

Подякували: FakiNyan, koala, leofun013

6

Re: Вказівники і динамічна пам`ять при опрацюванні двовимірних масивів

int **matrix=new int[M];
for (int i=0; i<M; i++) matrix[M]=new int [N];
int id_max[2]={0};//first m, second n
for (int i=0; i<M; i++) for (int j=0; j<N; j++) if(matrix[i][j]>matrix[id_max[0]][id_max[1]]) id_max[0]=i, id_max[1]=j;//search max

це просто пошук
а це сортування

int **matrix=new int[M];
for (int i=0; i<M; i++) matrix[M]=new int [N];
int id_max[2]={0};//first m, second n
int t;
for (int a=0; a<M*N; a++) for (int i=0; i<M; i++) for (int j=0; j<N; j++) if(matrix[i][j]>matrix[id_max[0]][id_max[1]]) id_max[0]=i, id_max[1]=j, t=matrix[0][0], matrix[0][0]=matrix[i][j], matrix[i][j]=t;//search max & sort

я можу помилятися, код написаний на бистру руку

int **matrix=new int[M];
for (int i=0; i<M; i++) matrix[M]=new int [N];
int id_col=0;//m
for (int i=0; i<M; i++) for (int j=0; j<N; j++) for (int q=0; q<N; q++) if (matrix[i][j]==maxrix[i][q]) id_col=i, break;

якось так. незнаю, чесно

7

Re: Вказівники і динамічна пам`ять при опрацюванні двовимірних масивів

Весь код в студію, а не обривки і нормально його відформайтуйте.
int **matrix=new int[M];
Що за джавішний підхід? =.=

8

Re: Вказівники і динамічна пам`ять при опрацюванні двовимірних масивів

ReAl написав:
FakiNyan написав:

Перестановкою її рядків і стовпців досягти того, щоб найбільший елемент опинився у верхньому лівому куті

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

Ні, це саме обмінювати місцями рядки і стовпці.
Тобто треба знайти рядок з найбільшим елементом (не важливо у якому стовпці) і свапнути весь рядок з першим рядком.
Потім треба свапнути весь стовпець з найбільшим елементом з першим стовпцем.

p.s. Це використовується при розв'язуванні систем лінійних рівнянь, тоді процес продовжується з підматрицею без перших рядка і стовпця і запам'ятовується матриця перестановок, щоб потім знати, яка xij на якому місці опинилася.

аа, точно, це я затупив просто

9

Re: Вказівники і динамічна пам`ять при опрацюванні двовимірних масивів

помилився! в 2-му рядку

for (int i=0; i<M; i++) matrix[i]=new int [N];

а все тому що код написаний спочатку на руку а потім іще і копіпстом))
я не знаю а в сі є вектори?

10

Re: Вказівники і динамічна пам`ять при опрацюванні двовимірних масивів

Ви ж не в Сі пишете..

11

Re: Вказівники і динамічна пам`ять при опрацюванні двовимірних масивів

а в сі немає вказівників? топікстартер зазначив, що зробити треба саме на сі, в першому повідомленні.

не по темі

і ніякого підходу java не було, я навіть повідомлення не редагував. і код повний (невідомо куди саме його примостити) і топікстартер розбив завдання на пункти по яких і надано код, це зовсім різні задачі. і відформатований нормально. компактно. чи ви хочете щоб у нас мізки ватними стали?

12

Re: Вказівники і динамічна пам`ять при опрацюванні двовимірних масивів

Ну ваш код написаний на С++, а не на Сі.
Джавішний бо не оптимальний.

13

Re: Вказівники і динамічна пам`ять при опрацюванні двовимірних масивів

Ну це ж треба таке нахабство! Сам коду не пише бо не знає як а хто пише, на тих говорить що пишуть джавішні коди! Я зроду java не вчив. Я вчив якраз Сі. Де є вказівники, до-речі. Короче про що можна говорити з малявкою яка сама коду не пише бо не знає як, а іншим вказує. З вами я більше ні про що не говорю. Все. Крапка.

14

Re: Вказівники і динамічна пам`ять при опрацюванні двовимірних масивів

Портфель зібрали?

15

Re: Вказівники і динамічна пам`ять при опрацюванні двовимірних масивів

не сваріться, бо зара обом по сраці надаю

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

16

Re: Вказівники і динамічна пам`ять при опрацюванні двовимірних масивів

А хто свариться? Людина неадекватно реагує на
повідомлення, таких ізольовувати тре.

17

Re: Вказівники і динамічна пам`ять при опрацюванні двовимірних масивів

Я сьогодні не виспався. Знаєте як ото коли 3 ночі не спиш то потім агресивний стаєш. А тут довелося ще писати якогось кода який мені не потрібен. І тому так відреагував на цього тролля. Міг би просто сказати "давай код". Але оскільки він все рівно коду не дав то не програміст він певне. Ну хай знайде хоч в гуглі готовий та скопіпастить. Я просто намагався вирішити задачу логікою. Без допоміжних функцій. І я отой код написав ще давно, ще тільки но топікстартер питання задав. Через ліміт 600 секунд. І пішов по справам. Прийшов і натиснув "Надіслати". А потім вже побачив ваші обговорення.

18

Re: Вказівники і динамічна пам`ять при опрацюванні двовимірних масивів

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
void print_a (int **, int, int);
int  max_row (int *, int);
 
int main (void)
{
    int i, k, n, m;
    printf("n = ");     scanf("%d", &n);
    printf("m = ");     scanf("%d", &m);
    if (n<1 || m<1) return 1;
 
    int ** a = (int **) malloc(n * sizeof(int*));       // create array
    if (a == NULL) return 1;
    for (i=0; i<n; i++)
    {
        a[i] = (int *) malloc(m * sizeof(int));
        if (a[i] == NULL)
        {
            for (k=i-1; k>=0; k--)
                free(a[k]);
            free(a);
            return 1;
        }
    }
 
    srand( (unsigned int)time(NULL)/2 );                // fill the array
    for (i=0; i<n; i++)
        for (k=0; k<m; k++)
            a[i][k] = 1 + rand() %100;
 
    print_a(a, n, m);
 
    int nMax = 0;               // found position of maximum element
    int max = max_row(a[nMax], m);
    for (i=1; i<n; i++)
        if ((a[i][k = max_row(a[i], m)]) > a[nMax][max]) max = k, nMax = i;
    printf("\nMaximum element %d found in %d string\n", a[nMax][max], nMax+1);
 
    int t;
    for (i=nMax; i>0; i--)      // step 1
    {
        for (k=0; k<m; k++)
        {
            t = a[i-1][k];
            a[i-1][k] = a[i][k];
            a[i][k] = t;
        }
    }
 
    printf("\nStep 1");
    print_a(a, n, m);
 
    for (k=max; k>0; k--)       // step 2
    {
        for (i=0; i<n; i++)
        {
            t = a[i][k-1];
            a[i][k-1] = a[i][k];
            a[i][k] = t;
        }
    }
 
    printf("\nStep 2");
    print_a(a, n, m);
 
    for (i=0; i<n; i++)         // free memory
        free(a[i]);
    free(a);
    return 0;
}
// ------------------------------------------------------------
void print_a (int ** a, int n, int m)
{
    int i, k;
    printf("\n");
    for (i=0; i<n; i++)
    {
        for (k=0; k<m; k++)
            printf("%5d", a[i][k]);
        printf("\n");
    }
}
// ------------------------------------------------------------
int max_row (int * a, int n)
{
    int i, m = 0;
    for (i=1; i<n; i++)
        if (a[i] > a[m]) m = i;
    return m;
}
// ------------------------------------------------------------
Подякували: volum1

19

Re: Вказівники і динамічна пам`ять при опрацюванні двовимірних масивів

Тільки от все ж хоч я і писав через кому, попереджаю,  викладачі коми не люблять. 

if ((a[i][k = max_row(a[i], m)]) > a[nMax][max]) max = k, nMax = i;

Люблять {}. Так склалося. 70% всіх викладачів розповідали мені самі про свою не любов.
Але для практики мені здається коми підходять більше. Вони збільшують швидкість написання програми (не треба натискати Shift), підвищують зручність читання (скорочують розмір). Для себе з комами, для викладача - без ком. тобто

if ((a[i][k = max_row(a[i], m)]) > a[nMax][max]) {max = k; nMax = i;}

на жаль

20

Re: Вказівники і динамічна пам`ять при опрацюванні двовимірних масивів

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

for (i=1; i<n; i++)

масиви починаються не з 1 а з 0,

for (i=0; i<n; i++)

можу помилятися всю програму не читав.

Прихований текст
int mass[10];
/*


1-st: mass[0]
10: mass[9]
0, 1, 2, 3, 4, 5, 6, 7, 8, 9

*/