2

intenté ingresar N números a mi arreglo y separarlos en arreglos diferentes dependiendo si son impar o par utilizando switch, pero al mostrarlos en consola aparecieron números sin sentido y de varios dígitos, cual pudo haber sido mi error?

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

using namespace std;

int main(){
    int A[100],n;
    int B[100], C[100];
    cout<<"Digite el numero de elementos que tendra el arreglo: ";
    cin>>n;
    
    for(int i= 0; i<n; i++){
        cout<<"Digite un numero: ";
        cin>>A[i];      
    }
    
    for (int i = 0, par = 0, impar = 0; i != 100; ++i)
    switch (A[i] % 2)
    {
        case 0: // Par.
            B[par++] = A[i];
            break;
        case 1: // Impar.
            C[impar++] = A[i];
            break;
    }
    
    for (int i=0; i<n; i++) {
    cout << B[i] << endl;     
    }

    for (int i=0; i<n; i++){
    cout << C[i] << endl;
    }

    getch();
    return 0;
    }
  • Si intentas expresar en lenguaje natural los dos últimos bucles `for` te darás cuenta del error. ¿Qué haría tu programa si le dieras `n=10` números todos pares? – juanrpozo Jun 25 '20 at 19:54
  • Como comenta @juanrpozo tu problema son los limites de los `for`, recomendaria que `par` e `impar` las declares fuera del `for`, ya que estas variables contean la cantidad de elmentos agreagados a cada arreaglo, por ende las uses como tus limites respectivamente para el arreglo de pares e impares. – denso Jun 25 '20 at 23:38

2 Answers2

2

¿Cuál pudo haber sido mi error?

Cuales fueron tus errores, en plural.

  1. En primer lugar, la inicialización de variables:

    int A[100],n;
    int B[100], C[100];
    

    Cuando una variable no es inicializada, ésta obtiene un valor indeterminado1, con tu variable n no pasa nada extraño pues cualquiera que sea su valor original lo sobrescribes dos líneas después de su declaración, pero en el caso de las formaciones2, los trescientos enteros (int) que estás solicitando obtienen un valor indeterminado, para evitar este comportamiento puedes añadir unas llaves vacías a la definición de las formaciones2 lo cuál provocará que todos sus valores se inicialicen a cero:

    int A[100]{},n;         // Todos los elementos de 'A' serán 0.
    int B[100]{}, C[100]{}; // Todos los elementos de 'B' y 'C' serán 0.
    
  2. En segundo lugar, la condición de finalización de tu bucle:

    for (int i = 0, par = 0, impar = 0; i != 100; ++i)
    //                                  ^^^^^^^^ <-- Hasta que 'i' sea diferente a '100'.
    

    Rellenas en A valores hasta la n-ésima posición pero cuando recorres el bucle para analizar el contenido de A lo recorres hasta la centésima posición, esto implica que si n es menor a cien, analizarás 100 - n elementos cuyo valor será indeterminado o dicho de otra manera "números sin sentido y de varios dígitos"1, la corrección evidente es cambiar ese 100 por n:

    for (int i = 0, par = 0, impar = 0; i != n; ++i)
    //                                  ^^^^^^ <-- Hasta que 'i' sea diferente a 'n'.
    

Para acabar, una serie de consejos:

  • NO uses la cabecera <conio.h>, pertenece a las cabeceras de , no de (lee este hilo para saber más). Por otro lado dicha cabecera no es estándar, deberías evitarla incluso si programas en (lee este hilo para saber más).
  • Evita abusar de la cláusula using namespace std, si la usas hazlo en el ámbito lo más pequeño posible. Lee este hilo para saber más.
  • Cuando sea preciso, favorece el pre-incremento antes que el post-incremento, lee este artículo para saber más.
  • Evita abusar de std::endl, lee este hilo para saber más.
  • Si quieres trabajar con colecciones de datos de tamaño indeterminado, evita usar formaciones2, mejor usa un contenedor, lee este hilo para saber cuál.
  • Si quieres operar sobre colecciones de datos, acostúmbrate a usar las herramientas de la cabecera <algorithm>.
  • Evita las variables cuyo nombre sea una sola letra, el nombre de una variable debe ser auto-explicativo.

Siguiendo los consejos anteriores, tu código podría parecerse a:

#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
    using namespace std;

    int numero;
    cout << "Digite el numero de elementos que tendra el arreglo: ";
    cin >> numero;

    vector<int> valores(numero);

    for (auto &valor : valores)
    {
        cout << "Digite un numero: ";
        cin >> valor;
    }

    auto pares = partition(valores.begin(), valores.end(), [](const auto &valor) { return valor % 2; });

    cout << "Numeros pares: ";
    for (auto begin = pares; begin != valores.end(); ++begin)
        cout << *begin << '\n';

    cout << "Numeros impares: ";
    for (auto begin = valores.begin(); begin != pares; ++begin)
        cout << *begin << '\n';

    return 0;
}

  1. Lo que sea que hubiera en la memoria en el espacio que ocupa.
  2. También conocidas como arreglos o en inglés arrays.
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
1

Esto te servirá...

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

using namespace std;

int main(){
    int A[100],n;
    int B[100], C[100];
    int par = 0, impar = 0;
    cout<<"Digite el numero de elementos que tendra el arreglo: ";
    cin>>n;

    for(int i= 0; i<n; i++){
        cout<<"Digite un numero: ";
        cin>>A[i];      
    }

    for(int i = 0; i < n; ++i){
        if(A[i] % 2 == 0){
           B[par] = A[i];
           par++;
        }else{
           C[impar] = A[i];
           impar++;
        }
    }
    cout<<"NUMEROS PARES " << endl;
    for(int i=0; i<par; i++) {
        cout << B[i] << endl;     
    }
    cout<<"NUMEROS IMPARES " << endl;
    for(int i=0; i<impar; i++){
        cout << C[i] << endl;
    }

    getch();
    return 0;
}
MJackson22
  • 69
  • 4