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



