Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12

Discussione: Correzione codice c++

  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2016
    Messaggi
    9

    Correzione codice c++

    Salve, sto riscontrando difficoltà a correggere questo codice in maniera migliore.

    template < class T > void CodaP < T >::fixDown (int k, int N) {
    short int scambio = 1;
    while (k <= N / 2 && scambio) {
    int j = 2 * k;
    tipoelem tmp;
    if (j < N && heap[j - 1] > heap[j]) j++;
    if (scambio = (heap[j - 1] < heap[k – 1])) {
    tmp = heap[k – 1];
    heap[k - 1] = heap[j - 1];
    heap[j - 1] = tmp;
    k = j;
    }
    }
    };

    Ho capito che gli errori stanno nel -1 in quanto ho già corretto nell'altra parte del codice, però vedo che anche la variabile "scambio" non è usata in maniera giusta. Come posso risolvere?

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,307
    Credo che dovresti, quantomento, fornire una descrizione di cosa dovrebbe fare quel codice... per capire cosa c'è di sbagliato.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2016
    Messaggi
    9
    Riguarda una coda con priorità heap, il fix down scambia gli elementi se hanno priorità minore

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Supponendo tu stia utilizzando un vettore come un albero binario completo e il nodo padre sia l'indice 0, mi sembra che tu non stia rispettando le relazioni padre-figlio. Infatti le relazioni di parentela dovrebbero essere
    codice:
    left_child(int k) = 2*k+1
    right_child(int k) = 2*k+2
    //-1 on parent(0)
    parent(int k) = round_down((k-1)/2)
    //0 on parent(0)
    parent(int k) = trunc((k-1)/2)
    Tu invece stai utilizzando come relazioni 2k-1 e 2k
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2016
    Messaggi
    9
    la variabile scambio è usata correttamente?

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Sì, contiene true se è avvenuto uno scambio, false altrimenti. È il modo peggiore in cui si può scrivere ma funziona.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2016
    Messaggi
    9
    Ecco mi hai risposto, in che senso è il modo peggiore? Si può scrivere meglio?

  8. #8
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    È sempre meglio evitare assegnazioni nelle condizioni: risulta ambiguo se si volesse realmente intendere una assegnazione(=) o sia un errore di scrittura per la comparazione(==). Siccome puoi fare la stessa cosa assegnando esplicitamente true e false alla variabile, non vedo perché non farlo.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2016
    Messaggi
    9
    Scusami non ho capito..

  10. #10
    Utente di HTML.it
    Registrato dal
    Nov 2016
    Messaggi
    9
    Up, mi serve, è importante

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.