[C] Calcolare distanza tra due intervalli

floppyes
Ciao a tutti!

Sono alle prese con un nuovo esercizio in C, e non riesco a completare l'ultima parte della richiesta ](*,)

Testo esercizio:
Si sviluppi un programma in C che riceva in ingresso una sequenza di 100 coppie di numeri interi tali che per ogni coppia (a, b) , a < b . Ognuna di queste coppie rappresenta un intervallo temporale di durata b – a . Determinare l’intersezione tra tutti gli intervalli e la sua durata.
Ad esempio, se si riceve la sequenza: 3 7 1 5 4 6 ..., (che rappresenta il diagramma temporale allegato in foto), il programma dovrà mostrare a video: (4, 5), 1



Ho svolto quasi tutto l'esercizio, mi manca solamente l'ultima parte, quella che chiede di determinare l'intersezione tra tutti gli intervalli e la loro durata.

Questo è il codice che ho scritto:
#include <stdio.h>
// Per provare se il codice funziona per ora immetto solo 3 coppie
#define totcoppie 3
#define dimcoppia 2

typedef struct nome_struttura
    {
        int numero;
        int distanza;
    } nuovo_tipo;
    nuovo_tipo coppia[totcoppie*dimcoppia];

int main ()
{
    int i, tot, flag=0, n=0, contatore=0;
    tot=totcoppie*dimcoppia; // Mi serve per determinare quanti numeri devo ancora inserire
    printf("Inserisci %d coppie di numeri\n", totcoppie);

    do 
    {
        for (i=0;i<tot;i++)
        {
            printf("\tInserisci il %d° numero: ", i+1);
            scanf("%d", &coppia[i].numero);
            // Aumento il contatore per sapere quante coppie ho inserito
            if ((i+1)%2==0)
            {
                contatore++;
            }                   
        }
    } while (n==totcoppie);
    
    // Calcolo la distanza tra ogni coppia di numeri inseriti
    for (i=0;i<tot;i++)
    {
        coppia[i].distanza = coppia[i+1].numero-coppia[i].numero;
        i=i+1;
    }
    
    // Stampo le coppie inserite divise per due elementi in ogni coppia
    printf("\nCoppie inserite:\n\t");
    for (i=0;i<tot;i++)
    {
        printf("%2d", coppia[i].numero);
        if ((i+1)%2==0)
        {
            printf("\n\t");
        }
    }
    
    // Stampo la distanza tra ogni coppia inserita
    printf("\nDistanze tra le coppie:\n\t");
    for (i=0;i<tot;i++)
    {
        printf("%d", coppia[i].distanza);
        i=i+1;
        if ((i+1)%2==0)
        {
            printf("\t");
        }
    }

    // Stampo quante coppie ho inserito in tutto
    printf("\nTot coppie inserite: %d\n", contatore); 

    return 0;   
}


Adesso non riesco a capire come fare per determinare se una coppia ha un numero in comune e qual'è la distanza tra essi.

Avevo pensato di basarmi sulla distanza tra ogni singola coppia, però dopo non riesco più a risale ai due numeri in comune!

Grazie mille in anticipo
Ciaoo!

Risposte
Atem1
L'interesezione è l'intervallo:
[Il_Piu_Grande_fra_i_Minimi, Il_Piu_Piccolo_Fra_I_Massimi]

Cioè, se tu hai questi intervalli:
[3,7]
[1,5]
[4,6]

I minimi sono 3,1,4 e devi prendere il più grande, cioè 4.
I massimi sono 7,5,6 e devi prendere il più piccolo, cioè 5.

Se il "più grande fra i minimi" è maggiore del "più piccolo fra i massimi" allora l'intersezione è l'insieme vuoto.
PS: e comunque "nome_struttura" "nuovo_tipo" li avevo scritti a titolo indicativo, sarebbe meglio se gli dessi nomi più significativi :)

floppyes
Ciao!

Grazie mille ora provo a farlo vediamo se esce :D A volte non mi viene proprio in mente nemmeno sulla carta come procedere per risolverlo :S :D

Eheh ho utilizzato direttamente l'altro codice che mi avevi passato, ho visto che il metodo è perfetto :D ora vedo di modificare i nomi :D

Grazie ancora per l'aiuto
Ciaoo!

floppyes
Ciao!
Ho scritto questo pezzo di codice per dividere i numeri nei due gruppi, minimi e massimi.
 for (i=0;i<tot;i++)
{
printf("\tInserisci il %d° numero: ", i+1);
scanf("%d", &coppia[i].numero);
// Dovido i max e min
if (i%2==0)
{
coppia[i].min = coppia[i].numero;
}
else (coppia[i].max = coppia[i].numero);
}
// DEBUG MIN E MAX
for (i=0;i<tot/2;i++)
{
printf("Minimi: %d \t Massimi: %d\n", coppia[i].min, coppia[i].max);
}

In pratica se io sono nella posizione pari allora significa che ho inserito il numero più piccolo della coppia, che andrà collocato nel vettore coppia.min, altrimenti andrò a collocarlo nel gruppo dei massimi.
Quello che non riesco a capire è perchè i numeri vengono salvati in questo modo:
Vettore coppia.min = 1 0 3 0 5 0
Vettore coppia.max = 0 2 0 4 0 6
E' giusto che sia così oppure sbaglio io qualcosa?

A parte questo dubbio per il resto sono riuscito a fare tutto quanto, ho "evitato" lo zero mettendo la condizione nell'if.
#include <stdio.h>
// Per provare se il codice funziona per ora immetto solo 3 coppie
#define totcoppie 3
#define dimcoppia 2

typedef struct nome_struttura
    {
        int numero;
        int distanza;
        int min;
        int max;
    } nuovo_tipo;
    nuovo_tipo coppia[totcoppie*dimcoppia];

int main ()
{
    int i, tot, flag=0, n=0, num, dist=0, contatore=0, inizio=0, minrif=0, maxrif=0, minmax=0;
    tot=totcoppie*dimcoppia; // Mi serve per determinare quanti numeri devo ancora inserire
    printf("Inserisci %d coppie di numeri\n", totcoppie);

    for (i=0;i<tot;i++)
    {
        printf("\tInserisci il %d° numero: ", i+1);
        scanf("%d", &coppia[i].numero);           
        // Dovido i max e min              
        if (i%2==0)
        {
            coppia[i].min = coppia[i].numero;
        }
        else (coppia[i].max = coppia[i].numero);
    }
    // Trovo minimo più grande
    for (i=0;i<tot;i++)
    {
        if (coppia[i].min>minrif)
        {
            minrif = coppia[i].min;
            
        }
    }
    // Trovo il più grande massimo
    for (i=0;i<tot;i++)
    {
        if (coppia[i].max>minmax)
        {
            minmax = coppia[i].max;
        }
    }    
    
    // Trovo massimo più piccolo
    for (i=0;i<tot;i++)
    {
        if (coppia[i].max<minmax && coppia[i].max!=0)
        {
            minmax = coppia[i].max;
            
        }
    }
    
    dist = minmax-minrif;
    
    // Stampo le coppie inserite divise per due elementi in ogni coppia
    printf("\nCoppie inserite:\n\t");
    for (i=0;i<tot;i++)
    {
        printf("%2d", coppia[i].numero);
        if ((i+1)%2==0)
        {
            printf("\n\t");
        }
    }
    
    if (minrif>minmax)
    {
        printf("\nL'insieme di intersezione è vuoto");
    }
    else (printf("\nEcco l'intersezione: (%d,%d), %d", minrif, minmax, dist));

    return 0;   
}


Mi manca solo da inserire il controllo, che il primo numero della coppia sia minore del secondo numero.
Pensavo allora di inserire questo codice alla linea 24
if ((i+1)%2==0 && coppia[i].numero>coppia[i+1].numero)
{
    printf("Il secondo numero deve essere maggiore del primo");
    i=i-2;
}


però ho visto che non funziona :? Tu come avresti fatto :-D ?

Grazie
Ciaoo :)

floppyes
Fatto ci sono riuscito! Con questo codice dovrebbe andare tutto :-D
#include <stdio.h>
#define totcoppie 3
#define dimcoppia 2

typedef struct nome_struttura
    {
        int numero;
        int min;
        int max;
    } nuovo_tipo;
    nuovo_tipo coppia[totcoppie*dimcoppia];

int main ()
{
    int i, tot, num, dist=0, minrif=0, maxrif=0, minmax=0;
    tot=totcoppie*dimcoppia; // Mi serve per determinare quanti numeri devo ancora inserire
    printf("Inserisci %d coppie di numeri\n", totcoppie);

    printf("\n\tInserisci il 1° numero: ");
    scanf("%d", &coppia[0].numero);
    for (i=1;i<tot;i++)
    {
        printf("\tInserisci il %d° numero: ", i+1);
        scanf("%d", &coppia[i].numero);
        if (i%2!=0 && coppia[i].numero<coppia[i-1].numero)
        {
            printf("Primo numero < secondo numero");
            i--;
        }      
        // Dovido i max e min              
        if (i%2==0)
        {
            coppia[i].min = coppia[i].numero;
        }
        else (coppia[i].max = coppia[i].numero);
    }
    // Trovo minimo più grande
    for (i=0;i<tot;i++)
    {
        if (coppia[i].min>minrif)
        {
            minrif = coppia[i].min;
            
        }
    }
    // Trovo il più grande massimo
    for (i=0;i<tot;i++)
    {
        if (coppia[i].max>minmax)
        {
            minmax = coppia[i].max;
        }
    }    
    
    // Trovo massimo più piccolo
    for (i=0;i<tot;i++)
    {
        if (coppia[i].max<minmax && coppia[i].max!=0)
        {
            minmax = coppia[i].max;
            
        }
    }
    
    dist = minmax-minrif;
    
    // Stampo le coppie inserite divise per due elementi in ogni coppia
    printf("\nCoppie inserite:\n\t");
    for (i=0;i<tot;i++)
    {
        printf("%2d", coppia[i].numero);
        if ((i+1)%2==0)
        {
            printf("\n\t");
        }
    }
    
    if (minrif>minmax)
    {
        printf("\nL'insieme di intersezione è vuoto");
    }
    else (printf("\nEcco l'intersezione: (%d,%d) -> dist. %d", minrif, minmax, dist));

    return 0;   
}


Devo solo capire come mai quando faccio la divisione minimi e massimi ottengo questo
Vettore coppia.min = 1 0 3 0 5 0
Vettore coppia.max = 0 2 0 4 0 6


Grazie
Ciaoo :)

Atem1
I valori li devi inserire così:

for (i=0;i<totcoppie;i++)
    {
        printf("\tInserisci il %d° estremo inferiore: ", i+1);
        scanf("%d", &coppia[i].min);

        do
         {
           printf("\tInserisci il %d° estremo superiore: ", i+1);
           scanf("%d", &coppia[i].max);
          } while (coppia[i].min>=coppia[i].max);
    }


Anche se per questo programma la cosa è indipendente, comunque la variabile coppia non deve essere considerata una variabile globale quindi la devi mettere dentro al MAIN. L'uso delle variabili globali è sempre sconsigliato se è possibile farne a meno.

floppyes
Ciao!

Grazie mille ora è veramente perfetto :D adesso funziona tutto quanto correttamente ed ho risparmiato anche tutti i passaggi che avevo fatto prima!

Grazie ancora per l'ottimo aiuto!
Ciaoo :)

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