#c
#c
Вопрос:
когда я запускаю его, он выводит список всех целых чисел в массиве, но затем он отбрасывает последние три цикла and и навсегда. я не могу понять это, некоторая конструктивная критика была бы оценена.
#include <iostream>
#include <unistd.h>
int ary[8] = {3, 7, 8, 1, 3, 45, 19};
int len (sizeof(ary)/sizeof(ary[0]));
int right = 1;
int g;
int g2;
int main()
{
while(right != len)
{
for(int i = 0; i <= len; i )
std::cout << ", " << ary[i];
std::cout << "n";
usleep(120000);
for(int i = 0; i <= len; i )
{
if(ary[i] <= ary[i 1])
{
right ;
}
else
{
g = ary[i];
g2 = ary[i 1];
ary[i] = g2;
ary[i 1] = g;
}
}
}
}
Комментарии:
1. последний допустимый индекс в массиве размером N равен N-1
2. Не похоже, что он будет сортировать. Вы просто меняете местами элементы, если они не в порядке, но вы передаете массив один раз. Практически, вам нужно сделать это N ^ 2 раза, чтобы убедиться, что весь массив отсортирован. N — длина массива.
3. Я рекомендую использовать отладчик. Отладчик позволит вам выполнить один шаг по вашему коду, просматривая значения в переменных.
4. Еще одна идея отладки: после каждого обмена выводите весь массив с индексами.
Ответ №1:
итак, то, что вы пытались сделать здесь, выглядит примерно как пузырьковая сортировка. я исправил ошибки в вашем коде, вот рабочая версия:
#include <iostream>
#include <unistd.h>
int ary[8] = {3, 7, 8, 1, 3, 45, 19};
int len (sizeof(ary)/sizeof(ary[0]));
int right = 1;
int g;
int g2;
int main()
{
while(right != len)
{
// the value of the variable 'right' needs to be reset to 1 everytime you loop
right = 1;
for(int i = 0; i < len; i )
std::cout << ", " << ary[i];
std::cout << "n";
usleep(120000);
// as arrays in c are zero-indexed, the last element is index len - 1
for(int i = 0; i < len - 1; i )
{
if(ary[i] <= ary[i 1])
{
right ;
}
else
{
g = ary[i];
g2 = ary[i 1];
ary[i] = g2;
ary[i 1] = g;
}
}
}
}
есть одна вещь, которая действительно привлекла мое внимание и является действительно плохой практикой: то, как вы поменяли местами переменные
// you only need at most 3 variables to swap
g = ary[i];
ary[i] = ary[i 1];
ary[i 1] = g;
// or you can do built-in:
std::swap(ary[i], ary[i 1]);
даже если пытаться разобраться в этом самостоятельно — хорошая практика и обычно помогает, в этом случае, я думаю, вам следует прочитать некоторую документацию.
для справки, вот как выглядит обычная пузырьковая сортировка:
#include <iostream>
int a[] = {3, 7, 8, 1, 3, 45, 19};
const int len = sizeof(a) / sizeof(int);
int main () {
for (int i=0; i<len; i) {
for (int j=i 1; j<len; j) {
if (a[i] > a[j])
std::swap(a[i], a[j]);
}
}
for (int i=0; i<len; i)
std::cout << a[i] << ' ';
return 0;
}
спасибо за ваше время и удачи в написании кода (:
Ответ №2:
это продолжается вечно, потому что цикл for будет сравнивать последний элемент i [8] с i [8 1], а i [8 1] равен нулю, поэтому для решения этой проблемы
for(int i = 0; i < len - 1; i )
вместо
for(int i = 0; i <= len; i )
попробуйте это:
#include <iostream>
#include <unistd.h>
int ary[8] = {3, 7, 8, 1, 3, 45, 19};
int len (sizeof(ary)/sizeof(ary[0]));
int Round = 0;
int g;
int g2;
int main()
{
while(Round != len)
{
for(int i = 0; i < len; i )
std::cout << ", " << ary[i];
std::cout << "n";
usleep(120000);
for(int i = 0; i < len - 1; i )
{
if(ary[i] <= ary[i 1])
{
continue;
}
else
{
g = ary[i];
g2 = ary[i 1];
ary[i] = g2;
ary[i 1] = g;
}
}
Round ;
}
}