Определять число элементов между первым и последним элементом нуль массива

Определять число элементов между первым и последним элементом ноль, а именно между первым нулем и последним нулем в массиве с динамической памятью. Следующий код прокручивает изображение в окне без ошибки, но результат не правилен.

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <conio.h>

using namespace std;

int main()
{
    int r,c, i, j, count=0;
    cout<<"\n Input number of rows: "; cin>>r;
    cout<<" Input number of columns: "; cin>>c;
    srand(time(NULL));

    int **m = new int* [r];
    for (int i=0; i<r; i++) {
        m[i] = new int[c];  }

    for (i=0; i<r; i++) {
        m[i] = new int[c];
        for (j=0; j<c; j++)  {
            m[i][j] = rand()%200-100; cout<<m[i][j]<<"\t";  }
        cout<<endl;  }
    cout<<endl;

    for (i=0; i<r; i++) {
        for (j=0; j<c; j++)  {
            if (m[i][j]==0)
                break;
            else
                count++; 
        if (j!=c)
            break;   }  }

    if (i!=r && j!=c) {
        for (i=r-1; i>=0; i--)  {
            for (j=c-1; j>=0; j--)  {
                if (m[i][j]==0)
                    break;
                else
                    count++;  
            if (j!=c)
                break;    }   }  }

    cout<<"\n Total of elements between the first and last zero element: " <<r*c-count<<endl;

    delete []m; 

    _getch();
}
1
задан 06.04.2016, 19:02
2 ответа

Поскольку он упоминает eferion, есть ошибки в алгоритме поисков

Ты можешь использовать этот код, чтобы находить оба нуля в двухмерном array

Если ты находишь 0, нужно видеть, соответствует ли он первому или второму, чтобы распределять переменные i1 и j1 или i2 и j2, как он соответствовал, однако, если это первый случай, нужно продолжать, чтобы продолжать искать второго. Если находится второй 0, мы можем выходить из обоих for используя один goto и один label

// Encontrar 
int i1 = -1;
int j1 = -1;
int i2 = -1;
int j2 = -1;
bool foundTwoZeros = false;

for (i = 0; i < r; i++) {
    for (j = 0; j < c; j++) {
        if (m[i][j] == 0)
            if (i1 == -1 && j1 == -1)
            {
                i1 = i;
                j1 = j;
            }
            else
            {
                i2 = i;
                j2 = j;
                foundTwoZeros = true;
                goto foundTwoZeros;
            }
    }
}

foundTwoZeros:

В конце концов чтобы вычислять все элементы есть между обоими нулями, мы делаем простое математическое преобразование.

Если мы обращаем двухмерную договоренность в договоренность unidimensional, новое положение в договоренности дано sgte из-за выражения

pos = numElementosXFila * i + j // pseudocódigo

В твоем случае он был бы:

int pos1 = c * i1 + j1;
int pos2 = c * i2 + j2;

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

count = pos2 - pos1 - 1;

Я оставляю тебе полный код:

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <conio.h>

using namespace std;

int main()
{
    int r, c, i, j, count = 0;
    cout << "\n Input number of rows: "; cin >> r;
    cout << " Input number of columns: "; cin >> c;
    srand(time(NULL));


    int **m = new int*[r];
    for (int i = 0; i < r; i++) {
        m[i] = new int[c];
    }

    for (i = 0; i < r; i++) {
        m[i] = new int[c];
        for (j = 0; j < c; j++) {
            m[i][j] = rand() % 200 - 100;
            cout << m[i][j] << "\t";
        }
        cout << endl;
    }
    cout << endl;

    // Encontrar los ceros
    int i1 = -1;
    int j1 = -1;
    int i2 = -1;
    int j2 = -1;
    bool foundTwoZeros = false;

    for (i = 0; i < r; i++) {
        for (j = 0; j < c; j++) {
            if (m[i][j] == 0)
                if (i1 == -1 && j1 == -1)
                {
                    i1 = i;
                    j1 = j;
                }
                else
                {
                    i2 = i;
                    j2 = j;
                    foundTwoZeros = true;
                    goto foundTwoZeros;
                }
        }
    }

foundTwoZeros:

    if (foundTwoZeros)
    {
        int pos1 = c * i1 + j1;  // pos1 es la posicion del primer 0
                                 // en un array unidimensional
        int pos2 = c * i2 + j2;  // pos2 es la posición del segundo 0
                                 // en un array unidimenisonal
        count = pos2 - pos1 - 1; // la distancia de ambos puntos - 1
                                 // te dará cuantos elementos hay entre estos

        cout << "\n Total of elements between the first and last zero element: " << count << endl;
    }
    else
    {
        cout << "\n There are no two zero elements";
    }

    delete []m;

    _getch();
}
0
ответ дан 24.11.2019, 14:37
  • 1
    Это прокрутив изображение в окне он правилен, когда нет нулей, но когда есть нули, не является правильным ответ и ответ выходит отрицательным. –  Neon 06.04.2016, 20:04
  • 2
    С какой стоимостью estas пытаясь, и который является результатом, который ты получаешь, и ожидаемым? Имей в виду, что они n и # 250; морские окуни - random, podr и # 237; схвати пытаться с датой est и # 225; костариканская? –  Carlos Muñoz 06.04.2016, 20:12
  • 3
    Cambi и # 233; < < рэнд () %100-0> > и я ввожу стоимость tama и # 241; или 10x10. Так как с < < рэнд () %200-100> > не выходи и # 237; an нули. –  Neon 06.04.2016, 20:16
  • 4
    И который произошедший ты получаешь? Пожалуйста помоги мне помогать тебе, он скроллирует меня верно. Я не могу быть все время решаясь проблему а ты помещаешь усилие твоей стороны. –  Carlos Muñoz 06.04.2016, 20:21

Как первый совет рекомендовал бы не использовать тебе conio.h. Это не стандартный книжный магазин и сомнительной утилиты в реальных разработках.

С другой стороны, когда ты делаешь delete []m; ты должен осознавать, из которого ты не удаляешь больше ничего, что m, резервы размера c они остаются в лимбе. Общая норма - что из-за каждый new ты должен включать один delete и в твоем коде есть два new и уникум delete.

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

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

Рекомендации - это, рекомендации, они не обязанного исполнения, но никогда не больше и могут помогать тебе совершать меньше ошибок в будущем.

Деталь, которая я кричит особенно, состоит в том, чтобы вычислять дистанцию двух элементов массива. Ты сказал array, потом я боюсь, что ты не должен создавать массив а вектор элементов. Если мои подозрения верные, алгоритм идет упрощать тебя очень много. Если, взамен, оказывается, что ты должен создавать массив, он у меня не заканчивает оставаться ясным, почему ты понимаешь, что дистанция между двумя элементами перемещает из-за linealizar массив как будто это был вектор.

Ну, мы будем проверять первый цикл твоего алгоритма поисков:

for (int i=0; i<r; i++) {
  for (int j=0; j<c; j++)  {
    if (m[i][j]==0)
      break;
    else
      count++; 
    if (j!=c)
      break;
  }
}

Имей в виду, что break только оставь цикл и у тебя есть два укрытых. Прибыв в break, выполнение оставит цикл j и он продолжит выполнять цикл i, а следовательно он закончит тем, что войдет снова в цикл j. Во втором цикле он перемещает точно то же самое тебя.

Если идея состоит в том, чтобы искать два положения внутри вектора (и ты относишься к массиву как к вектору), он предпочитал управлять прямо о векторе.

// Un único new implica un único delete
int* vector = new int[filas*columnas];

В конце концов, поиски первого и последний элемент характеристик X мог бы герметизироваться в корпусе в функции, избегая удваивать код. Чтобы делать эту часть есть несколько выборов, хотя, может быть, самая простая будет функцией, которая возвращала бы следующее данное положение стоимости, начальное положение и-1, если нет больше стоимости. Тогда ты просишь первую стоимость и после просишь второго в цикле до тех пор, пока функция не возвращает тебе-1, стоимость, которая дала тебе предыдущий раз (и что ты должен запоминать) это положение последнего '0' из списка. Немного с такой подписью, которая:

// valor es el número a buscar
// ptr el inicio del vector
// inicio es el índice por donde empieza a buscar
// final indica el índice donde debe finalizar la búsqueda (final del array)
int Posicion(int valor, int* ptr, int inicio, int final);

Приветствие.

0
ответ дан 24.11.2019, 14:37
  • 1
    То, что он перемещает, состоит в том, что я не имею, я не должен делать это с функциями, а в главной функции. –  Neon 06.04.2016, 18:49
  • 2
    Это funci и # 243; n была в плане подсказка. Возможно делать верно без функций. –  eferion 06.04.2016, 18:53