[C] Calcolare distanza tra due intervalli
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:
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!
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
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
[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
Ciao!
Grazie mille ora provo a farlo vediamo se esce
A volte non mi viene proprio in mente nemmeno sulla carta come procedere per risolverlo :S 
Eheh ho utilizzato direttamente l'altro codice che mi avevi passato, ho visto che il metodo è perfetto
ora vedo di modificare i nomi
Grazie ancora per l'aiuto
Ciaoo!
Grazie mille ora provo a farlo vediamo se esce
Eheh ho utilizzato direttamente l'altro codice che mi avevi passato, ho visto che il metodo è perfetto
Grazie ancora per l'aiuto
Ciaoo!
Ciao!
Ho scritto questo pezzo di codice per dividere i numeri nei due gruppi, minimi e massimi.
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.
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
però ho visto che non funziona
Tu come avresti fatto
?
Grazie
Ciaoo
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
?Grazie
Ciaoo
Fatto ci sono riuscito! Con questo codice dovrebbe andare tutto
Devo solo capire come mai quando faccio la divisione minimi e massimi ottengo questo
Grazie
Ciaoo
#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
I valori li devi inserire così:
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.
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.
Ciao!
Grazie mille ora è veramente perfetto
adesso funziona tutto quanto correttamente ed ho risparmiato anche tutti i passaggi che avevo fatto prima!
Grazie ancora per l'ottimo aiuto!
Ciaoo
Grazie mille ora è veramente perfetto
Grazie ancora per l'ottimo aiuto!
Ciaoo