Foros del Web » Programación para mayores de 30 ;) » C/C++ »

¿Como puedo guardar datos previamente escritos de una cadena a un array?

Estas en el tema de ¿Como puedo guardar datos previamente escritos de una cadena a un array? en el foro de C/C++ en Foros del Web. Hola, estoy haciendo trabajo y es un programa que te permite introducir datos de una especie en una cadena y luego mostrarlos. Ya tengo hecha ...
  #1 (permalink)  
Antiguo 07/04/2016, 07:36
 
Fecha de Ingreso: abril-2016
Mensajes: 2
Antigüedad: 8 años, 7 meses
Puntos: 0
Pregunta ¿Como puedo guardar datos previamente escritos de una cadena a un array?

Hola, estoy haciendo trabajo y es un programa que te permite introducir datos de una especie en una cadena y luego mostrarlos. Ya tengo hecha la parte de comprobar errores y que la cadena con los datos este correctamente introducida. Lo único que me falta es mostrar distintos datos en pantalla, pero no se como hacerlo, creo que es con un array ya que solo puedes ingresar hasta 10 datos. Lo que no se es en que parte implementar el codigo. He visto que se puede hacer esto con ficheros, el problema es que aun no se como implementar un fichero.

Código:
#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;
}
tambien dejo imagenes de como deberia funcionar el programa
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
  #2 (permalink)  
Antiguo 07/04/2016, 08:02
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: ¿Como puedo guardar datos previamente escritos de una cadena a un array?

Para listar los elementos de la estructura tienes que imprimir cada elemento de forma explícita.

Un ejemplo:

Código C:
Ver original
  1. Especie data;
  2. printf("Nombre     Nejs S Habi\n");
  3. printf("%10s %4d %c %4d",data.nombre,data.num_ejemplares,data.seccion,data.habitaculo);

Para imprimir una secuencia de elementos puedes modificar un poco el código para que el segundo printf se encuentre dentro de un bucle.

Los ficheros únicamente sirven para almacenar información de forma persistente, es decir, que sobreviva al cierre del programa, pero ya te digo yo que el uso de ficheros no tiene nada que ver con la salida de la consola.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #3 (permalink)  
Antiguo 07/04/2016, 08:37
 
Fecha de Ingreso: abril-2016
Mensajes: 2
Antigüedad: 8 años, 7 meses
Puntos: 0
Respuesta: ¿Como puedo guardar datos previamente escritos de una cadena a un array?

Cita:
Iniciado por eferion Ver Mensaje
Para listar los elementos de la estructura tienes que imprimir cada elemento de forma explícita.

Un ejemplo:

Código C:
Ver original
  1. Especie data;
  2. printf("Nombre     Nejs S Habi\n");
  3. printf("%10s %4d %c %4d",data.nombre,data.num_ejemplares,data.seccion,data.habitaculo);

Para imprimir una secuencia de elementos puedes modificar un poco el código para que el segundo printf se encuentre dentro de un bucle.

Los ficheros únicamente sirven para almacenar información de forma persistente, es decir, que sobreviva al cierre del programa, pero ya te digo yo que el uso de ficheros no tiene nada que ver con la salida de la consola.

Un saludo.
Gracias por ayudarme, creo que lo que hay que hacer es que con la opcion 2 que es para listar los datos, hay que tomar los datos que ya se introdujeron en la opcion 1, por eso es lo que yo pienso que podría ser con ficheros ya que como dijiste sirven para almacenar información, pero yo aun no se como usarlos correctamente por eso lo único que se me ocurriría es con un array que tome la cadena introducida y la almacene.
  #4 (permalink)  
Antiguo 07/04/2016, 09:18
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: ¿Como puedo guardar datos previamente escritos de una cadena a un array?

Estás demasiado perdido. Necesitas con urgencia hacerte con un libro o tutorial de Internet de C y dedicar algunas horas a su estudio.

Tu programa tiene unos cuantos fallos y problemas de diseño:
Código C:
Ver original
  1. void nuevo() {
  2.   Especie e;

Por ejemplo, si esta función sirve para crear nuevos elementos... ¿Dónde se supone que los almacena? Si la práctica es sencilla seguramente te valiese con un array de tamaño fijo, como por ejemplo:

Código C:
Ver original
  1. Especie datos[20];
  2. int numDatos;

La variable entera te sirve para saber cuántos registros están ocupados (0 a numDatos-1). Eso sí, tienes que preocuparte de no insertar nunca un elemento nº 21.

Con el array anterior creado ya podrías añadir elementos nuevos al array. Eso lo puedes hacer donde quieras, dentro de la función nuevo o fuera, y el proceso podría ser tal que:

Código C:
Ver original
  1. datos[numDatos] = especie;
  2. numDatos++;

También estás usando instrucciones prohibidas:

Código C:
Ver original
  1. fflush(stdin);

fflush sirve para que los buffer de salida vuelquen su salida a donde corresponda, pero sus resultados con los buffer de entrada (y stdin es de entrada) son indefinidos, lo que implica que, en el mejor de los casos, no va a vaciar stdin.

También estás complicando en exceso la lectura de los datos:

Código C:
Ver original
  1. gets (especie);
  2. //Mientras sea diferente del - leera el texto
  3. for (i = 0; especie[i] != '-'; i++) {
  4.     e.nombre[i] = especie[i];
  5. }

Por un lado especie[ i] es algo que no va a compilar porque especie no es un array sino un único registro, luego no tiene índice.

Por otro, ¿qué pasaría si el usuario no introdujese ningún guión? El resultado no te iba a gustar nada.

Y, finalmente, has de saber que hay formas más sencillas de pedir datos al usuario. No hace falta que le obligues al usuario a introducir todo el texto del tirón separado por guiones (salvo que sea una exigencia de la práctica).

Un mecanismo más limpio podría ser:

Código C:
Ver original
  1. printf("Introduce el nombre: ");
  2. scanf("%s",especie.nombre); // nombre es un array, luego no necesita &
  3. printf("Introduce el num de ejemplares: ");
  4. scanf("%d", &especie.num_ejemplares); // num_ejemplares no es un puntero, luego necesita &
  5. // ...

O incluso si quieres tener más control sobre los enteros:

Código C:
Ver original
  1. printf("Introduce el nombre: ");
  2. char temp[20];
  3. scanf("%s",especie.nombre); // nombre es un array, luego no necesita &
  4. while(1) // bucle infinito, necesita un break
  5. {
  6.   printf("Introduce el num de ejemplares: ");
  7.   scanf("%s", temp);
  8.   especie.num_ejemplares = my_atoi(temp);
  9.   if( especie.num_ejemplares < 0 || especie.num_ejemplares >= 100 )
  10. // ...
  11. }

Tu mayor problema es la falta de base, pero eso solo se consigue empoyando tutoriales.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.

Etiquetas: cadena, char, funcion, int, numero, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:38.