-

[DOMANDA] Esercizio in pseudocodice

xjokerx

Utente Attivo
111
2
Hardware Utente
CPU
Intel Core I5-3570k 3.40Ghz + Hyper 412s
Scheda Madre
Asrock Z77 Extreme 4
Hard Disk
WD Black 1 TB 7200rpm
RAM
Kingston 8 Gb 1600
Scheda Video
Sapphire r9 280 3gb
Scheda Audio
Integrato
Alimentatore
Corsair CX600M
Case
Cooler Master HAF 912 Plus
Sistema Operativo
Windows 7 ultimate 64-bit
#1
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.
 

Tidus88

Utente Attivo
465
49
Hardware Utente
CPU
Ryzen 2400G
Scheda Madre
Asrock B450M Pro4
Hard Disk
MX-500 500GB
RAM
Ballistix 16GB DDR4 3000Mhz
Scheda Video
GTX 970 Compact Inno3D
Monitor
Philips 27" 278C4QHSN/00
Alimentatore
Sharkoon Silentstorm Icewind 550W
Case
Aerocool Aero-500-BC
Sistema Operativo
Windows 10
#2
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
 
Mi Piace: _Achille e xjokerx

xjokerx

Utente Attivo
111
2
Hardware Utente
CPU
Intel Core I5-3570k 3.40Ghz + Hyper 412s
Scheda Madre
Asrock Z77 Extreme 4
Hard Disk
WD Black 1 TB 7200rpm
RAM
Kingston 8 Gb 1600
Scheda Video
Sapphire r9 280 3gb
Scheda Audio
Integrato
Alimentatore
Corsair CX600M
Case
Cooler Master HAF 912 Plus
Sistema Operativo
Windows 7 ultimate 64-bit
#3
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?
 

Tidus88

Utente Attivo
465
49
Hardware Utente
CPU
Ryzen 2400G
Scheda Madre
Asrock B450M Pro4
Hard Disk
MX-500 500GB
RAM
Ballistix 16GB DDR4 3000Mhz
Scheda Video
GTX 970 Compact Inno3D
Monitor
Philips 27" 278C4QHSN/00
Alimentatore
Sharkoon Silentstorm Icewind 550W
Case
Aerocool Aero-500-BC
Sistema Operativo
Windows 10
#4
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:
Mi Piace: xjokerx

xjokerx

Utente Attivo
111
2
Hardware Utente
CPU
Intel Core I5-3570k 3.40Ghz + Hyper 412s
Scheda Madre
Asrock Z77 Extreme 4
Hard Disk
WD Black 1 TB 7200rpm
RAM
Kingston 8 Gb 1600
Scheda Video
Sapphire r9 280 3gb
Scheda Audio
Integrato
Alimentatore
Corsair CX600M
Case
Cooler Master HAF 912 Plus
Sistema Operativo
Windows 7 ultimate 64-bit
#5
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
 

Tidus88

Utente Attivo
465
49
Hardware Utente
CPU
Ryzen 2400G
Scheda Madre
Asrock B450M Pro4
Hard Disk
MX-500 500GB
RAM
Ballistix 16GB DDR4 3000Mhz
Scheda Video
GTX 970 Compact Inno3D
Monitor
Philips 27" 278C4QHSN/00
Alimentatore
Sharkoon Silentstorm Icewind 550W
Case
Aerocool Aero-500-BC
Sistema Operativo
Windows 10
#6
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

;)
 
Mi Piace: xjokerx

xjokerx

Utente Attivo
111
2
Hardware Utente
CPU
Intel Core I5-3570k 3.40Ghz + Hyper 412s
Scheda Madre
Asrock Z77 Extreme 4
Hard Disk
WD Black 1 TB 7200rpm
RAM
Kingston 8 Gb 1600
Scheda Video
Sapphire r9 280 3gb
Scheda Audio
Integrato
Alimentatore
Corsair CX600M
Case
Cooler Master HAF 912 Plus
Sistema Operativo
Windows 7 ultimate 64-bit
#7
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
 

Tidus88

Utente Attivo
465
49
Hardware Utente
CPU
Ryzen 2400G
Scheda Madre
Asrock B450M Pro4
Hard Disk
MX-500 500GB
RAM
Ballistix 16GB DDR4 3000Mhz
Scheda Video
GTX 970 Compact Inno3D
Monitor
Philips 27" 278C4QHSN/00
Alimentatore
Sharkoon Silentstorm Icewind 550W
Case
Aerocool Aero-500-BC
Sistema Operativo
Windows 10
#8
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
 
Mi Piace: xjokerx

Discussioni Simili


Entra