Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2020
    Messaggi
    1

    [C] Apertura di un file e operazioni su automobili

    Salve ho scritto questo programma per scuola (ho iniziato da poco a scrivere c quindi abbiate pietà) ma ho diversi problemi tra cui:
    - Se faccio un inserimento, la visualizzazione e poi un altro inserimento, la seconda auto sovrascrive la prima
    -Il programma chiude quando gli dico di caricare il file

    E non capisco davvero dove sbaglio.
    Grazie in anticipo per l'aiuto

    PROGRAMMA:


    codice:
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    
    #define N 10
    #define B 4
    
    
    
    
      
    typedef struct {
          char cognome[20];
          char nome[20]; 
    } nomi;  
    
    
    typedef struct {
      char marca[20];
      char modello[20];
      int anno;
      int prezzo;
      char targa [7];
      nomi proprietari [B];   
    } automobili;
    
    
    int main() {
         int c=0,i,n,anno,tot=0;                    //c = Numero proprietari            n = Numero di Auto
         automobili autosalone[N];
         char marca[20];
          FILE *pf;
          FILE * fp; // Per usare il file
          int scelta = 0, cancello;
         
         
         do {
    
    
            printf("\n 1) Inserimento\n 2) Cancellazione\n 3) Ordinamento\n 4) Visualizza risultati\n 5) Salva\n 6) Carica da file\n 0) Esci\n: ");
                scanf("%d", &scelta);
                switch (scelta) {
                    case 1:
                        do{
                            printf("Quante auto vuoi inserire?: ");
                            scanf("%d", &n);
                                    
                            if (n>N)
                                printf ("Posso inserire solo 10 auto\n\n");
                            if (n<1)
                                printf ("Non puoi inserire 0 auto\n\n");
                                        
                        } while (n<1 || n>N);
                                
                              
                            for(i=0; i<n; i++){
                                        
                                printf("\nAuto %d\n", i+1);
                                printf("\nMarca: ");
                                    scanf("%s", autosalone[i].marca);
                                printf("\nModello: ");
                                    scanf("%s", autosalone[i].modello);
                                printf("\nTarga (GENTILMENTE TUTTA ATTACCATA): ");
                                    scanf("%s", autosalone[i].targa);
                                         
                                do {
                                    printf("\nPrezzo: ");
                                           scanf("%d", &autosalone[i].prezzo);
                                           
                                    if ((autosalone[i].prezzo) <= 1)
                                        printf ("Non puoi non aver pagato la tua auto\n\n");
                                        
                                } while ((autosalone[i].prezzo) <= 1);
                            
                                    
                                do  {
                                    printf("\nAnno immatricolazione: ");
                                        scanf("%d", &autosalone[i].anno);
                                        
                                    if ((autosalone[i].anno)<1900)
                                        printf ("La targa non puo' esser stata immatricolata cosi' tanti anni fa'\n");
                                        
                                    if ((autosalone[i].anno)<1990 && (autosalone[i].anno)>1901)                                        // || &&
                                        printf ("\nComplimenti, hai proprio una bella auto d'epoca\n");
                                        
                                    if ((autosalone[i].anno)>2020)
                                        printf ("La targa non puo' esser stata immatricolata nel futuro\n\n");
                                        
                                } while ((autosalone[i].anno)<1900 && (autosalone[i].anno)>2020);                                    // || &&
                                    
                                    
                                do {
                                    printf("\nQuanti proprietari ha l'auto?: ");
                                        scanf("%d", &c);
                                    if (c>3)
                                        printf ("\nL'auto non puo' avere piu' di 3 proprietari\n\n");
                                }while (c>3);
                                        
                                for (int j = 0; j<c; j++) {
                                    printf("\nNome del %d^ proprietario: ", j+1);
                                        scanf("%s", autosalone[i].proprietari[j].nome);
                                        
                                    printf("\nCognome del %d^ proprietario: ", j+1);
                                        scanf("\n%s", autosalone[i].proprietari[j].cognome);
                                        
                            }
                                } break;
                        
                    case 2:
                    
                        do {
                
                            printf ("Quale posizione vuoi cancellare? ");
                                scanf ("\n%d", &cancello);
                
                        } while ((cancello< 0) || (cancello > n));
            
                        for (int i = cancello ; i < n; i++) {
                    
                            autosalone[i] = autosalone [i-1];                            //cancellazione e spostamento degli elementi nel vettore
                        }
                        n--;
                    
                    break;
                    
                    case 3: // Ordinamento non ottimizzato
                        for (int i=0; i<n; i++) { // ripeto il ciclo numFrutti volte
                            for (int j=0; j<n-1; j++) { // Confronta le coppie
                                if (strcmp(autosalone[j].proprietari[j].nome, autosalone[j+1].proprietari[j].nome)>0) {
                                    // scambia i valori
                                    automobili fTemp = autosalone[j];
                                    autosalone[j] = autosalone[j+1];
                                    autosalone[j+1] = fTemp;
                                }
                            }
                        }    
                        printf ("Vettore ordinato correttamente");
                                
                    break;
                    
                    case 4:    
                    
                        for (int i= 0; i<n; i++) {
                
                               printf("\nAuto %d\n", i+1);
                            printf ("\nMarca: %s\n", autosalone[i].marca);
                            printf ("Modello: %s\n", autosalone[i].modello);
                            printf ("Anno: %d\n", autosalone[i].anno);
                            printf ("Targa: %s\n", autosalone[i].targa);
                            printf ("Prezzo: %d\n", autosalone[i].prezzo);
                            printf ("Anno: %d\n", autosalone[i].anno);
                            for (int j = 0; j<c; j++) {
                                printf ("Nome del %d proprietario: %s\n", j+1, autosalone[i].proprietari[j].nome);
                                printf ("Cognome del %d proprietario: %s\n\n", j+1, autosalone[i].proprietari[j].cognome);
                            }
                        } break;
                    
                    case 5: // Salvo la struttura
                        if (n>0) {                    
                            // Apro il file 
                            fp = fopen ("Autosalone.txt","wb");
                            if (fp!=NULL) { // Se sono riuscito a creare il file
                                fwrite(autosalone,sizeof(automobili),n, fp);                    
                                fclose(fp);
                                printf("Salvataggio avvenuto con successo di %d auto\n", n);
                            } else {
                                printf("Attenzione, errore nella creazione del file");
                            }
                        } else {
                            printf("Spiacente, non c'? nulla da salvare'");
                        }
                    
                    break;
                    
                    case 6: // Carico la struttura
                        printf("\nAttenzione, caricando i dati perderete tutti i dati in memoria, continuare? (Y/n)");
                        char f;
                        fflush(stdin);
                            scanf("%c",&f);
                        if (f=='Y') { // Autorizzazione a caricare!
                            fp = fopen("Autosalone.txt","rb");
                            if (fp!=NULL) { // Se il file esiste
                                while (!feof(fp)) {
                                    int res = fread(&autosalone[n],sizeof(automobili),1, fp);
                                    if (res>0) { // Dopo avere letto l'ultimo elemento ne legge sempre uno vuoto
                                        n++;
                                    }
                                }
                                fclose(fp);
                                printf("Caricamento avvenuto con successo di %d auto\n", n);
                            } else {
                                printf("Mi spiace, sembra che il file Autosalone.txt non esista\n");                        
                            }
                        };
                        break;    
                            
                    case 0:
                        exit (1);
                    break;
        
                }
        } while (scelta <6);
    }
    Ultima modifica di LeleFT; 05-10-2020 a 10:16 Motivo: Aggiunti i tag CODE

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,336
    La variabile n va azzera prima della lettura
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2020
    Messaggi
    1
    Ciao grazie della risposta,....non capisco, nel primo case devo azzerare la n?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,336
    Quote Originariamente inviata da C0DEX Visualizza il messaggio
    Ciao grazie della risposta,....non capisco, nel primo case devo azzerare la n?
    "prima della lettura"
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2020 vBulletin Solutions, Inc. All rights reserved.