Re: Задача на C.(Допоможіть)
в с нема векторів, тобі потрібен масив розміром п*(п+1)/2
У C і матриць немає, але це ж вас чомусь не чіпає.
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → C++ → Задача на C.(Допоможіть)
Для відправлення відповіді ви повинні увійти або зареєструватися
в с нема векторів, тобі потрібен масив розміром п*(п+1)/2
У C і матриць немає, але це ж вас чомусь не чіпає.
в с нема векторів, тобі потрібен масив розміром п*(п+1)/2
Вектор - це одновимірний масив
Матриця - двовимірний
Для початку - ви бачите, що вираз у циклі (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, але забув його збільшувати ). Я вам дуже дякую).
P.S. Ось код https://onlinegdb.com/rk_1zNhnr , якщо є якісь зауваження кажіть.
ur_naz написав:в с нема векторів, тобі потрібен масив розміром п*(п+1)/2
Вектор - це одновимірний масив
Матриця - двовимірний
Вектор і матриця - математичні поняття; ви використовуєте для їхнього представлення в програмі масиви. Так буде коректніше. Тим більше, що в C немає двовимірних масивів, ви використовуєте масив масивів для матриці.
Для бульбашкового сортування не треба внутрішній цикл крутити постійно до 9; після першої ітерації зовнішнього циклу найбільше число в масиві гарантовано буде останнім, і можна вдруге робити цикл лише до 8, потім до 7 і т.д. Вхопили ідею?
Формула
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à!
Oleg Kulynych написав:ur_naz написав:в с нема векторів, тобі потрібен масив розміром п*(п+1)/2
Вектор - це одновимірний масив
Матриця - двовимірнийВектор і матриця - математичні поняття; ви використовуєте для їхнього представлення в програмі масиви. Так буде коректніше. Тим більше, що в C немає двовимірних масивів, ви використовуєте масив масивів для матриці.
Ну так , повністю погоджуюсь
Для відправлення відповіді ви повинні увійти або зареєструватися