Тема: Двовимірні масиви
Написати програму, яка знаходить індекс того рядочка матриці, який містить найбільшу кількість елементів, що повторюються.
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → C++ → Двовимірні масиви
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися
Написати програму, яка знаходить індекс того рядочка матриці, який містить найбільшу кількість елементів, що повторюються.
Ось початок :
#include <iostream>
#include <time.h>
using namespace std;
void main()
{
srand(time (NULL));
const int cols=6,rows=5;
int arr[rows][cols];
int i,j;
for ( i = 0; i < rows; i++)
{
for ( j = 0; j <cols ; j++) {
arr[i][j]=rand ()%10;
cout <<arr[i][j]<<" ";
}cout <<endl;
}
cout <<endl;
}
Хехе, так початок лише заповнює масив випадковими числами, і виводить їх, але ж ніяк і нічого не підраховує.
Ви хочете стати програмістом? Тоді пишіть програму самостійно, а якщо десь якась незрозуміла поведінка - питайте.
Ви хочете просто отримати оцінку? Тоді ідіть на іншу спеціальність, я не хочу потім ризикувати, що на моїй машині будуть фрагменти вашого коду.
Давайте розбирати. Ви навіть простими словами недоговорюєте, що вам треба, тому і з програмами не виходить - комп'ютер вимагає максимальної чіткості.
Очевидно, що порівняти можна лише два елементи. "Порівняти кожен елемент" просто так неможливо. Можна порівняти, наприклад, кожен елемент із якимось конкретним числом. Або кожен елемент із кожним іншим елементом. Для цього потрібно перебрати всі елементи (цикл) і всередині цього циклу перебрати всі інші елементи (другий цикл), а потім їх порівняти. Отже, вам потрібні вкладені цикли. І вони, звісно, мають бути у ще одному циклі - по рядках.
порівнює з кожним наступним ...
int max_repeat=0;int count =0;
for (int i = 0; i < rows; i++){
for ( i = 0; i <rows; i++)
{
for ( j = 0; j <cols ; j++)
{
if(arr[i][j]==arr[i][j+1])
count++;
}if (count>max_repeat)max_repeat=count;
cout <<"Max repeat= "<<max_repeat<<endl;
}
}
}
порівнює з кожним наступним ...
int max_repeat=0;int count =0; for (int i = 0; i < rows; i++){ for ( i = 0; i <rows; i++) { for ( j = 0; j <cols ; j++) { if(arr[i][j]==arr[i][j+1]) count++; }if (count>max_repeat)max_repeat=count; cout <<"Max repeat= "<<max_repeat<<endl; } } }
це не робить сенсу, а ще форматування є жахливим, бррр.
Спробуйте потренуватись на одномірному масиві, типу такому
[1, 2, 3]
от порівняйте кожен елемент з кожним елементом, типу. спочтаку 1 порівнюємо з 1, потім 1 з 2, потім 1 з 3, потім 2 з 1, 2 з 2, 2 з 3, а потім 3 з 1, 3 з 2, 3 з 3, і виведіть результат. Він має бути таким
true, false, false,
false, true, false,
false, false, true
до речі, тут виходить одинична, симетрична матриця
Одна з проблем навчання програмування в наших школах - повторення старих патернів, які вже стали антипатернами.
У вас є цикл по рядках? Я не буду тут про вказівники і ітератори, але який стосунок літера i має до рядків? Хай змінна зветься row:
for (int row = 0; row < rows; row++){
//елементи рядка будуть arr[row][..]
...
}
А два внутрішніх цикли мають бути по одному рядку - тобто обидва мають йти по останньому індексу.
Одна з проблем навчання програмування в наших школах - повторення старих патернів, які вже стали антипатернами.
У вас є цикл по рядках? Я не буду тут про вказівники і ітератори, але який стосунок літера i має до рядків? Хай змінна зветься row:for (int row = 0; row < rows; row++){ //елементи рядка будуть arr[row][..] ... }
А два внутрішніх цикли мають бути по одному рядку - тобто обидва мають йти по останньому індексу.
коли я навчався в вузі, то в нас доречі координатами комірки матриці були "i,j".
то, мабуть, з математики пішло. Бо в нас теж використовували i,j для позначення елементів матриці, наприклад.
Та в принципі нічого страшного в i та j немає, але коли їх багато, починається плутанина. Тому краще те, що можна нормально назвати, називати нормально.
Чудово. А тепер майже те саме - всередину циклу по row, і замість mass - arr[row], а замість cout - count++.
Лишилася пара дрібних проблем: ви порівнюєте всі пари двічі (наприклад, mass[1] із mass[2] спершу при i==1, j==2, потім при i==2,j==1), і ще порівнюєте елемент із самим собою. Підказка: це можна виправити, якщо починати внутрішній цикл не з 0.
всеодно не доходить ((
int max_repeat=0;int count =0;
for (int rows= 0; rows< rows; rows++){
for (int i = 1; i <rows ; i++)
{
for (int j = 1; j <rows ; j++)
{
if (arr[rows]==arr[rows+1])
count++;
}
}
if (count>max_repeat)max_repeat=count;
cout <<"Max repeat= "<<max_repeat<<endl;
}
}
Було:
if (mass[j]==mass[i])
Що я просив:
замість mass - arr[row]
Яким чином ви заміною mass на arr[row] отримали
if (arr[rows]==arr[rows+1])
а не
if (arr[rows][j]==arr[rows][i])
можете пояснити? В чому логіка була?
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися