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 - MAFUS

#1331
Elginah, el error que tienes marcado en rojo es que comparas el valor de algo que se guarda en el array con la dirección de inicio de ese array.
El nombre de un array devuelve siempre su dirección de inicio, para acceder a un valor que contenga, aunque sea la primera posición debes dereferenciarlo, ya sea con notación de puntero, ya sea con subíndices (notación de array).
#1332
La primera y la tercera me gustan, la tercera me gusta más. La 2 no la haría.

Tambien puedes encadenar ifs:

bool retValue = false;
if ( func1 ())
if ( func2 ())
if ( func3 ())
   retValue = true;

return retValue;


Queda bonito, visible a simple vista y quitas letras de enmedio.
#1333
El que haya un solo return por función es una de las corrientes de estilo de programación y tiene muchos seguidores, yo me incluyo, aunque no la llevo a rajatabla.
Es como otras como no salir de los bucles con break, no usar goto para la lógica, etc.
Yo digo: todos estos estilos tienen su espacio y su momento. Hay que usar el que, en cada momento,  deje más claro el código a la hora de revisarlo.
#1334
Y ¿qué tienes hecho hasta ahora?
Muestra lo que tienes hecho, para que tengamos una base con la que trabajar e indica la duda que tengas.
#1335
Está bien, pero debes retocar una cosa:
Cuando vas a inicializar las columnas, y, y una de estas inicializaciones falla retornas NULL y regresas, pero esto te crea pérdida de memoria: todos los punteros anteriormente inicializados desaparecerán al salir de la función, pero su memoria seguirá adquirida.

P.ej.: Si la última inicialización de y falla pedrerás la memoria del array principal, x, y de cada una de las ys, menos la última que ha fallado.
#1336
Bueno, tampoco habría tanta ventaja. El compilador de java pasa a bytecode de la máquina java el código y después la máquina java va traduciendo el código máquina de la máquina virtual al código máquina del procesador. Toda una historia muy larga. Y el trabajo este se realiza cada vez que se ejecuta un java. No sé si hace como .NET que traduce al momento y al mismo tiempo guarda en caché las instrucciones en IL para una próxima ejecución más rápida.
En cámbio C, normalmente, lo traduce todo a ensamblador y el linker a código máquina. Esto unido a que tiene un entorno de ejecución pequeño es lo que lo convierte en un lenguaje rápido, pero a la vez inseguro porque su entorno de ejecución hace muy poco para el programador.
#1337
Varias cosas:
En base a tu problema, cuándo encuentres el nombre, la siguiente lectura con fscanf te dará la siguiente línea del archivo, el teléfono.

Cuando se trata de recoger una cadena con un formato bien establecido de antemano, nada mejor que scanf o fscanf. La razón es que su cadena de configuración es muy configurable y discrimina muy bien los elementos a tomar.

Por otra parte, los caracteres de nueva línea que están al final de las cadenas.
fgets recoges el carácter de nueva linea, con scanf y fscanf no. Así que según que función uses debes lidiar de una forma u otra con este problema.

Aquí te lo expongo, para ver el efecto del carácter de nueva línea comenta las lineas con scanf y fscanf y descomenta las de fgets.

#include<stdio.h>
#include<string.h>

int main() {
   FILE *f;
   char nombre[20];
   char cadena[20];
   int encontrado = 0;
   f = fopen("archivo.txt", "r");
   if(!f) {
       printf("*** Archivo de datos no encontrado ***\n");
       return 1;
   }
   printf("> ");
   // fgets(nombre, 19, stdin);
   scanf("%19s", nombre); while(getchar() != '\n'); // <-- Mejor así. Los nombres no tiene caracteres de nueva linea :D
   do {
       // fgets(cadena, 19, f);
       fscanf(f, "%19s", cadena); fgetc(f);
       if(strcmp(cadena, nombre) == 0)
           encontrado = 1;
   } while(!feof(f) && !encontrado);
   if(encontrado) {
       printf("Nombre   : %s\n", nombre);
       // fgets(cadena, 19, f);
       fscanf(f, "%19s", cadena); fgetc(f);
       printf("Telefono : %s\n", cadena);
   }
   else printf("No se ha encontrado el registro.\n");
   fclose(f);    
   return 0;
}
#1338
Si le pasas el puntero a una función para que ésta le asigne un espacio en la memoria sí debes pasar la dirección del puntero como argumento (un puntero a puntero).

O puedes hacer una función que dentro de ella declare un puntero temporal y le asigne la memoria, después devuelves el puntero con el return y lo recoges en el main con una variable puntero.
#1339
Ah, ok, entonces sí  :rolleyes:
#1340
Programación C/C++ / Re: Ahorcado en c++
10 Marzo 2016, 09:25 AM
No, pero tampoco son tan difíciles de hacer:
Con una libreta de hojas a cuadritos y un lápiz haz el dibujo de como debe ser el ahorcado.
A cada cuadro que tengas dibujado buscas un carácter imprimible (no hace falta que sean letras, en ASCII hay caracteres para dibujar) que más se asemeje a la forma del dibujo del cuadro.
En código creas una tabla de dimensiones iguales a los cuadros que han hecho los dibujos y metes esos caracteres dentro.
Después, durante el juego, vas pintando las porciones del ahorcado (metiendo el carácter dibujado o un carácter blanco) dependiendo del número de fallos del jugador.

Si lo haces pequeño puedes poner el dibujo en la parte de arriba de la ventana y el texto de juego abajo. Si ya te ves con corazón de hacerlo más complicado puedes poner el dibujo a la izquierda o a la derecha de la ventana teniendo en cuenta que la pantalla se va a pintar línea a línea, es decir:
deberás pintar la primera línea del dibujo y escribir la primera línea del texto del juego; pasar a la segunda línea de la ventana, dibujar la segunda línea del ahorcado y escribir la segunda línea del texto; y así ir repitiendo hasta terminar de pintar la pantalla.