Vai al contenuto

Primario: Sky Slate Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Marble
Secondario: Sky Slate Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Marble
Sfondo: Blank Waves Squares Notes Sharp Wood Rockface Leather Honey Vertical Triangles
Corsi di Laurea










ROX @ Unisa - Forum degli studenti di Ingegneria utilizza i cookie. Se prosegui la navigazione accetti il loro uso.    Accetto l'uso dei cookie
-->
Foto

Aiuto Prova d'Esame!!


  • Effettua l'accesso per rispondere
Questa discussione ha avuto 22 risposta/e

#1
Raffina92

Raffina92

    Advanced Member

  • Utente
  • StellaStellaStella
  • 64 Messaggi:
Ciao ragazzi, sto facendo un po' di prove d'esame di ASD degli anni passati e ho trovato difficoltà con un tipo di funzione un po' particolare.
Vi spiego in breve la situazione.
Bisogna fare un programma per la gestione degli esami universitari sostenuti da uno studente.
Questa è la dichiarazione dei tipi:

[codice-c:2p6ltcdz]struct SKey{
int value;
};
typedef struct SKey TKey;

struct SSat {
char insegnamento[MAXLEN_NOME_INSEGNAMENTO];
char docente[MAXLEN_NOME_DOCENTE];
int voto;
};
typedef struct SSat TSat;

struct SInfo{
TKey key;
TSat satellite;
};

typedef struct SInfo TInfo;[/codice-c]

e la dichiarazione dell'albero binario ordinato per valori della chiave
[codice-c:2p6ltcdz]struct SNode {
TInfo info;
struct SNode *left;
struct SNode *right;
};
typedef struct SNode TNode;
typedef TNode* TTree;[/codice-c]

La funzione che devo implementare è la seguente:

• Ricerca dell’esame sostenuto con un dato docente in cui si è conseguito il voto maggiore


Vi posto la mia versione, che però non funziona!

[codice-c:2p6ltcdz]TNode* ricerca_esami(TTree tree, char docente[])
{
TNode *l,*r;

if(tree==NULL) return NULL;
if ((tree->left==NULL)&&(tree->right==NULL)&&(strcmp(tree->info.satellite.docente,docente)==0)) return tree;
else {
l=ricerca_esami(tree->left,docente);
r=ricerca_esami(tree->right,docente);
if ((l!=NULL)&&(r!=NULL))
{
if((l->info.satellite.voto > tree->info.satellite.voto)&&(l->info.satellite.voto > r->info.satellite.voto))
return l;
else if ((r->info.satellite.voto > tree->info.satellite.voto)&&(r->info.satellite.voto > l->info.satellite.voto))
return r;
else return tree;
}
if ((l==NULL)&&(r!=NULL))
if (r->info.satellite.voto > tree->info.satellite.voto)
return r;
else return tree;
if ((l!=NULL)&&(r!=NULL))
if (l->info.satellite.voto > tree->info.satellite.voto)
return l;
else return tree;
}
}[/codice-c]

Se mi date una mano vi sarò molto riconoscente, sono in crisi da giorni su funzioni di questo tipo!!



#2
LeoVa

LeoVa

    Advanced Member

  • Utente
  • StellaStellaStella
  • 245 Messaggi:
Sono un pò arrugginito però possiamo provare.
La terza condizione
   if ((l!=NULL)&&(r!=NULL)) 
è uguale alla prima, cioè quando si suppone che ci sia sia il figlio destro che quello sinistro. Tu hai già fatto quella in cui c'è solo il figlio destro, ovvero:
if ((l==NULL)&&(r!=NULL)) 
, ora dovresti fare il viceversa, cioè quella in cui consideri solo il figlio sinistro, cioè
if ((l!=NULL)&&(r==NULL)) 
.

E' ovviamente inutile fare il caso in cui sono entrambi nulli in quanto corrisponde al caso base.

Fai sapere. :ciao:
.

#3
904

904

    Advanced Member

  • Utente
  • StellaStellaStella
  • 48 Messaggi:
 if ((l!=NULL)&&(r!=NULL))
{
if((l->info.satellite.voto > tree->info.satellite.voto)&&(l->info.satellite.voto > r->info.satellite.voto))
return l;
else if ((r->info.satellite.voto > tree->info.satellite.voto)&&(r->info.satellite.voto > l->info.satellite.voto))
return r;
else return tree;
}
if ((l==NULL)&&(r!=NULL))
if (r->info.satellite.voto > tree->info.satellite.voto)
return r;
else return tree;
if ((l!=NULL)&&(r!=NULL))
if (l->info.satellite.voto > tree->info.satellite.voto)
return l;
else return tree;
}
nell'else manca questo controllo (strcmp(l->info.satellite.docente,docente)==0) e r

#4
Raffina92

Raffina92

    Advanced Member

  • Utente
  • StellaStellaStella
  • 64 Messaggi:

Sono un pò arrugginito però possiamo provare.
La terza condizione

   if ((l!=NULL)&&(r!=NULL)) 
è uguale alla prima, cioè quando si suppone che ci sia sia il figlio destro che quello sinistro. Tu hai già fatto quella in cui c'è solo il figlio destro, ovvero:
if ((l==NULL)&&(r!=NULL)) 
, ora dovresti fare il viceversa, cioè quella in cui consideri solo il figlio sinistro, cioè
if ((l!=NULL)&&(r==NULL)) 
.

E' ovviamente inutile fare il caso in cui sono entrambi nulli in quanto corrisponde al caso base.

Fai sapere. :ciao:


Cavolo è vero!! Che sbadata!!

#5
Raffina92

Raffina92

    Advanced Member

  • Utente
  • StellaStellaStella
  • 64 Messaggi:

 if ((l!=NULL)&&(r!=NULL))
{
if((l->info.satellite.voto > tree->info.satellite.voto)&&(l->info.satellite.voto > r->info.satellite.voto))
return l;
else if ((r->info.satellite.voto > tree->info.satellite.voto)&&(r->info.satellite.voto > l->info.satellite.voto))
return r;
else return tree;
}
if ((l==NULL)&&(r!=NULL))
if (r->info.satellite.voto > tree->info.satellite.voto)
return r;
else return tree;
if ((l!=NULL)&&(r!=NULL))
if (l->info.satellite.voto > tree->info.satellite.voto)
return l;
else return tree;
}
nell'else manca questo controllo (strcmp(l->info.satellite.docente,docente)==0) e r


Quale else??

#6
904

904

    Advanced Member

  • Utente
  • StellaStellaStella
  • 48 Messaggi:
 else {
l=ricerca_esami(tree->left,docente);
r=ricerca_esami(tree->right,docente);
if ((l!=NULL)&&(r!=NULL))
{
if((l->info.satellite.voto > tree->info.satellite.voto)&&(l->info.satellite.voto > r->info.satellite.voto))
return l;
else if ((r->info.satellite.voto > tree->info.satellite.voto)&&(r->info.satellite.voto > l->info.satellite.voto))
return r;
else return tree;
}
if ((l==NULL)&&(r!=NULL))
if (r->info.satellite.voto > tree->info.satellite.voto)
return r;
else return tree;
if ((l!=NULL)&&(r!=NULL))
if (l->info.satellite.voto > tree->info.satellite.voto)
return l;
else return tree;
}
}
In questo else dove controlla che nel nodo destro e quello sinistro il record insegnante coincide con quello di cui devi trovare il voto max?

#7
Raffina92

Raffina92

    Advanced Member

  • Utente
  • StellaStellaStella
  • 64 Messaggi:
Cosi??

[codice-c:37m8w0s3]else {
l=ricerca_esami(tree->left,docente);
r=ricerca_esami(tree->right,docente);
if ((strcmp(l->info.satellite.docente,docente)==0)&&(strcmp(r->info.satellite.docente,docente)){
if ((l!=NULL)&&(r!=NULL))
{
if((l->info.satellite.voto > tree->info.satellite.voto)&&(l->info.satellite.voto > r->info.satellite.voto))
return l;
else if ((r->info.satellite.voto > tree->info.satellite.voto)&&(r->info.satellite.voto > l->info.satellite.voto))
return r;
else return tree;
}
if ((l==NULL)&&(r!=NULL))
if (r->info.satellite.voto > tree->info.satellite.voto)
return r;
else return tree;
if ((l!=NULL)&&(r==NULL))
if (l->info.satellite.voto > tree->info.satellite.voto)
return l;
else return tree;
}}[/codice-c]

Comunque praticamente se lo provo conun albero che contengono esami tutti con lo stesso docente funziona, appena ne aggiungo qualcuno diverso si sballa!

#8
Raffina92

Raffina92

    Advanced Member

  • Utente
  • StellaStellaStella
  • 64 Messaggi:

 else {
l=ricerca_esami(tree->left,docente);
r=ricerca_esami(tree->right,docente);
if ((l!=NULL)&&(r!=NULL))
{
if((l->info.satellite.voto > tree->info.satellite.voto)&&(l->info.satellite.voto > r->info.satellite.voto))
return l;
else if ((r->info.satellite.voto > tree->info.satellite.voto)&&(r->info.satellite.voto > l->info.satellite.voto))
return r;
else return tree;
}
if ((l==NULL)&&(r!=NULL))
if (r->info.satellite.voto > tree->info.satellite.voto)
return r;
else return tree;
if ((l!=NULL)&&(r!=NULL))
if (l->info.satellite.voto > tree->info.satellite.voto)
return l;
else return tree;
}
}
In questo else dove controlla che nel nodo destro e quello sinistro il record insegnante coincide con quello di cui devi trovare il voto max?


Come mi hai detto non funziona.. non so se ho capito male io però!!

#9
904

904

    Advanced Member

  • Utente
  • StellaStellaStella
  • 48 Messaggi:
ovvio perchè ad esempio nell'else che mi hai dato prevedi il caso in cui (strcmp(l->info.satellite.docente,docente)==0) e (strcmp(r->info.satellite.docente,docente)==0) ma non prevedi il caso in cui questo non si verifica ad esempio ammettiamo che (strcmp(l->info.satellite.docente,docente)==0) è verificato ma che (strcmp(l->info.satellite.docente,docente)==0) non è verificato che deve succedere?

#10
Raffina92

Raffina92

    Advanced Member

  • Utente
  • StellaStellaStella
  • 64 Messaggi:

ovvio perchè ad esempio nell'else che mi hai dato prevedi il caso in cui (strcmp(l->info.satellite.docente,docente)==0) e (strcmp(r->info.satellite.docente,docente)==0) ma non prevedi il caso in cui questo non si verifica ad esempio ammettiamo che (strcmp(l->info.satellite.docente,docente)==0) è verificato ma che (strcmp(l->info.satellite.docente,docente)==0) non è verificato che deve succedere?


Non sto capendo ^_^
Col mio caso base non dovrei controllare a prescindere solo i nodi che coincidono con il campo docente??

#11
904

904

    Advanced Member

  • Utente
  • StellaStellaStella
  • 48 Messaggi:
esatto ma ammettiamo che non coincidono cosa deve restituire?

#12
Raffina92

Raffina92

    Advanced Member

  • Utente
  • StellaStellaStella
  • 64 Messaggi:
NULL???

#13
R.Antonio

R.Antonio

    Advanced Member

  • Utente
  • StellaStellaStella
  • 39 Messaggi:
Ragazzi io l'ho fatta in 10 minuti e non ho il tempo di implementare il main x vedere se funziona o meno... ve lo posto così come l'ho scritta ... sicuramente ci sarà qlk errore ma non credo sia irrisolvibile, fatemi sapere se funziona...
Spoiler

Spero di aver risolto qlk dubbio e di non averne creati degli altri fingerup ...

#14
904

904

    Advanced Member

  • Utente
  • StellaStellaStella
  • 48 Messaggi:
esatto è fatta bene a parte qualche piccolo errore ma comunque è questa la logica

#15
904

904

    Advanced Member

  • Utente
  • StellaStellaStella
  • 48 Messaggi:
si esatto deve restituire NULL

#16
Raffina92

Raffina92

    Advanced Member

  • Utente
  • StellaStellaStella
  • 64 Messaggi:
Sarà anche fatta bene :D ma a me nn funz

#17
dottorbrillo

dottorbrillo

    Advanced Member

  • Utente
  • StellaStellaStella
  • 82 Messaggi:
Io l'ho fatta sulla traccia che andava svolta tramite liste. Se ti può essere utile:


TNode* esame_prof(TList list, char prof[]){
TNode* max;
if(list==NULL){
return NULL;
}
while((list != NULL) && (strcmp(list->info.satellite.docente, prof) != 0))
list = list->link;
max = list;
while(list!=NULL){
if((strcmp(list->info.satellite.docente, prof) == 0) && (list->info.satellite.voto > max->info.satellite.voto))
max=list;
list=list->link;
}
return max;
}


#18
R.Antonio

R.Antonio

    Advanced Member

  • Utente
  • StellaStellaStella
  • 39 Messaggi:

Sarà anche fatta bene :D ma a me nn funz


ma qll che ho postato io funziona?
:nono:
qlk errore grave è stato trovato?
:scratch:

#19
Raffina92

Raffina92

    Advanced Member

  • Utente
  • StellaStellaStella
  • 64 Messaggi:
il tuo non funziona, non ci sn errori di sintassi, ma va in crash :D

#20
rossano92

rossano92

    Member

  • Utente
  • StellaStella
  • 15 Messaggi:
Prova con questa , dovrebbe andare:
[codice-c:48hiethj]TNode *ricerca_votomax_docente(TTree tree, char docente[]){
TNode *node1, *node2;
if(tree==NULL){
return NULL;
}
if((tree->left==NULL) && (tree->right==NULL)){
if(strcmp(tree->info.satellite.docente,docente)==0)
return tree;
else
return NULL;
}
if(tree!=NULL){
node1=ricerca_votomax_docente(tree->left,docente);
node2=ricerca_votomax_docente(tree->right, docente);
if(strcmp(tree->info.satellite.docente,docente)!=0){
if((node1!=NULL) && (node2!=NULL)){
if((node1->info.satellite.voto)>(node2->info.satellite.voto)){
return node1;
}
else if((node1->info.satellite.voto)==(node2->info.satellite.voto)){
if(greater(node1->info.key,node2->info.key))
return node2;
else
return node1;
}
else{
return node2;
}
}
else if((node1!=NULL) && (node2==NULL)){
return node1;
}
else if((node1==NULL) && (node2!=NULL)){
return node2;
}
else{
return NULL;
}
}

else{
if((node1!=NULL) && (node2!=NULL)){
if((node1->info.satellite.voto)>(node2->info.satellite.voto)){
if((node1->info.satellite.voto)>(tree->info.satellite.voto))
return node1;
else
return tree;
}
else if((node1->info.satellite.voto)==(node2->info.satellite.voto)){
if(greater(node1->info.key,node2->info.key)){
if((node2->info.satellite.voto)>=(tree->info.satellite.voto))
return node2;
else
return tree;
}
else{
if((node1->info.satellite.voto)>(tree->info.satellite.voto))
return node1;
else
return tree;
}
}
else{
if((node2->info.satellite.voto)>=(tree->info.satellite.voto))
return node2;
else
return tree;
}
}
else if((node1!=NULL) && (node2==NULL)){
if((node1->info.satellite.voto)>(tree->info.satellite.voto))
return node1;
else
return tree;
}
else if((node1==NULL) && (node2!=NULL)){
if((node2->info.satellite.voto)>=(tree->info.satellite.voto))
return node2;
else
return tree;
}
else{
return tree;
}
}
}
}[/codice-c]




Leggono questa discussione 0 utenti

0 utenti, 0 ospiti, 0 utenti anonimi