codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h> //Necessaria per strcpy
#define NUMCAR 25 //Le macro si solito si scrivono tutte in maiuscolo per distinguerle
#define MASSIMO 3
#define ARRSIZE(arr) (sizeof(arr)/sizeof(*arr)) //Macro che ottiene le dimensioni di un array allocato sullo stack
int main(){
struct cantante {
char lastname[NUMCAR];
char firstname[NUMCAR];
unsigned int dischi; //Non sono necessari i double, non credo che nessuno abbia mai pubblicato frazioni di dischi...
} cantanti[MASSIMO];
//La variabile I non serve, si può riciclare i
int i;
int j = 0;
char buffer[NUMCAR];
double disco;
for (i = 0; i < MASSIMO; i++){ //i deve essere solo minore, mai essere uguale a MASSIMO, altrimenti sfori dall'array
printf ("Inserire cantante %d :\n", i);
printf ("Cognome : ");
scanf ("%24s", cantanti[i].lastname); //Occhio, il numero massimo di caratteri da acquisire è 24, il 25 è riservato al NUL
cantanti[i].lastname[ARRSIZE(cantanti[i].lastname)-1]=0; //Mi assicuro che il buffer sia NUL-terminated
printf ("Nome : ");
scanf ("%24s", cantanti[i].firstname);
cantanti[i].firstname[ARRSIZE(cantanti[i].firstname)-1]=0;
printf ("Totale dischi : ");
scanf ("%u",&cantanti[i].dischi);
//Se cantanti[i].dischi fosse stato un double come era prima avresti dovuto mettere:
//scanf ("%lf", &cantanti[i].dischi);
}
for (i = 0; i < MASSIMO - 1; i++){
for (j = i + 1; j < MASSIMO; j++){
if (cantanti[i].dischi > cantanti[j].dischi){
strcpy(buffer,cantanti[j].lastname);
strcpy(cantanti[j].lastname,cantanti[i].lastname);
strcpy(cantanti[i].lastname,buffer);
strcpy(buffer,cantanti[j].firstname);
strcpy(cantanti[j].firstname,cantanti[i].firstname);
strcpy(cantanti[i].firstname,buffer);
disco = cantanti[j].dischi;
cantanti[j].dischi = cantanti[i].dischi;
cantanti[i].dischi = disco;
}
}
}
printf ("Stampa ordinata\n");
//In questo modo le intestazioni sono allineate come le scritte
printf ("%25s%25s%30s\n","COGNOME","NOME","DISCHI");
for (i = 0; i < MASSIMO; i++){
printf ("%25s%25s%30u", cantanti[i].lastname, cantanti[i].firstname, cantanti[i].dischi);
}
return 0;
}