Salva a tutti sono nuovo nel forum. Mi servirebbe una mano nel capire quali errori ho commesso nel codice che ho realizzato per un'esercitazione per esame universitario. La traccia del problema richiedeva, una volta definita la struttura e averla popolata, di effettuare l'ordinamento in base al livello degli impiegati. Fino alla creazione e al popolamento della tabella il programma funziona, però poi arrivato all'ordinamento il programma termina dandomi errore. Il compilatore tuttavia non mi segnala alcun errore. Il problema dunque risiede nel modo in cui uso le istruzioni nella procedura ordina (o comunque nel modo in cui passo i parametri), però facendo vari tentativi non sono ancora riuscito a comprendere bene come usare i comandi per lo scambio di elementi all'interno della struttura, né tantomeno a capire se sono corretti.
Il tipo di ordinamento che ho usato è un Bubble Sort con sentinella (o almeno credo sia quello, dato che ho realizzato il codice seguendo l'algoritmo con i diagrammi di flusso che la prof ci ha passato. Comunque il codice dell'ordinamento funziona, l'ho testato su array monodimensionale).
codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100
typedef struct{
char matricola[7];
char nome[20];
char cognome[20];
int livello;
int straord_mensile[12];
int straord_annuo;
}impiegati_t;
impiegati_t inserimento (void);
void ordina (impiegati_t *dipendenti, int dim);
int main(){
impiegati_t impiegati[MAX];
int i;
int n;
printf("Inserisci il numero dei dipendenti. (Max 100 dipendenti) \n");
scanf("%d", &n);
for(i=0; i<n; i++){
impiegati[i]=inserimento();
}
ordina (&impiegati[MAX], n);
return(0);
}
impiegati_t inserimento(void){
impiegati_t impieg;
int j;
printf("Inserisci il codice matricola dell'impiegato. (6 caratteri) \n");
scanf("%s", impieg.matricola);
printf("Inserisci il nome dell'impiegato. \n");
scanf("%s", impieg.nome);
printf("Inserisci il cognome dell'impiegato. \n");
scanf("%s", impieg.cognome);
printf("Inserisci il livello dell'impiegato. \n");
scanf("%d", &impieg.livello);
printf("\nInserisci il numero di ore di straordinari mensili dell'impiegato. \n");
impieg.straord_annuo=0;
for (j=0; j<12; j++){
printf("Inserisci il numero di ore di straordinari del %d ^ mese dell'impiegato. \n", (j+1));
scanf("%d", &impieg.straord_mensile[j]);
impieg.straord_annuo=impieg.straord_annuo+impieg.straord_mensile[j];
}
return(impieg);
}
void ordina (impiegati_t *dipendenti, int dim){
int i, j;
int perno;
int scambio;
impiegati_t temp[MAX];
temp[MAX]=*dipendenti;
perno=dim;
do{
scambio=0;
i=0;
j=0;
for(i=0; i<perno-1; i++){
if(dipendenti[i].straord_annuo>dipendenti[i+1].straord_annuo){
strcpy(temp[j].nome, dipendenti[i].nome);
strcpy(dipendenti[i].nome, dipendenti[i+1].nome);
strcpy(dipendenti[i+1].nome, temp[j].nome);
strcpy(temp[j].cognome, dipendenti[i].cognome);
strcpy(dipendenti[i].cognome, dipendenti[i+1].cognome);
strcpy(dipendenti[i+1].cognome, temp[j].cognome);
strcpy(temp[j].matricola, dipendenti[i].matricola);
strcpy(dipendenti[i].matricola, dipendenti[i+1].matricola);
strcpy(dipendenti[i+1].matricola, temp[j].matricola);
temp[j].livello=dipendenti[i].straord_annuo;
dipendenti[i].straord_annuo=dipendenti[i+1].straord_annuo;
dipendenti[i+1].straord_annuo=temp[j].livello;
temp[j].straord_annuo=dipendenti[i].straord_annuo;
dipendenti[i].straord_annuo=dipendenti[i+1].straord_annuo;
dipendenti[i+1].straord_annuo=temp[j].straord_annuo;
scambio=1;
j++;
}
}
perno=perno-1;
}while(scambio!=0);
for(i=0; i<dim; i++){
printf("Matricola impiegato: %s \n", dipendenti[i].matricola);
printf("Nome impiegato: %s \n", dipendenti[i].nome);
printf("Cognome impiegato: %s \n", dipendenti[i].cognome);
printf("Livello impiegato: %d \n", dipendenti[i].livello);
printf("Straordinario annuo: %d \n", dipendenti[i].straord_annuo);
}
}