Nabeel Munir Ответов: 2

Здравствуйте, я пытаюсь сортировать пузырьки в C++


Я должен написать программу на c++, которая печатает 2d массив из N и M случайных чисел. N и M вводятся пользователем. Затем мне нужно найти наибольшее значение в каждой строке и отсортировать его в порядке возрастания с помощью пузырьковой сортировки.

Ниже приводится правильное объяснение этой проблемы:

Напишите программу, которая заполняет значения двумерного массива A[N,M] случайными числами от 10 до 90 и определяет наибольшее значение в каждой строке. Строки с наибольшими значениями элементов располагаются в порядке возрастания, используя алгоритм сортировки "пузырь". N и M вводимые пользователем.

Что я уже пробовал:

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;


int main()
{
	srand(time(0));
	int i, j, r, c, temp = 0;
	cout << " how many rows?";
	cin >> r;
	cout << "how many cloumns?";
	cin >> c;
	int a[r][c];

	for (i = 0; i<r; i++)
	{
		for (j = 0; j<c; j++)
		{
			a[i][j] = rand() % 80 + 10;
		}
		cout << endl;
	}
	cout << endl;

	for (i = 0; i<r; i++) {
		for (j = 0; j<c; j++) {
			cout << " " << a[i][j];
		}
		cout << endl;
	}

	for (int i = 0; i < r; i++)
	{
		int max = a[i][0];
		for (int j = 1; j < c; j++)
		{
			if (a[i][j] > max)
			{
				max = a[i][j];
			}
		}
		cout << "Highest value in row " << i << " is: " << max << endl;
	}
	for (int i = 0; i < r; i++)
	{
		int max = a[i][0];
		for (int j = 1; j - 1 < c; j++)
		{
			if (max > a[j + 1])
			{
				temp = max;
				max = a[j + 1];
				a[j + 1] = temp;
			}
		}

	}
	for (int i = 0; i < r; i++)
	{
		cout << a[i][j];
	}
}

Patrice T

А у вас есть вопрос ?

Rick York

Некоторые советы по кодированию : используйте некоторые функции для различных аспектов программы, таких как заполнение массива и сортировка строк. Я бы заставил функции работать по одной строке матрицы за раз. В качестве аргументов они будут принимать указатель на строку и количество элементов в строке.

CPallini

Почему бы вам не использовать std::vector?

2 Ответов

Рейтинг:
1

OriginalGriff

Во-первых, либо прекратите создавать новые переменные в вашем for петли, конечно, дают им разные названия. i и j вы объявляете в начале метода. Когда вы это сделаете:

int i = 666;
for (int i = 0; i < 5; i++)
   cout << i << "\n";
cout << i << "\n";
Есть две переменные с одинаковым именем, и они не "связаны". Выход будет таким:
0
1
2
3
4
666
Потому что внутренняя самая переменная i маскирует самую внешнюю переменную i пока он не выйдет из области видимости в конце цикла и не будет уничтожен.

Итак, к тому времени, когда вы доберетесь до последнего цикла, какое значение вы ожидаете j сдерживать?
for (int i = 0; i < r; i++)
{
    cout << a[i][j];
}
Ответ: j будет иметь то же значение, что и c и будет индексировать элемент массива, который не имеет значения.

Когда вы немного очистите все, чтобы было немного более очевидно, что происходит, вы можете начать искать проблемы во время выполнения.

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

Итак, теперь вы входите во вторую стадию разработки (на самом деле это четвертая или пятая, но вы перейдете к более ранним стадиям позже): тестирование и отладка.

Начните с рассмотрения того, что он делает, и как это отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а затем удвоить его и напечатать ответ, то если бы ввод / вывод был таким:
Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его - он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он находится где-то здесь:
int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить, почему. Поместите точку останова в первую строку метода и запустите приложение. Когда он достигнет точки останова, отладчик остановится и передаст управление вам. Теперь вы можете запускать свой код построчно (так называемый "одноступенчатый") и просматривать (или даже изменять) содержимое переменных по мере необходимости (черт возьми, вы даже можете изменить код и повторить попытку, если вам это нужно).
Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она действительно делала, когда вы использовали кнопку "Step over" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?
Надеюсь, это поможет вам определить, в какой части этого кода есть проблема и в чем она заключается.
Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он только улучшается при использовании!


Рейтинг:
1

KarstenK

Советы от OriginalGriff абсолютно верны, но, как я вижу, ваш код не будет компилироваться, потому что вам нужен какой-то другой код с динамической памятью.

int a = new int[r*c];
Выделяет достаточно памяти для целого числа r * C. В конце вашего кода Вы должны
delete a;

И, как сказал OriginalGriff, будьте осторожны с переменными. Я бы назвал такую важную переменную не "А", а "массив".

Хорошее именование - это основа хорошего кода. ;-)