[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
](/datas/uploads/forum/emoji/eusa_wall.gif)
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
