Aiuto per esercizi

di il
19 risposte

19 Risposte - Pagina 2

  • Re: Aiuto per esercizi

    Vero ho interpretato male la richiesta.
    Comunque, come posso generalizzare un ragionamento simile?
    
    struct analisi_vettore
        {
            int elemento_distinto;
            int frequenza_occorrenza;
        };
        analisi_vettore vettore[100];
        vettore[0].elemento_distinto=v[0];
        vettore[0].frequenza_occorrenza=1;
        if(v[1]==v[0])
            vettore[0].frequenza_occorrenza=2;
        else
        {
            vettore[1].elemento_distinto=v[1];
            vettore[1].frequenza_occorrenza=1;
        }
        if(v[2]==v[1])
            if(v[1]==v[0])
                vettore[0].frequenza_occorrenza=3;
        if(v[2]==v[1])
            if(v[1]=!v[0])
                vettore[1].frequenza_occorrenza=2;
        if(v[2]=!v[1])
        {
            vettore[2].elemento_distinto=v[2];
            vettore[2].frequenza_occorrenza=1;
        }
        if(v[3]=v[2])
            if(v[2]=v[1])
                if(v[1]=v[0])
                    vettore[0].frequenza_occorrenza=4;
            if(v[3]=v[2])
                if(v[2]=v[1])
                    if(v[1]=!v[0])
                        vettore[1].frequenza_occorrenza=3;
                if(v[3]=v[2])
                    if(v[2]=!v[1])
                        vettore[2].frequenza_occorrenza=2;
                if(v[3]=!v[2])
                    vettore[3].frequenza_occorrenza=1;
                    .
                    .
                    .
                    .
                    e cosi via
    
  • Re: Aiuto per esercizi

    Scusa ma non capisco.
  • Re: Aiuto per esercizi

    E' un altro esercizio. Ho scritto i passi elementari ma non riesco a generalizzare tutti quei if else.
    Dato un vettore bisogna individuare gli elementi distinti e la loro frequenza di occorrenza.
  • Re: Aiuto per esercizi

    E' tutta un'altra storia. Credo che il moderatore di chiederebbe (chiederà) di avviare un nuovo thread.
  • Re: Aiuto per esercizi

    Comunque sia, io farei così (con tutti i miei limiti)...

    Definita una struttura tipo questa:
    typedef struct RICORRENZA {
        int valore;
        size_t quantita;
    } RICORRENZA;
    Potresti implementare una funzione tipo rileva_ricorrenze...

    RICORRENZA *rileva_ricorrenze( int *v, size_t dim_v );

    La funzione potrebbe verificare quanti rilevamenti sono necessari, quindi allocare un vettore di elementi di tipo RICORRENZA e "compilarlo".

    Per rilevare quanti elementi sono necessari, potresti scorrere il vettore v e contare la quantità di valori diversi in esso presenti.
    Ad esempio, usando una variabile ausiliaria aux e due contatori qvu (quantità valori unici) e n (numero di ricorrenze) potresti eseguire un ciclo annidato del tipo...
    for( qvu=0, i=0; i<dim_v; ++qvu )
        for( aux=v[i], n=0; v[i]==aux&&i<dim_v; ++i, ++n );
    ...che, partendo dal presupposto che il vettore v sia ordinato in senso crescente, "osservi" uno ad uno gli elementi del vettore v stesso e conti in qvu quanti sono i valori unici.

    Una volta scoperta la quantità dei valori unici occorrerebbe predisporre un vettore di elementi di tipo RICORRENZA dove immettere osservazioni più specifiche. Siccome non si potrebbe sapere quanti elementi dovrebbero trovare posto in quel vettore, non si potrebbe fare altro che allocarlo dinamicamente.
    r = calloc( qvu+1, sizeof(*r) );
    if( !r ) return r; // l'allocazione potrebbe fallire
    Scopiazzando il metodo che usa il C per indicare la fine degli array di caratteri nelle stringhe, potresti usare un valore arbitrario (ad esempio potresti usare (size_t)-1) per indicare la fine della serie degli elementi RICORRENZA.In questo caso, l'allocazione riguarderebbe qvu+1 elementi.

    A questo punto, potresti ri-"osservare" il vettore v e memorizzare in r i risultati delle "osservazioni".
    for( i=0, j=0; i<dim_v; ++j ) {
        for( aux=v[i], n=0; v[i]==aux&&i<dim_v; ++i, ++n );
        r[j].valore   = aux;
        r[j].quantita = n;
    }
    Occorrerebbe non dimenticare di mettere il "terminatore" convenzionale in coda alla serie degli elementi RICORRENZA rilevati.

    r[j].quantita = (size_t)-1; // (size_t)-1 è un valore "terminatore" arbitrario.

    Alla fine della fiera, si dovrebbe passare come valore di ritorno il puntatore al vettore di elementi RICORRENZA allocato e "compilato", che sarebbe NULL in caso di errore.

    Ovviamente, come sempre, potrei aver scritto delle scempiaggini poco "ortodosse". Tienilo ben presente (sono un hobbista).
Devi accedere o registrarti per scrivere nel forum
19 risposte