PDA

View Full Version : Aiuto!!!


metallic
28-02-2006, 23:00
Ciao,

sto seguendo il tutorial di TurboPascal a quest'indirizzo:

http://www.leadergl.e1000.it/index.php?PHPSESSID=d7afcb659ab84403a697b4051c3d9dbb&direction=0&order=&directory=Programmazione/Corso%20Turbo%20Pascal

e sono alla Lezione 3.

Ho avuto difficoltà negli esercizi finali ai punti 3,6 e 7.

Il punto 3 tutto, il punto 6 tutto ed il punto 7 la seconda metà.

Il punto 3

Credo di non aver capito appieno l'algoritmo per risolvere le equazioni di secondo grado. A me sembra che con quello proposto non sorga nessun problema se "b=0" dato che non c'è nessuna divisione che implica "b".

Il punto 6

Del 6 ho fatto solo la prima (di tre) parti, ma è sbagliata, o meglio non è sbagliata, ma in un punto fa uso della divisione mentre e la consegna dice solo addizione e sottrazione.

VARIABILI x,y,nx,cont
LEGGI(x,y)
cont = 1
SE x,y <= 0
QUANDO cont < y
nx = x+x(y/2)
RIPETI
SCRIVI(nx)
ALTRIMENTI
SCRIVI(-errore-)

nx serve perchè se avessi messo "x=x+x" ad ogni riesecuzione del ciclo il valore sarebbe rimasto invariato. Quella invece è una piccola formula che ho ideato :D

Prendiamo come esempio 2*3 che equivale è uguale a 2+2+2, ora prendiamo (nella moltiplicazione) il 3 come y, il "numero di due" (scusate il litigio tra i termini :cool: ) presente nella somma deve essere uguale a y, ed è così. Ma siccome questo non si può rappresentare dato che y è un input e il programmatore non può sapere quanto sarà, si può invece usare la formula x*y=(x+x)*(y/2), ovvero (x+x) per (y diviso 2, dato che gli addendi nella formula raddoppiano perchè non esiste un'addizione ad un termine, anche se per rappresentare correttamente la formula ce ne dovrebbe essere uno solo) volte.

Ora, come posso fare a definire quella divisione con un addizione (o sottrazione)? Il fatto che non sia riuscito a risolvere gli altri quesiti del punto 6 è una diretta conseguenza del primo, perchè non riesco a trovare un metodo di rendere la divisione con la somma algebrica, come invece sono riuscito a fare per la moltiplicazione.

Il punto 7

Sono riuscito con tranquillità per quanto riguarda il primo punto (bastava basarsi sull'algoritmo per il calcolo della moltiplicazione con la somma, la differenza è che qua usare moltiplicazione e divisione è lecito). Però mi sono incasinato per quanto riguarda il secondo punto. Mi sono scervellato :cry: ma niente, come posso fare a calcolare una potenza solo con addizione e sottrazione?

Dateli uno sguardo, è importante (almeno, per me...). Potrei passare oltre, ma non è questo che voglio, voglio programmare come si deve! ;) Anche se avete la soluzione di uno solo postate, anche se avete solo una mezza idea fatelo lo stesso! Proprio non mi viene in mente niente :mc:

P.S. I programmi non sono in TurboPascal, ma in linguaggio "algoritmico".

metallic
01-03-2006, 00:45
Nessuno?

Non credo che per voi che già programmate sia così difficile...

pinok
01-03-2006, 01:01
Nessuno?

Non credo che per voi che già programmate sia così difficile...
Bella questa...
Un titolo che non chiarisce di cosa si parli, in un post fatto a mezzanotte e con pretese di risposta dopo 1 ora e un quarto, cioè all'una di notte :eekk:

PS: non ho voglia di andarmi a leggere gli esercizi, ho già dato ai miei tempi ;)
Se riporti il testo dell'esercizio almeno nella parte che dà problemi, magari un'occhiata ci si può dare ;)

leadergl
01-03-2006, 09:21
Algoritmo:

leggi a, b, c
discriminante <-- b^2 + 4*a*c
SE discriminante < 0
ALLORA
scrivi "nessuna soluzione reale"
ALTRIMENTI
SE discriminante = 0
ALLORA
x <-- (-b) / (2*a)
scrivi "Due soluzioni coincidenti"
ALTRIMENTI
x1 <-- (-b - sqr(discriminante))
x1 <-- (-b + sqr(discriminante))
scrivi "Due soluzioni: ", x1, x2
FINE SE
FINE SE
3. Si consideri l'algoritmo per il calcolo delle radici di un'equazione di secondo grado. Cosa succede se il coefficiente di a vale zero? Si modifichi l'algoritmo per gestire anche questa situazione

Se a dovesse essere uguale a 0 (zero) avresti una divisione per zero qui: x <-- (-b) / (2*a)


6. Supponendo che l'esecutore conosca solo le operazioni di somma e sottrazione, scrivere un algoritmo per il calcolo del prodotto di due numeri interi non negativi x e y ricevuti in ingresso, e un algoritmo per il calcolo del quoziente e del resto della divisione di x per y

Moltiplicare "x * y" altro non significa che sommare ad x se stesso tante volte quanto dice y, quindi è un for ma volendo anche un while (while y>0, con decremento di y):

FOR Indice:=2 to Y DO
Risultato:=x+x;
END FOR

Dividere un numero per un altro è invece la sottrazione, ottenendo così il resto:
quoziente:=0;
WHILE (x>=y) DO
x:=x-y; // ci da il resto della divisione
quoziente:=quoziente+1; //il quoziente
END WHILE

Mentre per il punto 7 l'elevamento a potenza (x^y) significa moltiplicare x per se stesso tante volte quanto dice y e questo l'abbiamo fatto precedentemente nell'altro thread se non sbaglio...

FOR indice:=2 to Y DO
risultato:=x*x;
END FOR

per farlo con le sole addizioni devi sostituire "x*x" un numero calcolato dall'algoritmo di prima:

FOR Indice:=2 to Y DO
Risultato:=x+x;
END FOR

metallic
01-03-2006, 12:10
Grazie leadergl :D

Bella questa...
Un titolo che non chiarisce di cosa si parli, in un post fatto a mezzanotte e con pretese di risposta dopo 1 ora e un quarto, cioè all'una di notte

Si è vero... :p

metallic
01-03-2006, 12:58
Non ho ancora capito alcune cose...

FOR Indice:=2 to Y DO
Risultato:=x+x;
END FOR

Non riesco a capire come possa funzionare, cioè il valore di "x" non varia, perciò nemmeno quello di "Risultato", perchè "x+x" farà ad ogni riesecuzione del ciclo, per esempio nel caso di 2, 4 e perciò "Risultato" sarà sempre uguale a 4. :confused:

Non dovrebbe essere:

risultato:=x
FOR Indice:=2 TO y DO
Risultato:=Risultato+x
END FOR

Di modo che ad ogni riesecuzione del ciclo "risultato" venga incrementato di un "x" e di modo che anche se "y" vale 1 (x*1) alla richiesta di stampa di "x" venga stampato la "x" di input originale (x*1) (dato che il ciclo while non è stato eseguito).

quoziente:=0;
WHILE (x>=y) DO
x:=x-y; // ci da il resto della divisione
quoziente:=quoziente+1; //il quoziente
END WHILE

Facendo un paio di prove ho visto che funziona perfettamente, ma non ho capito come hai fatto a crearlo... Da cosa l'hai dedotto?

FOR indice:=2 to Y DO
risultato:=x*x;
END FOR

risultato:=x
FOR Indice:=2 TO Y DO
risultato:=risultato*x
END FOR

Idem come la moltiplicazione con la somma? :confused:

Qua

FOR Indice:=2 to Y DO
Risultato:=x+x;
END FOR

invece non riesco a capire come potrebbe funzionare (anche una volta sostituito "Risultato" con "x"). Perchè questo funziona solo in caso venga elevata a potenza una base con esponente 2, ma già nel caso di 3 sarebbe "x:=x+x+x" e nel caso di 4 "x:=x+x+x+x". Deve per forza entrare in gioco la moltiplicazione no?

Grazie della pazienza :muro: :D

metallic
01-03-2006, 19:16
leadergl?

leadergl
01-03-2006, 19:47
:P si scusa hai ragione :D
Risultato:=X
FOR Indice:=2 to Y
Risultato:=Risultato+X; {Risultato:=Risultato*X}
END FOR

invece non riesco a capire come potrebbe funzionare (anche una volta sostituito "Risultato" con "x"). Perchè questo funziona solo in caso venga elevata a potenza una base con esponente 2, ma già nel caso di 3 sarebbe "x:=x+x+x" e nel caso di 4 "x:=x+x+x+x". Deve per forza entrare in gioco la moltiplicazione no?

è il ciclo FOR che ti permette di ripetere l'addizione o la moltiplicazione più volte...così:

Risultato:=Risultato+X (nel FOR) equivale a fare Risultato:=X+X+...+X
Risultato:=Risultato*X (nel FOR) equivale a fare Risultato:=X*X*...*X

metallic
01-03-2006, 20:04
è il ciclo FOR che ti permette di ripetere l'addizione o la moltiplicazione più volte...così:

Risultato:=Risultato+X (nel FOR) equivale a fare Risultato:=X+X+...+X
Risultato:=Risultato*X (nel FOR) equivale a fare Risultato:=X*X*...*X

Appunto, con FOR+Moltiplicazione è possibile realizzare la potenza, e con FOR+Addizione la moltiplicazione. Ma proprio non riesco a fare la potenza con FOR+Addizione. Non è che chi ha scritto il tutorial si è sbagliato?

Si potrebbe definire l'elevamento a potenza con l'addizione per una determinata base ed una determinata potenza, ad esempio con 3 elevato 2:

FOR 2 TO y (che è 2) DO
Risultato:=Risultato+x+x
END FOR

Ma gia' nel caso di 3 elevato 3 diventerebbe:

FOR 2 TO y (che è 3) DO
Risultato:=Risultato+x+x+x+x
END FOR

E nel caso di 3 elevato 4 non c'è una formula con l'addizione ed il FOR!

Come si potrebbe fare?

Grazie!

P.S. Mi spieghi da dove hai ricavato l'algoritmo per la divisione? Probabilmente era una regola matematica che non conoscevo... Risulta meno intuitivo di quello della moltiplicazione...

metallic
01-03-2006, 20:22
Probabilmente non sara' importantissimo, pero' se c'è come esercizio...

leadergl
01-03-2006, 22:09
Riguardo l'elevamento a potenza siccome l'abbiamo definito come la moltiplicazione di X per se stesso tante volte quante Y ed abbiamo inoltre definito la moltiplicazione come la somma di X tante volte (quante necessarie) a se stesso e presto detto:

X*Y = x+x+..+x (tante volte volte quante y-1)
X^Z = x*x*..*x (tante volte quanto Z-2)

basta fare le opportune sostituzioni oppure creare una procedura per la moltiplicazione di due numeri che usa le addizioni ed una che eleva a potenza usando la procedura che abbiamo creato per le moltiplicazioni ;)

se serve altro non hai che da chiedere ;)

metallic
02-03-2006, 18:06
se serve altro non hai che da chiedere

Ti ringrazio, mi sa che ti devo chiedere ancora qualcos'altro... :( :muro:

creare una procedura per la moltiplicazione di due numeri che usa le addizioni ed una che eleva a potenza usando la procedura che abbiamo creato per le moltiplicazioni

Se creo una procedura per la moltiplicazione di due numeri ciò funziona solo per 2^2, perchè già 3^2 ne richiede 3 e 4^2 4, per non parlare di 2^3, 3^3, ecc... Non lo so ma sembra impossibile creare un algoritmo per il calcolo di potenze di numeri qualsiasi SOLO con l'addizione e la sottrazione... Se ti viene in mente mi puoi dare un'idea? Io non so più cosa provare... Ho provato tutti quelli che mi venivano in mente... :confused:

Sennò passo oltre ;)

Tanto non credo sia una cosa cruciale per imparare il Turbo Pascal... Sembra più opportuna per verificare le conoscenze matematiche...

leadergl
02-03-2006, 19:06
...scusa è come "simulare" la moltiplicazione tramite una procedura aggiuntiva creata da te che andrebbe a sostituire il *:


Function Moltiplicazione(X,Y: Integer): Integer;
VAR Risultato: Integer;
iIndice: Integer;
Begin
Risultato:=X;
FOR iIndice:=2 to Y DO
Risultato:=Risultato+X;
Moltiplicazione:=Risultato;
End;

Function ElevazionePotenza(Base, Esponente: Integer):Integer;
VAR Risultato, iIndice: Integer;
Begin
IF Esponente=0 THEN
Risultato:=1
ELSE IF (Esponente=1) THEN
Risultato:=Base
ELSE BEGIN
Risultato:=Base;
FOR iIndice:=2 to Esponente DO
Risultato:=Moltiplicazione(Risultato, Base);
END;
ElevazionePotenza:=Risultato;
End;


;) L'ho scritto di getto e senza verificarne il funzionamento, cmq il ragionamento è questo se ci sono errori prova a capire dove, come e perchè..poi prova a correggere e se non riesci torna a chiedere ;)

in ogni caso sono sempre qui ;)

metallic
02-03-2006, 22:59
L'ho scritto di getto e senza verificarne il funzionamento, cmq il ragionamento è questo se ci sono errori prova a capire dove, come e perchè..poi prova a correggere e se non riesci torna a chiedere

in ogni caso sono sempre qui

Ti ringrazio, ci devo studiare un pò dietro ma poi arrivo a capirlo :D

Ora ho un problemino (credo che ti pentirai di avermi linkato il tutorial, a furia di farti domande... ;) con la lezione 4, gli ho fatti tutti tranne il 5:

Scrivere un algoritmo, basato sulle tre strutture di controllo fondamentali, che riceva in ingresso una sequenza di numeri interi e riporti in uscita il più grande e il più piccolo tra i numeri letti. Si supponga che l'inserimento del numero zero indichi la fine della sequenza.

Mi sono immedesimato un pò di più della logica degli algoritmi (infatti tutti gli altri gli ho fatti) ma questo proprio non l'ho capito. A differenza degli altri, dove tutti i numeri inseriti andavano a convergere in un'unica variabile (per somma o per moltiplicazione) qui sembra quasi ci voglia una variabile apposta per ogni numero inserito, ma non si sa quanti saranno (la sequenza termina con l'inserimento del numero zero)... Infatti bisogna avere i numeri com'erano all'inizio per fare i confronti, e bisogna anche trovare un modo per fare i confronti tra tutti i numeri (non solo due). E non vedo come si possa fare solo con le tre strutture di controllo fondamentali... Idea?

Grazie! :D

leadergl
03-03-2006, 16:57
ti faccio alcune domande che magari ti aprono la mente per il solo fatto di farti pensare:

1) quali sono le tre strutture fondamentali?
2) dove sta scritto che devi leggere prima tutti i numeri e poi trovare il min. e max.?
3) dove dovrebbe essere, in ogni caso, la difficoltà a fare dei confronti "incrociati" tra più valori?

Esempio:
1 4 6 2 3 9 12 5
Qui come fai a trovare il più piccolo ed il più grande?


P.S. Programmare è ben più difficile che riuscire a scrivere delle righe di codice in un qualche linguaggio, un programmatore deve trovare la strada per risolvere un determinato problema ed implementare la sua idea al PC tramite un algoritmo. Tu pensa a COME risolvere senza il PC questo problema e poi lo implementiamo ;)

metallic
03-03-2006, 22:06
1.a) Sequenza (permette di eseguire le istruzioni così come sono scritte)
1.b) Selezione (permette di scegliere in base al valore di una condizione l'esecuzione di un blocco di istruzioni tra due possibili
1.c) Iterazione (permette di eseguire un certo numero di volte un blocco di istruzioni)

Vabbé ho dato una sbirciatina al manuale ;) comunque grossomodo me le ricordavo

2) Infatti oggi mentre ci pensavo (pensa un pò durante le lezioni :rolleyes: ) mi è proprio passata per la mente questa cosa, e tutto d'un tratto l'algoritmo si è scritto nella mia mente :cool:

Dimmi cosa ne pensi:

VAR x,xmin,xmax : Interi
ESEGUI
Leggi x
SE x <> 0
SE x < xmin
xmin := x
SE x > xmax
xmax := x

FINO A QUANDO x = 0
Stampa xmin,xmax

Bello eh? :D

Forse sto entrando sempre più nella logica corretta? :)

leadergl
04-03-2006, 02:28
1.b) Selezione (permette di scegliere in base al valore di una condizione l'esecuzione di un blocco di istruzioni tra due possibili

Perchè limitarsi a solo due?! ;)


2) Infatti oggi mentre ci pensavo (pensa un pò durante le lezioni :rolleyes: ) mi è proprio passata per la mente questa cosa, e tutto d'un tratto l'algoritmo si è scritto nella mia mente :cool:

Dimmi cosa ne pensi:
VAR x,xmin,xmax : Interi
ESEGUI
Leggi x
SE x <> 0
SE x < xmin
xmin := x
SE x > xmax
xmax := x
FINO A QUANDO x = 0
Stampa xmin,xmax

Bello eh? :D

Forse sto entrando sempre più nella logica corretta? :)
Ecco finalmente ci siamo ;) ma perche mettere:
ESEGUI...FINO A QUANDO
e poi dentro ripetere:
SE x<>0?
Fai in modo che semplicemente se X=0 non fa nulla, altrimenti entra dentro ;)

metallic
04-03-2006, 14:07
VAR x,xmin,xmax : Interi
Leggi x
xmin := x
xmax := x
ESEGUI
Leggi x
SE x <> 0
SE x < xmin
xmin := x
SE x > xmax
xmax := x
FINO A QUANDO x = 0
Stampa xmin,xmax

Ho sistemato alcune cose, mi sono infatti dimenticato di dare un valore alle variabili. Ho deciso di darli il valore del primo numero inserito (non c'era alternativa) di modo che se ce ne saranno di più piccoli/grandi verranno automaticamente sovrascritti, altrimenti rimarranno uguali (dando un risultato corretto al momento della stampa).

Non posso mettere un semplice SE, perchè altrimenti la lettura di x si effettuerebbe una sola volta, devo per forza inserire tutto in un ciclo a ripetizione (e di conseguenza verificare due volte il valore di x). Ho pensato anche di metterlo in un ciclo a verifica iniziale (e non finale come questo), ma non andrebbe bene:

VAR x,xmin,xmax : Interi
Leggi x
xmin := x
xmax := x
WHILE x <> 0 DO
Leggi x
SE x < xmin
xmin := x
SE x > xmax
xmax := x
FINO A QUANDO x = 0
Stampa xmin,xmax

Senza un'istruzione SE che riverifica il valore di x, ma non funzionerebbe:

-inserisco 2
-il ciclo viene eseguito e rieseguito rieseguito perchè al punto della verifica x è 2, e non 0
-quando richiesto inserisco 0
-se 0 è minore di xmin/xmax, xmin/xmax verrà sovrascritto
-solo al punto della riverifica il ciclo termina.

L'unico modo è con un ciclo a ripetizione combinato ad un SE.

Era un test? :D :D :D

P.S. Perchè limitarsi a solo due?!

Vero ;)

leadergl
05-03-2006, 06:57
Leggi X;
Min=X;
Max=X;

Leggi X;

While X<>0
If X<Min
Min=X
else If X>Max
Max=x
end if

Leggi X;
do

metallic
05-03-2006, 11:01
Beh non è una cattiva idea mettere "leggi x" alla fine :D