PDA

Visualizza la versione completa : [C] Ordinamento struct


Nerul
22-01-2013, 18:10
A quanto pare è un problema abbastanza comune, ho letto spesso di persone che hanno problemi con le struct in C e, purtroppo, ci sono anche io. In realtà l'unica cosa che mi viene difficile è l'ordinamento, stavo provando con il bubblesort (anche perchè è l'unico che abbiamo fatto bene) ma mi è sembrato molto poco adatto. Quindi ho optato per strncpy, funzione che ho deciso di studiare da solo, in quanto, i miei professori, si sono dimostrati totali incompetenti. Quello che vi chiedo è di postare come dovrebbe essere fatto il codice, magari con qualche spiegazione. Io ho fatto varie e infruttuose prove. Se avete anche consigli generali per migliorare il codice sono sempre ben accetti. Grazie


//Codice che prende in input dati di un album e li restituisce ordinati per data

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 50

struct album {

char nome_album[SIZE];
char nome_artista[SIZE];
int anno_album;
};
typedef struct album CD;

void inserimento(int, CD[]);
void stampa(int, CD[]);
void ordinamento(int, CD[]);

main () {

int num_album;
CD album[SIZE];
//int menu=1;

printf("Quanti cd vuoi inserire? ");
scanf("%d",&num_album);
printf("\n");
printf("Inserisci i dati dei cd\n");

inserimento(num_album, album);
stampa(num_album, album);
ordinamento(num_album, album);
system("pause");
}


void inserimento(int num_album, CD album[]){

int i;

for (i=0;i<num_album;i++){

printf("\nCD %d\n",i+1);

printf("Nome dell'album\n");
gets(album[i].nome_album);
gets(album[i].nome_album);
printf("Nome dell'artista\n");
gets(album[i].nome_artista);
printf("Anno di uscita dell'album\n");
scanf("%d",&album[i].anno_album);
printf("\n");

}
return;
}

void stampa(int num_album, CD album[]){ //Per ora la stampa avviene seguendo l'ordine di inserimento ma vorrei che in seguito fosse legata all'ordinamento

int i;
for (i=0;i<num_album;i++){

printf("\nCD %d\n",i+1);

printf("%s,",album[i].nome_album);
printf("%s,",album[i].nome_artista);
printf("%d",album[i].anno_album);
}
printf("\n");
return;
}

void ordinamento(int num_album, CD album[]){


int i=0, j=0;
for (i=0; i<num_album-1; i++){
for (j=i+1; j<num_album; j++){
if (album[i].anno_album>album[j].anno_album){

//non so come continuare, tutte le prove, non hanno funzionato

}

}
}

MItaly
22-01-2013, 18:24
Ho provveduto a mettere il codice tra tag [co­de] ... [/co­de] (altrimenti perde l'indentazione) e a rendere il titolo un po' più significativo, in futuro ricordati di impostare il thread correttamente fin da subito.
:ciauz:

Nerul
22-01-2013, 18:36
Grazie mille, lo avevo fatto, ma evidentemente avevo sbagliato qualcosa perchè usciva tutto su un'unica riga quindi ho preferito scriverlo normalmente ;)

MItaly
22-01-2013, 18:44
Originariamente inviato da Nerul
Grazie mille, lo avevo fatto, ma evidentemente avevo sbagliato qualcosa perchè usciva tutto su un'unica riga quindi ho preferito scriverlo normalmente ;)
Sì è uno dei tanti bachi del forum :D i pulsanti "CODE", "PHP" e "Quote" sono sostanzialmente inutili perché la finestra che viene fuori consente di inserire una sola riga, il modo corretto è incollare il codice e aggiungerci intorno i tag [co­de] ... [/co­de] a mano.

oregon
22-01-2013, 18:57
Originariamente inviato da Nerul
//non so come continuare, tutte le prove, non hanno funzionato


Qui devi scambiare i due elementi del vettore di strutture album[i] e album[j] usando una variabile di tipo struttura temporanea (come faresti per due interi ...)

Nerul
22-01-2013, 19:09
Originariamente inviato da oregon
usando una variabile di tipo struttura temporanea
Ok e questo lo avevo capito, il problema è che la variabile struttura temporanea non so come inserirla, non è che potresti farmi un esempio?
Intendo: dovrei dichiararla nella funzione, quindi dovrebbe essere tipo

CD album[min];?

oregon
22-01-2013, 19:24
Semplicemente

CD temp;

Nerul
22-01-2013, 20:38
void ordinamento(int num_album, CD album[]){

CD temp;
int i=0, j=0;
for (i=0; i<num_album-1; i++){
for (j=i+1; j<num_album; j++){
if (album[i].anno_album<album[j].anno_album){

CD temp=CD album[i];
CD album[i]=CD album[j];
CD album[j]=CD temp;
}

faccio così ma mi da errore:
expected espression before CD
variable-sized object may not be initialized

Nerul
22-01-2013, 20:38
Originariamente inviato da Nerul
void ordinamento(int num_album, CD album[]){

CD temp;
int i=0, j=0;
for (i=0; i<num_album-1; i++){
for (j=i+1; j<num_album; j++){
if (album[i].anno_album<album[j].anno_album){

CD temp=CD album[i];
CD album[i]=CD album[j];
CD album[j]=CD temp;
}

faccio così ma mi da errore:
expected espression before CD
variable-sized object may not be initialized
scusate se non uso code ma continua a darmi quell'errore di mettere tutto su un unica linea

oregon
22-01-2013, 20:40
E' solo temp che devi dichiarare, il vettore esiste già ...



CD temp;

temp=album[i];
album[i]=album[j];
album[j]=temp;

Loading