elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


  Mostrar Mensajes
Páginas: [1]
1  Programación / Programación C/C++ / Ayuda programa que comprueba si una cadena esta introducida correctamente en: 2 Abril 2016, 18:12 pm
Hola, tengo un trabajo y es sobre crear un programa que muestre un menu con opciones, el usuario elige una opción y si elige la opción 1 tiene que introducir una nueva especie en la base de datos.
La condición para que la especie sea introducida es la siguiente:"nombre de la especie"-"numero de ejemplares"(en numeros)-dia/mes/año-"sección (una letra solo en mayusculas)"-"habitaculo (en numeros)"
Por ejemplo: Canis lupus familiaris−20−14/09/2015−H−5
El problema que tengo es que no me esta leyendo bien la cadena, tengo que usar la función atoi, pero no la que viene en la librería, tengo que crear una que ya la tengo, pero no se como aplicarla correctamente. Ya que al introducir la cadena cuando doy al enter me muestra todos los mensajes de error de datos.
Código:
#include <stdio.h>
#include <stdlib.h>

typedef struct {
    char nombre[30];
    int num_ejemplares;
    char sección;
    int habitaculo;
    int dia;
    int mes;
    int año;
}Especie;

int menu() {

    int op = 0;

    printf ("Prototipo de la Reserva natural.\n");
    printf ("1. Introducir una nueva especie.\n");
    printf ("4. Salir.\n");

    printf ("\nIntroduce una opcion: ");
    scanf ("%d", &op);

    return op;
}

void nuevo() {

    Especie e;

    int i, j;
    char especie [100];
    fflush(stdin);
    gets (especie);
    //Mientras sea diferente del - leera el texto
    for (i = 0; especie[i] != '-'; i++) {
        e.nombre[i] = especie[i];
    }
    //Se le suma 1 a la posicion de i ya que terminaria en - y debe comenzar a leer desde lo siguiente
    i++;
    for (j = i; especie [j] != '-'; j++) {
        e.num_ejemplares = especie [j];
        //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");
        }
    }
    j++;
    //Lee el dia que introducido
    for (i = j; especie [i] != '/'; i++) {
         e.dia = especie [i];
        //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 = i; especie [j] != '/'; j++) {
        e.mes = especie [j];
        //Controla que el formato del mes este bien introducido
        if (e.mes <= 0 || e.mes > 12) {
            printf ("--> Error en el formato de datos.\n");
        }
    }
    j++;
    //Lee el año introducido
    for (i = j; especie [i] != '-'; i++) {
        e.año = especie [i];
        //Controla que el formato del año este bien introducido
        if (e.año < 1970 || e.año > 2060) {
            printf ("--> Error en el formato de datos.\n");
        }
    }
    i++;
    //Lee en que sección esta introducido
    for (j = i; especie [j] != '-'; j++) {
        e.sección = especie [j];
        //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.\n");
        }
    }
    j++;
    //Al estar en el final tiene que encontrarse con el \0 para saber que es el habitaculo
    for (i = j; especie [i] != '\0'; i++) {
        e.habitaculo = especie [i];
    }
    printf ("---> Especie introducida con exito.\n");
}

void mi_atoi(char cad [10]) {
    int r = 0;
    int i;
    for (i = 0; i < 10; i++) {
       r = r*10;
       r+= cad [i] - '0';
    }
}

void ejecutaOpcion(int op) {

    switch (op) {
        case 1:
            nuevo();
            break;

        default:
            break;
    }
}

int main() {

    int op = 0;

    do {
        op = menu();
        ejecutaOpcion(op);
    } while (op != 4);
    return 0;
}

Gracias.
2  Programación / Programación C/C++ / Ayuda programa en C que lee una cadena en: 5 Marzo 2016, 15:11 pm
Hola, soy nuevo programando en C y por el momento me esta gustando. En la universidad me mandaron a hacer un ejercicio que es sobre un programa que lee una cadena introducida por el usuario.
Luego de leer la cadena el programa mostrará por pantalla un mensaje de error en caso de que algo este mal introducido o un mensaje correcto.
El problema que tengo es que no entiendo muy bien como hacer que lea la cadena. Pongo un ejemplo del código que tengo hecho y unas imágenes de como debería funcionar el programa.
Código:
#include<stdio.h>

typedef struct {
char nombre [30];
int num_ejemplares;
char sección;
int habitaculo;
int dia;
int mes;
int año;
} 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");
}

int main () {
int op;
while (op != 4){
op == menu ();
scanf ("%d", &op);
if (op == 1) {
nuevo ();
}
}
}
//Opcion 1 que permite introducir una nueva especie
void nuevo () {
Especie e;
int i;
char especie [100];
gets (especie);
int cont;
//Mientras sea diferente del - leera el texto
while (especie [i] != '-') {
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;
while (especie [i] != '-') {
especie [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') {
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) {
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");
}

Así es como debería funcionar el programa.


Y así debería dar error.


Otra cosa que no se muy bien como hacerla es sobre los espacios libres, se que tiene que ser con un array de 10 casillas que guarde los datos introducidos.

Perdón si es un desastre el código, pero soy nuevo en esto de la programación.

Gracias.
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines