PDA

Visualizza la versione completa : [C] Ordinamento


luanlombardi
20-08-2008, 12:12
Salve a tutti!

Sto scrivendo un programma di un compito di Informatica.
Questa è la traccia:

"Un Comune deve organizzare una manifestazione di intrattenimento nel centro cittadino. Su un file strutturato (“eventi.dat”) bisogna pertanto memorizzare gli eventi che costituiscono ala manifestazione, caratterizzati dalle seguenti informazioni: nome organizzazione, tipo evento, ora inizio evento, minuto inizio evento, durata evento(in minuti).
Si codifichi in linguaggio C un programma che:
permetta l’inserimento di un nuovo evento nel file(anche quando il file è vuoto)
consenta di ordinare gli eventi in base all’orario (ora e minuto) di inizio
consenta di sapere, data un’ora di inizio, tutti gli eventi della manifestazione organizzati in quell’ora."

Quello che mi manca è l'ordinamento, scritto sopra in grassetto:

Questo è il codice finora scritto:



#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>

#define MAX 100

//creazione struttura per contenere le manifestazioni
typedef struct {
char nome[50];
char tipo[200];
char ora[MAX];
char minuto[MAX];
char durata[MAX];
} manifestazione;

//creazione struttura per la lista
struct elemento {
manifestazione inf;
struct elemento *pun;
};

//prototipi funzioni
void VisualizzaManifestazione(struct elemento *p);
struct elemento *AggiungiManifestazione(struct elemento *p);
void Ordina(struct elemento *p);
void pausa();

//main
main()
{
//variabile scelta
int scelta;
struct elemento *lista = NULL;

//ciclo infinito per il menu
for( ; ; ) {
printf("MANIFESTAZIONI\n");
printf(" 1 Visualizza Manifestazione\n");
printf(" 2 Aggiungi Manifestazione\n");
printf(" 3 Ordina\n");
printf(" 0 Esci\n");

printf("La tua scelta >> ");

scanf("%i", &scelta);
scelta = (int)scelta; //cast

if(scelta == 0)
{
printf("Arrivederci");
break;
}
else if(scelta == 1)
{
VisualizzaManifestazione(lista);
}
else if(scelta == 2)
{
lista = AggiungiManifestazione(lista);
}
else if(scelta == 3)
{
Ordina(lista);
}
}//chiusura ciclo for

}//chiusura main

/*
Visualizza Manifestazioni
*/
void VisualizzaManifestazione(struct elemento *p)
{
if(p == NULL)
{
printf("Non ci sono Manifestazioni");
pausa();
} else {
printf("Nome > %s\n", p->inf.nome);
printf("Tipo > %s\n", p->inf.tipo);
printf("Ora > %s\n", p->inf.ora);
printf("Minuto > %s\n", p->inf.minuto);
printf("Durata > %s\n", p->inf.durata);
pausa();
}

while(p != NULL)//stampiamo tutte le altre manifestazioni
{
printf("Nome > %s\n", p->inf.nome);
printf("Tipo > %s\n", p->inf.tipo);
printf("Ora > %s\n", p->inf.ora);
printf("Minuto > %s\n", p->inf.minuto);
printf("Durata > %s\n", p->inf.durata);
pausa();
p = p->pun; //legge l'elemento successivo
}
return;
}

/*
Aggiungi Manifestazione
*/
struct elemento *AggiungiManifestazione(struct elemento *p)
{
printf("Aggiungi Manifestazione\n");

//dichiariamo le variabili
char nome[50];
char tipo[200];
char ora[MAX];
char minuto[MAX];
char durata[MAX];
manifestazione daInserire;
struct elemento *punt;

//popoliamo le variabili
printf("Nome > ");
scanf("%s", nome);
strcpy(daInserire.nome, nome);
printf("Tipo > ");
scanf("%s", tipo);
strcpy(daInserire.tipo, tipo);
printf("Ora > ");
scanf("%s", ora);
strcpy(daInserire.ora, ora);
printf("Minuti > ");
scanf("%s", minuto);
strcpy(daInserire.minuto, minuto);
printf("Durata > ");
scanf("%s", durata);
strcpy(daInserire.durata, durata);

if(p != NULL)
{
//creazione elementi successivi
//allochiamo la memoria necessaria
punt = (struct elemento *)malloc(sizeof(struct elemento));
//metto daInserire nell'informazione del puntatore
punt->inf = daInserire;
//metto il puntatore in testa alla lista
punt->pun = p;
} else {
//creazione primo elemento
//allochiamo la memoria necessaria
p = (struct elemento *)malloc(sizeof(struct elemento));
//metto da inserire nell'informazione del puntatore
p->inf = daInserire;
//metto il puntatore in testa alla lista
p->pun = NULL;
//assegno p a punt
punt = p;
}

return(punt);
}


/*
ordina le manifestazioni in base all'ora e ai minuti
*/
void Ordina(struct elemento *p)
{

}


//funzione pausa
void pausa()
{
char invio;
printf("premere Invio per continuare");
invio = getchar();
return;
}


Un grazie anticipato per le vostre spiegazioni

























:D

Vincenzo1968
20-08-2008, 15:44
Ciao,

puoi vedere qui

http://forum.html.it/forum/showthread.php?s=&threadid=1232501

devi solo adattare il codice al tuo problema.
:)

luanlombardi
20-08-2008, 17:47
Grazie!

Ho provato a fare cosi:



#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>

#define MAX 100

//creazione struttura per contenere le manifestazioni
typedef struct {
char nome[50];
char tipo[200];
char ora[MAX];
char minuto[MAX];
char durata[MAX];
} manifestazione;

//creazione struttura per la lista
struct elemento {
manifestazione inf;
struct elemento *pun;
};

//prototipi funzioni
void VisualizzaManifestazione(struct elemento *p);
struct elemento *AggiungiManifestazione(struct elemento *p);
int Ordina(const void *p1, const void *p2);
void pausa();

//main
main(void)
{
//variabile scelta
int scelta;
struct elemento *lista = NULL;
manifestazione *man;


//ciclo infinito per il menu
for( ; ; ) {
printf("MANIFESTAZIONI\n");
printf(" 1 Visualizza Manifestazione\n");
printf(" 2 Aggiungi Manifestazione\n");
printf(" 3 Ordina\n");
printf(" 0 Esci\n");

printf("La tua scelta >> ");

scanf("%i", &scelta);
scelta = (int)scelta; //cast

if(scelta == 0)
{
printf("Arrivederci");
break;
}
else if(scelta == 1)
{
VisualizzaManifestazione(lista);
}
else if(scelta == 2)
{
lista = AggiungiManifestazione(lista);
}
else if(scelta == 3)
{
qsort(man, sizeof(manifestazione) ,sizeof(manifestazione), Ordina);
}
}//chiusura ciclo for

}//chiusura main

/*
Visualizza Manifestazioni
*/
void VisualizzaManifestazione(struct elemento *p)
{
if(p == NULL)
{
printf("Non ci sono Manifestazioni");
pausa();
} else {
printf("Nome > %s\n", p->inf.nome);
printf("Tipo > %s\n", p->inf.tipo);
printf("Ora > %s\n", p->inf.ora);
printf("Minuto > %s\n", p->inf.minuto);
printf("Durata > %s\n", p->inf.durata);
pausa();
}

while(p != NULL)//stampiamo tutte le altre manifestazioni
{
printf("Nome > %s\n", p->inf.nome);
printf("Tipo > %s\n", p->inf.tipo);
printf("Ora > %s\n", p->inf.ora);
printf("Minuto > %s\n", p->inf.minuto);
printf("Durata > %s\n", p->inf.durata);
pausa();
p = p->pun; //legge l'elemento successivo
}
return;
}

/*
Aggiungi Manifestazione
*/
struct elemento *AggiungiManifestazione(struct elemento *p)
{
printf("Aggiungi Manifestazione\n");

//dichiariamo le variabili
char nome[50];
char tipo[200];
char ora[MAX];
char minuto[MAX];
char durata[MAX];
manifestazione daInserire;
struct elemento *punt;

//popoliamo le variabili
printf("Nome > ");
scanf("%s", nome);
strcpy(daInserire.nome, nome);
printf("Tipo > ");
scanf("%s", tipo);
strcpy(daInserire.tipo, tipo);
printf("Ora > ");
scanf("%s", ora);
strcpy(daInserire.ora, ora);
printf("Minuti > ");
scanf("%s", minuto);
strcpy(daInserire.minuto, minuto);
printf("Durata > ");
scanf("%s", durata);
strcpy(daInserire.durata, durata);

if(p != NULL)
{
//creazione elementi successivi
//allochiamo la memoria necessaria
punt = (struct elemento *)malloc(sizeof(struct elemento));
//metto daInserire nell'informazione del puntatore
punt->inf = daInserire;
//metto il puntatore in testa alla lista
punt->pun = p;
} else {
//creazione primo elemento
//allochiamo la memoria necessaria
p = (struct elemento *)malloc(sizeof(struct elemento));
//metto da inserire nell'informazione del puntatore
p->inf = daInserire;
//metto il puntatore in testa alla lista
p->pun = NULL;
//assegno p a punt
punt = p;
}

return(punt);
}


/*
ordina le manifestazioni in base all'ora e ai minuti
*/
int Ordina(const void *p1, const void *p2)
{
manifestazione* s1 = (manifestazione*)p1;
manifestazione* s2 = (manifestazione*)p2;

if(s1->ora < s2->ora)
return -1;
else return 1;

}


//funzione pausa
void pausa()
{
char invio;
printf("premere Invio per continuare");
invio = getchar();
return;
}


Il programma funziona! :)

Loading