Menú

Mostrar Mensajes

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ú

Mensajes - K-YreX

#921
Programación C/C++ / Re: Duda .
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.
#922
Programación C/C++ / Re: Duda .
19 Noviembre 2018, 01:56 AM
Cierto, no me había dado cuenta que podías imprimirlos de dos en dos  :xD

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:
Código (cpp) [Seleccionar]

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:
Código (cpp) [Seleccionar]

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.
#923
Programación C/C++ / Re: Duda .
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í:
Código (cpp) [Seleccionar]

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:
Cita de: Estudiante000000 en 19 Noviembre 2018, 01:25 AM
Código (cpp) [Seleccionar]
while(pares[i]!=0){
cout<<pares[i]<<" ";
}


Eso dentro del primer for para imprimir los numeros pares pero no se como.
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:
Código (cpp) [Seleccionar]

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.
#924
Programación C/C++ / Re: Ayuda! Letra mas repetida
19 Noviembre 2018, 00:26 AM
Tienes en el array <letras> el número de veces que aparece cada una. Simplemente compara esos valores y guarda el máximo. Por ejemplo:
Código (cpp) [Seleccionar]

int maximo = letras[0], indiceMaximo = 0;
for (i = 1; i < 4; i++){
    if(letras[i] > maximo){
        maximo = letras[i];
        indiceMaximo = i;
    }
}


Si quieres hacerlo usando la enum te dejo que investigues cómo podrías hacerlo.

PD: Para futuras consultas mete tu código entre etiquetas GeSHi ya que sino los índices con "[ ]" y una "i" o una "b" dentro desaparecen, puedes verlo tú mismo y el código es más complicado de entender. Y te recomiendo que sustituyas <gets(frase)> por <fgets(frase, 100, stdin)>.
#925
Programación C/C++ / Re: Duda .
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:
Código (cpp) [Seleccionar]

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:
Código (cpp) [Seleccionar]

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.
#926
Programación C/C++ / Re: Duda .
18 Noviembre 2018, 22:45 PM
Te ha faltado modificar la siguiente línea:
Código (cpp) [Seleccionar]

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>.
#927
No, dentro por ejemplo un típico uso del <do while> es para hacer un filtro y que el usuario introduzca un valor válido, para ese caso se hace así:
Código (cpp) [Seleccionar]
int main(){
    int numero;
    do{
        cout << "\nIntroduce un numero positivo: ";
        cin >> numero;
   } while(numero < 0);
    // el resto del programa
}


Así el programa solo pasa de ahí cuando el número es positivo, ya que si es negativo te lo vuelve a pedir. La idea es esa pero dentro del do mete todo lo que tienes que hacer y al final preguntas si desea repetir o no y lo comparas en el while.
#928
Eso se hace con el uso del <do while>. Mete prácticamente todo el programa en un bucle <do> (excepto las dos últimas líneas porque sino acabaría siempre) y añade al final del <do> un par de líneas de código donde le dices al usuario que si desea repetir el programa introduzca "s" o "S", guardas la respuesta del usuario en una variable y la condición del while es que mientras esa variable sea "s" o "S".

La parte de pasar mi explicación a código te lo dejo a ti y si te surge alguna duda puedes volver a preguntar pero recuerda meter el código entre etiquetas pulsando en <Código GeSHi> y eligiendo c++ para que te aparezcan dos etiquetas de código. Mete el código entre esas dos etiquetas y listo.

Veo que programas en C++. Te recomiendo que en vez de <system("pause")> utilices <cin.get()> por buena praxis. Aquí tienes más información sobre ese y otros puntos: https://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html
#929
Programación C/C++ / Re: Duda .
18 Noviembre 2018, 22:04 PM
Cita de: MAFUS en 18 Noviembre 2018, 20:37 PM
Mira esto:
for(i=0;i=9;i++)
¿Qué ves?
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:
Código (cpp) [Seleccionar]
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:
Código (cpp) [Seleccionar]
cout << "Numeros pares:"
for(i = 0; i < 10; i++)
    cout << pares[i] << " ";

Y lo mismo para los impares.
#930
He notado una ambigüedad en la pregunta, por eso voy a intentar aclararlo. Si introduces <N = 10> y <X = 4> tenemos varios resultados:
- 1 2 3 5 6 7 9 10 11 13 (es decir imprimir N números y que ninguno de ellos sea múltiplo de X)
- 1 2 3 5 6 7 9 (es decir imprimir desde 1 hasta N y que ninguno sea múltiplo de X)
Se nota a simple vista la diferencia, en el primer caso calcular el promedio es más fácil ya que siempre dividiremos la suma de la sucesión entre N. En cambio en el segundo caso tenemos que ver de esos N números cuántos se han imprimido al final para dividir la suma por ese número.

Para la solución a la primera situación sólo debemos contar que se ha impreso un elemento cuando este no sea múltiplo de X, y debemos de incrementar la variable que vamos imprimiendo siempre. El código quedaría algo así:
Código (cpp) [Seleccionar]

void sucesion(int multiplo, int repeticiones){
int contador = 0, elemento = 1;
float suma, promedio;
while(contador < repeticiones){
if(elemento % multiplo != 0){
printf("%d  ", elemento);
suma += elemento;
contador++;
}
elemento++;
}
promedio = suma / repeticiones; // o (promedio = suma / contador) porque (contador == repeticiones)
printf("\nEl promedio de la sucesion es: %.2f \n", promedio);
}


Para la segunda solución debemos de contabilizar cada iteración, no sólo las que no sean múltiplo de X. Pero en este caso debemos llevar una cuenta aparte de cuántos dígitos hemos impreso para calcular el promedio. El código sería algo así:
Código (cpp) [Seleccionar]

void sucesion(int multiplo, int limite){
int contador = 0;
float suma, promedio;
for(int elemento = 1; elemento <= limite; elemento++){
if(elemento % multiplo != 0){
printf("%d  ", elemento);
suma += elemento;
contador++;
}
}
promedio = suma / contador; // (promedio = suma / limite) es incorrecto (contador < limite)
printf("\nEl promedio de la sucesion es: %.2f \n", promedio);
}


Y ahora un par de consejos para el futuro:
- Es recomendable usar nombres de variables que ayuden a comprender su utilidad. Nota la diferencia entre <repeticiones> código 1 y <limite> código 2.
- A no ser que sea tarea estudiantil y te obliguen a usar la llamada al sistema <system("pause")> hay alternativas mejores, para más información https://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html

Aparte para evitar la situación de que N < X podrías hacer uso de un filtro:
Código (cpp) [Seleccionar]

int repeticiones, multiplo;
do{
printf("Introduce el numero de valores para la sucesion: ");
scanf("%d", &repeticiones);
printf("Introduce el numero cuyos multiplos no deben aparecer en la sucesion: ");
scanf("%d", &multiplo);
} while(repeticiones < multiplo);