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

#851
Hay una gran diferencia entre usar "="(asignación) o usar "=="(comparación).
Cuando quieres VER si una variable vale algo concreto hay que usar la comparación.
Código (cpp) [Seleccionar]

if(x == 0)
    cout << "x vale 0";


Pero si lo que quieres es ASIGNAR un valor a una variable pues entonces usas la asignación. Por ejemplo, para que veas las dos cosas juntas.
Código (cpp) [Seleccionar]

if(x == 0)
    x = 1;

Ahí lo tienes. Compruebas que <x> vale 0 y de ser así, le asignas el valor de 1, entonces ahora <x> vale 1.

Si en un código haces:
Código (cpp) [Seleccionar]

int x = 1;
if(x = 0)
    cout << "x vale = " << x;

La salida va a ser: "x vale = 0". Por qué?? Porque una asignación en un <if> se traduce como verdadera siempre. Entonces <x> empieza valiendo 1, llega al <if>, como es una asignación se hace, ahora <x> vale 0 y como una asignación siempre es cierta te muestra el valor de <x> que es 0.

En cambio si tienes:
Código (cpp) [Seleccionar]

int x = 1;
if(x == 0)
    cout << "x vale = " << x;

Ese programa no muestra nada por pantalla. Ya que <x> empieza valiendo 1, comparas <x> con 0 y como no es igual no se ejecuta lo que hay dentro del <if>.

En resumen, si quieres hacer que una variable valga algo, usa un igual "=". Si quieres comprobar que una variable vale algo, usa dos iguales "==". Suerte.
#852
Programación C/C++ / Re: POO
4 Diciembre 2018, 12:54 PM
Cita de: Beginner Web en  4 Diciembre 2018, 03:19 AM
Creo que el "&" esta demas tenia sueño cuando hice este ejercicio

En realidad no afecta el uso de "&". Es más, en objetos que sean muy grandes es recomendable pasar los parámetros constantes y por referencia ya que si no lo pasas por referencia la función va a hacer una copia del parámetro para lo que va a tener que reservar más memoria. En este caso que el objeto no es muy grande no tiene mucha importancia.
#853
Programación C/C++ / Re: POO
4 Diciembre 2018, 01:31 AM
A mí lo que se me hace raro es el método <float racional::decimal(float)>. Es decir, para qué se le pasa un parámetro de tipo float? :huh:.
Digo yo que lo suyo sería pasarle el parámetro de tipo <float> por referencia y quitar el valor de retorno o bien dejar como valor de retorno un <float> y quitar el parámetro... no?? :rolleyes:
Código (cpp) [Seleccionar]

void racional::decimal(float &dec)const{
    dec = float(num) / float(den);
}

float racional::decimal()const{
    float dec = float(num) / float(den);
    return dec;
}
#854
Programación C/C++ / Re: Ayuda con programa
4 Diciembre 2018, 01:17 AM
No tenía pensado ponerme a implementar este programa pero al final para dejártelo de ayuda he acabado haciendo toda la función principal. Bueno la función principal a mi manera, lo he hecho de forma que se entienda bien todo lo que se va haciendo para que puedas ir viendo lo que se hace en cada momento.

Código (cpp) [Seleccionar]

int main(){
double puntuacionHumano, puntuacionMaquina;
int modo, numCartas;
ifstream fichero;
do{
modo = menu();
srand(time(NULL));

if(modo != 0){
numCartas = MINIMO + rand() % (MAXIMO - MINIMO + 1); // esto genera un numero en el intervalo cerrado [MINIMO, MAXIMO]
// esto tienes que hacerlo con la funcion generarMaxCartas() pero te lo dejo asi para que veas como se usa rand
fichero = abrirFichero();
}

switch(modo){
case 1:
cout << "\nEmpieza el juego (modo A: numCartas = " << numCartas << "):" << endl;
puntuacionHumano = modoA(fichero, numCartas);
puntuacionMaquina = modoA(fichero, numCartas);
determinaGanador(puntuacionHumano, puntuacionMaquina);
break;
case 2:
cout << "\nEmpieza el juego (modo B: numCartas = " << numCartas << "):" << endl;
puntuacionHumano = modoBHumano(fichero, numCartas);
puntuacionMaquina = modoBMaquina(fichero, numCartas, puntuacionHumano);
determinaGanador(puntuacionHumano, puntuacionMaquina);
break;
default:
cout << "Saliendo del juego..." << endl;
}
} while(modo != 0);
}


Te comento:
- La función <menu()> tiene un filtro <do while> para mostrar las opciones y elegir una opcion {0,1,2}. Y en cuanto tenga una opción válida la devuelve, es decir que quitamos el <switch> que teníamos en esa función.
- La función <generarMaxCartas()> simplemente crea un número aleatorio y lo devuelve. Yo te recomendaría pasarle dos parámetros con el mínimo y el máximo.
- La función <determinaGanador()> compara ambas puntuaciones para ver cual es mayor y muestra por pantalla quien ha ganado. No tiene ningún misterio.

Nos quedan las funciones más complejas que son las que manejan archivos. Yo te recomiendo que por ahora mires el código que he hecho, me comentes si tienes alguna duda al respecto, hagas las pruebas que quieras (tú decides lo que quieres mostrar por pantalla y esas cosas) y te asegures de poder ejecutar las funciones anteriores sin errores antes de empezar con las complicadas.
Haz programas de prueba pequeños donde puedas ver que las funciones simples funcionan correctamente.

Cuando tengas estas funciones entendidas tanto en valores de retorno como en parámetros te ayudo con las otras funciones que quedan para que veas como manejar archivos. Aunque tener un archivo con las cartas y coger de ahí los valores es un tanto complejo ya que tienes que hacerlo de manera aleatoria. Y no sé si tendrás que tener en cuenta que si el máximo de cartas a coger es 5, no se pueden coger 5 cartas iguales, ya que no existen en la baraja. Ya me dirás.
#855
Programación C/C++ / Re: Ayuda con programa
3 Diciembre 2018, 23:14 PM
Lo siento pero sigo sin entender el funcionamiento del programa del todo. Como ya te comenté creo:
- Usar una variable <bool exit> que es <false> y si la opción es 0 se pone a <true> no tiene mucho sentido ya que esa variable no tiene ningún propósito.
- Y sustituye los <system("pause")> por <cin.get()>. Vas a conseguir lo mismo, una pausa hasta que teclees algo pero sin tener que hacer una llamada al sistema.
- Tienes que incluir el archivo de cabecera <iostream> ya que sino no puedes usar <cin> ni <cout>.

Ahora vamos a profundizar en el código:
- La función <menu()> la entiendo. Muestras un menú, el usuario elige una opción y esa se devuelve al programa principal. Hasta ahí todo bien. No sé que uso le vas a dar pero dentro de cada <case> puedes poner todo lo que hay que hacer en caso de elegir esa opción. Pero personalmente si la función se llama menú prefiero que sólo muestre el menú y no haga más todo lo demás se haga en el <main> o en otra función creada específicamente para esa tarea.
Lo que no sé es lo que vas a hacer en la función <lectura()> entonces no sé cómo ayudarte... :-X
Supongo que la función <lectura()> llama internamente a <modoA()> usando el fichero que ha abierto. Pero qué más hace? O qué hace la función <modoA()> porque sino sería hacer otro <switch> en la función <lectura()> y según el <modo> que le pases como parámetro llame a la función <modoA()> o <modoB()> (si existe) o lo que tenga que hacer.

Tampoco sé si te mandan usar unas funciones obligatorias o lo estás estructurando cómo tú quieres porque tal y como lo estás haciendo como la opción va de un lado para otro, tienes que estar comparándola un montón de veces para ver que hacer. Si puedes dime que funciones tienes o quieres usar y que tienes en la cabeza que haga cada una (si puedes especificar parámetros o valores de retorno mejor).
#856
Windows / Re: Restaurar Windows 10
3 Diciembre 2018, 16:03 PM
He ejecutado el comando ese en ambos ordenadores. En el que compré recientemente que trae Windows con licencia me sale:
Windows(R), Core edition:
El equipo está activado de forma permanente.

En cambio en el otro donde instalé Windows con una ISO y no tengo licencia me sale:
Windows(R), Core edition:
Windows está en modo de notificación.
#857
Cita de: dariodr01 en  3 Diciembre 2018, 14:53 PM
Hola, la entrada de datos podria ser asi:
Salu2.

while (opcion != 'n') {
       printf("Nombre del alumno: ");
       scanf("%s",nombre[i]);
       printf("Apellido paterno: ");
       scanf("%s",apellidoPaterno[i]);
       printf("Apellido materno: ");
       scanf("%s",apellidoMaterno[i]);
       printf("Promedio del alumno: ");
       scanf("%f",&promedio[i]);
       getchar();

       printf("Capturar mas alumnos s/n: ");
       scanf("%c",&opcion);
       getchar();
       printf("\n");

       if (opcion == 's')
           i++;

       if (i > 100) {
           printf("Lo siento, la lista esta llena.");
           break;
       }
   }

No es recomendable usar <break> para salir de un bloque que no sea un <switch>. Lo correcto sería un <do while> y en el <while> dos condiciones (opcion != 'n' && i < 100). :rolleyes:

Y no controlo demasiado de C sin compilar pero igual tienes problemas con los saltos de línea en el buffer...
#858
Programación C/C++ / Re: Duda de compiladores
3 Diciembre 2018, 15:10 PM
En principio los errores son los mismos, un error es un error. Yo también empecé usando Dev en Windows y ahora compilo con gcc y g++ en Ubuntu. La diferencia es que gcc y g++ te añade más comentarios que Dev por ejemplo. Dev únicamente te dice cual es el error. Pero si te fijas con gcc los errores te los muestra en rojo mientras que el resto de comentarios en vez de "error" pone "note".
También puede ser que estés haciendo programas con librerías de Windows. Entonces en Dev en Windows funcionará y con gcc en GNU/Linux no.

Ya me contarás si descubres lo que era. Suerte. :rolleyes:
#859
Ya estoy otra vez por aquí, primero un par de cosas que ya te dije ayer:
- No usar <system("pause")>. Cambiarlo por <getchar()>.
- No usar <fflush(stdin)>. AlbertoBSD te dejó un par de enlaces para solucionar ese y otros problemas básicos.

Cosas nuevas de este programa:
- <scanf_s> y <gets_s> son funciones muy fáciles de usar y que quitan trabajo a quien las usa... sin embargo, no son estándar, es decir que yo que compilo los programas en GNU/Linux no puedo compilar un programa con esas instrucciones.
- No es recomendable declarar tantas variables globales. Lo normal es declararlas en el <main> si las vas a usar durante el programa o en la propia función si son de uso temporal.
- Tus dos funciones reciben como primer parámetro un entero <int> pero tú lo que quieres es mandar un array de enteros (o un puntero al comienzo del array  :silbar:).
- Tu función de ordenar los sueldos has puesto que devuelva un entero pero no devuelve nada. Y no entiendo muy bien qué entero vas a devolver. Me equivocaba, sí devuelve algo, devuelve el primer sueldo que está desordenado y se sale por lo que no ordena más.
- Tu otra función además de cambiar el primer parámetro que no está del todo bien, imagino que compara todos los sueldos con el promedio para ver cuántos están por encima de la media. Y en el <for> recorres los 10 primeros sueldos sólo.
- No validas que no existan sueldos negativos. Eso se puede hacer un filtro de toda la vida con un <do while>.
- Y luego para repetir el programa, haces una comparación, si la comparación es 0, pones <w = 1> y si la comparación es distinta de 0, pones <w = 0>. Usa directamente el resultado de la comparación en el <do while> y no le des tantas vueltas a una variable (esto lo vi hace poco en otro programa, no recuerdo si también era tuyo...)

Mis recomendaciones para que trabajes con funciones:
- Una función que te vaya pidiendo los datos y compruebe que los sueldos son positivos. Como valor de retorno un entero con la cantidad de sueldos registrados y como parámetros de entrada un array de <float> para los sueldos y el máximo de sueldos a guardar. En esta función puedes crear las variables <fin> y <final> ya que sólo se usan para repetir la entrada de datos.
- Una función que te ordene los sueldos. Sin valor de retorno y como parámetros de entrada un array de enteros y un entero de cuántos sueldos se han introducido (date cuenta que justo eso es lo que devuelve la función anterior).
- Una función que calcule el total de sueldos. Recibe como entradas un array de <float> y la cantidad de sueldos introducidos. Devuelve un <float> con la suma total.
- Una función que calcule cuántos empleados están por encima de la media. Recibe como entradas un array de <float>, la cantidad de sueldos introducidos y el promedio. Devuelve un entero con la cantidad de ellos que están por encima de la media.

Con estas recomendaciones, las cuales ya sé que son ineficientes ya que recorremos el array más veces de las necesarias, pero que es con fines educativos y para practicar, el programa principal quedaría algo así:

const int MAX_SUELDOS = 100; // O con #define si te gusta más
int main(){
    float sueldos[MAX_SUELDOS];
    float sumaSueldos, sueldoMedio;
    int cantidadSueldosFinal, cantidadSueldosSuperior;

    cantidadSueldosFinal = pedirSueldos(sueldos, MAX_SUELDOS); // el segundo parametro no es necesario ya que la variable es global
    sumaSueldos = sumarSueldos(sueldos, cantidadSueldosFinal);
    sueldoMedio = totalSueldos / cantidadSueldosFinal;
    cantidadSueldosSuperiores = superiorMedia(sueldos, cantidadSueldosFinal);

    ordenarSueldos(sueldos, cantidadSueldosFinal);
    for(int i = 0; i < cantidadSueldosFinal; i++) // mostramos los sueldos que se vea que estan ordenados
        printf("%.2f  ", sueldos[i]);

    // aqui muestras todos los resultados que has ido obteniendo
}


Esto es muy mejorable, piensa por ejemplo que si primero ordenas los sueldos luego es más eficiente calcular cuántos están por encima de la media. Pero eso y como implementar cada función te lo dejo a ti. Lo he intentado hacer lo más sencillo posible para que se entienda bien. Ahora ya te toca trabajar a ti. Suerte :rolleyes:

PD: Te dejo aquí la función <sumarSueldos()> para que veas como se pasan los arrays como parámetros.

float sumarSueldos(float sueldos[], int cantidadSueldos){
    float suma = 0;
    for(int i = 0; i < cantidadSueldos; i++)
        suma += sueldos[i];
    return suma;
}
#860
Un par de cosas básicas que hay que arreglar:
- Tienes una variable <R> de tipo <int> y otra variable <R> de tipo <char>. Error, no pueden tener el mismo nombre.
- Como ya te han dicho la función <registro()> no devuelve ningún valor de retorno, no puedes hacer <R = registro(...)>.
- También te han comentado ya como concatenar el nombre con los apellidos, ya que si usas la función <strcpy> lo que haces es copiar una cadena en otra eliminando lo que tuviese la cadena destino. En todo caso infórmate sobre la función <strcat> o mejor aun la variante <strncat> por seguridad.
- Después de la condición de un <if> van las llaves "{}", no va un ";". Además tienes dos <if> seguidos con la misma condición pero con modificaciones que alteran el resultado de la condición y no entiendo muy bien eso.
- El contador <cont1> va a valer 0 o 1 ya que sólo se va a incrementar como mucho una vez. Y por qué hacer los contadores de tipo <float>?? Un contador vale 1 o 2 o 3... pero no 1.5...
- Tienes un bloque entre llaves en el <main> sin sentido. Osea unas llaves que se abren y se cierran pero no llevan ninguna sentencia antes como puede ser un <if> o un <while> o algo por el estilo.
- La función <registro()> recibe como parámetros matrices de tipo <char> y tú le mandas arrays en el <main>.

Otro par de cosas que deberías mejorar:
- No usar <fflush(stdin)>.
- No usar <system("pause")>. Sustitúyelo por <getchar()>.
- No usar <gets>. Usar <fgets> en su lugar.
- Qué narices es el parámetro <n> que pasas por referencia?? Creo entender que es el contador, pero...

Ahora sólo te queda investigar un poco lo que te hemos aconsejado y ver cómo modificas tu programa. Y ahora me voy a dormir que me iba a ir cuando he visto el programa pero iba a tener pesadillas si no hacía nada al respecto. Suerte :rolleyes: