Cita de: Estudiante000000 en 16 Noviembre 2018, 01:21 AM
Continuando y analizando este programa.
.
Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.
Mostrar Mensajes MenúCita de: Estudiante000000 en 16 Noviembre 2018, 01:21 AM
Continuando y analizando este programa.
.
Cita de: YreX-DwX en 19 Noviembre 2018, 03:30 AM
Sí, sería incorrecto, en primer lugar porque el segundo campo del <for> que debería ser una condición, no lo es, es una asignación. El funcionamiento de ese <for> es el siguiente: entras en el <for> y se asigna el valor inicial <i = 0>. Se llega a la condición que como no es una condición sino una asignación se ejecuta entonces ahora <i = 9>. Se ejecuta el interior del bucle. Termina una iteración y se produce el incremento <i = 10>, se llega a la condición de nuevo y... <i = 9>. Se vuelve a ejecutar el bucle.
Conclusión: tenemos un bucle infinito en el que i siempre vale 9.
Resumen: <a = b> asignas a <a> el valor de <b>
<a == b> comparas que el valor de <a> y el de <b> sean iguales
Quieres probarlo? Simple, ejecuta esto (no hace falta que modifiques nada) y podrás ver los valores de i por pantalla (no esperes que acabe):
#include <iostream>
using namespace std;
int main(){
for(int i = 0; i = 9; i++)
cout << i << endl;
}
En todo caso la otra opción (haciendo correctamente una condición y no una asignación) sería usando dos iguales, tal que así:
#include <iostream>
using namespace std;
int main(){
for(int i = 0; i == 9; i++)
cout << "El bucle se ha ejecutado" << endl;
}
Resultado de este código: NINGUNO. Empieza el bucle <i = 0>, llegamos a la condición... ¿<i == 9>? No, <i = 0>; entonces sale del bucle. Nunca llegará a ejecutarse lo que haya dentro del bucle.
Cita de: YreX-DwX en 19 Noviembre 2018, 02:45 AM
Primero:
Porque lo que hacías antes era intercambiar el valor de la posición <i> de <pares> (o <impares>) por la de <numeros> pero con guardar el valor de <numeros> en <pares> o <impares> es suficiente.
Tú al usar una variable auxiliar estabas por decirlo de alguna manera borrando cada elemento una vez que trabajabas con él, pero no era necesario.
Segundo:
for(i=0;i<10;i++){
if(numeros[i]%2==0){
if(numeros[i] % 2 == 0)
Aquí estás repitiendo dos veces el mismo <if>, borra uno de ellos.
Y no imprimir 0 te doy una pista: al finalizar el <for> donde clasificas los números en <pares> e <impares>; <contadorPar> vale la cantidad de dígitos pares y <contadorImpar> de la misma manera vale la cantidad de dígitos impares. Úsalos en los últimos bucles <for>.
#include<iostream>
#include<cstdlib>
using namespace std;
int main(){
const int TAM =10;
int numeros[TAM];
int pares[TAM]={0};
int impares[TAM]={0};
int i;
int contadorPar=0 , contadorImpar=0;
for(i=0;i<TAM;i++){
cout<<i+1<<"-Digite un numero = ";
cin>>numeros[i];
}
for(i=0;i<TAM;i++){
if(numeros[i]%2==0){
pares[contadorPar] = numeros[i];
contadorPar++;
}
else {
impares[contadorImpar] = numeros[i];
contadorImpar++;
}
}
cout<<"\n";
cout<<"Numeros Pares ";
cout<<"\n";
cout<<"\n";
for(i=0;i<contadorPar;i=i++){
cout<<pares[i]<<" ";
}
cout<<"\n";
cout<<"\n";
cout<<"Numeros Impares ";
cout<<"\n";
cout<<"\n";
for(i=0;i<contadorImpar;i=i++){
cout<<impares[i]<<" ";
}
cin.get();
return 0;
}
for(i=0;i=9;i++){
}
Cita de: YreX-DwX en 19 Noviembre 2018, 02:14 AM
Exacto, no puedes dar por hecho que van a estar ordenados.
Además para no desperdiciar posiciones del vector, es más correcto introducirlos seguidos que no introducir un valor cada 2 o cada n posiciones.
#include<iostream>
#include<cstdlib>
using namespace std;
int main(){
int numeros[10];
int pares[10]={0};
int impares[10]={0};
int i;
int contadorPar=0 , contadorImpar=0;
for(i=0;i<10;i++){
cout<<i+1<<"-Digite un numero = ";
cin>>numeros[i];
}
for(i=0;i<10;i++){
if(numeros[i]%2==0){
if(numeros[i] % 2 == 0){
pares[contadorPar] = numeros[i];
contadorPar++;
}
}
else {
impares[contadorImpar] = numeros[i];
contadorImpar++;
}
}
cout<<"Numeros Pares ";
cout<<"\n";
cout<<"\n";
for(i=0;i<10;i=i++){
cout<<pares[i]<<" ";
}
cout<<"\n";
cout<<"\n";
cout<<"Numeros Impares ";
cout<<"\n";
cout<<"\n";
for(i=0;i<10;i=i+2){
cout<<impares[i]<<" ";
}
cin.get();
return 0;
}
Cita de: YreX-DwX en 19 Noviembre 2018, 01:56 AM
Cierto, no me había dado cuenta que podías imprimirlos de dos en dos
Ya para terminar de pulir ese código:
- En vez de ir poniendo un <cout> para cada salto de línea puedes poner por ejemplo:
cout << "Numeros Impares " << endl << endl;
Y ya tienes ahí dos saltos de línea.
- O declarar una constante para el tamaño de los vectores por si más adelante quieres guardar 20 números, sólo tienes que modificarlo en un sitio:
const int TAM = 10;
Y usar la variable <TAM> en el programa donde has usado el <10> directamente. Así consigues programas más genéricos.
Cita de: YreX-DwX en 19 Noviembre 2018, 01:44 AM
Tienes varias opciones para hacerlo:
- Opción 1: Usar contadores independientes para cada vector. En ese caso te quedaría algo así:
int contadorPar = 0, contadorImpar = 0;
for(i = 0; i < 10; i++)
if(numeros[i] % 2 == 0){
pares[contadorPar] = numeros[i];
contadorPar++;
}
else{
impares[contadorImpar] = numeros[i];
contadorImpar++;
}
De esta manera cada vector <pares> e <impares> tendrán los elementos en sus 5 primeras posiciones (si imprimes hasta 10 verás que las 5 últimas ya no tienen nada). Me he evitado todo lo que tienes tú en cada <if>; ya que tú lo que haces es sustituir el elemento de <numeros> por 0 una vez lo guardas en el otro vector, algo que no es necesario para que el programa funcione correctamente, pero que si te lo piden así está bien hecho.
- Opción 2: No mostrar los elementos que sean 0. En este caso no puedes usar tu código:En este caso muestras los elementos MIENTRAS un elemento no sea 0, entonces en cuanto encuentra un 0 va a dejar de imprimir. Además el tema de que se repita el 2 continuamente es porque al usar un <while> el incremento <i++> del <for> tienes que hacerlo explícitamente dentro del <while>.
Para que esta segunda opción funcione tendrías que hacerlo con un <for> para recorrer el vector como antes y un <if> dentro para no imprimir los valores que sean 0. El código sería de este estilo:
for(i = 0; i < 10; i++)
if(pares[i] != 0)
cout << pares[i] << " ";
La opción más correcta es la primera pero te muestro la segunda para que veas que es posible plantear tu idea.
#include<iostream>
#include<cstdlib>
using namespace std;
int main(){
int numeros[10] = {1,2,3,4,5,6,7,8,9,10};
int pares[10]={0};
int impares[10]={0};
int i,j,aux1,aux2;
for(i=0;i<10;i++){
if(numeros[i]%2==0){
aux1=numeros[i];
numeros[i]=pares[i];
pares[i]=aux1;
}
else {
aux2=numeros[i];
numeros[i]=impares[i];
impares[i]=aux2;
}
}
cout<<"Numeros Pares ";
cout<<"\n";
cout<<"\n";
for(i=1;i<10;i=i+2){
cout<<pares[i]<<" ";
}
cout<<"\n";
cout<<"\n";
cout<<"Numeros Impares ";
cout<<"\n";
cout<<"\n";
for(i=0;i<10;i=i+2){
cout<<impares[i]<<" ";
}
cin.get();
return 0;
}
Cita de: YreX-DwX en 18 Noviembre 2018, 23:52 PM
El problema está en que los vectores <pares> e <impares> no están inicializados a 0. Entonces en el <for> como el primer número es impar se guarda en <impares[0]> pero ¿qué queda en pares[0]? basura, es decir, un número desconocido. Siguiente iteración: el 2 es par entonces se guarda en pares[1]; pero... ¿qué hay en impares[1]? basura. Y así hasta el final.
Para que veas lo que te digo si inicializamos los vectores <pares> e <impares> a 0 de esta manera:
int pares[10] = {0};
int impares[10] = {0};
Veremos como nos sale el resultado esperado pero intercalando un 0. El 0 sale porque ahora en vez de haber basura hemos llenado el vector de 0. Entonces en cada iteración se guarda el número en un vector y en el otro vector habrá un 0.
PD: Para mejorar un poco más el código, si para saber si es par hacemos:
if(numeros[i]%2==0)
Cuando es impar? Siempre que no sea par. Por lo tanto con poner el else sin otra condición el programa funciona correctamente y nos ahorramos el segundo <if>.
Ahora puedes pensar como hacer para no ir guardando un 0 en cada posición que te saltas. Pista: usas el índice i para recorrer todos los vectores, pero los vectores <pares> e <impares> no avanzan al mismo ritmo que <numeros> por lo que tendrás que usar índices distintos.
while(pares[i]!=0){
cout<<pares[i]<<" ";
}
Cita de: YreX-DwX en 18 Noviembre 2018, 22:45 PM
Te ha faltado modificar la siguiente línea:
for(i=0;i=9;i++){
El segundo campo de <i = 9> como te hemos comentado antes no es correcto.
Primero: si tu idea era poner como condición que i sea igual a 9, entonces se pone como <i == 9> con dos iguales.
Segundo: en tal caso ese bucle empezaría con <i = 0> y se ejecutaría si <i == 9>, es decir, nunca.
Tercero: fíjate en como has hecho el <for> para recorrer el vector y mostrarlo más abajo.
PD: Si este programa si lo estás haciendo tú te recuerdo lo que te comenté en tus primeros posts. En lugar de "#include <stdlib.h>" utiliza mejor "#include <cstdlib>" aunque el programa va a funcionar igual es más correcto usar las librerías de C++ en vez de las de C. Y en segundo lugar evita usar <system("pause")> como ya te comente es preferible sustituirlo por <cin.get()> a no ser que te obliguen a usar eso en la universidad (si usas <cin.get()> puedes eliminar la librería <cstdlib> ya que en este programa sólo es necesaria para hacer la llamada al sistema <system>.
#include<iostream>
#include<cstdlib>
using namespace std;
int main(){
int numeros[10] = {1,2,3,4,5,6,7,8,9,10};
int pares[10];
int impares[10];
int i,aux1,aux2;
for(i=0;i<10;i++){
if(numeros[i]%2==0){
aux1=numeros[i];
numeros[i]=pares[i];
pares[i]=aux1;
}
else if(numeros[i]%2==1){
aux2=numeros[i];
numeros[i]=impares[i];
impares[i]=aux2;
}
}
cout<<"Numeros Pares";
for(i=0;i<10;i++){
cout<<pares[i]<<" ";
}
cout<<"Numeros Impares";
for(i=0;i<10;i++){
cout<<impares[i]<<" ";
}
cin.get();
return 0;
}
Cita de: YreX-DwX en 18 Noviembre 2018, 22:04 PM
A lo que se refiere es que si haces <i = 9> estás haciendo una asignación, no una comparación. La comparación se hace con dos iguales <i == 9> como en:If(numeros[i] % 2 == 0)
De todos modos ese for se ejecuta cuando <i == 9> y dudo que eso sea lo que quieres ya que entonces solo se ejecuta para la última posición del vector.
Además donde comparas si es par o impar has puesto la misma condición osea que si es par, hace tal y sino, si es par, hace tal... Osea que el segundo if está mal.
Y en el último for para meter los resultados estás poniendo el primer par, 6 saltos de línea y el primer impar, etc; es decir, imposible de leer (además de que repites el título en cada iteración). Más correcto sería:cout << "Numeros pares:"
for(i = 0; i < 10; i++)
cout << pares[i] << " ";
Y lo mismo para los impares.
#include<iostream>
#include<stdlib.h>
using namespace std;
int main(){
int numeros[10] = {1,2,3,4,5,6,7,8,9,10};
int pares[10];
int impares[10];
int i,aux1,aux2;
for(i=0;i=9;i++){
if(numeros[i]%2==0){
aux1=numeros[i];
numeros[i]=pares[i];
pares[i]=aux1;
}
else if(numeros[i]%2==1){
aux2=numeros[i];
numeros[i]=impares[i];
impares[i]=aux2;
}
}
cout<<"Numeros Pares";
for(i=0;i<10;i++){
cout<<pares[i]<<" ";
}
cout<<"Numeros Impares";
for(i=0;i<10;i++){
cout<<impares[i]<<" ";
}
system("pause");
return 0;
}