DOMANDA Esercizio in pseudocodice

xjokerx

Utente Attivo
161
8
CPU
Intel Core I5-3570k 3.40Ghz + Hyper 412s
Scheda Madre
Asrock Z77 Extreme 4
HDD
WD Black 1 TB 7200rpm
RAM
Kingston 8 Gb 1600
GPU
Sapphire r9 280 3gb
Audio
Integrato
PSU
Corsair CX600M
Case
Cooler Master HAF 912 Plus
OS
Windows 7 ultimate 64-bit
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

From another world
Utente Èlite
2,038
1,738
CPU
Ryzen 5600X
Dissipatore
Deepcool GAMMAX 400
Scheda Madre
Asus Prime B450-Plus
HDD
MX-500 500GB
RAM
Ballistix 16GB DDR4 3000Mhz
GPU
RTX 3060Ti Dual ASUS
Audio
Edifier R1280db
Monitor
Hisense H55U7A
PSU
Sharkoon Silentstorm Icewind 550W
Case
Corsair 275R Airflow White
Net
SkyWifi FTTH
OS
Windows 10
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
Reazioni: _Achille e xjokerx

xjokerx

Utente Attivo
161
8
CPU
Intel Core I5-3570k 3.40Ghz + Hyper 412s
Scheda Madre
Asrock Z77 Extreme 4
HDD
WD Black 1 TB 7200rpm
RAM
Kingston 8 Gb 1600
GPU
Sapphire r9 280 3gb
Audio
Integrato
PSU
Corsair CX600M
Case
Cooler Master HAF 912 Plus
OS
Windows 7 ultimate 64-bit
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

From another world
Utente Èlite
2,038
1,738
CPU
Ryzen 5600X
Dissipatore
Deepcool GAMMAX 400
Scheda Madre
Asus Prime B450-Plus
HDD
MX-500 500GB
RAM
Ballistix 16GB DDR4 3000Mhz
GPU
RTX 3060Ti Dual ASUS
Audio
Edifier R1280db
Monitor
Hisense H55U7A
PSU
Sharkoon Silentstorm Icewind 550W
Case
Corsair 275R Airflow White
Net
SkyWifi FTTH
OS
Windows 10
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
Reazioni: xjokerx

xjokerx

Utente Attivo
161
8
CPU
Intel Core I5-3570k 3.40Ghz + Hyper 412s
Scheda Madre
Asrock Z77 Extreme 4
HDD
WD Black 1 TB 7200rpm
RAM
Kingston 8 Gb 1600
GPU
Sapphire r9 280 3gb
Audio
Integrato
PSU
Corsair CX600M
Case
Cooler Master HAF 912 Plus
OS
Windows 7 ultimate 64-bit
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

From another world
Utente Èlite
2,038
1,738
CPU
Ryzen 5600X
Dissipatore
Deepcool GAMMAX 400
Scheda Madre
Asus Prime B450-Plus
HDD
MX-500 500GB
RAM
Ballistix 16GB DDR4 3000Mhz
GPU
RTX 3060Ti Dual ASUS
Audio
Edifier R1280db
Monitor
Hisense H55U7A
PSU
Sharkoon Silentstorm Icewind 550W
Case
Corsair 275R Airflow White
Net
SkyWifi FTTH
OS
Windows 10
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
Reazioni: xjokerx

xjokerx

Utente Attivo
161
8
CPU
Intel Core I5-3570k 3.40Ghz + Hyper 412s
Scheda Madre
Asrock Z77 Extreme 4
HDD
WD Black 1 TB 7200rpm
RAM
Kingston 8 Gb 1600
GPU
Sapphire r9 280 3gb
Audio
Integrato
PSU
Corsair CX600M
Case
Cooler Master HAF 912 Plus
OS
Windows 7 ultimate 64-bit
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

From another world
Utente Èlite
2,038
1,738
CPU
Ryzen 5600X
Dissipatore
Deepcool GAMMAX 400
Scheda Madre
Asus Prime B450-Plus
HDD
MX-500 500GB
RAM
Ballistix 16GB DDR4 3000Mhz
GPU
RTX 3060Ti Dual ASUS
Audio
Edifier R1280db
Monitor
Hisense H55U7A
PSU
Sharkoon Silentstorm Icewind 550W
Case
Corsair 275R Airflow White
Net
SkyWifi FTTH
OS
Windows 10
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
Reazioni: xjokerx

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!