Newsgroup: it.comp.lang.pascal
Titolo: variabili, case of, random

In un mio programma devo dare un valore random a una variabile, poi però
dovrei fare un case of...
Tuttavia non posso nè dare valori real nel case of nè integer nel random
Come posso fare per aggirare il problema?
Si può cambiare il tipo della variabile durante il programma?
Più sotto c'è il codice, se interessa... L' ho buttato giù di brutto, è un
po' rozzo :)
program lotto;
uses crt;
var a,b,c    : real;
    n,r    : integer;
    ruota,risp : string;
label ciclo,labelend;
begin
clrscr;
writeln ('Questo programma genererà un terno basandosi su un numero');
readln (n);
randseed := n ;
     ciclo: repeat
            a:= int(random(91));
            b:= int(random(91));
            c:= int(random(91));
            until (a<>b) and (b<>c) and (c<>a);
                  if (a=0) or (b=0) or (c=0) then goto ciclo;
writeln ('Ecco il terno:');
writeln (a:3:0,b:3:0,c:3:0);
repeat
r:= int(random(11));
until r>0;
case r of
1 : ruota:= 'Bari';
2 : ruota:= 'Cagliari';
3 : ruota:= 'Firenze';
4 : ruota:= 'Genova';
5 : ruota:= 'Milano';
6 : ruota:= 'Napoli';
7 : ruota:= 'Palermo';
8 : ruota:= 'Roma';
9 : ruota:= 'Torino';
10: ruota:= 'Venezia';
end;
writeln ('Vuoi sapere la ruota? (s/n)');
readln (risp);
if risp = 's' then
writeln (ruota)
else goto labelend;
readln;
labelend:end.
--
Paolo '83 RE
gher...@iname.com
CIAO!


Te l'ho un po' sistemato.
program lotto;
uses crt;
var	a,b,c,n,r   : integer;
	ruota,risp : string;
begin
clrscr;
writeln ('Questo programma genererà un terno basandosi su un numero');
readln (n);
randseed := n ;
repeat
	a:= random(90)+1;
	b:= random(90)+1;
	c:= random(90)+1
until (a<>b) and (b<>c) and (c<>a);
writeln ('Ecco il terno:');
writeln (a:3:0,b:3:0,c:3:0);
r= random(10)+1;
case r of
	1 : ruota:= 'Bari';
	2 : ruota:= 'Cagliari';
	3 : ruota:= 'Firenze';
	4 : ruota:= 'Genova';
	5 : ruota:= 'Milano';
	6 : ruota:= 'Napoli';
	7 : ruota:= 'Palermo';
	8 : ruota:= 'Roma';
	9 : ruota:= 'Torino';
	10: ruota:= 'Venezia';
end;
writeln ('Vuoi sapere la ruota? (s/n)');
readln (risp);
risp:=UpCase(risp);
if risp = 'S' then
	writeln (ruota);
readln;
Al posto della CASE puoi utilizzare un vettore.
potresti fare cosi'
definisci
const    ruota : array[1..10] of string = ('Bari', 'Cagliari',
	'Firenze', 'Genova', 'Milano', 'Napoli',
	'Palermo', 'Roma', 'Torino', 'Venezia');
e quando vuoi stampare la ruota fai:
	writeln(ruota(r));
randseed := n ;
questa istruzione non la conosco.
Io ci mettere una RANDOMIZE.
Ciao e BUONA FORTUNA
	Fabio
--
fabi...@rocketmail.com

Si può cambiare il tipo della variabile durante il programma?
Assolutamente no.
Andrea Laforgia

labelend:end.
If risp ='S'
  Then Begin
       WriteLn (ruota);
       ReadKey; (* attende la pressione di un qualunque tasto. In questo
modo però per visualizzare l'output dovrai trasformarlo in :
Write (ReadKey); *)
  End;
End.

Guarda che la funzione random da un numero casuale intero
senza segno.
Andrea Laforgia

un secondo tempo.
Ma che stai dicendo ?
Quando e' nato il Pascal il Basic doveva ancora essere inventato !
L'istruzione derivava dal modo con cui gli assemblatori gestivano i
salti locali e globali nel codice macchina.
La questione del goto risale ai tempi di Wirth, il quale pur avendo
inventato il Pascal esaltandone la natura strutturata, usava spesso
questa istruzione quando, ad esempio, c'era da saltare direttamente al
corpo principale del programma da una subroutine o bisognava saltare
da una procedura all'altra o quando bisognava gestire le situazioni
d'errore.
La Borland, poi, ha implementato nel suo TP il goto solo "locale",
riprendendolo dal C, il quale pero' possiede anche le routine di goto
"globale" che ormai sono ridefinite come standard e sono setjmp e
longjmp.
Volendo esse si possono costruire anche per il TP.
Ci sono situazioni, vedi la gestione delle eccezioni per gli errori
critici del vecchio DOS in cui questo genere di istruzione si
dimostrava molto utile.
Ovvio, poi, che tutto quello che si puo' fare con il goto si puo' fare
con la programmazione strutturata e viceversa.
Andrea Laforgia

nell'intervallo tra 0 e X (estremi compresi), non un integer.
E no.
X non e' compreso.
Fabio
--
fabi...@rocketmail.com

X non e' compreso.
Giusto.
Andrea Laforgia




Io ci mettere una RANDOMIZE.
Nel Tp c'è scritto che dare un valore a randseed è come chiamare randomize,
in pratica genera i random basandosi su randseed, non so se mi sono spiegato
bene, l' ho letto nell' help...
Grazie tante per l' aiuto :)

quindi, dovevo usare int...
Ma comunque  la funzione INT restituisce sempre un REAL.
Se volevi ottenere un intero avresti dovuto utilizzare TRUNC o ROUND
(che per la precisione restituiscono un longint).
--
fabi...@rocketmail.com

quindi, dovevo usare int...
E' esattamente il contrario, infatti int restituisce la parte intera
di un real, ma sempre real, mentre random un intero senza segno.
E' un piccolo pasticcio creato da mamma Borland.
Andrea Laforgia


L'istruzione
Random;
Senza indicare il valore massimo, restituisce un real compreso tra 0 e 1
 0 < X < 1 ) nello zero può anche essere =, questo non lo so.
In merito alle al discorso del basic  e del TP credo tu abbia perfettamente
ragione, quello che ho affermato mi è stato semplicemente raccontato a
scuola. Non mi sono mai documentato in merito. Scusami, ma come nell'altro
messagio non avevo intenzione di urtare nessuno.
Bye.

messagio non avevo intenzione di urtare nessuno.
Ma figurati ! ;)
Andrea Laforgia

Andrea Laforgia
Perche' un pasticcio??
Se uno vuole un intero puo' utilizzare la funzione TRUNCATE (che
restituisce un longint con le sue ovvie limitazioni).
Poi avere la parte intera in un real puo' comunque essere utile.
E poi ancora, secondo te, che tipo di variabile intera potrebbe
contenere la parte intera di un reale? (he he he)  ;-)
Fabio
--
fabi...@rocketmail.com

contenere la parte intera di un reale? (he he he)  ;-)
??? e chi dice che bisogna assegnarlo a una variabile intera ?
var r : real ;
begin
  r := trunc ( r ) ;
end.
Conversione implicita : real -> longint -> real 
Andrea Laforgia

Andrea Laforgia
Questa ultima cosa non l'ho capita.
Hai fatto un esempio di una cosa che vorresti poter fare essendo
consapevole che non la puoi fare?
Il massimo reale 'troncabile' e il maxlongint (non esiste ma ci siamo
capiti)
Poi su queste cose il Pascal e' veramenbte un'infame.
Guarda questo giochino:
var	a,b:integer;
	c:longint;
begin
	a:=maxint;
	b:=maxint;
	c:=a+b;
	writeln(c)
end.
Quando vale C ?
(risultato   c  =  -2)
Fabio
--
fabi...@rocketmail.com

end.
Andrea Laforgia