|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 | |
|
Member
Iscritto dal: Oct 2005
Messaggi: 155
|
TurboPascal
Ciao!!
Qui porgo, a chi programma in Turbo Pascal le mie domande, per ora ne ho 2: -Ciclo FOR -Variabili di tipo BYTE/WORD 1) Ho letto su un manuale che per terminare un ciclo FOR bisogna mettere END; (con punto e virgola), ma se faccio così sia FreePascal che TurboPascal 7.0 mi da errore dicendo che si aspetta un punto, probabilmente quest'istruzione non è valida. Io però voglio che mi venga stampato a video tre volte un messaggio e terminato il ciclo FOR ne venga mostrato un altro, ho fatto così: Quote:
Qualcuno me lo spiega? Un ciclo FOR esegue una sola istruzione e bisogna perciò definire un ciclo FOR per ogni singola istruzione? O esiste effettivamente un'istruzione che termina il ciclo? 2)Che differenza c'è fra le due?
__________________
cAsE -> Viper Midi Tower aLiMeNtAtOrE -> RaptoxX 350W 1.3V mAiNbOaRd -> GigaByte K8NS (nForce 3 250) pRoCeSsOrE -> AMD Sempron 64 2800+ rAm -> Apacer 512MB PC3200 chipset Samsug (DDR-400MhZ) sChEdA vIdEo -> Asus Radeon A9250 256DDR dIsCo RiGiDo -> IBM Deskstar 40GB 7200rpm mAsTeRiZzAtOrE -> Plextor PXW161040A (16x10x40x) -> Powerd by... Slackware Linux 10.2 ->] registered Linux user number 401837 |
|
|
|
|
|
|
#2 |
|
Member
Iscritto dal: May 2005
Messaggi: 118
|
E' da tanto che non programmo in Pascal, ma da quello che ricordo il blocco di istruzioni del for doveva essere racchiudo da BEGIN e END;. Per fare un esempio banale col tuo programma:
Codice:
PROGRAM test_iterazioni;
VAR A : INTEGER;
BEGIN
FOR A:= 3 DOWNTO 1 DO
BEGIN
WRITELN('Conto alla rovescia);
WRITELN(a);
END;
WRITELN('BOOM!');
READLN;
END.
Per quanto riguarda la seconda domanda la differenza sta nella memoria utilizzata per salvare i dati (BYTE = 8bit, WORD = 16bit), e quindi nel range di valori che possono contenere le variabili dichiarate con quei tipi (BYTE = 0...255, WORD = 0...65535). |
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Oct 2005
Messaggi: 155
|
Ah ok grazie!!
Per quanto riguarda la memoria utilizzata, è in questo modo che si ottimizzano i programmi?
__________________
cAsE -> Viper Midi Tower aLiMeNtAtOrE -> RaptoxX 350W 1.3V mAiNbOaRd -> GigaByte K8NS (nForce 3 250) pRoCeSsOrE -> AMD Sempron 64 2800+ rAm -> Apacer 512MB PC3200 chipset Samsug (DDR-400MhZ) sChEdA vIdEo -> Asus Radeon A9250 256DDR dIsCo RiGiDo -> IBM Deskstar 40GB 7200rpm mAsTeRiZzAtOrE -> Plextor PXW161040A (16x10x40x) -> Powerd by... Slackware Linux 10.2 ->] registered Linux user number 401837 |
|
|
|
|
|
#4 | |
|
Member
Iscritto dal: May 2005
Messaggi: 118
|
Quote:
|
|
|
|
|
|
|
#5 | ||||
|
Member
Iscritto dal: Oct 2005
Messaggi: 155
|
Quote:
Sullo stesso sito (meglio che abbandono quel manuale perchè è pieno di caxate) ho trovato scritto che questo programma Quote:
Quote:
Quote:
__________________
cAsE -> Viper Midi Tower aLiMeNtAtOrE -> RaptoxX 350W 1.3V mAiNbOaRd -> GigaByte K8NS (nForce 3 250) pRoCeSsOrE -> AMD Sempron 64 2800+ rAm -> Apacer 512MB PC3200 chipset Samsug (DDR-400MhZ) sChEdA vIdEo -> Asus Radeon A9250 256DDR dIsCo RiGiDo -> IBM Deskstar 40GB 7200rpm mAsTeRiZzAtOrE -> Plextor PXW161040A (16x10x40x) -> Powerd by... Slackware Linux 10.2 ->] registered Linux user number 401837 Ultima modifica di metallic : 18-02-2006 alle 23:17. |
||||
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Sep 2005
Città: Genova
Messaggi: 1927
|
Quote:
__________________
SO di non sapere |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: May 2003
Messaggi: 1113
|
Ci sono vari errori nel tuo codice, ecco quello "corretto":
Codice:
{01}Program Potenza;
{02}Uses crt;
{03}Var
{04} Base, Esponente: integer;
{05} iIndice, Risultato: integer;
{06}Begin
{07} Write('Inserire il numero da elevare: ');
{08} readln(Base);
{09} Write('Inserire l''esponente a cui elevare il numero: ');
{10} readln(Esponente);
{11}
{12} Risultato:=Base;
{13} IF (Esponente=0) then
{14} Risultato:=1
{15} ELSE IF (Esponente=1) then
{16} Risultato:=Base
{17} ELSE BEGIN
{18} FOR iIndice:=2 to Esponente DO
{19} Risultato:=Risultato*Base;
{20} END;
{21}
{22} Writeln('Il risultato e'': ',Risultato);
{23} readln;
{24}End.
TUO CODICE: Codice:
FOR I:= 1 TO b DO c:=a*a; Codice:
Risultato:=Base;
FOR iIndice:=2 to Esponente DO
Risultato:=Risultato*Base;
__________________
| Athlon XP Barton 3000+ | CoolerMaster HAC-V81 | ASUS A7N8X DELUXE v2.0 | 2*256 PC3200 + 1*512 PC3200 = 1GB DDR400| ATI Radeon 9250 | HD 80Gb Maxtor SATA | Ali Q-TEC 550W Dual Fan GOLD PFC Ultima modifica di leadergl : 23-02-2006 alle 23:17. |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7260
|
Quote:
|
|
|
|
|
|
|
#9 | |||
|
Member
Iscritto dal: Oct 2005
Messaggi: 155
|
Quote:
L'ho già sostituito Quote:
C'è qualcosa di sbagliato nel codice... Però prima di questo, me lo spiegheresti passo-passo? Così leggendolo non riesco a capire esattamente cosa fa, le funzioni della varie variabili (in particolare iIndice),ecc... grazie Comunque, "uses [...]" a cosa serve? Quote:
__________________
cAsE -> Viper Midi Tower aLiMeNtAtOrE -> RaptoxX 350W 1.3V mAiNbOaRd -> GigaByte K8NS (nForce 3 250) pRoCeSsOrE -> AMD Sempron 64 2800+ rAm -> Apacer 512MB PC3200 chipset Samsug (DDR-400MhZ) sChEdA vIdEo -> Asus Radeon A9250 256DDR dIsCo RiGiDo -> IBM Deskstar 40GB 7200rpm mAsTeRiZzAtOrE -> Plextor PXW161040A (16x10x40x) -> Powerd by... Slackware Linux 10.2 ->] registered Linux user number 401837 |
|||
|
|
|
|
|
#10 | ||||
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7260
|
Quote:
Quote:
per capire devi fare una tabella dove scrivi il valore delle variabili passo-passo. esempio: decidi di mettere base=2 e esponente=2 quindi risultato alla riga "risultato=base" diventa 2, poi indice diventa 1, il ciclo viene eseguito perchè 1<esponente, e vai avanti nel ciclo e per tutti i cicli adesso non mi ricordo più l'esatto comportamento di FOR indice:=1 TO esponente.. forse si comporta come <= e non come <, e quindi il ciclo viene eseguito anche con indice=esponente (sarebbe l'errore di cui parlavi) Quote:
)Quote:
|
||||
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: May 2003
Messaggi: 1113
|
ho corretto l'algoritmo
m'ero scordato di far partire il FOR da 2 visto che: Base^0=1 Base^1=Base Base^X= ... (con X>1)
__________________
| Athlon XP Barton 3000+ | CoolerMaster HAC-V81 | ASUS A7N8X DELUXE v2.0 | 2*256 PC3200 + 1*512 PC3200 = 1GB DDR400| ATI Radeon 9250 | HD 80Gb Maxtor SATA | Ali Q-TEC 550W Dual Fan GOLD PFC |
|
|
|
|
|
#12 | |
|
Member
Iscritto dal: Oct 2005
Messaggi: 155
|
Quote:
mettiamo che la base è 2 e l'esponente è 3, allora lui esegue tre volte Risultato*Base, ovvero tre volte 2*2 Ma poi quando ha i tre risultati (4,4,4) cosa ne fa? Come fa a restituirci il risultato della potenza? Credo che la soluzione stia nella seconda riga, ma non riesco proprio a coglierla...
__________________
cAsE -> Viper Midi Tower aLiMeNtAtOrE -> RaptoxX 350W 1.3V mAiNbOaRd -> GigaByte K8NS (nForce 3 250) pRoCeSsOrE -> AMD Sempron 64 2800+ rAm -> Apacer 512MB PC3200 chipset Samsug (DDR-400MhZ) sChEdA vIdEo -> Asus Radeon A9250 256DDR dIsCo RiGiDo -> IBM Deskstar 40GB 7200rpm mAsTeRiZzAtOrE -> Plextor PXW161040A (16x10x40x) -> Powerd by... Slackware Linux 10.2 ->] registered Linux user number 401837 |
|
|
|
|
|
|
#13 | |
|
Member
Iscritto dal: Oct 2005
Messaggi: 155
|
Quote:
Non è che ti potresti unire alla spiegazione? Non riesco a capire bene il funzionamento di FOR...
__________________
cAsE -> Viper Midi Tower aLiMeNtAtOrE -> RaptoxX 350W 1.3V mAiNbOaRd -> GigaByte K8NS (nForce 3 250) pRoCeSsOrE -> AMD Sempron 64 2800+ rAm -> Apacer 512MB PC3200 chipset Samsug (DDR-400MhZ) sChEdA vIdEo -> Asus Radeon A9250 256DDR dIsCo RiGiDo -> IBM Deskstar 40GB 7200rpm mAsTeRiZzAtOrE -> Plextor PXW161040A (16x10x40x) -> Powerd by... Slackware Linux 10.2 ->] registered Linux user number 401837 |
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7260
|
Quote:
|
|
|
|
|
|
|
#15 |
|
Member
Iscritto dal: Oct 2005
Messaggi: 155
|
Aaaaaaah ora è chiaro!!!
Va a riprendere il risultato del calcolo di prima giusto? E lo "ricicla" fino alla fine del ciclo FOR? Io credevo che una volta che il ciclo fosse ricominciato avrebbe azzerato tutto... Questa è una di quelle cose per cui deve scattare la "scintilla" in testa, prima non c'è modo di capirla
__________________
cAsE -> Viper Midi Tower aLiMeNtAtOrE -> RaptoxX 350W 1.3V mAiNbOaRd -> GigaByte K8NS (nForce 3 250) pRoCeSsOrE -> AMD Sempron 64 2800+ rAm -> Apacer 512MB PC3200 chipset Samsug (DDR-400MhZ) sChEdA vIdEo -> Asus Radeon A9250 256DDR dIsCo RiGiDo -> IBM Deskstar 40GB 7200rpm mAsTeRiZzAtOrE -> Plextor PXW161040A (16x10x40x) -> Powerd by... Slackware Linux 10.2 ->] registered Linux user number 401837 |
|
|
|
|
|
#16 | |
|
Member
Iscritto dal: Oct 2005
Messaggi: 155
|
Quote:
Ma... Queste librerie sono indispensabili? Cioè io non sapevo nemmeno esistessero... Ne serve almeno una per I/O o no? Perchè con FreePascal non ne ho mai avuto la necessità... Altre dove le trovo?
__________________
cAsE -> Viper Midi Tower aLiMeNtAtOrE -> RaptoxX 350W 1.3V mAiNbOaRd -> GigaByte K8NS (nForce 3 250) pRoCeSsOrE -> AMD Sempron 64 2800+ rAm -> Apacer 512MB PC3200 chipset Samsug (DDR-400MhZ) sChEdA vIdEo -> Asus Radeon A9250 256DDR dIsCo RiGiDo -> IBM Deskstar 40GB 7200rpm mAsTeRiZzAtOrE -> Plextor PXW161040A (16x10x40x) -> Powerd by... Slackware Linux 10.2 ->] registered Linux user number 401837 |
|
|
|
|
|
|
#17 | ||
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7260
|
Quote:
Quote:
comunque se hai una reference per il pascal.. se cerchi la funzione che vuoi utilizzare di solito c'è scritto se devi includere qualche libreria in particolare. il tuo manuale non ne parla (anche se è scarsamente affidabile |
||
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7260
|
questa è quella che io chiamo reference http://www.math.uni-hamburg.de/it/so...its/node1.html spero che te la cavi con l'inglese
ci sono tutte le funzioni divise per libreria (o unità in pascal) |
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7260
|
effettivamente crt non ti serve nel programma di prima... writeln e readln sono funzioni che non sono in nessuna librerie, ma sono proprio incluse nel pascal! ok adesso è chiaro..
|
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: May 2003
Messaggi: 1113
|
Ciao,
ieri ti avevo anche commentato il codice in un altro post (oltre a correggere i piccoli errori) ma poi ho premuto un tasto sbagliato ed ho perso tutto...mi rompevo di riscrivere il tutto ma lo faccio adesso: Codice:
{01}Program Potenza;
{02}Uses crt;
{03}Var
{04} Base, Esponente: integer;
{05} iIndice, Risultato: integer;
{06}Begin
{07} Write('Inserire il numero da elevare: ');
{08} readln(Base);
{09} Write('Inserire l''esponente a cui elevare il numero: ');
{10} readln(Esponente);
{11}
{12} Risultato:=Base;
{13} IF (Esponente=0) then
{14} Risultato:=1
{15} ELSE IF (Esponente=1) then
{16} Risultato:=Base
{17} ELSE BEGIN
{18} FOR iIndice:=2 to Esponente DO
{19} Risultato:=Risultato*Base;
{20} END;
{21}
{22} Writeln('Il risultato e'': ',Risultato);
{23} readln;
{24}End.
Se prendiamo un generico numero (Base) e lo vogliamo elevare a potenza (Esponente): X^Y (simbolo che si trova in genere sulle calcolatrici) dobbiamo moltiplicare il nostro numero (Base) per se stesso (Base) tante volte quanto è il valore dell'esponente meno una dato che: Base=2 Esponente=5 2^0=1 2^1=2 (che è la nostra Base di esempio) 2^2=4 2^3=8 2^4=16 2^5=32 32 è quindi il nostro risultato che è anche dato da: 2*2*2*2*2=32 Questo (2*2*2*2*2)=(2^5) si analizza in programmazione nel seguente modo: 1) Si ricerca il caso Base (o i casi base) 2) Si ricerca il passo induttivo Siccome il nostro problema è molto semplice è un po esagerato parlare di "passo induttivo"...comunque: 1) Il caso, o i casi, base è quella particolare situazione in cui non c'è alcun bisogno di fare dei calcoli perchè il risultato è noto per qualsiasi valore di ingresso (in questo caso per qualsiasi valore della nostra base). I nostri casi base saranno quando l'esponente è UGUALE a 0 oppure UGUALE ad 1 perchè in entrambi i casi i valori di uscita sono conosciuti: Quote:
Come detto nel nostro problema questo non serve poichè è un problema semplicissimo (ed anche perchè in genere questo modo di procedere si utilizza con le funzioni ricorsive), comunque vediamo il nostro algoritmo che effettua la moltiplicazione: (2*2*2*2*2) = (2^5) Codice:
{12} Risultato:=Base;
{13} IF (Esponente=0) then
{14} Risultato:=1
{15} ELSE IF (Esponente=1) then
{16} Risultato:=Base
{17} ELSE BEGIN
{18} FOR iIndice:=2 to Esponente DO
{19} Risultato:=Risultato*Base;
{20} END;
Codice:
{12} Risultato:=Base;
{18} FOR iIndice:=2 to Esponente DO
{19} Risultato:=Risultato*Base;
Siccome abbiamo detto che per esponenti <2 (ovvero 0 ed 1) siamo nel nostro caso base qui dovremo trattare solo esponenti UGUALI o MAGGIORI di 2 e dovremo effettuare l'operazione: "Base * Base" = Base^2 successivamente (Base^2) * Base = Base^3 ... (Base ^ (N-1) * Base = Base^N risultato voluto Che come vedi sono solo delle semplici moltiplicazioni che in programmazione potremmo scrivere: Codice:
VAR Risultato, Base, Esponente: Integer;
{se esponente = 5}
Risultato=Base*Base {2}
Risultato=Risultato*Base{3}
Risultato=Risultato*Base{4}
Risultato=Risultato*Base{5}
Codice:
{18} FOR iIndice:=2 to Esponente DO
{19} Risultato:=Risultato*Base;
Codice:
clrscr; {pulitura schermo}
Spero che adesso sia tutto chiaro, in caso contrario chiedi pure
__________________
| Athlon XP Barton 3000+ | CoolerMaster HAC-V81 | ASUS A7N8X DELUXE v2.0 | 2*256 PC3200 + 1*512 PC3200 = 1GB DDR400| ATI Radeon 9250 | HD 80Gb Maxtor SATA | Ali Q-TEC 550W Dual Fan GOLD PFC |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:36.











)







