PDA

View Full Version : ALGORITMI


moka
02-03-2005, 16:40
ciao!
mi aiutereste a fare questi 3 algoritmi?

algoritmo 1:
dato in input un numero (n) calcolare la somma di tutti i numeri da 0 a n.
algoritmo 2:
dato in input un numero (n) calcolare la somma di tutti i numeri pari da 0 a n.
algoritmo 3:
dati in input n numeri,calcolare la differenza tra numero minimo e numero massimo..
aiutatemi li devo presentare per domani!

gokan
02-03-2005, 17:19
Dai, non sono difficili, ad esempio per fare il primo ti basta fare un ciclo for ed aggiungere sempre alla somma parziale l'ultimo numero:

somma=0;

for i=1 to n
somma=somma+i;


Ciao

VegetaSSJ5
02-03-2005, 17:46
per favore non dire che ti serve una mano per questi! gokan non postare più soluzioni, penso che questi non siano da dare nemmeno come esercizio per quanto sono semplici!:mc:

Fenomeno85
02-03-2005, 17:47
vegeta come sei cattivo :D

~§~ Sempre E Solo Lei ~§~

VegetaSSJ5
02-03-2005, 17:53
Originariamente inviato da Fenomeno85
vegeta come sei cattivo :D

~§~ Sempre E Solo Lei ~§~
si però se lui si fa aiutare su questi esercizi come può sperare di passare l'esame?? e poi giusto per non ridurre tutto sul piano di passare/non passare l'esame, queste cose sono davvero basilari, penso che dovrebbe applicarsi un po' di più, trovare una soluzione, e poi magari postarla sul forum per commentarla.

Fenomeno85
02-03-2005, 18:02
si ti do ragione ma forse cercava di vedere come si fanno ste cose :D

~§~ Sempre E Solo Lei ~§~

cionci
02-03-2005, 18:15
Per il punto 1 non c'è un algoritmo, ma una formula ;)

(n*(n+1))/2

moka
02-03-2005, 18:23
Originariamente inviato da VegetaSSJ5
si però se lui si fa aiutare su questi esercizi come può sperare di passare l'esame?? e poi giusto per non ridurre tutto sul piano di passare/non passare l'esame, queste cose sono davvero basilari, penso che dovrebbe applicarsi un po' di più, trovare una soluzione, e poi magari postarla sul forum per commentarla.


bè sono in terza superiore è il primo anno che faccio informatica,non è che si possa pretendere un grankè...
cmq per i primi 2 ho trovato soluzione,secondo voi può andare bene?

alg.1:
start
leggi n
k=0
ris=0
mentre k<=n
k=k+1
ris=ris+k
end mentre
stampa ris
end

l'alg. 2 è uguale solo che nel mentre ci ho messo k+2 al posto di k+1
al 3 ancora nn ho trovato soluzione :(

Fenomeno85
02-03-2005, 18:27
start
leggi n
k=0
ris=0
mentre k<n
k=k+1
ris=ris+k
end mentre
stampa ris
end


k<n altrimenti staresti leggengo n+1 elementi ;)

~§~ Sempre E Solo Lei ~§~

Fenomeno85
02-03-2005, 18:28
ah per il secondo punto si vai avanti di due.

~§~ Sempre E Solo Lei ~§~

moka
02-03-2005, 18:32
Originariamente inviato da Fenomeno85

start
leggi n
k=0
ris=0
mentre k<n
k=k+1
ris=ris+k
end mentre
stampa ris
end


k<n altrimenti staresti leggengo n+1 elementi ;)

~§~ Sempre E Solo Lei ~§~


ok grazie mille ;)

VegetaSSJ5
02-03-2005, 18:41
bravo moka vedi che se ti ci metti le cose le sai fare!? l'unico appunto che c'era da fare l'ha fatto fenomeno85, spero che tu abbia capito. ora trova una soluzione per il terzo, poi la commentiamo... suggerimento: considera gli n numeri in input come un vettore A lungo n (A[0], A[1], ...... , A[n-1]). ;)

Fenomeno85
02-03-2005, 19:00
Originariamente inviato da VegetaSSJ5
bravo moka vedi che se ti ci metti le cose le sai fare!? l'unico appunto che c'era da fare l'ha fatto fenomeno85, spero che tu abbia capito. ora trova una soluzione per il terzo, poi la commentiamo... suggerimento: considera gli n numeri in input come un vettore A lungo n (A[0], A[1], ...... , A[n-1]). ;)

be bello il vettore :D ... se non sa manco che è una variabile :D ... sei troppo avanti vege :D

~§~ Sempre E Solo Lei ~§~

VegetaSSJ5
02-03-2005, 19:10
Originariamente inviato da Fenomeno85
be bello il vettore :D ... se non sa manco che è una variabile :D ... sei troppo avanti vege :D

~§~ Sempre E Solo Lei ~§~
guarda se il professore ha dato questo esercizio allora avrà anche detto come fare per gestire la situazione in cui si hanno n numeri in input e che il vettore è un (se non il) modo più semplice, non credo che tutti i professori siano come i miei...:muro: :muro: :mc:

moka
02-03-2005, 19:15
Originariamente inviato da VegetaSSJ5
bravo moka vedi che se ti ci metti le cose le sai fare!? l'unico appunto che c'era da fare l'ha fatto fenomeno85, spero che tu abbia capito. ora trova una soluzione per il terzo, poi la commentiamo... suggerimento: considera gli n numeri in input come un vettore A lungo n (A[0], A[1], ...... , A[n-1]). ;)


per averci provato ci ho provato...
solo che nn riesco a capire bene come aggiustarlo...per il momento quello migliore che ho fatto è stato:

start
leggi n1
leggi n2
condizione: n1>n2?
___ris=n1-n2
___ris=n2-n1
fine condizione
condizione: ci sono altri numeri?
___condizione:n1>n2?
______torna a leggi n2
______assegna n2=n1 e torna a leggi n2
___fine condizione
___stampa ris
end


lo so che è sbagliato e sarà na cagata però nn riesco a pensare di meglio...anche perchè io la pseudocidifica nn sono molto capace a farla,faccio spesso coi flow charts

Fenomeno85
02-03-2005, 19:16
si ma stai parlando a persone che hanno veramente visto poca roba ... cmq di dove sei moka?

~§~ Sempre E Solo Lei ~§~

moka
02-03-2005, 19:16
Originariamente inviato da VegetaSSJ5
guarda se il professore ha dato questo esercizio allora avrà anche detto come fare per gestire la situazione in cui si hanno n numeri in input e che il vettore è un (se non il) modo più semplice, non credo che tutti i professori siano come i miei...:muro: :muro: :mc:


veramente ha ragione il fenomeno :D

moka
02-03-2005, 19:19
Originariamente inviato da Fenomeno85
si ma stai parlando a persone che hanno veramente visto poca roba ... cmq di dove sei moka?

~§~ Sempre E Solo Lei ~§~


milano..ma che centra :confused:

VegetaSSJ5
02-03-2005, 19:23
allora per scorrere tutti gli n elemento potresti fare una cosa del genereper ogni numI con I da 1 a n
istruzione1
istruzione2
.
.
.il mio consiglio è di controllare ad ogni incremento di I se numI è meggiore del massimo o se è minore del minimo e quindi aggiornare le variabili che contengono i valori di massimo e minimo opportunamente, quindi alla fine fai la differenza. l'algoritmo in pratica te l'ho scritto io in linguaggio naturale :p ora tu cerca di scrivere i vari passi...

VegetaSSJ5
02-03-2005, 19:26
Originariamente inviato da moka
veramente ha ragione il fenomeno :D
lo so me ne sono accorto da come hai impostato l'algoritmo...;) cmq mi consolo perchè vedo che non sono solo i professori miei ad essere pigri...:mad:

moka
02-03-2005, 19:32
Originariamente inviato da VegetaSSJ5
lo so me ne sono accorto da come hai impostato l'algoritmo...;) cmq mi consolo perchè vedo che non sono solo i professori miei ad essere pigri...:mad:


più che altro il mio professore è appena arrivato(abbiamo avuto casini coi professori sto anno...siamo indietrissimo col programma) quindi sto prof mio nn sa bene la situazione della classe... solo che ora sta incominciando a dare i voti....


p.s. vorrei far notare come con questo post sto tentando di prendere tempo per postare la soluzione dell'algoritmo :asd:

moka
02-03-2005, 19:37
Originariamente inviato da VegetaSSJ5
allora per scorrere tutti gli n elemento potresti fare una cosa del genereper ogni numI con I da 1 a n
istruzione1
istruzione2
.
.
.il mio consiglio è di controllare ad ogni incremento di I se numI è meggiore del massimo o se è minore del minimo e quindi aggiornare le variabili che contengono i valori di massimo e minimo opportunamente, quindi alla fine fai la differenza. l'algoritmo in pratica te l'ho scritto io in linguaggio naturale :p ora tu cerca di scrivere i vari passi...


vediamo un po'...io ci provo.. :asd:

start (fin qua penso sia giusto :asd: )
leggi n
per ogni numI con I da 1 a n
n1=nI>
n2=nI<
ris=n1-n2
stampa ris
end


p.s. sarà na cagata lo so :asd:

VegetaSSJ5
02-03-2005, 20:08
Originariamente inviato da moka
p.s. vorrei far notare come con questo post sto tentando di prendere tempo per postare la soluzione dell'algoritmo :asd::nonsifa:
vediamo un po'...io ci provo.. :asd:

start (fin qua penso sia giusto :asd: )
leggi n
per ogni numI con I da 1 a n
n1=nI>
n2=nI<
ris=n1-n2
stampa ris
end


p.s. sarà na cagata lo so :asd:
:eekk:
allora vediamo un po'... la frase "per ogni numI con I da 1 a n" vuol dire che si parte da I=1, si eseguono le istruzioni, poi I=2, si eseguono sempre le stesse istruzioni e così via fino ad n. L'idea che sto cercando di farti venire in mente è questa: io all'inizio non so nè quale sarà il numero massimo nè il numero minimo quindi io posso creare due variabili MAX e MIN che contengono i valori massimi e minimi. Mano mano che procedo ad analizzare il numI con I da 1 a n queste variabili vengono aggiornate. quindi potresti fare così:

per ogni numI con I da 1 a n
se numI>MAX allora MAX=numI
altrimenti se numI<MIN allora MIN=numI

quando finisce il ciclo tu avrai trovato i numeri massimo e minimo, quindi fai la differenza.

moka
02-03-2005, 20:15
ok grazie mille! :)

VegetaSSJ5
02-03-2005, 20:22
Originariamente inviato da moka
ok grazie mille! :)
hai capito come funziona quell'algoritmo?? fai un esempio e prova ad eseguire l'algoritmo su un input di 10 numeri (giusto per non farti annoiare troppo :D)...

moka
02-03-2005, 20:38
Originariamente inviato da VegetaSSJ5
hai capito come funziona quell'algoritmo?? fai un esempio e prova ad eseguire l'algoritmo su un input di 10 numeri (giusto per non farti annoiare troppo :D)...


si si l'ho capito...funziona...grazie mille!

Blackat
02-03-2005, 21:57
effettivamente esiste una formula anche per il punto due

notazione

utilizzerò come simbolo di sommatoria la
funzione S([valore_iniziale],[valore_finale],[funzione]).

fine notazione

Abbiamo che

S(0,n,i) = n (n+1) / 2

dimostrato dal grande Gauss.


Bene. Come determiniamo i numeri pari ? La sequenza di numeri
pari è determinata dalla funzione 2i

Dobbiamo tenere conto anche del fatto tra 0 e n ci sono n/2
numeri pari.

Allora alla fine possiamo dire che
S(0,n/2,2i) = 2*S(0,n/2,i) = 2 * (n/2) ( (n/2) + 1 ) /2 = (n/2) ( (n/2) + 1 )

Perciò la funzione che dato in input un numero (n) calcola la somma di tutti i numeri pari da 0 a n è :

f(n) = (n/2) ( (n/2) + 1 ).

c.v.d. :cool:

P.S.

Evviva la matematica. :yeah:

Blackat
02-03-2005, 22:06
piccola correzione....

n/2, nel caso di n dispari, deve essere arrotondato per difetto.

sirus
03-03-2005, 15:04
LOL, gli algoritmi della terza superiore :asd:

The3DProgrammer
03-03-2005, 16:46
Originariamente inviato da moka
vediamo un po'...io ci provo.. :asd:

start (fin qua penso sia giusto :asd: )
leggi n
per ogni numI con I da 1 a n
n1=nI>
n2=nI<
ris=n1-n2
stampa ris
end


p.s. sarà na cagata lo so :asd:


ma ke è?:confused:

:D

ciauz

Haku
19-03-2005, 11:47
Allora: finchè c'è stato il "se" tutto a posto; il "per" tutto a posto, ma sto diavolo di "mentre" non riesco a farmelo entrare in testa!! Qualcuno potrebbe darmi qualche spiegazione su questa istruzione?

P.s ogni problema è risolvibile con questa istruzione o bisogna fare ricorso al ripeti quando è richiesto?

Haku
13-05-2005, 16:45
up! :help:

Fenomeno85
13-05-2005, 16:56
per il ciclo do / while


primo caso

i = 10;
do{
i --;
} while (i > 0);


secondo caso

i=10
while (i>0){
i--;
}


la differenza tra i due cicli è che nel primo almeno una volta passi nel ciclo, nel secondo invece prima di entrare nel ciclo devi prima verificare la condizione :D

~§~ Sempre E Solo Lei ~§~

Haku
13-05-2005, 17:04
Ma ogni problema è risolvibile col mentre?

Fenomeno85
13-05-2005, 17:12
Ma ogni problema è risolvibile col mentre?

tutto può essere risolto con while, do/while e for ;) il problema dopo è cercare di scrivere il codice in maniera corretta :O e soprattutto per lo scopo che devi fare si implementa di solito un determinato tipo di ciclo

~§~ Sempre E Solo Lei ~§~

Haku
13-05-2005, 17:22
La questione se non ricordo male(nel caso si voglia scegliere fra i due) era di vedere se la iterazione è definita o indefinita giusto?
Nel caso sia definita posso usare il "per" giusto? in caso contrario il mentre? Il fatto che possa essere postcondizionata o precondizionata(fattore chiave per sapere se usare "ripeti" o "mentre") non mi è del tutto chiaro :confused:

sirus
13-05-2005, 18:28
La questione se non ricordo male(nel caso si voglia scegliere fra i due) era di vedere se la iterazione è definita o indefinita giusto?
Nel caso sia definita posso usare il "per" giusto? in caso contrario il mentre? Il fatto che possa essere postcondizionata o precondizionata(fattore chiave per sapere se usare "ripeti" o "mentre") non mi è del tutto chiaro :confused:
tecnicamente tutte le iterazioni sono riconducibili al mentre (while), il nostro prof preferiva (inizialmente) che usassimo sempre il while ;)

come hai detto tu se il numero di iterazioni è definito si usa (solitamente) il for ;) ma con alcuni linguaggi come il C il for è molto più flessibile e può essere usato per altre cose ;)

la differenza tra do{ }while e while{ } non è complicata da capire, con il primo tipo di iterazione il blocco di istruzioni viene eseguito almeno una volta, e poi viene controllata la condizione, nel caso del while{ } non è sempre detto che il blocco di istruzioni venga eseguito ;) dipende dalla condizione, se la condizione permette di ciclare il blocco viene eseguito altrimenti non viene eseguito nemmeno una volta ;)

Haku
09-10-2005, 17:07
ragazzi mi potreste dare una mano con questo algoritmo?Allora il problema è questo:dato un vettore di N componenti, con N minore uguale a 100, ordinato in modo crescente ed un numero x, costruire un nuovo vettore di dimensione N+1 componenti, formato dalle componenti del vettore dato e dal numero X, in modo che il vettore ottenuto risulti anchesso ordinato.


Io ho provato così:
INIZIO
ACQUISISCI X
CONT<---0
SE N<>100 ALLORA
PER I DA 1 A 100
ACQUISISCI VETT(I)
CONT<---CONT+VETT(I)
FINE SE
FINE PER
VET2<---X+CONT
FINE

Mi sa che però è sbagliato :doh:

Haku
09-10-2005, 17:08
:DOps doppio post

leadergl
09-10-2005, 18:37
io il punto 3 lo risolverei stesso quando da l'input da tastiera dei vari numeri che inserisce...

Es:
1) i numeri che verranno digitati, uno alla volta, saranno: 1,5,9,2,8,13,6

Algoritmo:

fine=false
min=0
max=0
finchè fine=falso
leggi numero N
se N>max allora max=N altrimenti
se N<min allora min=N
fine SE
leggere un altro numero? (imposta il valore di fine)
fine finchè
somma=min+max

credo sia la strada più semplice da pensare....poi la si implementa nel proprio linguaggio di programmazione

Haku
09-10-2005, 18:47
io il punto 3 lo risolverei stesso quando da l'input da tastiera dei vari numeri che inserisce...

Es:
1) i numeri che verranno digitati, uno alla volta, saranno: 1,5,9,2,8,13,6

Algoritmo:

fine=false
min=0
max=0
finchè fine=falso
leggi numero N
se N>max allora max=N altrimenti
se N<min allora min=N
fine SE
leggere un altro numero? (imposta il valore di fine)
fine finchè
somma=min+max

credo sia la strada più semplice da pensare....poi la si implementa nel proprio linguaggio di programmazione

E io? :cry: :cry: :help:

leadergl
09-10-2005, 19:13
tu cosa?
che problema avevi?

Haku
09-10-2005, 19:28
ragazzi mi potreste dare una mano con questo algoritmo?Allora il problema è questo:dato un vettore di N componenti, con N minore uguale a 100, ordinato in modo crescente ed un numero x, costruire un nuovo vettore di dimensione N+1 componenti, formato dalle componenti del vettore dato e dal numero X, in modo che il vettore ottenuto risulti anchesso ordinato.


Io ho provato così:
INIZIO
ACQUISISCI X
CONT<---0
SE N<>100 ALLORA
PER I DA 1 A 100
ACQUISISCI VETT(I)
CONT<---CONT+VETT(I)
FINE SE
FINE PER
VET2<---X+CONT
FINE

Mi sa che però è sbagliato :doh:
Questo!

leadergl
09-10-2005, 19:45
Tu devi creare un nuovo vettore di N+1 elementi...


crea nuovo vettore M di N+1 elementi
crea variabile I (per il contatore)

i=0
finche i<=N allora
M[i]=N[i]
fine del finchè
M[n+1]=X

Haku
09-10-2005, 19:59
quindi il mio metodo era completamente sbagliato?

leadergl
09-10-2005, 20:46
Io ho provato così:
INIZIO
ACQUISISCI X
CONT<---0
SE N<>100 ALLORA
PER I DA 1 A 100
ACQUISISCI VETT(I)
CONT<---CONT+VETT(I)
FINE SE
FINE PER
VET2<---X+CONT
FINE

beh si, perchè:
1) Il vettore già lo hai e non lo devi acquisire da input
2 se ha fatto il controllo su "SE N<>100.." a che scopo dopo fai un ciclo "DA 1 A 100" ignorando quello che avevi scritto prima?
3) nel testo non c'è scritto di sommare nulla quindi non capisco il "CONT=CONT+VETT(I)" ed il "VETT2=X+CONT"....entrambe non hanno senso in quanto tu devi CREARE un nuovo vettore di dimensione N+1 quindi un elemento in più dell'altro. Potevi anche scegliere che il tuo vettore era di 101 elementi e poi lo riempivi fin dove ti serviva...

Haku
09-10-2005, 21:29
Ok, grazie dell'aiuto ;)

71104
09-10-2005, 22:31
non so se qualcuno l'ha già fatto notare ma credo che la soluzione del primo algoritmo sia errata: la soluzione proposta restituisce semplicemente N, e non la somma di tutti i numeri da 1 a N; è meglio usare la formula di cionci oppure quest'altro algoritmo:

int f(int n) {
int r = 0;
for (int i = 0; i <= n; i++) {
r += i;
}
return r;
}

scusate se l'ho scritto in C ma non conosco quello pseudocodice :p

PS: il mio codice restituisce la somma dei numeri da 1 a N compreso N; per escluderlo basta usare < anziché <= nella condizione del for.

71104
09-10-2005, 22:33
ehm, come non detto............ :stordita: :stordita: :stordita: :stordita: :stordita:

credevo che l'algoritmo restituisse k anziché ris :D