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

#571
Programación C/C++ / Re: URGE AYUDA DEV C++
14 Mayo 2019, 22:45 PM
Todos los códigos entre etiquetas de código GeSHi...  :rolleyes:

Mejor cárgate esa Z... :silbar: :silbar: :silbar:
Por qué la condición entre comillas???? Eso son cadenas de caracteres literales...
En serio... Por qué Z? Por qué si vale 5? Y por qué de tipo <char> si le asignas un entero? Eso no hay quien lo entienda. Como te han dicho usa una variable <bool> que solo puede ser true/false para decidir si seguir repitiendo el programa o si salir. Y pon un nombre que diga algo, como te han dicho, no Z (igual que <ch>.... Llámalo <opcion> o algo así que permita identificarlo fácil).

Además estás usando funciones típicas de C y estás programando en C++... Usa las funciones de entrada/salida típicas de C++ <cout> y <cin> (de <iostream>) en lugar de <getchar()> y <printf()> (de <stdio.h> que en C++ sería <cstdio>) y quita la librería <conio.h> que no tiene utilidad y solo sirve para sacar errores según el compilador... Así que haciendo eso <conio.h> y <stdio.h> sobran. Y el nombre correcto para <stdlib.h> en C++ es <cstdlib> (como con todas, se quita el .h y se añade una c al comienzo del nombre).

Y lo normal es meter cada funcionalidad en una FUNCIÓN, no en un programa. Así haces los programas independientes unos de otros y no tienes que usar <system("...")> que requiere más recursos porque necesita hacer llamadas al sistema.

Y si haces <return> el programa termina. Otra razón más por la que el Z=5 sobra. Bueno el Z=5 y todo lo que vaya después del <return>
#572
La i entre corchetes no sale porque se traduce como una etiqueta de cursiva. Por eso a partir de ahí viene escrito en cursiva. Para solucionarlo mete tu código entre etiquetas de código GeSHi seleccionando como lenguaje C.

Y estás usando el formato %ls que la s es para cadenas cuando estás usando una matriz de enteros. El formato para enteros es %d.
Además estás intentando mostrar la dirección de memoria de cada elemento, en vez de el elemento.

printf("%d", &variable); // muestras la dirección de memoria de variable
printf("%d", variable); // muestra el valor entero de la variable
#573
Para crear un programa que calcule lo que tú quieres no necesitas usar una función como <gotoxy()>.
#574
Al usar la palabra <auto> todo depende del valor de retorno de <getInstance()>. Si esa función devuelve un puntero o una referencia entonces <auto> se comportará como si estuviesemos declarando un puntero de ese tipo.
#575
Por qué dices que no es un puntero? Normalmente la función miembro <getInstance()> suele ser una función de las clases singleton (clases que solo pueden tener una instancia) y estas clases suelen tener un puntero a un objeto de esa clase.
Código (cpp) [Seleccionar]

class SingletonExample{
    private:
        static SingletonExample* instance = NULL;
        SingletonExample(){}
    public:
        static SingletonExample getInstance(){
            if (instance == NULL)
                instance = new SingletonExample;
            return *instance;
        }
}

Te dejo el enlace de donde he sacado este fragmento de código: https://stackoverflow.com/questions/12707542/what-exactly-does-getinstance-do-in-a-singleton


Y como bien acabas de decir. La palabra reservada <auto> crea la variable del mismo tipo que le estás asignando.
#576
Ahora para dejar ya el tema zanjado por el momento, una tontería más que olvidé:
Citar
cout << "La suma de los numeros abundantes entre " << valor1 << " y " << valor2 << " es " << abund;
Cuidado con lo que se dice y lo que se quiere decir. Lo que tú vas a mostrar es la cantidad de números abundantes en (valor1, valor2) que tampoco es lo mismo que la cantidad que hay en [valor1, valor2) (cerrado-abierto) ni (valor1, valor2] (abierto-cerrado) ni [valor1, valor2] (cerrado-cerrado). No la suma de los números abundantes que eso se calcularía sustituyendo <abund++> por <abund += x>. No sé si ves la diferencia pero digamos que es importante saber lo que se está calculando en cada momento.
#577
El problema no es ese, ya verás ahora que te vas a dar cuenta.
Los números abundantes los contabilizas en <abund> pero... ¿cuánto empieza valiendo <abund>?
#578
Bien, veamos, parece que tienes otro problema con las funciones, los parámetros.
Cuando a una función le pasamos parámetros es porque necesitamos variables que dependen de cada ejecución. Por ejemplo si queremos si un número es perfecto/abundante/defectivo pues debemos pasarle el número no? Lógico.
Para poder usar estas variables dentro de la función debemos darle un nombre. En el prototipo no es necesario, podemos dejarlo en <int Perfecto(int)> porque el prototipo solo necesita saber de qué tipo es cada parámetro y el valor que retorna. Pero en la implementación sí debemos poner un nombre por ejemplo <int Perfecto(int num)>.
Luego tenemos las variables locales a una función. Por ejemplo si necesitamos una variable como parece que ahora es <sum_div> que la vamos a usar dentro de la función para hacer cálculos pero fuera de esa función no tiene utilidad, la podemos crear de forma local en la función. Y quedaría algo así:
Código (cpp) [Seleccionar]

// cabeceras
int Perfecto(int);

// main

int Perfecto(int num){
    int sum_div = 0; // num no lo declaramos aqui porque lo estamos pasando como parametro
    for(int i = 1; i < num; ++i) // desde el 1 hasta num-1
        if(num % i == 0) // si num es divisible por i
            sum_div += i; // sum_div = sum_div + i   acumulamos la i
    if(sum_div > num) // si se cumple esto, num es abundante (me fio de tu definicion de abundante, no he comprobado que sea asi)
        return 1; // devolvemos 1 y la funcion termina
    if(sum_div < num) // si se cumple esto, num es defectivo
        return -1; // devolvemos -1 y la funcion termina
    return 0; // si num no es abundante ni defectivo, entonces tiene que ser perfecto, no queda otra. Devolvemos 0 y termina la funcion
}

Por pasos:
No sé la utilidad del <while()> supongo que es por si te preguntan por el 0, pero no funciona así. Piensa que un <while()> se ejecuta mientras se cumpla la condición por lo tanto si esa función recibe un número distinto a 0 NUNCA saldría del <while()>. En programación es importante diferenciar entre <while()> e <if()> ya que representan cosas distintas.
Como ves ya hemos reducido los parámetros a 1 porque <sum_div> la creamos dentro de la función ya que fuera no tiene utilidad y no varía su valor inicial, siempre la inicializaremos en 0.
También he quitado los <cout> por lo que te decía. Mejor que la función nos responda lo que queremos saber y ya veremos nosotros cómo usamos esa información. Imagina que el que creó la función suma, lo implementó de está forma:
Código (cpp) [Seleccionar]

int suma(int a, int b){
    int suma = a + b;
    cout << "La suma de " << a << " + " << b << " = " << suma << endl;
    return suma;
}

Entonces cada vez que alguien hiciera <suma(a, b)> le saldría esa línea por pantalla. No siempre queremos mostrar el resultado de una suma ya que muchas veces son cálculos parciales, no la solución. Entonces se implementa la suma como:
Código (cpp) [Seleccionar]

int suma(int a, int b){
    return a+b;
}

// Y si en alguna ocasion queremos ver el resultado pues hacemos
cout << "La suma de " << a << " + " << b << " = " << suma(a,b) << endl; // pero esto ya en el main o en otra funcion

Y por último, el <return> es como el final de la función. Si se ejecuta un <return> ya no se van a ejecutar las líneas que sigan porque un <return> "retorna" el control a la función que llama a la que acaba de terminar.

Espero no haberme dejado nada. Si tienes más dudas sobre funciones, ya sabes que puedes preguntar y siempre puedes probar a hacer funciones hasta que las manejes perfectamente. Suerte :-X
#579
El problema no es que se salte la condición sino que no te deja introducir el valor de <sexo>. Esto es porque al introducir la edad, introduces un número y pulsas Enter entonces en el buffer de entrada se guarda (imaginemos que introduces 20) <20 Enter>. Luego el programa busca en el buffer de entrada el valor de edad y encuentra un 20, por lo que el programa hace <edad = 20> y en el buffer queda <Enter>. Después el programa te pregunta el sexo y como el buffer no está vacío recoge el Enter y hace <sexo = Enter> (entíendase la asigación).

Para solucionar esto debes limpiar el buffer de entrada. Normalmente te recomendarán que hagas <fflush(stdin)> para limpiarlo. Sin embargo, <fflush()> es una función que se diseñó para limpiar el buffer de salida (<fflush(stdout)>) y aunque parece que funciona para el de entrada, siempre se recomienda no usarlo ya que no está definido formalmente su comportamiento para <stdin> (en los manuales oficiales de C se expone que el comportamiento es "indeterminado")

Tienes algunas alternativas como pueden ser:

getchar(); // alternativa 1: coge un caracter del buffer
fgetc(stdin); // alternativa 2: mas de lo mismo
// Para cuando puedes tener mas de un Enter tienes una alternativa 3: en bucle


Te dejo aquí un enlace a un tema que se abrió hace un tiempo tratando de buscar alternativas a <fflush(stdin)>:
https://foro.elhacker.net/programacion_cc/iquestqueda_algo_en_el_buffer_de_entrada_stdin_solucionado-t489993.0.html
Te recomiendo que uses algunas de estas para evitar ese <fflush(stdin)> que tanto daño hace. En el fondo mejor será conocer y aplicar buenas prácticas de programación.
#580
Exacto así es.
En cambio si el primer "Es" estuviera escrito en minúsculas también, encontraría ese y después empezaría a buscar desde la "s" del primer "es" y encontraría también el segundo.