Testo di esame

di il
18 risposte

Testo di esame

Salve, mi sto esercitando per preparare l'esame di programmazione in C(facoltà di fisica), mi sono imbattuto in questo esercizio che non sono riuscito a svolgere, i primi due punti li ho svolti nel modo corretto ma non riesco ad andare avanti. Qualcuno può darmi un aiuto?

N coppie di fidanzati, con N ? 200, in occasione di S. Valentino, de- cidono di recarsi a cena in uno dei 10 ristoranti presenti nei dintorni. In circa il 30 % delle coppie uno dei due fidanzati ha una storia con uno dei componenti di un’altra coppia. Qualora entrambe le coppie
con un componente fedifrago si trovino casualmente a cenare nello stesso ristorante, c’`e una probabilit`a del 25 % che accada l’irreparabile: le coppie di amanti non resistono e si fanno scoprire dai rispettivi partner. In seguito a un tale evento entrambe le coppie si sfasciano.
Scrivete un programma che simuli quanto sopra seguendo la traccia sotto delineata.
1. Nel programma `e definita la funzione getN() che acquisisce un numero da tastiera, con- trolla che sia positivo e minore di un numero m passato come parametro alla funzione, e lo restituisca. Qualora il numero immesso dall’utente non sia compreso nell’intervallo
accettabile [1, m] deve permettere all’utente di ripeterne l’inserimento.
2. Usando la funzione getN() il programma determina l’effettivo numero di coppie di fidan- zati da simulare, che al massimo saranno 200. Provvede, quindi, a eseguire le prenotazioni presso i ristoranti. Per ognuna delle coppie, estrae a caso l’indice del ristorante e lo as- segna a un array di nome ristoranti di taglia opportuna, in modo tale che l’elemento i
dell’array rappresenti il ristorante scelto dalla coppia i.
3. In un secondo array di taglia opportuna, denominato amanti, il programma registra even-
tuali relazioni amorose esterne a ciascuna coppia. Per ogni coppia i, assegna, con proba- bilit`a del 30 %, un amante nella coppia j, con j=\= i. L’assegnazione si esegue attribuendo alla componente con indice i dell’array amanti il valore j e alla componente j il valore i. Si lascia al candidato la scelta di come rappresentare le coppie nelle quali non sia presente alcun traditore.
4. Una funzione che riceve in ingresso l’array amanti provvede a stampare sullo schermo le coppie sentimentalmente coinvolte. Per ognuna delle coppie con un amante in un’altra coppia, e solo per esse, stampa sullo schermo gli indici delle coppie in questione in una riga. Naturalmente per ogni situazione del genere compariranno sullo schermo due righe: se, ad esempio, uno dei membri della coppia 81 ha una relazione con uno dei componenti la coppia 127, sullo schermo compariranno le righe 81 127 e 127 81.
5. Per ciascuno dei ristoranti, il programma stampa sullo schermo il relativo indice seguito dagli indici delle coppie di fidanzati che hanno deciso di cenare presso quell’esercizio. Qualora in una coppia esista un traditore e nel caso in cui questi abbia una relazione con un componente di un’altra coppia presente nello stesso ristorante, il programma determina il verificarsi di un litigio con la probabilit`a del 25 %.
6. Il programma termina scrivendo sullo schermo l’elenco delle coppie che, a seguito di un litigio, si sfasciano.

18 Risposte

  • Re: Testo di esame

    Che aiuto?
  • Re: Testo di esame

    oregon ha scritto:


    Che aiuto?
    il punto 3 e 4, non riesco ad assegnare i valori come vuole lui..
  • Re: Testo di esame

    flavio_in_c ha scritto:


    oregon ha scritto:


    Che aiuto?
    il punto 3 e 4, non riesco ad assegnare i valori come vuole lui..
    avevo pensato ad una cosa del genere
    
      for (i=1; i<=m; i++) {
            amanti[i]=i;
        }
        for (i=1; i<=a; i++) {
            r=1+ lrand48()%10;
            if ((r==1)|| (r==2) || (r==3)){
                j= i+lrand48()%(a-i);
                pi =&amanti[i];
                pj= &amanti[j];
                printf("%d--%d\n",*(pi), *(pj));
                
            } else {
                amanti[i]=0;
            }
                
        }
        
    pero' non tiene conto se gli amanti hanno già relazioni con un altra coppia (ovvero si potrebbero creare situazioni con 2 amanti nella stessa coppia)
  • Re: Testo di esame

    Posta il codice completo.
  • Re: Testo di esame

    Nippolo ha scritto:


    Posta il codice completo.
    
    #define N 200
    
    int getN(int );
    
    int main() {
        int r,m,a = 0,i,j,*pi,*pj;
        long int seed;
        seed=time(0);
        srand48(time(0));
        m=getN(N);
        a =getN(m);
        int ristorante[a],amanti[a];
        for (i=0;i<a;i++){
            r= 1+ lrand48()%10;
            ristorante[i]= r;
            printf("%d\n",ristorante[i]);
            }
        for (i=1; i<=m; i++) {
            amanti[i]=i;
        }
        for (i=1; i<=a; i++) {
            r=1+ lrand48()%10;
            if ((r==1)|| (r==2) || (r==3)){
                j= i+lrand48()%(a-i);
                pi =&amanti[i];
                pj= &amanti[j];
                printf("%d--%d\n",*(pi), *(pj));
                
            } else {
                amanti[i]=0;
            }
                
        }
        
    }
    
    int getN(int a){
        int r,b;
        char s[255];
        printf("Inserisci un valore compreso tra 1 e %d: ",a);
        do {
            r=scanf("%d",&b);
            if (r!=1) {
                printf("\nImpunt non valido");
                scanf("%s", s);
            }
            if ((b<1) || (b>a)) {
                printf("\nIl valore inserito non rispetta i parametri");
                printf("\nInserisci un valore compreso tra 1 e %d: ",a);
                r=0;
            }
            
        }while (r!=1);
        return b;
    }
    
    
  • Re: Testo di esame

    Alcune considerazioni:
    - a cosa serve la variabile seed?
    - è vero che il C supporta i VLA (variable length array), ma impara a farne a meno (la spiegazione è lunga, ma ti basti sapere che gli standard C più recenti li hanno resi opzionali, mentre il C++ non li ha mai adottati). Quindi utilizza degli array statici del tipo v[N] (dove N è la costante da te definita) e considera poi solo i primi n<=N elementi (con n scelto dall'utente);
    - perchè utilizzi la funzione getN() due volte?
    - per quanto riguarda la funzione getN() la semplificherei soffermandomi soltanto sull'appartenenza all'intervallo [1;max].

    Detto questo e limitandomi ai primi due punti farei qualcosa del genere:
    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    
    #define N 200
    
    int getN(int max)
    {
        int n;
        while(1)
        {
            printf("Inserisci un valore compreso tra 1 e %d: ", max);
            scanf("%d", &n);
            if(n >= 1 && n <= max)
            {
                break;
            }
        }
        return n;
    }
    
    int main()
    {
        srand(time(0));
        int ristorante[N];
        int n = getN(N);
        for(int i = 0; i < n; ++i)
        {
            ristorante[i] = rand() % 10 + 1;
        }
    }
    Soffermiamoci quindi sul punto 3. Premesso che la traccia non è molto chiara, qual è la tua interpretazione del suddetto punto? Definito il problema, come intendi risolverlo? Dal codice si intuisce qualcosina, ma sarebbe meglio se lo spiegassi prima a parole.
  • Re: Testo di esame

    Innanzitutto riempio l'array amanti fino al valore MAX
    Poi con un ciclo for, per ogni valore dell'array(ovvero per ogni coppia)
    genero num casuali tra 1 e 10 e se il numero è uguale a 1,2 o 3 (ovvero ci troviamo nel 30%) avremo che ci sono degli amanti tra una coppia "i" e una "j".
    Per determinare la coppia "j avevo pensato" di generare un num casuale cosi' definito: j= (i+1)+rand()%(max-i), in modo che per esempio se la coppia 0,1,2 non hanno relazione amorose, la 3 invece si il num casuale generato è solo tra 4 e max.
    Pero', sempre per esempi, se alla coppia 3 viene assegnato il valore j= 60 (es), nulla vieta al programma che anche la coppia i= 4 fino alla coppia i= (j-1) venga assegnato lo stesso valore j, quindi si potrebbe creare una situazione del tipo che la coppia 3 ha un amante nella coppia 60 ma anche la coppia 4(sempre per esempio) ha un amante nella coppia 60.
    Questo problema non so come ovviarlo...
    dopo aver risolto questo problema, avevo pensato di creare due puntandori ai valori i e j dell'array amanti e di assegnare il contenuto del puntatore a i alla casella j e viceversa.
    Per tutti valori i-esimi che invece non centravano il 30% ho pensato di assegnare il valore "0" nella loro casella dell'array amanti.
  • Re: Testo di esame

    Ma se alla coppia 4 viene assegnata la coppia 60, cosa dovrebbe succedere nel momento in cui i=60? Tale coppia sarà esclusa dal processo che prevede di calcolare una percentuale del 30%?
  • Re: Testo di esame

    Esatto perché ormai la coppia 60 ha già una relazione con la coppia 4, quindi deve essere esclusa. Non riesco ad imporre questa condizione
  • Re: Testo di esame

    - sorteggi le coppie fedifraghe
    - sorteggi quella da escludere in caso di totale dispari
    - fai un nuovo array con solo le coppie fedifraghe e cicli solo su i pari (i+=2)
    - per ogni i sorteggi la coppia j con l'amante (j >i)
    - scambi di posto la coppia j con la coppia (i+1) e vai avanti nel ciclo
  • Re: Testo di esame

    flavio_in_c ha scritto:


    Esatto perché ormai la coppia 60 ha già una relazione con la coppia 4, quindi deve essere esclusa. Non riesco ad imporre questa condizione
    OK, credo di aver capito la tua interpretazione della traccia, ma prima di passare alla parte implementativa vorrei farti notare una cosa.

    Nel momento in cui assegni con probabilità del 30% una coppia ad un'altra, ti ritroverai alla fine che la parte della consegna che recita
    In circa il 30 % delle coppie uno dei due fidanzati ha una storia con uno dei componenti di un’altra coppia.
    non sarà rispettata, in quanto la percentuale di coppie fedifraghe sarà superiore al 30%.

    Per esempio ipotizziamo di avere 13 coppie:
    - consideriamo la coppia 1 e riscontriamo che essa è fedifraga e associata alla coppia 2;
    - la coppia 2 non la consideriamo in quanto già fedifraga;
    - consideriamo la coppia 3 e riscontriamo che essa è fedifraga e associata alla coppia 4;
    - la coppia 4 non la consideriamo in quanto già fedifraga;
    - consideriamo la coppia 5 e riscontriamo che essa è fedifraga e associata alla coppia 6;
    - la coppia 6 non la consideriamo in quanto già fedifraga;
    - consideriamo la coppia 7 e riscontriamo che essa non è fedifraga;
    - consideriamo la coppia 8 e riscontriamo che essa non è fedifraga;
    - consideriamo la coppia 9 e riscontriamo che essa non è fedifraga;
    - consideriamo la coppia 10 e riscontriamo che essa non è fedifraga;
    - consideriamo la coppia 11 e riscontriamo che essa non è fedifraga;
    - consideriamo la coppia 12 e riscontriamo che essa non è fedifraga;
    - consideriamo la coppia 13 e riscontriamo che essa non è fedifraga.
    In pratica tra le 10 coppie considerate, cioè a cui viene applicate la probabilità del 30% di essere fedifraga, solo 3 risultano effettivamente fedifraghe e quindi la suddetta probabilità è rispettata perfettamente. Calcoliamo ora la percentuale di coppie fedifraghe:
    p = coppie_fed / coppie_totali * 100 = 6 / 13 * 100 = 46%
    Sbaglio io qualcosa o siete d'accordo con questo ragionamento?
  • Re: Testo di esame

    Direi che sbagli. Perché ad una coppia è fedifraga associ automaticamente a quella successiva?
  • Re: Testo di esame

    Ho semplicemente ricostruito l'algoritmo suggerito da @flavio_in_c, e ai fini del calcolo della percentuale di coppie fedifraghe non ha nessun importanza se associo automaticamente la coppia successiva oppure la estraggo a sorte.

    Il punto è che imponendo che una generica coppia sia fedifraga con una percentuale dell'x% con un'altra generica coppia (che poi ovviamente non andremo a considerare), otterremo alla fine che la percentuale di coppie fedifraghe è superiore all'x%.
  • Re: Testo di esame

    Nippolo ha scritto:


    Il punto è che imponendo che una generica coppia sia fedifraga con una percentuale dell'x% con un'altra generica coppia (che poi ovviamente non andremo a considerare), otterremo alla fine che la percentuale di coppie fedifraghe è superiore all'x%.
    Infatti vanno sorteggiate prime e accoppiate dopo, come suggerito sopra
Devi accedere o registrarti per scrivere nel forum
18 risposte