Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    (c) problema riconoscimento albero binario rappresentato con parentesi

    Salve, dovrei scrivere un programma C che verifichi se un albero, rappresentato con una stringa attraverso parentesi tonde, è binario o meno e in caso lo sia scriva a schermo B altrimenti N.

    Ho implementato il seguente codice e testandolo ho trovato un caso in cui non funziona, qualcuno mi sa dire dove sia il problema? Grazie!

    codice:
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 
    
    
    char visita(char * s, int i, int n, char b, int c){
        while(i<=n&&s[i]!=')'){
                if(s[i]=='('){
                    c = 1;
                    i = i + 1;
                    visita (s, i, n, b, 0);
                }else{
                    if(s[i]==')'){
                    }else{
                        c = c + 1;
                    }
                }
        i = i + 1;
        }
        if(c>2) {b = 'N';}
            
        return b;
    }
    
    
    int main(int argc, char *argv[]) 
    { 
        char s[100];
        char b = 'B';
        int c = 0, n = 0, i = 1;
        
        // trasferimento degli argomenti della linea di comando
        strcpy(s, argv[1]);
        
        // calcolo della lunghezza della stringa s
        n = strlen(s);
        
        // chiamata della funzione visita che controlla se l'albero è binario 
        // e stampa del valore di ritorno
        printf("%c", visita(s, i, n, b, c));
        return 0;
    }
    L'ho testato con i seguenti alberi ottenendo questi risultati:

    1 B
    (12) B
    (123) N
    (1(23)) B

    e fin qui sono giusti, ma per l'albero seguente mi rileva che è Binario quando invece Non lo è.

    ((12)(1(23)3))

  2. #2
    Mi stupisce piuttosto che funzioni in qualche caso... la routine è banalmente sbagliata per il fatto che dopo aver chiamato la visita ti ritrovi ancora nella stessa posizione, per cui (ad esempio) la prima visita sullo stack delle chiamate si smazza comunque tutta la stringa, resettando c a 1 ogni volta che vede una parentesi. Inoltre, qualunque 'N' fornito da una sottochiamata a visita viene completamente ignorato.
    Devi modificare la routine in modo che ogni chiamata a visita sposti il puntatore al carattere corrente fin dove arriva, e in modo che, se un check ad una chiamata nidificata fallisce, venga propagato fino al chiamante originario.

    Inoltre:
    - variabili di una sola lettera sono faticose da leggere;
    - tutti quei parametri non servono a niente; ti basta il puntatore (doppio) a carattere (aggiornato man mano con la posizione corrente).
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    In realtà si tratta di un'esercizio che deve essere svolto attenendosi ad un diagramma di flusso.
    Pensavo di essermi attenuto a quel diagramma ma probabilmente ho confuso qualche passaggio, ti allego il diagramma, ti sarei grato se mi aiutassi in questo senso, non sono molto pratico di visite ad alberi e ho necessità di svolgere al più presto questo esercizio. Grazie
    Foto 09-09-15 23 34 23.jpgFoto 09-09-15 23 34 10.jpg

  4. #4
    Guarda bene il secondo diagramma... i e b sono marcate come "in/out"...
    Amaro C++, il gusto pieno dell'undefined behavior.

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.