Código:
tambien dejo imagenes de como deberia funcionar el programa#include <stdio.h> #include <stdlib.h> typedef struct { char nombre[30]; int num_ejemplares; char seccion; int habitaculo; int dia; int mes; int anio; }Especie; int menu() { int op = 0; 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"); printf ("\nIntroduce una opcion: "); scanf ("%d", &op); return op; } void nuevo() { Especie e; int i, j; char especie[100]; char aux[10]; //variable auxiliar usada para reemplazar el valor de la cadena especie printf("Introduce los datos:\n"); //Se hace un fflush para que no haya algun problema con el numero introducido en el menu fflush(stdin); gets (especie); //Mientras sea diferente del - leera el texto for (i = 0; especie[i] != '-'; i++) { e.nombre[i] = especie[i]; } e.nombre[i] = '\0'; i++; //Se le suma 1 a la posicion de i ya que terminaria en - y debe comenzar a leer desde lo siguiente for (j = 0; especie[i] != '-'; i++,j++) { aux[j] = especie[i]; } aux[j] = '\0'; e.num_ejemplares = mi_atoi(aux); //Controlara que el numero de ejemplares sea un numero y no un caracter if (e.num_ejemplares <= 0 || e.num_ejemplares >= 100) { printf ("--> Error en el formato de datos.\n"); } i++; //Lee el dia introducido for (j = 0; especie[i] != '/'; i++, j++) { aux[j] = especie[i]; } aux[j] = '\0'; e.dia = mi_atoi(aux); //Controla que el formato del dia este bien introducido if (e.dia <= 0 || e.dia > 31) { printf ("--> Error en el formato de datos.\n"); } i++; //Lee el mes introducido for (j = 0; especie[i] != '/'; i++, j++) { aux[j] = especie[i]; } aux[j] = '\0'; e.mes = mi_atoi(aux); //Controla que el formato del mes este bien introducido if (e.mes <= 0 || e.mes > 12) { printf ("--> Error en el formato de datos.\n"); } i++; //Lee el año introducido for (j = 0; especie[i] != '-'; i++, j++) { aux[j] = especie[i]; } aux[j] = '\0'; e.anio = mi_atoi(aux); //Controla que el formato del aÒo este bien introducido if (e.anio < 1970 || e.anio > 2060) { printf ("--> Error en el formato de datos.\n"); } i++; //Lee en que seccion esta introducido e.seccion = especie[i]; //Controla que la seccion este introducida con mayusculas if (e.seccion < 'A' || e.seccion > 'Z') { printf ("--> Error en el formato de datos.\n"); } //Al estar en el final tiene que encontrarse con el \0 para saber que es el habitaculo i+= 2; for (j = 0; especie[i] != '\0'; i++, j++) { aux[j] = especie[i]; } aux[j] = '\0'; e.habitaculo = mi_atoi(aux); if (e.habitaculo < 0 || e.habitaculo > 20) { printf ("--> Error en el formato de datos.\n"); } } int mi_atoi(char cad[10]) { int r = 0; int i; for (i = 0; cad[i] != '\0'; i++) { r = r * 10; r += cad[i] - '0'; } return r; } void listar () { } void estadisticas() { } void ejecutaOpcion(int op) { switch (op) { case 1: nuevo(); break; case 2: listar(); break; case 3: estadisticas(); break; default: break; } } int main() { int op = 0; do { op = menu(); ejecutaOpcion(op); } while (op != 4); return 0; }
Esta es la primera opcion, ya la tengo hecha porque ya me comprueba que la cadena este bien introducida
http://subefotos.com/ver/?27da5c6038b49de566c23391b835c80ao.jpg
La opcion 2 y 3 son las que me faltan por implementar
http://subefotos.com/ver/?d5db4fbc4b738191a5364a9fd16ffaa5o.jpg
http://subefotos.com/ver/?ac5be9e588a611fcd6df73818008bc63o.jpg