¿Cuál pudo haber sido mi error?
Cuales fueron tus errores, en plural.
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.
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 c, no de c++ (lee este hilo para saber más). Por otro lado dicha cabecera no es estándar, deberías evitarla incluso si programas en c (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;
}
- Lo que sea que hubiera en la memoria en el espacio que ocupa.
- También conocidas como arreglos o en inglés arrays.