Programa C estructura switch.

Iniciado por Chetero, 17 Junio 2014, 18:39 PM

0 Miembros y 1 Visitante están viendo este tema.

Chetero

El programa en cuestión es este:
http://gyazo.com/9100e1eabb55b59b4d50adfc6f436e7e


Tengo la estructura en general aunque ando bastante perdido en como hacer que el programa me cambie la fecha de la recolección y la ultima cantidad recolectada la cambie y la sume a la cantidad recolectada desde la plantación.

Os voy a dejar el problema entero,rodeando las partes en las que no se como hacerlas funcionar con ??????.Espero que podáis arrojarme algo de luz.

#include <stdio.h>
#include <stdlib.h>

typedef char texto10[10];
typedef char texto20[20];

typedef struct{
        int dia;
        int mes;
        int anno;
        } fecha;

typedef struct{
        texto10 codigo;
        texto20 nombre;
        fecha plant_fecha;
        fecha rec_fecha;
        float cantidadrec;
        float cantidadacc;
        } cultivo;





char menu (void);
void datos_cultivo(cultivo *cult);
int leer_num(int c);
void modif_nombre(texto20 nom);
/*??????????????????????????????????????????????????*/
void recolectar (int recfecha,float cantidadr);
/*??????????????????????????????????????????????????*/
void imprime (cultivo *cult);


int main (void)

{
    cultivo catalogo[14];
    char opcion;
    int numero, control = -1;
   
    do
    {
        opcion=menu();
        switch (opcion)
        {
               case 'a':if (control < 14){
                    control++;
                    datos_cultivo(&catalogo[control]);
                    }
                    else
                    printf("Catalogo completo no se pueden introducir más datos\n");
                    break;
               case 'b':if (control != -1){
                    numero=leer_num(control);
                    modif_nombre(catalogo[numero].nombre);
                    }
                    else
                    printf("No se puede modificar pues no se han introducido datos\n");
                    break;
                    /*??????????????????????????????????????????????????*/
               case 'c':if (control != -1){
                    numero=leer_num(control);
                    recolectar(catalogo[numero].rec_fecha);
                    }
                    else
                    printf("No se puede modificar la fecha pues no se han introducido datos\n");
                    break;
                    /*??????????????????????????????????????????????????*/
               case 'e':if (control != -1){
                    numero=leer_num(control);
                    imprime(catalogo[numero]);
                    }
                    else
                    prinft("No se pueden mostrar los datos pues no se han introducido\n");
                    break;
               case 'f': printf ("Fin del programa\n");
                         system("PAUSE");
                         break;
               default: printf("Opcion incorrecta\n");
        };
       
}while (opcion != 'f');

return (0);

}




char menu (void)
{
     char op;
     
     printf("Pulsa a para leer los datos del cultivo\n");
     printf("Pulsa b para modificar el nombre al cultivo\n");
     printf("Pulsa c para modificar la fecha de la ultima recoleccion\n");
     printf("Pulsa d para modificar la cantidad de kilos recogidos en la ultima recoleccion\n");
     printf("Pulsa e para mostrar los datos del cultivo\n");
     printf("Pulsa f para terminar\n");
     scanf("%c",&op);
     fflush(stdin);
     return (op);
     }
     
     void datos_cultivo(cultivo *cult)
     
     {
          printf("Dame el codigo: ");
          gets((*cult).codigo);
          fflush(stdin);
          printf("Dame el nombre: ");
          gets((*cult).nombre);
          fflush(stdin);
          printf("Dame los kilos recogidos en la ultima recoleccion: ");
          scanf("%f", &((*cult).cantidadrec));
          fflush(stdin);
          printf("Dame los kilos recogidos desde la plantacion: ");
          scanf("%f", &((*cult).cantidadacc));
          fflush(stdin);
          printf("Dame el año de plantacion: ");
          scanf("%d", &((*cult).plant_fecha));
          fflush(stdin);
          printf("Dame el año de recolecion: ");
          scanf("%d", &((*cult).rec_fecha));
          fflush(stdin);
         
         
     }
     
     int leer_num(int c)
     
     {
         int num;
         do {
             printf("Dame el numero de finca entre 0 y %d: ",c);
             scanf("%d", &num);
             fflush(stdin);
             }
         while ((num<0)||(num>c));
         
         return(num);
         
     }
         
     void modif_nombre(texto20 nom)
     
     {
          printf("La finca %s va a cambiar de nombre.\n", nom);
          printf("Dame el nuevo nombre: ");
          gets(nom);
          fflush(stdin);
         
     }
     /*??????????????????????????????????????????????????*/
     void recolectar (int recfecha,float cantidadr)
     
     {
         printf("La fecha antigua de recolecion es: %d\n", recfecha);
         printf("Dame la nueva fecha: ");
         scanf("%d", &recfecha);
         fflush(stdin);
         printf("La cantidad de kilos recogidad en la ultima recolecion es: %f\n", cantidadr);
         scanf("%f", &cantidadr);
         fflush(stdin);
         
         
     }
     /*??????????????????????????????????????????????????*/
   
     
     void imprime (cultivo *cult)
     
     {
          printf("El codigo del invernadero es: %s\n",cult.codigo);
          printf("El nombre del cultivo es: %s\n",cult.nombre);
          printf("La cantidad de kilos recogidos en la ultima recolecion es: %f\n",cult.cantidadrec);
          printf("La cantidad de kilos recogidos desde la plantacion es: %f\n",cult.cantidadacc);
          printf("La fecha de recolecion es: %d\n",cult.rec_fecha);
          printf("La fecha de plantacion es: %d\n",cult.plant_fecha);
          system("PAUSE");
         
     }


He intentado cambiar el void recolectar.Pero en la estructura switch me salta error cuando intento insertar un caso con el modif_recfecha.

char menu (void);
void datos_cultivo(cultivo *cult);
int leer_num(int c);
void modif_nombre(texto20 nom);
int modif_recfecha(int fechare);
float modif_cantidadr(float cantidadrecol);
void imprime (cultivo *cult);


Pero en la estructura switch me salta error cuando intento insertar un caso con el modif_recfecha.


case 'c':if (control != -1){
                    numero=leer_num(control);
                    modif_recfecha(catalogo[numero].rec_fecha);
                    }
                    else
                    printf("No se puede modificar la fecha pues no se han introducido datos\n");
                    break;




Gracias de antemano por las molestias.

eferion

"recolectar" puede tener, básicamente, dos versiones diferentes:


  • Recibe la fecha de recolección y la cantidad recolectada
  • Recibe un puntero de tipo "cultivo"

Si optas por la primera opción, la fecha de recolección debe ser de tipo "fecha" ya que es el tipo que empleas para almacenar las fechas. Además, dado que pretendes modificarlo dentro de la función, debería ser un puntero. Además, presupongo que la "cantidad recolectada" debería inicializarse a 0 una vez has recolectado, cierto? en tal caso este parámetro también debería ser un puntero.

Si optas por la segunda opción, la función únicamente recibirá un parámetro que, por ser puntero, te permitirá modificar su contenido alegremente sin problemas.

Versión 1:

void recolectar ( fecha* recfecha, float* cantidadr);

Versión 2:

void recolectar( cultivo* datoscultivo );

El contenido de la función imagino que sabrás adaptarlo correctamente.

Un saludo.