Conferma esercizio-dubbio funzione

ELWOOD1
Scusate se abuso della vostra disponibilità, ma siccome non saprei con chi confrontarmi, vorrei postarvi un esercizio e la mia risoluzione.

Il mio dubbio più grande riguarda il ritorno della seconda funzione. Vi ringrazio

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

/*ESERCIZIO: Si vuole realizzare un programma per la gestione della coppa del Mondo di sci alpino 2010/11.
Il programma deve consentire di immagazzinare i dati relativi a:
- sciatori, caratterizzati da un nome, una nazionalità, e un numero di gara;
- gare, caratterizzate dal nome della località, dalla disciplina (discesa libera, slalom, slalom gigante), 
dalla data in cui si svolge la gara, e dai risultati (tempi ottenuti) di ciascuna manche 
(si considerino 2 manche). 
- I risultati sono memorizzati associando il numero di gara dell'atleta ai tempi ottenuti nelle due 
manche. Il tempo ottenuto è misurato in minuti, secondi, decimi di secondo. Ad esempio, deve essere 
possibile memorizzare in maniera efficiente il fatto che lo sciatore con il numero 5 ha ottenuto, 
nella gara di Kitzbühel un tempo di 1'10"3 nella prima manche e di 1'03"4 nella seconda. 

Si assuma che il programma possa immagazzinare al massimo 20 gare, ciascuna disputata da un massimo
di 15 sciatori. Si assuma che gli sciatori siano sempre gli stessi, che partecipino a ogni gara e 
ogni manche e che i loro numeri di gara siano da 1 a 15. 
a)	Definire opportuni tipi e strutture dati per rappresentare le informazioni di cui sopra. 
b)	Si assuma che le strutture dati di cui sopra siano state popolate dall'utente con dati opportuni. 
Implementare le seguenti funzioni: 
o	confronta_tempi che, dati in input due tempi nel formato minuti/secondi/decimi, ritorna 1 se
il primo tempo è maggiore del secondo, -1 se il secondo è maggiore del primo, e 0 se i due tempi
 sono identici.  	

o	confronta_manche che, data una gara, ritorna un array contenente i numeri di gara degli sciatori 
che hanno ottenuto nella seconda manche un tempo migliore della prima. Questa seconda funzione deve 
utilizzare la precedente. 
*/

typedef char stringa[20];

typedef struct{
        int m,s,d;
        }ttempo;

typedef struct{
        int giorno,mese,anno;
        }tdata;

typedef struct{
        stringa nome;
        stringa nazionalita;
        int num_gara;
        ttempo manche1,manche2;
        }tsciatore;

typedef struct{
        stringa localita;
        stringa disciplina;
        tdata data;
        tsciatore sciatori[14];        
        }tgara;

typedef struct{
        int num_sciatori[14];
        }telenco; //Lo utilizzo come output della seconda funzione

main() {
  
  system("PAUSE");
}

// 1 FUNZIONE: confronta_tempi

float confronta_tempi(ttempo t1,ttempo t2){
    float ris;
    if(t1.m==t2.m && t1.s==t2.s && t1.d==t2.d){ris=0;}
    else{
         if(t1.m>t2.m || (t1.m==t2.m && t1.s>t2.s) || (t1.m==t2.m && t1.s==t2.s && t1.d>t2.d) ){ris=1;}
         else{ris=-1;}         
         }
    return ris;
    }
    
// 2 FUNZIONE: confronta_manche

telenco confronta_manche(tgara a[]){
             telenco r;
             int i,num=0;
             float k;
             for(i=0;i<20;i++){
                               k=confronta_tempi(a[i].sciatori[i].manche1,a[i].sciatori[i].manche1);
                               if(k==-1){
                                        r.num_sciatori[i]=a[i].sciatori[i].num_gara;
                                        num++;
                                        }
                               }
             return r;
             }

Risposte
apatriarca
Faccio brevemente un commento sulla prima funzione, perché restituisce un float?! int è un tipo decisamente più sensato per la funzione.. Il testo dell'esercizio è tralaltro inutilmente precisa sui valori di ritorno* e rende per forza necessario l'uso di una selezione (ma su questo non hai scelta). L'avrei comunque implementata diversamente, trasformando i tempi in decimi di secondi (moltiplicando quindi i secondi per 10 e i minuti per 600 e sommando tutti i valori ottenuti..) e confrontando quindi i tempi come interi riducendo un po' di confronti.

Un secondo commento riguarda invece la definizione della struttura dati. Perché, se il problema dice che ci sono 15 sciatori per gara, hai settato la lunghezza dei corrispondenti array a 14?! Dovrebbe essere 15..

Arriviamo quindi alla funzione per la quale hai chiesto aiuto. Ci sono alcuni errori:
1. Stai passando una sola gara, perché richiedi quindi il passaggio di un array di gare?
2. Stai iterando sulle gare invece che sugli sciatori che hanno partecipato alla gara che ti interessa.
3. Stai confrontando la stessa manche della stessa gara dello stesso giocatore per cui k varrà sempre 0.
4. Stai settando l'i-esimo valore dell'array di ritorno, ma i varia da 0 a 19, mentre l'array che restituisci ha solo lunghezza 14..
5. Stai restituendo numeri di gara invece che numeri di giocatori.
6. La maggior parte dei valori restituiti è uguale a 0..
Insomma è praticamente tutta sbagliata.

* Il metodo classico per implementare una funzione di questo tipo è quello di richiedere solo che i numeri siano positivi o negativi a seconda di quale dei due è più grande dell'altro.

ELWOOD1
"apatriarca":

1. Stai passando una sola gara, perché richiedi quindi il passaggio di un array di gare?


Per cui dovrei definire una variabile di tipo

tgara gara[20];


"apatriarca":

2. Stai iterando sulle gare invece che sugli sciatori che hanno partecipato alla gara che ti interessa.

Per cui potrei dare come input un semplice intero che mi indichi la posizione nell'array della gara?

"apatriarca":

3. Stai confrontando la stessa manche della stessa gara dello stesso giocatore per cui k varrà sempre 0.

Ok

"apatriarca":

4. Stai settando l'i-esimo valore dell'array di ritorno, ma i varia da 0 a 19, mentre l'array che restituisci ha solo lunghezza 14..

Ok

"apatriarca":

5. Stai restituendo numeri di gara invece che numeri di giocatori.

In effetti dalla traccia devo restituire i numeri di gara dei sciatori, faccio riferimento al dato struct contenuto in sciatori.

"apatriarca":

Insomma è praticamente tutta sbagliata.


Grazie per la sincerità ;)

Se le mie supposizioni sono corrette ho provato a modificare in questa maniera:

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

typedef char stringa[20];

typedef struct{
        int m,s,d;
        }ttempo;

typedef struct{
        int giorno,mese,anno;
        }tdata;

typedef struct{
        stringa nome;
        stringa nazionalita;
        int num_gara;
        ttempo manche1,manche2;
        }tsciatore;

typedef struct{
        stringa localita;
        stringa disciplina;
        tdata data;
        tsciatore sciatori[15];        
        }tgara;

typedef struct{
        int num_sciatori[15];
        }telenco; //Lo utilizzo come output della seconda funzione

main() {
  
  system("PAUSE");
}

// 1 FUNZIONE: confronta_tempi

int confronta_tempi(ttempo t1,ttempo t2){
    int ris;
    if(t1.m==t2.m && t1.s==t2.s && t1.d==t2.d){ris=0;}
    else{
         if(t1.m>t2.m || (t1.m==t2.m && t1.s>t2.s) || (t1.m==t2.m && t1.s==t2.s && t1.d>t2.d) ){ris=1;}
         else{ris=-1;}         
         }
    return ris;
    }
    
// 2 FUNZIONE: confronta_manche

telenco confronta_manche(int numg,tgara a[]){
             telenco r;
             int i,k;
             for(i=0;i<20;i++){
                               k=confronta_tempi(a[numg].sciatori[i].manche1,a[numg].sciatori[i].manche1);
                               if(k==-1){
                                        r.num_sciatori[i]=a[numg].sciatori[i].num_gara;
                                        }
                               }
             return r;
             }


Rispondi
Per rispondere a questa discussione devi prima effettuare il login.