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 - do-while

#771
Y yo ya te he dicho en el primer post que he escrito que si te salen los dos mensajes seguidos es porque en alguna parte antes de llamar a tu funcion, has dejado informacion en la entrada. Tambien te he dicho que el codigo que te he dado tienes que usarlo despues de scanf, asi como que si pones despues de fgets los gechar no podras leer los datos de forma correcta (o si, pero sera una tombola).

Tambien te he corregido el hecho de que si pones despues del fgets los getchar, estaras leyendo informacion que no estaras guardando, asi que si te saltan los dos mensajes uno detras de otro poco arreglas leyendo caracteres que no guardas en ninguna parte, lo que estas haciendo es perder datos.

¡Saludos!
#772
¡Buenas!

Esta parte del codigo esta mal (bueno, mal no esta, pero no funcionara como tu quieres):


           fgets(datos[i].nombre, 10, stdin);
           while(getchar() != '\n');


Te he dicho que lo de quitar caracteres de la entrada tienes que hacerlo despues de los scanf. Solo funcionara cuando la cadena introducida (contando el intro que pulses) tenga mas de 9 caracteres, ya que entonces al menos quedara un caracter en la entrada. En caso contrario, leera la cadena que introduzcas y se quedara esperando a que introduzcas mas datos para poder leerlos con getchar, por lo que perderas datos que te interesaria guardar, o a una mala, tendras que pulsar intro para que pase al siguiente mensaje solicitando datos.

Como te he dicho antes, fgets tambien extrae el caracter '\n' de la entrada, por lo tanto puedes controlar que se ha vaciado el buffer de entrada de la siguiente manera:


do{
    fgets(cadena,10,stdin);
}while(cadena[strlen(cadena) - 1] != '\n');

Asi te aseguras de que con fgets estas leyendo todos los datos de la entrada.

Otra alternativa seria la siguiente:

fgets(cadena,10,stdin);

if(cadena[strlen(cadena) - 1] != '\n')
    while(getchar() != '\n');


Pero lo que te he indicado en el post anterior solo deberias utilizarlo despues de un scanf.

Otra cosa, veo que estas abriendo el fichero en modo "r+t", no se si es bueno o te puede dar datos extraños el hecho de mezclar lectura/escritura en binario al abrir un fichero en modo texto. Cuando utilices structs de un tamaño fijo, intenta utilizar siempre acceso binario a los ficheros. Asi seguro que no te llevas sorpresas con feof().

¡Saludos!
#773
¡Buenas!

No veo el porque de tanto revuelo. Me he pasado por el enlace que has dejado y hay que reconocer que el video de nadal es bien gracioso.

¡Saludos!
#774
¡Buenas!

No te hace falta una matriz. Con tres bucles tienes de sobra:



for(i = 0 ; i < 2 ; i++)
{
    for(j = 0 ; j < 2 ; j++)
    {
        for(k = 0 ; k < 2 ; k++)
        {
            (1 - (i * 2)) * a + (1 - (j * 2)) * b + (1 - (k * 2)) * c
            // ...
        }
    }
}



¡Saludos!
#775
¡Buenas!

Posiblemente hayas usado varios scanf antes de la llamada a tu funcion.

scanf deja siempre, al menos, un caracter '\n' en el buffer de entrada, y fgets lee hasta encontrar un salto de linea (que extrae del buffer de entrada). Por lo tanto lo que te pasa es que fgets esta leyendo los datos que scanf ha dejado en el buffer de entrada y por eso pasa a leer directamente el segundo dato.

Para que no te pase esto tendras que sacar toda la "basura" que te deje scanf en el buffer de entrada caracter a caracter. Incluye este codigo despues de cada scanf

while(getchar() != '\n');


Otros utilizan la formula fgets + sscanf.

Yo personalmente prefieco la de getchar(), ya que no estoy dependiendo de tamaños concretos de cadenas para pasar como argumento a fgets. Pero para gustos colores.

¡Saludos!
#776
¡Buenas!

Supongo que la lectura/escritura en el fichero sera en binario. Si vas aumentando el tamaño del fichero segun vas metiendo datos, lo estaras haciendo de forma que añada bloques del tamaño del struct que utilizas. Por lo tanto, para saber cuantos elementos tienes en un momento dado solo tendras que calcular la longitud del fichero y dividirla por el tamaño del tipo de dato que guarda:



FILE *f;
unsigned long posicion, tamanio, ndatos;

f = fopen(tu_archivo,"rb");

/* las instrucciones que quieras */

/* leemos la posicion actual del fichero */
posicion = ftell(f);

/* nos situamos al final del fichero */
fseek(f,0,SEEK_END);

/* leemos el numero de bytes que tiene el fichero */
tamanio = ftell(f);

/* volvemos a dejarlo como estaba */
fseek(f,posicion,SEEK_SET);

/* si el fichero solo contiene un tipo de datos esta division siempre sera exacta */
ndados = tamanio / sizeof(tu_struct);


¡Saludos!
¡Saludos!
#777
¡Buenas!

Un metodo sencillo (aunque intuyo que no el mas eficiente) seria diagonailzar la matriz por Gauss y multiplicar los elementos de la diagonal.

Tambien puedes hacer ceros por ejemplo en la primera columna y aplicar la definicion. Te hara falta un algoritmo recursivo que repita el proceso para matrices de menor orden que la dada (hasta llegar a matrices 1x1):

|A| = Suma(desde i = 1 hasta n)(-1)i+j·aij·|Aij|

Donde i es el indice de la fila, j el de una columna prefijada y Aij es la matriz resultante de eliminar de A la fila i y columna j.

La definicion basica de determinanta se realiza ulilizando sumas de productos de permutaciones de los elementos de las filas multiplicando en cada suma por la signatura de la permutacion, pero esto ya es mas complicado de implementar, y el hecho de tener que estar calculando permutaciones hara que el algoritmo sea muy poco eficiente.

Te recomiendo cualquiera de los dos primeros algoritmos. El primero es iterativo y el segundo recursivo.

¡Saludos!
#778
¡Buenas!

Yo creo que estos ataques son justificados. Estan poniendo en evidencia al pais que esta atacando internet.

¡Saludos!
#779
¡Buenas!

No se si el problema esta bien planteado. ¿Los numero hay que utilizarlos en el orden en el que se introducen, o se pueden reordenar?

Lo digo porque si se pueden reordenar, en principipo tendras 4 formas de poner los simbolos de suma y resta en los dos huecos que tienes, y 6 (3!) formas de reorganizar los tres numeros para buscar el resultado, en total 24 casos (que luego se quedan en menos, ya que la suma es conmutativa). Si estas en este ultimo caso, introducir todas las condiciones a mano es largo y bastante propenso a cometer errores...

¡Saludos!

Editado:

Si lo miras con mas detenimiento, solo tienes que variar los coeficientes de los elementos. +/-a, +/-b y +/-c y luego sumarlos, asi queda mas claro, ya que solo tendras que comprobar 8 casos y te olvidas de reordenar los elementos:

a+b+c
a+b-c
a-b+c
-a+b+c
a-b-c
-a+b-c
-a-b+c
-a-b-c
#780
¡Buenas!

fgets, te esta leyendo la pulsacion del intro. Eliminalo de la cadena y ya lo tienes:
http://www.cplusplus.com/reference/clibrary/cstdio/fgets/

Por cierto, si no vas a usar el fichero, cierralo antes de salir de la funcion.

¡Saludos!