Discussioni su argomenti di Informatica

Regole del forum

Consulta il nostro regolamento e la guida per scrivere le formule
Rispondi al messaggio

Algortimi e strutture dati

26/04/2022, 10:49

Salve a tutti. Sto riscontrando alcuni problemi con questo esercizio. Non riesco a risolvere gli errori che si presentano. Qualcuno potrebbe aiutarmi dandomi alcuni suggerimenti? Ringrazio chi mi aiuterà

Nel link che ho postato ci sono le Struct necessiare
https://onlinegdb.com/QR3W9nCz_

In allegato ci sono anche gli errori

Immagine
Immagine

Re: Algortimi e strutture dati

27/04/2022, 05:13

Gli errori mi sembrano abbastanza chiari, che cosa non capisci esattamente? Il codice è di una certa lunghezza per cui la sua risoluzione richiede un po' di tempo. Avere qualche indicazione in più su quali sono le tue difficoltà potrebbe probabilmente velocizzare la cosa.

Re: Algortimi e strutture dati

27/04/2022, 13:56

Codice:
void HTtoArray_range(THT* ht, TArray* array, TKey min, TKey max) {
    TList list = listCreate();
    TInfo imin = {min}, imax = {max};
    for (int i = 0; i < ht->n_bucket; i++)
        for (TNode *node = ht->bucket[i]; node != NULL; node = node->link)
            if (!infoLess(node->info, imin) && !infoGreater(node->info, imax))
            arraySet(ht, array->info.key, array->info.value);
            ht = HTdelete(ht, ht->info);
   
}


E' questa funzione che mi crea problemi il arrayset non capisco come risolverlo

Re: Algortimi e strutture dati

27/04/2022, 17:03

Ti complichi un po' la vita. Dovresti cercare di capire quel che fanno le varie funzioni del professore, ogni tanto sembri andare a caso.

Per aggiungere gli elementi puoi fare qualcosa come:
Codice:
    for (int i = 0; i < ht->n_bucket; i++)
    {
        for (TNode *node = ht->bucket[i]; node != NULL; node = node->link)
        {
            if (node->info.key >= min && node->info.key <= max)
            {
                arrayAdd(array, node->info);
            }
        }
    }
o con > e < se i limiti vanno esclusi. Poi basta che iteri sull'array ed elimini dentro la hash table usando le key.

Alternativamente puoi anche fare qualcosa come:
Codice:
void
HTtoArray_range2(THT *ht, TArray *array, TKey min, TKey max)
{
    for( TKey key = min; key <= max; key++ )
    {
        TValue* value = HTsearch (ht, min);
        if( value )
        {
            TInfo info;
            info.key = key;
            info.value = *value;
            arrayAdd(array, info);
            HTdelete(ht, key);
        }
    }
}


È difficile dire quale sia il migliore a priori, dipende un po' da quanto sono distanti min e max e da quanti elementi ci sono nella tabella.

Re: Algortimi e strutture dati

28/04/2022, 07:48

Capito grazie mille. Più che altro faccio fatica a comprendere :/

Re: Algortimi e strutture dati

28/04/2022, 18:34

Quali difficoltà incontri nella comprensione dei concetti? Forse ti possiamo aiutare.

Re: Algortimi e strutture dati

09/05/2022, 17:35

Https://onlinegdb.com/evG7QTqb2 Qui è il codice aggiornato

L'unico intoppo è che non stampa i pazienti con esenzione in elenco 3 a causa della funzione ma non capisco come posso migliorarla affinchè possa funzionare

Codice:
void printOrderedArray_exemptions(TArray* array) {
    int i;
    TList list_ord = listCreate();
   
    for(i=0; i<array->length; i++){
        list_ord = listInsert(list_ord, array->items[i]);
    }
}

Re: Algortimi e strutture dati

09/05/2022, 17:36

apatriarca ha scritto:Quali difficoltà incontri nella comprensione dei concetti? Forse ti possiamo aiutare.

Sicuramente dovrò ristudiare i puntatori ed le funzioni perchè capita che molte volte mi blocco dato che non so come procedere

Re: Algortimi e strutture dati

09/05/2022, 18:02

Comunque ho notato che questa funzione sposta tutti i pazienti con ID pari forse perchè ho inserito la divisione per 2 però il problema è non so come verificare l'ultima cifra

BSTtoHT_exemption(bst, ht): funzione RICORSIVA che copia da bst a ht tutti i
* pazienti con ID la cui ultima cifra sia 0, rimuovendoli da bst.
* Considerando l'ID, se un paziente di bst gia' esiste in ht esso non verra'
* duplicato (ma verra' comunque rimosso da bst).
Codice:
TBST BSTtoHT_exemption(TBST bst, THT* ht) {
   
    if (bst != NULL) {
        bst->left = BSTtoHT_exemption(bst->left, ht);
        bst->right = BSTtoHT_exemption(bst->right, ht);
        if ((bst->info.key%2) == 0) {
            HTinsert(ht, bst->info.key, bst->info.value);
            bst = BSTdelete(bst, bst->info);
        }
    }

    return bst;
   
}

Re: Algortimi e strutture dati

10/05/2022, 16:22

L'operatore % non è una divisione! Calcola il RESTO della divisione, cioè qualcosa di simile al modulo (le due operazioni differiscono quando almeno uno dei numeri è negativo). L'esercizio ti chiede di considerare l'ultima cifra di un numero e l'idea di usare l'operazione di resto per farlo è corretta. Tuttavia non mi è chiaro perché hai deciso di usare 2 invece di 10. Non ti chiede se il numero è pari o l'ultima cifra binaria, ti chiede l'ultima cifra DECIMALE e quindi devi usare 10..
Rispondi al messaggio


Skuola.net News è una testata giornalistica iscritta al Registro degli Operatori della Comunicazione.
Registrazione: n° 20792 del 23/12/2010.
©2000— Skuola Network s.r.l. Tutti i diritti riservati. — P.I. 10404470014.