PDA

Visualizza la versione completa : [C] Algoritmo di ordinamento (era: Saluti a tutti!!!!)


Trusty
19-12-2004, 11:23
Buongiorno a tutti!!!
Sono appena arrivato nel vostro club (forum) e ho già bisogno di un piccolo aiutino da parte vostra!!Ebbene, vado all'Università ma mi trovo impacciato su una cosa:
Dati i seguenti tipi:

typedef struct{
int ore;
int minuti;}Orario;

typedef struct {
Orario time;
char attivita[20];} Impegno;


devo scrivere una funzione void agenda (Impegno agenda[],int n) che data una agenda, cioè un array di impegni di dimensione n, riordina gli impegni contenuti secondo l'ordine cronologico! Vi giuro che è una settimana che ci provo ma non ce la faccio proprio (senza scrivere una tonnellata) di righe di codice!! Vi prego, aiutatemi!!!!

unomichisiada
19-12-2004, 12:14
Originariamente inviato da Trusty
Buongiorno a tutti!!!
Sono appena arrivato nel vostro club (forum) e ho già bisogno di un piccolo aiutino da parte vostra!!Ebbene, vado all'Università ma mi trovo impacciato su una cosa:
Dati i seguenti tipi:

typedef struct{
int ore;
int minuti;}Orario;

typedef struct {
Orario time;
char attivita[20];} Impegno;


devo scrivere una funzione void agenda (Impegno agenda[],int n) che data una agenda, cioè un array di impegni di dimensione n, riordina gli impegni contenuti secondo l'ordine cronologico! Vi giuro che è una settimana che ci provo ma non ce la faccio proprio (senza scrivere una tonnellata) di righe di codice!! Vi prego, aiutatemi!!!!
Innanzitutto (ma ci penseranno i moderatori a rimproverarti) ti consiglio di mettere un titolo più esplicativo la prox volta.
Per quanto riguarda il tuo problema prima una domanda secca:ma gli algoritmi di ordinamento su interi li avete fatti?Tipo selectionsort,quicksort,bubblesort etc...Se è così il problema si riduce a riadattare leggermente uno di quelli per ordinare rispetto al campo che ti interessa.Prima rispondi alla mia domanda quindi,li avete fatti?

pprllo
19-12-2004, 12:27
Con il banalissimo bubblesort:


typedef struct{
int ore;
int minuti;}Orario;

typedef struct {
Orario time;
char attivita[20];} Impegno;

int OrarioComp(Orario a, Orario b)
{
int r;
r = a.ore - b.ore;
if (!r) r = a.minuti - b.minuti;
return r;
}

void OrdinaImpegni(Impegno a[], int n)
{
for (int i = n-1; i >= 0; i--)
for (int j = n-2; j >= 0; j--)
if (OrarioComp(a[j].time, a[j+1].time)>0)
{
Impegno temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}

Trusty
19-12-2004, 12:41
No, gli algoritmi di ordinamento non li abbiamo ancora fatti!!! Per quanto riguarda la procedura devo farne una sola !!! Si possono concentrare in un unica procedura le due procedure di sopra?? Grazie per le risposte !!!!


Thank you!!!!!!!!!!!

pprllo
19-12-2004, 12:53
Con una sola procedura (molto molto poco elegante)


typedef struct{
int ore;
int minuti;}Orario;

typedef struct {
Orario time;
char attivita[20];} Impegno;

void OrdinaImpegni(Impegno a[], int n)
{
for (int i = n-1; i >= 0; i--)
for (int j = n-2; j >= 0; j--)
if ((a[j].time.ore*60 + a[j].time.minuti) > (a[j+1].time.ore*60 + a[j+1].time.minuti))
{
Impegno temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}

pprllo
19-12-2004, 12:55
unomichiasada questi sono programmi abbastanza semplici probabilmente lo fanno come esercitazione introduttiva agli algoritmi di ordinamento :)

MMarzia
19-12-2004, 13:43
Originariamente inviato da Trusty
Buongiorno a tutti!!!
Sono appena arrivato nel vostro club (forum) e ho già bisogno di un piccolo aiutino da parte vostra!!

benvenuto anche a te

oltre a specificare il linguaggio come giustamente hai fatto, ricorda di utilizzare titoli più significiativi

Trusty
19-12-2004, 13:54
Posso chiedervi se cortesemente mi spiegate l'if del codice di sopra??

Tante Grazie!!!

pprllo
19-12-2004, 14:30
if ((a[j].time.ore*60 + a[j].time.minuti) > (a[j+1].time.ore*60 + a[j+1].time.minuti))


Questo if fa un semplice confronto:
facendo ore*60+minuti ottiene i minuti totali dell'uno e dell'altro, quindi li confronta. Se un elemento che viene prima nella lista in termini di tempo sta dopo, fa uno scambio. Insomma il significato e':
SE IL TOTALE MINUTI DEL PRIMO E' MAGGIORE DEL TOTALE MINUTI DEL SECONDO ...
L'alternativa sarebbe:



if ((a[j].time.ore > a[j+].time.ore) || (a[j].time.ore == a[j+1].time.ore && a[j].time.minuti > a[j+1].time.minuti))


Questo invece dice:
SE IL TOTALE ORE DEL PRIMO E' MAGGIORE DEL TOTALE ORE DEL SECONDO O IL TOTALE ORE E' UGUALE, MA IL TOTALE MINUTI DEL PRIMO E' MAGGIORE DEL TOTALE MINUTI DEL SECONDO ...

Capito ora ?

Trusty
19-12-2004, 14:33
Certo!!!
Grazie ancora!!!!!! Ciauzzz!!!!!!

Loading