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

#1351
Las imágenes no se ven.

Sobre tu código:

#include<stdio.h>

typedef struct {
    char nombre [30];
    int num_ejemplares;
    char sección; // En muchos compiladores va a fallar tu nombre de variable
                  // pues solo esperan letras del abecedario inglés: sin acentos.
    int habitaculo;
    int dia;
    int mes;
    int año; // Reafirmo lo dicho antes: en este caso se van a quejar de la letra ñ.
} Especie;

int menu (void) {
    printf ("Prototipo de la Reserva natural.\n");
    printf ("1. Introducir una nueva especie.\n");
    printf ("2. Listar las especies alojadas.\n");
    printf ("3. Mostrar estadisticas.\n");
    printf ("4. Salir.\n");
   
    // Aquí deberías pedir la opción numérica y devolverla
    // con el return de la función.
}

int main () {
    int op;
    while (op != 4){ // Varias cosas: op NO está inicializado, no
                     // debes usar un valor que no hayas inicializado antes.
                     // Los menús mejor hacerlos con un do ... while pues
                     // seguro que querrás mostrarlo almenos una vez.
        op == menu (); // Esto funcionaría en caso de que la función
                       // menu() regresara algo controlado.
        scanf ("%d", &op); // Esta linea y la anterior son contradictorias:
                           // ¿Es la función menu() la que te devuelve la opción
                           // o lo adquieres ahora en la función main()?
        if (op == 1) { // Para resolver opciones de menú queda más límpio el
                       // uso de la sentencia switch
            nuevo ();
        }
    }
}
    //Opcion 1 que permite introducir una nueva especie
void nuevo () {
    Especie e; // e es una variable local. Cuándo termine la función nuevo()
               // e va a desaparecer y con ella todo el trabajo que hayas
               // hecho para rellenarla. C permite devolver estructuras así
               // que en vez de declarar void nuevo() deberías haber declarado
               // Especie nuevo() y recogerlo en main mediante algo parecido a
               // Especie e = nuevo();
    int i;
    char especie [100];
    gets (especie); // gets no se debería usar porqué al no controlar la cantidad
                    // de datos que entran en la cadena podría sobrepasarse el tamaño
                    // máximo del buffer y se sobreescribirían otros datos del programa.
                    // usar fgets(stdin, especie, 100); en su lugar.
    int cont;
    //Mientras sea diferente del - leera el texto
    while (especie [i] != '-') { // Varias cosas aquí que sirven para el resto de
                                 // estructuras similares que hay en el programa:
                                 // i no está inicializado y no se sabe que valor tiene.
                                 // Estás leyendo quien sabe donde.
                                 // Por otra parte i no se actualiza por tanto siempre
                                 // trabajarás sobre la misma posición de memoria.
                                 // Otra cosa: cuándo has recibido una línea formateada con
                                 // delimitadores puedes usar la función strtok de string.h
                                 // para recoger los diferentes datos de la cadena.
        especie [i] = e.nombre; 
    }
    //Se le suma 1 a la posicion de i ya que terminaria en - y debe comenzar a leer desde lo siguiente
    i = i + 1; // Para incrementar en 1 una variable numérica es mejor usar el operador unario ++
               // Aquí quedaría mejor i++;
               // O mejor aún, sobre todo en compiladores antiguos usar ++i por la razón de que el
               // código objeto quedaba aún más optimizado.
    while (especie [i] != '-') {
        especie [i] = e.num_ejemplares; // Las cadenas no se copian mediante el operador =
                                        // esto te serviría para copiar punteros pero en este caso
                                        // perderías la información cuándo el usuario hiciera una nueva
                                        // entrada. En su lugar deberías usar strncpy de string.h
                                        // Por otra parte, y dejando de lado el punto anterior, aquí
                                        // tienes un error de lógica y es que intentas guardar en la cadena
                                        // desde la que estas, en teoría, leyendo, el el valor de la variable
                                        // que debería ser el destino. ***Aunque está mal*** debería ser
                                        // e.num_ejemplares = especie[i]
                                        // Por cierto, i sigue sin saberse a donde se apunta e itera siempre
                                        // en la misma posición. A partir de ahora obviaré este error.
                                        // e.num_ejemplares es un entero, para un usuario es imposible que
                                        // te escriba un entero como tipo de dato en una cadena.
                                        // Deberías crear una cadena auxiliar con, y solo con, el dato numérico
                                        // y pasarlo a entero mediante la siguiente construcción:
                                        // sscanf(cad_auxiliar, "%i", e.num_ejemplares);
        //Controlara que el numero de ejemplares sea un numero y no un caracter
        if (e.num_ejemplares <= '0' || e.num_ejemplares >= '100') { // Entre comillas simples solo se ponen
                                                                    // constantes de caracter.
                                                                    // Las constantes de cadena se ponen entre
                                                                    // comillas dobles.
                                                                    // Pero en tu caso lo que estás comparando son
                                                                    // constantes numéricas por lo que deben ir sin
                                                                    // delimitar.
            printf ("--> Error en el formato de datos.");
        }
    }
    i = i + 1;
    //Lee el dia que introducido
    while (especie [i] != '/') {
        especie [i] = e.dia;
        //Controla que el formato del dia este bien introducido
        if (e.dia <= 0 || e.dia > 31) {
            printf ("--> Error en el formato de datos.");
        }
    }
    i = i + 1;
    //Lee el mes introducido
    while (especie [i] != '/') {
        especie [i] = e.mes;
        //Controla que el formato del mes este bien introducido
        if (e.mes <= 0 || e.dia > 12) {
            printf ("--> Error en el formato de datos.");
        }
    }
    i = i + 1;
    //Lee el año introducido
    while (especie [i] != '/') {
        especie [i] = e.dia;
        //Controla que el formato del año este bien introducido
        if (e.dia <= 1970 || e.dia >= 2060) { // Supongo que aquí querías decir e.año
            printf ("--> Error en el formato de datos.");
        }
    }
    i = i + 1;
    //Lee en que sección esta introducido
    while (especie [i] != '-') {
        especie [i] = e.sección;
        //Controla que la sección este introducida con mayusculas
        if (e.sección < 'A' || e.sección > 'Z') {
            printf ("--> Error en el formato de datos.");
        }
    }
    i = i + 1;
    //Al estar en el final tiene que encontrarse con el \0 para saber que es el habitaculo
    while (especie [i] != '\0') {
        especie [i] = e.habitaculo;
        //Controlara que el numero de habitaculo sea un numero y no un caracter
        if (e.habitaculo <= '0' || e.habitaculo >= '100') {
            printf ("--> Error en el formato de datos.");
        }
    }
    printf ("---> Especie introducida con exito.\n");
    // La función main debe devolver un entero. El estándar dice que se debe
    // devolver 0 si el programa ha tenido éxito. C define una macro llamada
    // EXIT_SUCCESS en stdlib.h usada para éste menester. Puedes elegir la forma
    // que quieras.
}

#1352
Sí, usa los argumentos de la función main.

El prototipo de main con argumentos es
int main(int argc, char *argv[])
int argc es el número de argumentos que se le han pasado al programa
char *argv[] es son los argumentos que se le han pasado al programa.

A tener en cuenta de que siempre el primer argumento, eso es argv[0], es el nombre del programa.
#1353
Eso sí es cierto. Para emular ese comportamiento C debería usar punteros a void y funciones callback. Así se tendría una función genérica para sumar cualquier tipo de dato.
#1354
Si son de tipo genérico sí se puede pues C es muy vago a la hora de mirar el tipo de dato que le pasas: eso lo deja en manos del programador. Puede que los compiladores se quejen, pero con un cast explícito evitas que aparezcan los mensajes de alerta.

Creo recordar que en C++ libertades como esta desaparecen.


#include <stdio.h>

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

int main() {
   char cha = 2, chb = 3;
   int ia = 4, ib = 5;
   long la = 6, lb = 7;
   float fa = 8, fb = 9;
   
   printf("char  : %d\n", (char)suma(cha, chb));
   printf("int   : %d\n", (int)suma(ia, ib));
   printf("long  : %li\n", (long)suma(la, lb));
   printf("double: %f\n", suma(fa, fb));
   
   return 0;
}
#1355
El problema se encuentra en que después de leer el número de veces a repetir la palabra, en el buffer sigue quedando el caracter de nueva línea que has introducido al pulsar la tecla ENTER. Para solucionar esto puedes usar la siguiente linea de código después de una lectura de estas:
while(getchar() != '\n');
#1356
Vale, unas cuantas cosas que no tienes claras:
Un array de 1 elemento es una redundancia, por tanto donde pone
char texto1[40],letra[1];
debe poner
char texto1[40],letra;

Los arrays en C empiezan en el índice 0, no el 1. Así pues donde pone
texto[1] = letra[1]
debe poner
texto[0] = letra[0];
pero como hemos dicho que letra es un simple char la línea debe ser así:
texto[0] = letra

Un fallo que has realizado es en la linea
scanf("%s", &letra[1]);
porque estas cargando toda una cadena donde solo te cabe un caracter. Además el fallo es más grave porqué estás escribiendo fuera de la memoria asignada para letra (solo tienes asignado letra[0], escribir en letra[1] es escribir fuera de los límites de la variable). Además hay que recordar que letra lo hemos dejado como caracter por tanto debería escribirse todo de esta forma:
scanf("%c", &letra);
o mejor aún haciendo uso de getchar así:
letra = getchar();
#1357
Como sabrás una aventura conversacional es todo texto. El jugador no necesita más que una pantalla en modo consola ybun teclado. Lo que venía dar a entender es que una aventura conversacional se puede complicar muchísimo más de lo que lo hará cualquier aventura gráfica.
Se puede aprender a programar creando un parser básico y un mundo muy sencillo, pero si se quiere se puede exprimir al máximo las posibilidades del lenguaje de programación y seguir, de cara al usuario final, con un texto describiendo una habitación en la pantalla y un teclado para introducir el siguiente movimiento del jugador.
#1358
Hombre, un entorno bueno de aventura conversacional no es tan sencillo. En una aventura hay muchísimos tipos diferentes de objetos: estáticos (solo se pueden examinar), transportables, contenedores (se pueden poner otros objetos dentro), mesas (se pueden poner objetos sobre ellos), edibles, bebibles, transparentes, luminosos, NPC estáticos y móviles, etc. Después los capítulos de la historia, en un capítulo deben existirexistir objetos en ciertos lugares y en posteriores capítulos deben estar en otro sitio y tener comportamientos diferentes.
Por otra parte una aventura gráfica es básicamente un point and click, los comandos son muy básicos y por ende los objetoa. Sin embargo una conversacional puede haber tantos comandos diferentes como verbos tenga el lenguaje español. Además hay que pensar en los álias o sinónimos que pueda usar el jugador para referirse a un objeto; los adjetivos para diferenciar por ejemplo el tronco largo del tronco rugoso. Y muchas cosas más.
Para ver como de complicado se puede hacer todo solo hay que echar un viatazo al programa Infor 6, que es un lenguaje orientado a objetos, y sus librerías. No digo Inform 7 porqué es un paradigma totalmente diferente: lírico se le podría definir.
#1359
Hola, compañera.

Siempre me gustaron las aventuras conversacionales y alguna que otra vez he iniciado la programación de una aventura en C, pero lo abandonaba al poco tiempo. Se me da mejor jugarlas que crearlas: para hacer una madianamente interesante se necesita más de buen escritor que de buen programador.
En cuanto tenga algo de tiempo le echo un ojo al link.  :D
#1360
Sí, la primera da la longitud de la cadena hasta el caracter '\0', no incluido. Si lo cuentas a mano verás que el caracter nombre[length] es el '\0' y el caracter nombre[length-1] es '\n'. La siguiente línea de código sustituye el caracter '\n' por el '\0'.