Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

Trasformare il tipo di variabile in pascal

Discussioni e opinioni costruttive sul mondo dell'informatica.
Per la soluzione di problemi specifici fare riferimento alle sezioni di assistenza!

Moderatori: aurelio37, axelrox

Trasformare il tipo di variabile in pascal

Postdi Andrea87 » 03/03/03 16:56

Ho un problema vorrei trasformare una variabile di tipo integer in una di tipo real per permettere a questo programma di girare

Codice: Seleziona tutto
Program semplifica;
Uses crt;
Var n,d:integer;

FUNCTION MCD(a,b:integer):INTEGER;
VAR temp:INTEGER;
   BEGIN
     IF a<b THEN
      BEGIN
      temp:=a;
      a:=b;
      b:=temp;
      END;
     IF b=0 THEN MCD:=a
            ELSE MCD:=MCD(b,a mod b);
   END;


procedure semplifica(var x,y:integer);
begin
  Var a,b,c:real;
  a:=mcd(x,y);
  b:=x/a;
  c:=y/a;
  x:=b; (*è qui il problema*)
  y:=c; (*è qui il problema*)
End;

Begin {programma principale}
readln(n,d);
semplifica(n,d);
writeln(n:5:0,'/',d:5:0);
readln;
End.


Come si può fare?
Andrea87
Utente Senior
 
Post: 857
Iscritto il: 03/09/01 01:00
Località: Venezia

Sponsor
 

Postdi sidewinder » 06/03/03 13:20

Ciao!

Assegnare un real ad un integer NON si può! :o
Trasformando tutto in real il programma compila ma devi assicurti poi che produca gli stessi risultati. Con le variabili in virgola mobile gli "errori" dovuti alla precisione potrebbero non essere trascurabili...
Inoltre dipende che uso devi fare del tuo programma. Se la velocità di elaborazione è un imperativo, saprai che i numeri floating-point richiedono molto più tempo per essere processati...

Program semplifica_;
Uses crt;
Var n,d:real;

FUNCTION MCD(a,b:real):real;
VAR temp:real;
BEGIN
IF a<b THEN
BEGIN
temp:=a;
a:=b;
b:=temp;
END;
IF b=0 THEN MCD:=a
ELSE MCD:=MCD(b,a / b);
END;


procedure semplifica(var x,y:real);
Var a,b,c:real;
begin
a:=mcd(x,y);
b:=x/a;
c:=y/a;
x:=b; (*è qui il problema*)
y:=c; (*è qui il problema*)
End;

Begin {programma principale}
readln(n,d);
semplifica(n,d);
writeln(n:5:0,'/',d:5:0);
readln;
End.
sidewinder
Utente Senior
 
Post: 201
Iscritto il: 02/01/03 22:53

Postdi zello » 06/03/03 13:34

Premetto: di pascal non so una cippa. Ma mi pareva di aver visto un operatore cast simile al c. In C scriveresti

double f=4.2;
int n=(int)f; //ottieni 4

Mi pareva che in pascal l'operatore fosse "invertito", in quanto a parentesi:

x:=integer(b);

Ma ovviamente non sono sicuro.
Il faut être toujours ivre. Tout est là : c'est l'unique question. Pour ne pas sentir l'horrible fardeau du Temps qui brise vos épaules et vous penche vers la terre,il faut vous enivrer sans trêve...
Avatar utente
zello
Moderatore
 
Post: 2351
Iscritto il: 06/05/02 13:44

Postdi pjfry » 06/03/03 14:04

per passare da real a integer dovresti poter usare 'trunc'( o una che invece di troncare arrotonda,ma non mi ricordo il nome :-? ), hai provato?
Avatar utente
pjfry
Moderatore
 
Post: 8240
Iscritto il: 19/11/02 17:52
Località: terni

Postdi sidewinder » 07/03/03 11:54

Le funzioni Trunc (tronca) e Round (arrotonda) restituiscono un LONGINT ed accettano come parametro un REAL.
Quindi se assegno alla variabile L di tipo longint il risultato di una di queste funzioni è tutto ok, però perdo una bella quantità di "informazione"! Se si considera poi che il programma di Andrea87 è ricorsivo si rischia di giungere a risultati strampalati.
sidewinder
Utente Senior
 
Post: 201
Iscritto il: 02/01/03 22:53

Postdi pjfry » 07/03/03 12:27

se pretendi di passare da real a integer è normale che perdi informazione, mica vorrai un integer con i decimali :eeh:
round la usi solo quando sai che il real che vuoi trasformare dovrebbe rappresentare un numero intero, e allora cosa perdi?
Avatar utente
pjfry
Moderatore
 
Post: 8240
Iscritto il: 19/11/02 17:52
Località: terni

Postdi piercing » 07/03/03 12:48

ma il problema non è il contrario? cioè trasformare un integer in un real?
Avatar utente
piercing
Moderatore
 
Post: 7569
Iscritto il: 10/04/02 10:34
Località: Roma

Postdi pjfry » 07/03/03 12:59

piercing ha scritto:ma il problema non è il contrario? cioè trasformare un integer in un real?

così aveva scritto andrea87, ma a guardare il codice
procedure semplifica(var x,y:integer);
begin
Var a,b,c:real;
a:=mcd(x,y);
b:=x/a;
c:=y/a;
x:=b; (*è qui il problema*)
y:=c; (*è qui il problema*)
End;

sembrerebbe che il problema è assegnare b, real, a x che è un integer, no? cmq il pascal non me lo ricordo tanto bene, cioè se ho capito bene cosa fà questa procedura non si potrebbero dichiarare direttamente a,b,c come integer? :eeh:
Avatar utente
pjfry
Moderatore
 
Post: 8240
Iscritto il: 19/11/02 17:52
Località: terni

Postdi piercing » 07/03/03 13:07

pj in effetti così sembrerebbe.... ma non ho minimamente capito cosa debba fare questa procedura (o meglio l'ho anche capito ma non ne conosco l'applicabilità).

Comunque sta di fatto che in qualche maniera dovrebbe essere possibile fare una CAST, a prescindere dal fatto che anche seconodo me nel caso specifico non serve.

----
Ho analizzato bene il codice... (per quanto mi ricordi pochissimo di PASCAL) e non capisco:

1) perchè utilizzi i REAL??? devi usare solo e unicamente INTEGER
2) che ci fai con la procedure semplifica? nel MAIN con le variabili generate non ne fai nulla.... quindi il prog va proprio in errore prima o non funziona??
3) puoi utilizzare tranquillamente meno della metà del codice e un terzo della memoria che hai occupato in questa maniera... ma questa è didattica ed è un altro campo.
4) sicuro che si debba scrivere VAR nella dichiarazione delle variabili della procedure?? (sto andando veramente a scavare nei ricordi di 10 anni fa)
Avatar utente
piercing
Moderatore
 
Post: 7569
Iscritto il: 10/04/02 10:34
Località: Roma

Postdi Andrea87 » 08/03/03 21:09

piercing ha scritto:1) perchè utilizzi i REAL??? devi usare solo e unicamente INTEGER

b:=x/a;
c:=y/a;
si può fare solo se b e c sono real.

piercing ha scritto:2) che ci fai con la procedure semplifica? nel MAIN con le variabili generate non ne fai nulla.... quindi il prog va proprio in errore prima o non funziona??

come non ci faccio nulla? le variabili n e d lette passano attraverso la procedura semplifica e vengono semplificate

piercing ha scritto:3) puoi utilizzare tranquillamente meno della metà del codice e un terzo della memoria che hai occupato in questa maniera... ma questa è didattica ed è un altro campo.

Bhe intanto bisogna farlo girare, poi si vede come fargli utilizzare meno memoria :D
[/code]
Andrea87
Utente Senior
 
Post: 857
Iscritto il: 03/09/01 01:00
Località: Venezia

Postdi pjfry » 08/03/03 21:16

per quel poco che ho capito io cmq dalla divisione ti aspetti un risultato intero,no?
quindi x=round(b) non và bene?
Avatar utente
pjfry
Moderatore
 
Post: 8240
Iscritto il: 19/11/02 17:52
Località: terni

Postdi Andrea87 » 08/03/03 21:25

pjfry ha scritto:per quel poco che ho capito io cmq dalla divisione ti aspetti un risultato intero,no?
quindi x=round(b) non và bene?

Ok grazie, non so perchè nn mi era venuto in mente :lol:
Andrea87
Utente Senior
 
Post: 857
Iscritto il: 03/09/01 01:00
Località: Venezia

Postdi piercing » 08/03/03 22:05

Boh... ma se stai semplificando il risultato delle divisioni è sempre un intero... quindi non capisco perchè gli integer non vanno bene.

Diciamo che proprio l'impostazione del programma mi lascia perplesso.

Non puoi fare direttamente:

Codice: Seleziona tutto
n=n/mcd(n,d)
d=d/mcd(n,d)


Presupposto che la MCD non la vogliamo toccare in quanto funzione di libreria, in questo modo non usi altri tipi di dato e non usi memoria e non usi procedure e non usi nulla... e fai molto prima (due righe invece di 10)

Capisco che è scolastico... ma scolastico è anche non complicarsi la vita per forza. ;)
Avatar utente
piercing
Moderatore
 
Post: 7569
Iscritto il: 10/04/02 10:34
Località: Roma

Postdi Andrea87 » 09/03/03 12:46

piercing ha scritto:Boh... ma se stai semplificando il risultato delle divisioni è sempre un intero... quindi non capisco perchè gli integer non vanno bene.

Diciamo che proprio l'impostazione del programma mi lascia perplesso.

Non puoi fare direttamente:

Codice: Seleziona tutto
n=n/mcd(n,d)
d=d/mcd(n,d)


Presupposto che la MCD non la vogliamo toccare in quanto funzione di libreria, in questo modo non usi altri tipi di dato e non usi memoria e non usi procedure e non usi nulla... e fai molto prima (due righe invece di 10)

Capisco che è scolastico... ma scolastico è anche non complicarsi la vita per forza. ;)


Si ma io l'ho fatto per imparare a usare funzioni e procedure ;)
Cmq il compilatore non accetta che il risultato di una divisione sia un integer anche se il risultato è sempre un numero intero. mcd nn è una funzione di libreria, ho dovuto fare "function mcd(x,y)" con l'algoritmo di Euclide.
Andrea87
Utente Senior
 
Post: 857
Iscritto il: 03/09/01 01:00
Località: Venezia

Postdi piercing » 09/03/03 14:11

dicendo funzione di libreria intendo dire che fa parte di quelle funzioni "intoccabili", perchè può servire un pò ovunque nel programma. (...e comunque l'hai scopiazzata... ehheheh... occhio clinico!)

Ho ripreso i testi di pascal a questo punto... e la soluzione è semplicemente una...

visto che sei certo che il risultato della divisione sia un intero, e l'operatore / sforna un real, usa l'operatore di divisione con troncamento...
quindi le due righe diventano:

Codice: Seleziona tutto
n=n div mcd(n,d)
d=d div mcd(n,d)


ora dovrebbe fungere nò?
Avatar utente
piercing
Moderatore
 
Post: 7569
Iscritto il: 10/04/02 10:34
Località: Roma

Postdi Andrea87 » 09/03/03 14:57

La procedura semplifica ora è diventata
Codice: Seleziona tutto
procedure semplifica(var x,y:integer);
begin
  x:=x div mcd(x,y);
  y:=y div mcd(x,y);
End;

e funziona. ora il programma lavora solo con integer.
Si la function mcd l'ho copiata :P
Andrea87
Utente Senior
 
Post: 857
Iscritto il: 03/09/01 01:00
Località: Venezia

Postdi piercing » 09/03/03 15:13

bene andrè... ora questo è un programma decente ;)

il bello dei programmi decenti è che sono anche "belli" da vedersi... (o sono io ad essere malato... :D )
Avatar utente
piercing
Moderatore
 
Post: 7569
Iscritto il: 10/04/02 10:34
Località: Roma

Postdi Andrea87 » 09/03/03 15:53

Ora con la procedure semplifica sto facendo un programma che risolve equazioni di secondo grado che è ancora in fase alpha e nn funziona :D
Codice: Seleziona tutto
Program equazioni2galpha1;
Uses crt;

var     x,y: integer;
        a,b,c:integer;
        delta:integer;
        n1,n2,d1,d2:integer;
        mcd1,mcd2:integer;

       
FUNCTION MCD(x,y:integer):INTEGER;
VAR temp:INTEGER;
    Begin
     IF x<y THEN
      BEGIN
      temp:=x;
      x:=y;
      y:=temp;
      END;
     IF y=0 THEN MCD:=x;

     If x>y then MCD:=MCD(y,x mod y);
    end;



procedure semplifica(var x,y:integer);
begin
  x:=x div mcd(x,y);
  y:=y div mcd(x,y);
End;


Begin
   clrscr;
   readln(a,b,c);
   delta:=sqr(b)-(4*a*c);

   If delta>=0 then
         Begin
           d1:=2*a;
           d2:=2*a;
           If ( (int(sqrt(delta))) = sqrt(delta) ) then  (*se delta e' un quadrato perfetto*)
            Begin
              n1:=round(-b+sqrt(delta));
              n2:=round(-b-sqrt(delta));

              If not( (n1=0) or (d1=0) or (n2=0) or (d2=0) ) then
              Begin
              semplifica(a,c);
              semplifica(b,d);
              End;
              writeln('x1: ',n1,'/',d1);
              writeln('x2: ',n2,'/',d2);
              readln;
            End;

            If not( (int(sqrt(delta))) = sqrt(delta) ) then
            Begin
            writeln('x1: ',(-b),'+radice(',delta,')/',(d1));
            writeln('x2: ',(-b),'+radice(',delta,')/',(d2));
            End;

         End;

   If delta<0 then writeln('L''eqazione ',chr(130),' impossibile');
   readln;
End.
Andrea87
Utente Senior
 
Post: 857
Iscritto il: 03/09/01 01:00
Località: Venezia

Postdi pjfry » 09/03/03 16:04

:eeh: certo che non funziona, d che cosa sarebbe?! :P
Codice: Seleziona tutto
semplifica(a,c);
semplifica(b,d);

forse qui ci volevi mettere n1,d1,n2,d2 ? :lol:
Avatar utente
pjfry
Moderatore
 
Post: 8240
Iscritto il: 19/11/02 17:52
Località: terni

Postdi Andrea87 » 09/03/03 16:15

Si scusa, è un errore di battitura. avevo fatto una modifica e poi, visto che cmq non funzionata l'ho cancellata per scrivere qui il codice, ma mi sono dimenticato di modificare li :D
Praticamente l'unico errore che mi da è quando ho come delta un quadrato perfetto: il programma nn mi da nessun output e mi dice che nell'operazione mod il secondo termine è negativo :eeh:
cmq ora scoverò il bug... spero :D
Andrea87
Utente Senior
 
Post: 857
Iscritto il: 03/09/01 01:00
Località: Venezia

Prossimo

Torna a Discussioni


Topic correlati a "Trasformare il tipo di variabile in pascal":


Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti