DOMANDA Esercizio in pseudocodice

Pubblicità

xjokerx

Utente Attivo
Messaggi
161
Reazioni
8
Punteggio
49
Salve a tutti, spero di essere nella sezione giusta, ho un esercizio da scrivere in pseudocodice, segue il testo:
Descrivere un algoritmo in notazione NLS che prende in input una matrice o array bidimensionale V di dimensioni N × M, un array A di dimensione k, ed un numero w < M.
L’algoritmo stampa il valore di verit`a true se esiste almeno una riga della matrice V che contiene almeno w elementimaggiori di ogni elemento in A.

Ho provato a scrivere qualcosa:
https://pastebin.com/pqDNi5Vn

Ho qualche dubbio possa essere sbagliato, spero mi possiate aiutare.
 
Premettendo che non ho la notazione NLS molto fresca, secondo me ciò che deve fare il tuo algoritmo è:

- Inizializzare la variabile risultato a FALSE
- Calcolare il MAX di A (indichiamolo con Z)
- Ciclare su ogni riga della matrice e per ogni iterazione contare quanti elementi della riga sono maggiori di Z, indichiamo il numero di elementi con c
- Nel momento in cui c raggiunge il valore w puoi aggiornare il valore di risultato a TRUE e interrompere l'iterazione (con un break)
- Quando si esce dal ciclo restituire la variabile risultato
 
Premettendo che non ho la notazione NLS molto fresca, secondo me ciò che deve fare il tuo algoritmo è:

- Inizializzare la variabile risultato a FALSE
- Calcolare il MAX di A (indichiamolo con Z)
- Ciclare su ogni riga della matrice e per ogni iterazione contare quanti elementi della riga sono maggiori di Z, indichiamo il numero di elementi con c
- Nel momento in cui c raggiunge il valore w puoi aggiornare il valore di risultato a TRUE e interrompere l'iterazione (con un break)
- Quando si esce dal ciclo restituire la variabile risultato

Ho provato a modificare il codice:
https://pastebin.com/YvXB5V5B

Dici che cosi puo andare?
 
Dunque, vedo un po' di errori:

- Il calcolo del MAX è completamente fallato: assegni ad A[0] una variabile max che non esiste, mentre sarebbe giusto fare Z=A[0] come prima assegnazione, poi non aggiorni mai il valore di MAX e ti fermi al primo caso in cui trovi un valore maggiore del primo (es. nella sequenza 3, 1, 2, 4, 5, 6, 7, 8 il tuo MAX sarebbe 4!).
In questo caso è corretto utilizzare un ciclo FOR per iterare TUTTE le celle dell'array ed aggiornare Z ogni volta che la condizione A>Z è verificata.

- riga 11, l'istruzione w<M è nonsense... restituisce un valore BOOLEANO che non viene memorizzato ne utilizzato

- il ciclo che inizia alla riga 12 mi è difficile da comprendere, cosa intendi fare?

In generale, quando bisogna iterare tutti gli elementi è preferibile usare un ciclo for e non il while (perlomeno è più leggibile e costringe a fare meno salti per capire cosa fa il ciclo).


Il ciclo finale secondo me dovrebbe essere così:

Codice:
for (k=0, k<N, k++)
{
    counter = 0
    for (j=0, j<M, j++)
    {
        if (V[k][j]>Z)
        {
            counter ++
        }
        if (counter == w)
        {
            risultato = TRUE
            break
        }
    }
    if (risultato == TRUE)
    {
        break
    }
}

return risultato


Tieni conto che ho usato dei break perchè potrebbe essere necessario fare delle elaborazioni con i dati che hai ottenuto durante il ciclo.
In alternativa si potrebbero togliere entrambi i break e fare direttamente 'return TRUE' quando viene verificata la condizione counter==w.
 
Ultima modifica:
Dunque, vedo un po' di errori:

- Il calcolo del MAX è completamente fallato: assegni ad A[0] una variabile max che non esiste, mentre sarebbe giusto fare Z=A[0] come prima assegnazione, poi non aggiorni mai il valore di MAX e ti fermi al primo caso in cui trovi un valore maggiore del primo (es. nella sequenza 3, 1, 2, 4, 5, 6, 7, 8 il tuo MAX sarebbe 4!).
In questo caso è corretto utilizzare un ciclo FOR per iterare TUTTE le celle dell'array ed aggiornare Z ogni volta che la condizione A>Z è verificata.

- riga 11, l'istruzione w<M è nonsense... restituisce un valore BOOLEANO che non viene memorizzato ne utilizzato

- il ciclo che inizia alla riga 12 mi è difficile da comprendere, cosa intendi fare?

In generale, quando bisogna iterare tutti gli elementi è preferibile usare un ciclo for e non il while (perlomeno è più leggibile e costringe a fare meno salti per capire cosa fa il ciclo).


Il ciclo finale secondo me dovrebbe essere così:

Codice:
for (k=0, k<N, k++)
{
    counter = 0
    for (j=0, j<M, j++)
    {
        if (V[k][j]>Z)
        {
            counter ++
        }
        if (counter == w)
        {
            risultato = TRUE
            break
        }
    }
    if (risultato == TRUE)
    {
        break
    }
}

return risultato


Tieni conto che ho usato dei break perchè potrebbe essere necessario fare delle elaborazioni con i dati che hai ottenuto durante il ciclo.
In alternativa si potrebbero togliere entrambi i break e fare direttamente 'return TRUE' quando viene verificata la condizione counter==w.

Grazie per l’infinita pazienza, ma uso while perché il prof di programmazione ha detto di evitare di usare for e di scrivere i cicli con while, e sono abbastanza sicuro che sta cosa un po’ mi abbia complicato il lavoro, dato che col for è molto più immediato
 
OK, allora domani (adesso sono da mobile e non credo di riuscire a scriverti codice) provo a buttarti giù una versione del ciclo con il while.

Nel frattempo:
1. Rivedi il tuo codice sistemando gli errori
2. Prova a riscrivere il ciclo finale con l'uso del while

;)
 
OK, allora domani (adesso sono da mobile e non credo di riuscire a scriverti codice) provo a buttarti giù una versione del ciclo con il while.

Nel frattempo:
1. Rivedi il tuo codice sistemando gli errori
2. Prova a riscrivere il ciclo finale con l'uso del while

;)


Ok grazie mille, gentilissimo
 
Di seguito il medesimo ciclo eseguito con la sintassi del while (te lo metto sotto SPOILER, così magari puoi provare a scrivere anche tu il medesimo ciclo senza leggere prima la mia versione):

Codice:
k = 0
while (k<=N)
{
    counter = 0
    j = 0
    while (j<=M)
    {
        if (V[k][j]>Z)
        {
            counter ++
        }
        
        if (counter == w)
        {
            risultato = TRUE
            break
        }
        
        j++
    }
    
    if (risultato == TRUE)
    {
        break
    }
    
    k++
}

return risultato
 
Pubblicità
Pubblicità
Indietro
Top