miércoles, 8 de junio de 2011

Ejercicio de Ficheros Resuelto

/*Queremos idear un programa que permita:
1. Generar un fichero de texto para guardar una lista de platos de un
restaurante, el numero de calorias y el precio y guardarlo en un txt
2. Recuperar los platos del fichero txt y ordenarlos por su precio de mayor a
menor guardando la lista ordenada en un fichero con formato propio que incluya
el nombre del plato y el precio mas iva*/
#include<stdio.h>
#include<stdlib.h>
typedef struct{
    char nombre[80];
    int calorias;
    float precio;      
}plato;
int mostrar_menu(){
    int opcion;
    system("cls");
    printf("\n******MENU*****");
    printf("\n0. Salir del programa.");
    printf("\n1. Introducir los platos en un fichero .txt.");
    printf("\n2. Mostrar el contenido del fichero.");
    printf("\n3. Volcar los datos del fichero .txt en un fichero .mdd ordenados.");
    printf("\n4. Mostramos el .mdd.");          
    printf("\nElige una opcion: ");
    scanf("%d",&opcion);
    return(opcion);        
}
void leer_platos(){
    FILE *fichero;
    plato plato_leido;
    char ruta[80];
    char seguir='s';
    int cont=1;
    printf("\nIntroduce la ruta: ");
    scanf(" %[^\n]",ruta);
    fichero=fopen(ruta,"w");
    do{
       printf("\nPLATO %d",cont);
       printf("\nNombre del plato: ");
       scanf(" %[^\n]",plato_leido.nombre);
       printf("\nCalorias: ");
       scanf("%d",&plato_leido.calorias);
       printf("\nPrecio: ");
       scanf("%f",&plato_leido.precio);
       fprintf(fichero,"%s\t%d\t%.2f\n",plato_leido.nombre,plato_leido.calorias,plato_leido.precio);                
       printf("\nDesearias introducir un nuevo plato (s/n): ");
       scanf(" %c",&seguir);
       cont++;                    
    }while(seguir=='s');      
    fclose(fichero);        
}
void mostrar_fichero(){
    FILE *fichero;
    plato plato_leido;
    char ruta[80];
    char seguir='s';
    int cont=1;
    printf("\nIntroduce la ruta: ");
    scanf(" %[^\n]",ruta);
    fichero=fopen(ruta,"r");
    printf("\nCONTENIDO DEL FICHERO: %s",ruta);
    printf("\nPLATO\tCalorias\tPrecio\n");
    do{
       fscanf(fichero,"%[^\t]\t%d\t%f\n",plato_leido.nombre,&plato_leido.calorias,&plato_leido.precio);                    
       printf("%s\t%d\t%.2f\n",plato_leido.nombre,plato_leido.calorias,plato_leido.precio);
    }while(feof(fichero)==0);  
    printf("\nPara continuar presiona cualquier tecla: ");
    fflush(stdin);
    getchar();  
   return;              
}
int leer_datos(FILE *fichero_origen,plato *plato_leido[]){
      int cont=0;
      do{
       plato_leido[cont]=(plato *) malloc(1*sizeof(plato));
       fscanf(fichero_origen,"%[^\t]\t%d\t%f\n",plato_leido[cont]->nombre,&plato_leido[cont]->calorias,&plato_leido[cont]->precio);                    
       //Añadimos el IVA al precio del plato
       plato_leido[cont]->nombre=(plato_leido[cont]->precio*1.18);
       cont++;
    }while(feof(fichero_origen)==0);
    return(cont);          
}
void mostrar_platos_leidos(plato *plato_leido[],int nplatos){
     int cont;
     printf("\nPLATOS LEIDOS");
     for(cont=0;cont<nplatos;cont++){
         printf("\nNombre del plato=%s",plato_leido[cont]->nombre);
         printf("\nCalorias= %d",plato_leido[cont]->calorias);
         printf("\nPrecio= %.2f",plato_leido[cont]->precio);
         printf("\n*****************************");                          
     }                                    
     getchar();
     getchar();
     return;                                    
}
void ordeno_datos(plato *plato_leido[],int nplatos){
     int veces,cont;
     plato *aux;
     for(veces=1;veces<nplatos;veces++)
       for(cont=0;cont<nplatos-1;cont++)
         if(plato_leido[cont]->precio<plato_leido[cont+1]->precio){
           aux=plato_leido[cont];
           plato_leido[cont]=plato_leido[cont+1];
           plato_leido[cont+1]=aux;
         }
     return;
}
void grabo_datos(FILE *fichero_destino,plato *plato_leido[],int nplatos){
     char ruta[80];
     int cont;
     printf("\nIntroduce la ruta en la que quieres guardar el fichero .mdd: ");
     scanf(" %[^\n]",ruta);
     fichero_destino=fopen(ruta,"w");
     if(fichero_destino==0)
       printf("\nError en la ruta.");
     else{
       for(cont=0;cont<nplatos;cont++)  
         fwrite(plato_leido[cont],sizeof(plato),1,fichero_destino);
       fclose(fichero_destino);
     }
     return;                              
}
void pasar_txt_format_ordenado(){
     char ruta[80];
     plato *plato_leido[50];
     int nplatos;
     FILE *fichero_origen,*fichero_destino;
     printf("\nIntroduce la ruta: ");
     scanf(" %[^\n]",ruta);
     fichero_origen=fopen(ruta,"r");
     nplatos=leer_datos(fichero_origen,plato_leido);
     mostrar_platos_leidos(plato_leido,nplatos);
     ordeno_datos(plato_leido,nplatos);
     printf("\nDespues de ordenar los platos: \n");
     mostrar_platos_leidos(plato_leido,nplatos);
     grabo_datos(fichero_destino,plato_leido,nplatos);
     return;                      
}
void mostrar_mdd(){
     FILE *fichero_destino;
     char ruta[80];
     plato plato_leido;
    
     printf("\nIntroduce la ruta: ");
     scanf(" %[^\n]",ruta);
     fichero_destino=fopen(ruta,"r");
    
     printf("\nCONTENIDO DEL FICHERO: %s",ruta);
     printf("\nPLATO\tCalorias\tPrecio\n");
     do{
       fscanf(fichero_destino,"%[^\t]\t%d\t%f\n",plato_leido.nombre,&plato_leido.calorias,&plato_leido.precio);                    
       printf("%s\t%d\t%.2f\n",plato_leido.nombre,plato_leido.calorias,plato_leido.precio);
     }while(feof(fichero_destino)==0);
     return;
}
main(){
      int opcion;
      do{
       opcion=mostrar_menu();
       switch(opcion){
          case 0:
               printf("\nPrograma finalizado");
               break;
          case 1:
               system("cls");
               leer_platos();
               break;  
          case 2:
               system("cls");
               mostrar_fichero();
               break;
          case 3:
               system("cls");
               pasar_txt_format_ordenado();
               break;
          case 4:
               system("cls");
               mostrar_mdd();
               break;
          default:
               printf("\nEsa opcion no existe.Presione cualquier tecla para continuar: ");
               getchar();    
       }
      }while(opcion!=0);  
}

No hay comentarios:

Publicar un comentario