21

Re: Задача на C.(Допоможіть)

ur_naz написав:

в с нема векторів, тобі потрібен масив розміром п*(п+1)/2

У C і матриць немає, але це ж вас чомусь не чіпає.

22

Re: Задача на C.(Допоможіть)

ur_naz написав:

в с нема векторів, тобі потрібен масив розміром п*(п+1)/2

Вектор - це одновимірний масив
Матриця - двовимірний

23

Re: Задача на C.(Допоможіть)

koala написав:

Для початку - ви бачите, що вираз у циклі (10 операцій = ) не залежить від i та j і, відповідно, його можна сміливо винести з циклу?
Якщо так - добре. Якщо ні - подивіться ще раз. Тепер - як робити правильно.
Спосіб №1 (більш математичний). Встановіть залежність між індексами A та B, приблизно таку:
x = f(i,j);//наша залежність
B[x] = A[i ][j];
Короткий розрахунок показує, що для тих i, що нам підходять
f(i,j) = i*(довжина рядка-1)+j;
відповідно

for(i=...)
    for(j=...)
        if(елемент головної діагоналі і вище)
            B[j*(довжина рядка-1)+i] = A[i][j];

Спосіб 2 (програмістський).
Нам завжди треба буде дописувати в кінець записаної частини масиву B. Тому створімо ще одну змінну, скажімо k (правильніше було б її назвати size_b), і будемо кожного разу, коли додали щось у масив B, її збільшувати:

int k = 0;
for(i=...)
    for(j=...)
        if(елемент головної діагоналі і вище){
            B[k] = A[i][j];
            k++;
        }

k++ можна сміливо внести у попередній вираз:

int k = 0;
for(i=...)
    for(j=...)
        if(елемент головної діагоналі і вище)
            B[k++] = A[i][j];

Лишилося тільки знайти розмір B залежно від розмірів A. В принципі, ви не сильно втратите, якщо візьмете B такого ж розміру, як і A; але якщо дуже кортить не виділяти зайвої пам'яті - то сума арифметичної прогресії має вам допомогти.

П.С. У першій формулі таки помилка, але біс із ним. Всі користуються другим способом. Потім додумаю, яка там формула.

Все, я знайшов свою помилку , робив другим способом (добавляв k, але забув його збільшувати :D ). Я вам дуже дякую).
P.S. Ось код https://onlinegdb.com/rk_1zNhnr , якщо є якісь зауваження кажіть.

Подякували: Chemist-i1

24

Re: Задача на C.(Допоможіть)

Oleg Kulynych написав:
ur_naz написав:

в с нема векторів, тобі потрібен масив розміром п*(п+1)/2

Вектор - це одновимірний масив
Матриця - двовимірний

Вектор і матриця - математичні поняття; ви використовуєте для їхнього представлення в програмі масиви. Так буде коректніше. Тим більше, що в C немає двовимірних масивів, ви використовуєте масив масивів для матриці.

25

Re: Задача на C.(Допоможіть)

Для бульбашкового сортування не треба внутрішній цикл крутити постійно до 9; після першої ітерації зовнішнього циклу найбільше число в масиві гарантовано буде останнім, і можна вдруге робити цикл лише до 8, потім до 7 і т.д. Вхопили ідею?

26

Re: Задача на C.(Допоможіть)

Формула
B[(i*(довжина рядка)-i*(i+1)/2 + j] = A[ i ][ j ]
Перевіряємо:
B[3]=A[0][3]
B[8]=A[2][3]
B[9]=A[3][3]
Voilà!

27

Re: Задача на C.(Допоможіть)

koala написав:
Oleg Kulynych написав:
ur_naz написав:

в с нема векторів, тобі потрібен масив розміром п*(п+1)/2

Вектор - це одновимірний масив
Матриця - двовимірний

Вектор і матриця - математичні поняття; ви використовуєте для їхнього представлення в програмі масиви. Так буде коректніше. Тим більше, що в C немає двовимірних масивів, ви використовуєте масив масивів для матриці.

Ну так , повністю погоджуюсь