Eliminar numero negativos de una matriz ( sin librerías)

Iniciado por DamnSystem, 14 Diciembre 2017, 01:07 AM

0 Miembros y 1 Visitante están viendo este tema.

DamnSystem

llevo ya mas de dos horas y nada os pongo lo que tengo, la idea es con una matriz que yo he definido en el main eliminar los números negativos de dentro:


// Realizar un módulo para eliminar todos los valores negativos de un vector de
//  enteros. Hacedlo sobre el mismo vector, y sin usar vectores auxiliares.
//  Por ejemplo, después de aplicar dicho módulo al vector (2,-3,1,8,5), éste debe
// quedarse con (2,1,8).

#include <iostream>
using namespace std;

void adios_negativos(int _vector[], int _longitud_vector);

int main() {
    //  Variables y constantes
    int longitud_vector = 8;
    int vector[] = {-1, -2, 3, 4, -7, 8, 9, -11};
   
    //  Desarrallo del programa
    adios_negativos(vector, longitud_vector);
    for(int k = 0; k < longitud_vector; k++){
        cout << vector[k];
    }
    return 0;
}

void adios_negativos(int _vector[], int _longitud_vector){
    for(int i = 0; i < _longitud_vector; i++){
        if(_vector < 0){
            for(int j = i; j < _longitud_vector; j++){
                _vector[j] = _vector[j+1];
            }
        }
    }
}
<3 Stay Hungry, Stay Foolish <3

Serapis

Simplemente debes generar un bucle, con dos índices, el del propio bucle (avance) y el de colocación.


entero k, n

bucle para k desde 0 hasta array.length
   Si (array(k)>=0) luego
       array(n) = array(k)
       n += 1
   Fin si
fin bucle


k es el índice de avance del bucle.
n es el índice de escritura sobre el array. Éste deja de avanzar cuando encuentra un número negativo.

Es algo que si tomas un papel y lápiz y lo haces paso a paso a mano, lo sacas...

Al final del bucle quedarán (array.length - n) ítems sin alterar, que equivale a la cuenta de números negativos encontrados, tu sabrás que se te pide que hagas con ellos, quizás simplemente ponerlos a 0:

Bucle para k desde n hasta array.length
   Array(k) = 0
fin bucle

DamnSystem

no puedo usar funciones ... :(.

La cosa es que yo lo que intento es coger la primera posicion del vector[0], si el numero que tiene es negativo cojo con otro bucle el de la posicion siguiente y lo desplazo a esa posicion asi hasta recorrer todo el bucle vuelvo a la posicion inicial asi hasta eliminar todos los numeros negativo y redimensionar la matriz, pero no se como hacerlo, esto es lo que llevo y el compilador me arroja  -272632288-27263228834-27266322889.



// Realizar un módulo para eliminar todos los valores negativos de un vector de
//  enteros. Hacedlo sobre el mismo vector, y sin usar vectores auxiliares.
//  Por ejemplo, después de aplicar dicho módulo al vector (2,-3,1,8,5), éste debe
// quedarse con (2,1,8).

#include <iostream>
using namespace std;

void adios_negativos(int _vector[], int _longitud_vector);

int main() {
    //  Variables y constantes
    const int longitud_vector = 8;
    int vector[] = {-1, -2, 3, 4, -7, 8, 9, -11};
   
    //  Desarrallo del programa
    adios_negativos(vector, longitud_vector);
    for(int k = 0; k < longitud_vector; k++){
        cout << vector[k];
    }
    return 0;
}

void adios_negativos(int _vector[], int _longitud_vector){
    for(int i = 0; i < _longitud_vector; i++){
        if(_vector < 0){
            for(int j = 0; j < _longitud_vector; j++){
                _vector = _vector[j+1];
            }
        }
    }
}
<3 Stay Hungry, Stay Foolish <3

MAFUS

Un array declarado como int array[dimensión] siempre será del tamaño dimensión. Son estáticos y no se pueden redimensionar. Para eliminar deberían ser dinámicos.

De todas formas se te prohíbe el uso de librerías, no de funciones, por lo que supongo que te piden que hagas un array dinámico con las funciones de insertar, eliminar, leer, etc. Pero que te las tienes que hacer.

DamnSystem

SOLUCIONADO EL PROBLEMA:

// Realizar un módulo para eliminar todos los valores negativos de un vector de
//  enteros. Hacedlo sobre el mismo vector, y sin usar vectores auxiliares.
//  Por ejemplo, después de aplicar dicho módulo al vector (2,-3,1,8,5), éste debe
// quedarse con (2,1,8).

#include <iostream>
using namespace std;

void adios_negativos(int _vector[], int &_longitud_vector);

int main() {
    //  Variables y constantes
    int longitud_vector = 8;
    int vector[] = {-1, -2, 3, 4, -7, 8, 9, -11};
   
    //  Desarrallo del programa
    adios_negativos(vector, longitud_vector);
    for(int k = 0; k < longitud_vector; k++){
        cout << vector[k];
    }
    cout << endl;
    return 0;
}

void adios_negativos(int _vector[], int &_longitud_vector){
    for(int i = 0; i < _longitud_vector; i++){
        if(_vector < 0){
            for(int j = i; j < _longitud_vector -1; j++){
                _vector[j] = _vector[j+1];
            }
            _longitud_vector--;
            i--;
        }
    }
}
<3 Stay Hungry, Stay Foolish <3

Serapis

#5
Ineficiente. La solución que pones usa dos bucles con cada negativo hallado, desplazas todo el contenido del array por encima de él, cada vez.

La solución que yo te ofrecí (que puedes ponerla en una función o no), solo requiere recorrer una única vez el bucle, luego necesita 'k-n' comparaciones y 'n' asginaciones. Incluso para poner a 0 los valores finales en el array (que entonces las asginaciones serían n+ (k-n)) ). Siendo k el tamaño del array y n los positivos encontrados (y k-n los negativos).