Datos previo y siquiente en un arreglo

Iniciado por nolasco281, 28 Abril 2014, 00:44 AM

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

nolasco281

Hola de nuevo yo molestando.

estaba tratando de hacer que detecte que datos hay a la izquierda y a la derecha de un arreglo.

Ejemplo:

Arreglo:

indices

0     1     2      3      4       5
10  20    30    40     50     60    // <- datos

Si selecciona el indice 3

me diga que le que esta previo es 30 y el siquiente es 50

tengo esto

Código (cpp) [Seleccionar]
cout << ("Ingrese un indice y vera los datos que hay previo y sequiente");
   
cin >> prevSiqu;
       
       if(prevSiqu < 0 || prevSiqu >= Tam)
       {
           cout << ("p: mala posicion.\n");
       }
       cout << (prevSiqu+1);
       
       if(prevSiqu <= 0 || prevSiqu > Tam)
       {
           cout << ("p: mala pocicion. \n");
       }
       cout << (prevSiqu-1);


Hace el previo pero no el siquiente y no se por que, ni que estoy haciendo mal.

Gracias saludos
Lo que se puede imaginar... se puede programar.

vangodp

cuando vayas imprimir:

cout << "posicion actual:" << tabla;
cout << "posicion anterior:" << tabla[i - 1];
cout << "posicion seguiente:" << tabla[i +1];

has un cin para guardar la posicion de la tabla que quieras ver.

int i = 0;
cout << "cual es la posicion"
cin>>i;
cout << "posicion actual:" << tabla;
cout << "posicion anterior:" << tabla[i - 1];
cout << "posicion seguiente:" << tabla[i +1];

Espero que sirva XD

noele1995

Algo asi deberia funcionar

Código (cpp) [Seleccionar]
cin >> indice;
if(indice < 0 || indice >= array_len)
{
   cout << "fuera del array" << endl;
}
else
{
   if(indice != 0)
       cout << "previo: " << arreglo[indice - 1] << endl;
   else
       cout << "no hay previo" << endl;

   if(indice != array_len - 1)
       cout << "siguiente: " << arreglo[indice + 1] << endl;
   else
       cout << "no hay siguiente" << endl;
}


Saludos

nolasco281

#3
la salida de noele1995

es esta, y no me detecta el previo en ningun caso.



y la de vangodp es la correcta me toma los valores de iz y derecha.

Código (cpp) [Seleccionar]
for (int i = 0; i < Datos.length; i++)
       {
           if(i == prevSiqu)
           {
               cout << ("En el dato a la izquirda es: " << Datos[i-1] << "\n"
                                  << "El dato a la derecha es: " << Datos[i+1]);
           }

Lo que se puede imaginar... se puede programar.

nolasco281

Creo que noele1995 se confundio en el primer if

Código (cpp) [Seleccionar]
if(indice != 0)
Código (cpp) [Seleccionar]

if(indice != array_len + 1) //Lo deje asi y funciono perfecto


Muchas gracias a los dos  ;-)

Saludos y cuidense.
Lo que se puede imaginar... se puede programar.

vangodp

    cin >> indice;
    if(indice < 0 || indice >= array_len)//si indice es menor que 0 o mayor o igual que el array len
    {
       cout << "fuera del array" << endl;
    }
    else
    {
       if(indice != 0) // indice no sea 0 creo que el error es que no permite buscar en la posicion 0 y si deberia poder, otra cosa es que aya "previo" en este caso
           cout << "previo: " << arreglo[indice - 1] << endl;
       else
           cout << "no hay previo" << endl;
     
       if(indice != array_len - 1) //si indice no es mayor que array_len-1 es otro fallo o puede que no, si es un char no deberías mostrar esta posición ya que la ultima posición len - 1 se recomienda que sea un cero por otro lado no veo ningún problema en mostrar esta posición.
           cout << "siguiente: " << arreglo[indice + 1] << endl;
       else
           cout << "no hay siguiente" << endl;
    }

vamos a pensar un poco... se debe dejar mostrar todas las posiciones pero si estas en la posición 0 de una tabla no existe la posicion -1, lo mismo ocurre con la posicion len o TAM como os guste llamarla, si estamos en la ultima posición¿¿Por que no se puede mostrar?? Lo que no se debe mostrar es prev si estas en la posicion 0 ni siguiente si estas en la ultima ya que nos estariamos saliendo de la tabla.

seria un par de if especiales:
if (posicion == tabla[0]){
  //ver posición actual
  //ver posicion siguiente
}

¡Si! no quieres ver posición actual pues no ponga XDDD

Para el fin seria:
if (posicion == tabla[max_TAM]){
  //ver posición anterior
  //ver posición actual
}

luego para todas las demas si se debe dejar ver todo.

if ( posicion > tabla[0] && posicion < tabla[ max_TAM] ){
  //ver posición anterior
  //ver posición actual
  //ver posicion siguiente
}

Así es como lo veo la solución puede que me equivoque, si me equivoco pues decir abajo ;)
me he inventado mis nombres de variables jeje asi soy yo, vosotros pongan las vuestras ^^
Suerte compañeros!





amchacon

Citarseria un par de if especiales:
if (posicion == tabla[0]){
  //ver posición actual
  //ver posicion siguiente
}

¡Si! no quieres ver posición actual pues no ponga XDDD

Para el fin seria:
if (posicion == tabla[max_TAM]){
  //ver posición anterior
  //ver posición actual
}

luego para todas las demas si se debe dejar ver todo.

if ( posicion > tabla[0] && posicion < tabla[ max_TAM] ){
  //ver posición anterior
  //ver posición actual
  //ver posicion siguiente
}
Vangob, has cometido un error de novatillo ;D.

Es el indice, no tabla[0].
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

noele1995

A mi si que me funciona, a ver lo dejo comentado y con un ejemplo:
Código (cpp) [Seleccionar]
#include <iostream>

using namespace std;

const int ARRAY_LEN = 6; //numero de elementos del array

int arreglo[] = { 10, 20, 30 ,40 ,50,60};

int main (void)
{
int indice;
cin >> indice;
if(indice < 0 || indice >= ARRAY_LEN) // entonces no es un indice de nuestro arreglo
{
cout << "fuera del array" << endl;
}
else
{
if(indice != 0) //si es 0 no hay previo puesto que no existe indice -1 en otro caso lo muestra
cout << "previo: " << arreglo[indice - 1] << endl;
else
cout << "no hay previo" << endl;

if(indice != ARRAY_LEN - 1) //si es DIM - 1 (5) no hay siguiente en otro caso lo muestra
cout << "siguiente: " << arreglo[indice + 1] << endl;
else
cout << "no hay siguiente" << endl;
}

return 0;
}


Para entrada no devuelve previo y para entrada 5 no devuelve el siguiente, para cualquier otra entrada que sea un indice del arreglo devuelve ambos.

Saludos

vangodp

#8
¿¿¿Estoy perdonado???  ;D ;D ;D
Código (cpp) [Seleccionar]

#include <iostream>
#include <windows.h>
using namespace std;
    class clase{
        public:
            clase(){ suIndice = 0;
                     suTabla = "0123456789";
                     suMinimo = 0;
                     suMaximo = (suTabla.size()-1);                       
                   }
            ~clase(){}
           
            int getIndice ()const{return suIndice;}
           
            bool esMenor(int unIndice){if( unIndice < suMinimo ) {return true; } else{return false;} }
            bool esMayor(int unIndice){if( unIndice > suMaximo ) {return true; } else{return false;} }

            void bucle();
        private:
            int suIndice;
            int suMinimo;
            int suMaximo;
            string suTabla;       
    };
    void clase::bucle(){
        int salir = 0;
        while ( true ){
           
            cout << "\n-Entre el indice de 0 a 9: ";
            cin >> suIndice;
            system("cls");
         
            if ( esMenor(suIndice) || esMayor(suIndice)  ){
                   
                cout << "VALOR FUERA DE INDICE!!!" << endl;
            }
            if ( suIndice == suMinimo || suIndice == suMaximo ){
               
                if( suIndice == suMinimo ){

                    cout << "El seguiente valor es: " << suTabla[ suIndice+1 ] << endl;
                   
                }

                if ( suIndice == suMaximo ){

                    cout << "El valor anterior es: "  << suTabla[ suIndice-1 ] << endl;
                   
                }

            }else if( suIndice > suMinimo && suIndice < suMaximo ){
               
                cout << "El valor anterior es: "  << suTabla[ suIndice-1 ] << endl;
                cout << "El seguiente valor es: " << suTabla[ suIndice+1 ] << endl;
               
            }         
           
            cout << "Desea realizar otra operacion?\n0-salir\n1-seguir\n\nY bien?: ";
            cin>>salir;
           
            system("cls");
            if( salir == 0 )
                break;
             
        }
        cout << "baybay!";
    }


int main () {
system ( "MODE CON cols=50 lines=15" );

    clase c;
    c.bucle();

system("pause>nul");
return 0;
}

leosansan

Cita de: noele1995 en 28 Abril 2014, 12:39 PM
A mi si que me funciona, a ver lo dejo comentado y con un ejemplo:
Código (cpp) [Seleccionar]
#include <iostream>

using namespace std;

const int ARRAY_LEN = 6; //numero de elementos del array

int arreglo[] = { 10, 20, 30 ,40 ,50,60};
..........................

..................

Por un lado no es aconsejable declarar arreglo como global, no le veo el sentido y por otro lado tampoco veo declarar la longitud del array, esta vendrá determinada en este caso por su contenido: si cambias su valor a uno mayor, por ejemplo, te irás a posiciones fuera del array y, en cambio, si cambias el contenido del array, aumentándolo por ejemplo, te quedarás corto con ARRAY_LEN . Es decir para un cambio en el contenido  del array tienes que hacer dos cambios, en el array y en su longitud.

Mejor calcular la longitud del array en función de su contenido, yo lo hago tipo C, y así si cambias el array no tienes que cambiar su longitud ya que la calculas a posteriori:

Código (cpp) [Seleccionar]
#include <iostream>

using namespace std;

int main (void){
int arreglo[] = { 10, 20, 30 ,40 ,50,60};
int indice ,ARRAY_LEN = sizeof arreglo/ sizeof *arreglo;
cout << "Introduzca el indice (0-" <<ARRAY_LEN-1<<"):";
cin >> indice;
if(indice < 0 || indice >= ARRAY_LEN) // entonces no es un indice de nuestro arreglo
cout << "fuera del array" << endl;
else{
if(indice != 0) //si es 0 no h
.........................


Y amigo vangodp quidadito con esto:

Cita de: vangodp en 28 Abril 2014, 14:38 PM
¿¿¿Estoy perdonado???  ;D ;D ;D
Código (cpp) [Seleccionar]

#include <iostream>
#include <windows.h>
using namespace std;
   ................................................
system("pause>nul"); <==ESTOOOOOOOOOO
return 0;
}


El "system("pause>nul")" te crea un fichero null.txt. Mejor usar getchar si lo que quieres es parar el programa.

¡¡¡¡ Saluditos! ..... !!!!