Ciao a tutti. Ho fatto questo programmino per la creazione di un file e successivamente per ordinarlo in snso decresente in base al campo "Invitati"
Ho due problemi:codice:#include <stdio.h> #include <string.h> #define n 10 struct matrimonio { char Cognome_Sposo[15]; char Cognome_Sposa[15]; int Data; int Invitati; }matri[n]; int main() { char sposo[15]; char sposa[15]; int data; int invitati; int j; int i = 0; char app[15]; int appo; FILE *cfPtr; /* puntatore al file eventi.dat */ /* fopen apre il file in lettura/scrittura; se non riesce ad aprirlo provoca l'uscita dal programma */ if (( cfPtr = fopen("eventi.dat", "w")) == NULL ) { printf("Il file non può essere aperto.\n"); } else { printf("Inserisci il cognome dello sposo, il cognome della sposa, la data e il numero di invitati : \n"); printf("Inserisci EOF per terminare l'inserimento \n"); scanf("%s%s%d%d", sposo, sposa, &data, &invitati ); /* scrive i dati nel file con fprintf */ while (!feof(stdin)) { /* stdin punta al file e la funzione feof controlla l'impostazione di EOF */ fprintf(cfPtr, "%s %s %d %d\n", sposo, sposa, data, invitati); scanf("%s%s%d%d", sposo, sposa, &data, &invitati); } /* end while */ fclose(cfPtr); } /* end else */ /* fopen apre il file in lettura; se non riesce ad aprire il file provoca l'uscita dal programma */ if (( cfPtr = fopen("eventi.dat", "r")) == NULL ) { printf("Il file non può essere aperto \n"); } else { fscanf(cfPtr, "%s %s %d %d", sposo, sposa, &data, &invitati); strcpy(matri[i].Cognome_Sposo, sposo); strcpy(matri[i].Cognome_Sposa, sposa); matri[i].Data = data; matri[i].Invitati = invitati; i++; while (!feof(cfPtr)) { fscanf(cfPtr, "%s %s %d %d", sposo, sposa, &data, &invitati); strcpy(matri[i].Cognome_Sposo, sposo); strcpy(matri[i].Cognome_Sposa, sposa); matri[i].Data = data; matri[i].Invitati = invitati; i++; } /* end while */ fclose(cfPtr); } /* end else */ printf("%15s%15s%6s%18s", "COGNOME SPOSO", "COGNOME SPOSA", "DATA", "NUMERO INVITATI\n"); for ( j = 0; j < i - 1; j++ ) { printf("%15s%15s%6d%18d", matri[j].Cognome_Sposo, matri[j].Cognome_Sposa, matri[j].Data, matri[j].Invitati); printf("\n"); } for ( j = 0; j < i; j++ ) { if (matri[j].Invitati < matri[j+1].Invitati ) { strcpy(app, matri[j].Cognome_Sposo); strcpy(matri[j].Cognome_Sposo, matri[j+1].Cognome_Sposo); strcpy(matri[j+1].Cognome_Sposo, app); strcpy(app, matri[j].Cognome_Sposa); strcpy(matri[j].Cognome_Sposa, matri[j+1].Cognome_Sposa); strcpy(matri[j+1].Cognome_Sposa, app); appo = matri[j].Data; matri[j].Data = matri[j+1].Data; matri[j+1].Data = appo; appo = matri[j].Invitati; matri[j].Invitati = matri[j+1].Invitati; matri[j+1].Invitati = appo; } } printf("MATRIMONI ORDINATI IN SENSO DECRESCENTE IN BASE AL NUMERO DI IVNITATI\n"); printf("%15s%15s%6s%18s", "COGNOME SPOSO", "COGNOME SPOSA", "DATA", "NUMERO INVITATI\n"); for ( j = 0; j < i; j++ ) { printf("%15s%15s%6d%18d", matri[j].Cognome_Sposo, matri[j].Cognome_Sposa, matri[j].Data, matri[j].Invitati); printf("\n"); } return 0; }
1. sugli indici per il ciclo for per la visualizzazione
quando vado a scrivere il file arrivo ad un determinato "i". quindi di norma per la visualizzazione j dovrebbe andare da j = 0 a j < i ma se faccio così l'ultimo elemento me lo visualizza 2 volte e quindi ho messo "i - 1"..ma non capisco il perchè???codice:printf("%15s%15s%6s%18s", "COGNOME SPOSO", "COGNOME SPOSA", "DATA", "NUMERO INVITATI\n"); for ( j = 0; j < i - 1; j++ ) { printf("%15s%15s%6d%18d", matri[j].Cognome_Sposo, matri[j].Cognome_Sposa, matri[j].Data, matri[j].Invitati); printf("\n"); }
NON RIESCO A CAPIRNE IL MOTIVO..per favore qualcuno può aiutami??? Grazieee

Rispondi quotando
