andrea.b89 (Ex-Member)
Pro
Messaggi: 129
Iscritto: 03/03/2009
|
Personalmente il codice lo riscriverei nel seguente modo :
Codice sorgente - presumibilmente C++ |
#define N 5 main(){ int i=0; int u=1; int a[N]={3,6,9,10,15}; while(i < N && u != 0) if(a[i]%3!=0) u = 0; else i++;
|
secondo me per le asserzioni fatte è più chiaro scritto così :
1) Asserzione iniziale, o pre-condizione per darle un altro nome, è che u sia pari a 1
2) Asserzione finale, o post-condizione per darle un nome diverso, è che
u = 0 se nel vettore a vi è almento un elemento non multiplo di 3
u = 1 se tutti gli elementi del vettore sono multipli di 3
3) Complessità è pari a O(n) in quanto al massimo scorri l'intero vettore una sola volta.
Poi mi potresti cortesemente dare la tua definizione di invariante? Vorrei capire che cosa intendi tu per Invariante.
|
|
gabama (Normal User)
Rookie
Messaggi: 26
Iscritto: 12/04/2009
|
scusa se non ti ho risposto subito,mi ero assentato dal pc,
per prima cosa grazie mille per i consigli,
per quanto riguarda l 'invariante,è una proposizione sempre per quanto riguarda il ciclo,
quindi vera immediatamente prima dell' azione iterativa,vera dopo ogni ripetizione del corpo del ciclo e vera all' uscita azione iterativa
E' giusto il diagramma?
|
|
andrea.b89 (Ex-Member)
Pro
Messaggi: 129
Iscritto: 03/03/2009
|
capito.
allora l'invariante in quel caso è i con dominio [0, N-1]
lo schema è un pelo incasinato
io lo farei così :
begin
i = 0, u = 1
while : se i < N e u != 0
SI : se a % 3 != 0 NO : vai a fine
SI : u = 0 NO : i = i + 1
torna a while
fine : end
relativamente al tuo codice sarebbe stato :
begin
i = 0, u = 1
for : se i < N
SI : se a % 3 != 0 ; NO : vai a fine
SI : u = 0
se u == 0
SI : termina for
i = i +1
torna a for
fine : end
spero sia chiaro. se hai domande chiedi pure Ultima modifica effettuata da andrea.b89 il 13/04/2009 alle 19:52 |
|
gabama (Normal User)
Rookie
Messaggi: 26
Iscritto: 12/04/2009
|
grazie mille,non mi è però chiaro il diagramma sul tuo esempio
si parte da i=0; e u=1;
test while i<N e u!=0
se SI si fa ulteriore test ,se a>3 ,se NO si esce
se secondo test è SI i=i+1;se NO U=0 e si esce
---non comprendo--- dove ti ho fatto le freccette
i = 0, u = 1
while : se i < N e u != 0
SI : se a % 3 != 0 NO : vai a fine <--
SI : u = 0 NO : i = i + 1 <--
torna a while
fine : end
Abi pazienza se ti faccio una domanda stupida,o per te scontata.....
|
|
Dave Danuve (Normal User)
Newbie
Messaggi: 6
Iscritto: 13/04/2009
|
Scusate ma non è ben chiaro il problema da risolvere. Da quel che sono riuscito a capire il problema consiste nel verificare che un'insieme di n numeri contenga solo multipli di 3, o sbaglio?
In tal caso è sufficiente scorrere l'array con un ciclo for ed effettuare un controllo su tutti gli elementi.
Codice sorgente - presumibilmente C++ |
#include <stdbool.h> bool arrayMultipliDi3(int values[N]) { unsigned int i; for (i = 0; i < N; i++) if (values[i] % 3) return false; return true; }
|
La funzione restituisce true se e solo se tutti gli elementi sono multipli di 3. All'interno dell'if viene effettuato un controllo booleano implicito: in linguaggio C una qualsiasi espressione viene considerata vera se il risultato è diverso da 0. La complessità dell'algoritmo è O(n) nel caso peggiore, ovvero quando tutti gli elementi sono multipli di 3 (in questo caso si scorre tutto l'array, altrimenti la funzione restituisce false nonappena trova un elemento che non è multiplo di 3).
|
|
gabama (Normal User)
Rookie
Messaggi: 26
Iscritto: 12/04/2009
|
il mio problema è che non sono riuscito a comprendere il diagramma a blocchi
|
|
andrea.b89 (Ex-Member)
Pro
Messaggi: 129
Iscritto: 03/03/2009
|
ti allego il diagramma di flusso in versione grafica.
non è fatto molto bene a livello grafico perchè l'ho realizzato con paint, però dovrebbe essere chiaro. almeno lo spero.
|
|
gabama (Normal User)
Rookie
Messaggi: 26
Iscritto: 12/04/2009
|
ti ringrazio moltissimo,sei troppo gentile
Grazie ancora
Ciao!
|
|