Newsgroup: it.comp.lang.pascal
Titolo: [MI] AGLI AMANTI DEL PASCAL... AIUTATEMI!!!

CIAO, MI CHIAMO ALESSIA E DA POCO MI SONO ISCRITTA AL PRIMO ANNO DI
INFORMATICA ALL'UNIVERSITA'.
NON HO POTUTO SEGUIRE LE LEZIONI E ADESSO MI TROVO IN UN GROSSO GUAIO!!!
DEVO PREPARARE UN PROGETTO IN PASCAL MA NON SO DA CHE PARTE INCOMINCIARE.
SE AVETE QUALCHE MINUTO DA DEDICARMI VE NE SAREI MOLTO GRATA!!!!
LASCIO LA MIA E-MAIL A CHIUNQUE SIA DISPOSTO AD AIUTARMI!
GRAZIE ANCORA!
CIAO ALESSIA
Costruire in Pascal Standard un programma che:
legga da input un'espressione aritmetica scritta in notazione postfissa
calcoli il risultato dell'espressione e lo scriva in output, elencando, in
notazione infissa, tutte le operazioni effettuate.
L'espressione data contiene frazioni prive di segno espresse nella forma
numeratore/denominatore (come ad esempio 5/3) o nella forma numeratore (nel
qual caso il denominatore è 1) ed utilizza i seguenti operatori:
operatori binari:
+ somma, - sottrazione, * prodotto, : divisione;
operatori unari:
INV frazione inversa (ad esempio, il risultato di 5/3 INV è 3/5), NEG cambio
di segno (ad esempio, il risultato di 3/5 NEG è -3/5), ABS valore assoluto
(ad esempio, il risultato di -3/5 ABS è 3/5), INT parte intera, cioè il piú
piccolo numero intero minore o uguale della frazione data (ad esempio, il
risultato di 5/3 INT è 1), FRA parte frazionaria, cioè la differenza tra la
frazione e la sua parte intera (ad esempio, il risultato di 5/3 FRA è 2/3)
Il risultato dell'espressione e i risultati intermedi vanno mostrati sempre
in forma semplificata (ad esempio come risultato dell'espressione 5/8 7/8 +
andrà mostrato 3/2 e non 12/8). Inoltre non dovranno essere indicati i
denominatori uguali a 1 (ad esempio, il programma dovrà scrivere 5 al posto
di 5/1).
Il programma dovrà segnalare eventuali errori presenti nell'espressione o
che si verifichino durante i calcoli (si vedano gli esempi successivi). È
opportuno che ogni segnalazione d'errore sia accompagnata da un'indicazione
sulla natura dell'errore stesso.
Il programma deve essere privo di vincoli sul numero di operandi e di
operatori presenti nell'espressione. Non è richiesto invece il trattamento
dei problemi legati alla dimensione massima degli interi rappresentabili
(integer overflow).
Esempio 1
Si supponga che il programma legga da input la seguente sequenza di
caratteri:
10/13 3/4 5/9 * NEG 8/9 16 : + INV + 3/4 2 + -
Si noti che tale sequenza corrisponde all'espressione:
Il programma dovrà evidenziare (in notazione infissa) ogni operazione
effettuata, in questo caso:
3/4 * 5/9 = 5/12
NEG 5/12 = -5/12
8/9 : 16 = 1/18
-5/12 + 1/18 = -13/36
INV -13/36 = -36/13
10/13 + -36/13 = -2
3/4 + 2 = 11/4
-2 - 11/4 = -19/4
Il programma dovrà poi scrivere il risultato dell'espressione, in questo
caso -19/4.
Esempio 2
In base a come sono stati definiti gli operatori INT e FRA, le espressioni
in input 5/4 4 - INT e 5/4 4 - FRA, dovranno produrre rispettivamente come
output -3 e 1/4.
Esempio 3
Le seguenti sequenze d'ingresso dovranno produrre segnalazioni d'errore a
causa di errori nell'espressione in input o di errori che si verificano
durante i calcoli:
3/4 2 + -
4/3 1 1/4 -
4 a32/2 +
4 2/0 +
3/4 1/4 + 1 - INV
3/4 1/4 INT :

 ...
[cut cut]
Allora, ho abbozzato un prototipo della soluzione cmq ti consiglio di
controllare il tutto...
Non ho molto tempo, quindi non ho potuto inserire il controllo degli errori,
il calcolo del valore dell'espressione....praticamente ti è rimasto ancora
un buon 80% del lavoro da fare...cmq, credo che in una giornata si completa
tranquillamente (io queste righe le ho scritte stamattina in 1 ora)....
Ah, l'espressione finale viene visualizzata mediante una visita da sinistra
a destra dell'albero (mentre tu richiedevi destra->sinistra)...cmq, se ti
crea problemi dovrebbe essere sufficiente invertire le variabili
left<->right. (credo)
Per ogni problema, mandami una mail...
Ciao!
Simone.
P.S.: visto che sei nuova....va bè...cmq, la prossima volta ricordati che
non si posta in più di 1 Newsgroup ! :)
********************************************************
Program Progetto;
Uses
    Crt, Dos;
const
    binary = ['+','-','*',':'];
    number = ['0'..'9'];
type
    string10 = string[10];
    string100 = string[100];
procedure clear(var st: string); { toglie gli spazi alla fine della
stringa }
begin
     while st[length(st)]=' ' do
           dec(st[0]);
end;
function IsNumber(st: string): boolean;
{
        restituisce:
              TRUE se st e' un numero (anche frazionario)
              FALSE altrimenti
}
var
   l: word;
   flag: boolean;
begin
     flag := TRUE;
     for l:=1 to length(st) do
         if NOT (st[l] in (number + ['/'])) then flag := false;
     IsNumber := flag;
end;
Function Eval(var St: String): string;
var
   sp: word;
   token: string;
   v : string;
   left, right: string;
begin
     sp := length(st);
     v := '';
     token := '';
     if sp>0 then
        while (st[sp]<>' ') AND (sp>0) do
              begin
                   token := st[sp]+token;
                   dec(sp);
              end;
     if token<>'' then
        begin
             dec(st[0], length(token));
             if (token[1] in Binary) then { operatore binario }
                begin
                     clear(st);
                     left := eval(st);
                     clear(st);
                     right := eval(st);
                     v := '('+left+' '+token[1]+' '+right+')';
                     writeln(v);
                end
                else
             if IsNumber(token) then
                begin
                     v := token;
                end
                else
             if (token='INV') OR (token='NEG') then
                begin
                     clear(st);
                     left := eval(st);
                     v := token+' '+left;
                     writeln(v);
                end;
        end;
    eval := v;
end;
var
   st : string;
   v  : string;
   op : string10;
Begin
     clrscr;
     st := '10/13 3/4 5/9 * NEG 8/9 16 : + INV + 3/4 2 + - ';
     clear(st);
     writeln('Notazione postfissa : '+st);
     v := eval(st);
     writeln('Notazione infissa   : '+v);
End.
********************************************************
===================================
e-mail:  
drfa...@libero.it
 
drfa...@tiscalinet.it
web:     
http://www.tiscalinet.it/drfalken
 
http://free.prohosting.com/~drfalken
ICQ#:  19598133
===================================

CIAO ALESSIA
3) Quesito rivolto al NG: "Secondo voi il fatto che sia una ragazza che
cerca aiuto puo' influire in qualche modo sulle risposte ?"
A posteri l'ardua sentenza...
Ciao
along3x @ geocities . com

 DEVO PREPARARE UN PROGETTO IN PASCAL MA NON SO DA CHE PARTE INCOMINCIARE.
studiare un pochino, no ?
fanno tutte cosě...

 cerca aiuto puo' influire in qualche modo sulle risposte ?"
Infatti. Per me si chiama AlessiO e fa il furbetto.
--
Virgilio Lattanzi       HARPAX
Tel: 
+39 0733 816872
    via Fontanella, 55
Fax: +39 0733 819133    62012 Civitanova Marche MC
WWW: 
www.harpax.com
     ITALY

you wrote :
#CIAO, MI CHIAMO ALESSIA E DA POCO MI SONO ISCRITTA AL PRIMO ANNO DI
#INFORMATICA ALL'UNIVERSITA'.
#NON HO POTUTO SEGUIRE LE LEZIONI E ADESSO MI TROVO IN UN GROSSO GUAIO!!!
#DEVO PREPARARE UN PROGETTO IN PASCAL MA NON SO DA CHE PARTE INCOMINCIARE.
#SE AVETE QUALCHE MINUTO DA DEDICARMI VE NE SAREI MOLTO GRATA!!!!
#LASCIO LA MIA E-MAIL A CHIUNQUE SIA DISPOSTO AD AIUTARMI!
#GRAZIE ANCORA!
#CIAO ALESSIA
program POSTFISSA ;
const ADDIZIONE       =  0 ;
const SOTTRAZIONE     =  1 ;
const MOLTIPLICAZIONE =  2 ;
const DIVISIONE       =  3 ;
const NUMERO          =  4 ;
const INVERSO         =  5 ;
const ASSOLUTO        =  6 ;
const NEGATIVO        =  7 ;
const INTERO          =  8 ;
const FRAZIONARIO     =  9 ;
const LINEA_FRAZIONE  =  10 ;
const FINE_FORMULA    = -1 ;
const CATTIVO_TOKEN   = -2 ;
type numero_razionale = record
                          num : integer ;
                          den : integer ;
                        end ;
var stack                : array [1..128] of numero_razionale ;
    puntatore_stack      : integer ;
    token_rispedito      : integer ;
    flag_token_rispedito : boolean ;
    formula              : string ;
procedure scambia_interi( var a, b : integer ) ;
begin
  a := a xor b ;
  b := a xor b ;
  a := a xor b ;
end ;
function MCD ( a, b : integer ) : integer ; { a > b }
begin
  if b = 0 then MCD := a
  else MCD := MCD ( b, a mod b ) ;
end ;
function segno( n : integer ) : integer ;
begin
  if n >= 0 then segno := +1 else segno := -1 ;
end ;
procedure semplifica( var n : numero_razionale ) ;
var D : integer ;
begin
  if (n.num > n.den) then D := MCD(n.num, n.den)
  else D := MCD(n.den, n.num) ;
  n.num := abs( n.num div D ) * segno(n.num) * segno(n.den) ;
  n.den := abs( n.den div D ) ;
end ;
procedure esegui_operazione_binaria( n1, n2 : numero_razionale ;
                                     var r : numero_razionale ;
                                     operazione : integer ) ;
begin
   case operazione of
        ADDIZIONE       : begin
                            r.num := n1.num * n2.den + n2.num * n1.den
;
                            r.den := n1.den * n2.den ;
                          end ;
        SOTTRAZIONE     : begin
                            n2.num := -n2.num ;
                            esegui_operazione_binaria(n1, n2, r,
ADDIZIONE) ;
                          end ;
        MOLTIPLICAZIONE : begin
                            r.num := n1.num * n2.num ;
                            r.den := n1.den * n2.den ;
                          end ;
        DIVISIONE       : begin
                            scambia_interi(n2.num, n2.den) ;
                            esegui_operazione_binaria(n1, n2, r,
MOLTIPLICAZIONE) ;
                          end ;
   end ;
   semplifica( r ) ;
end ;
procedure esegui_operazione_unaria( var r : numero_razionale ;
                                    operazione : integer ) ;
begin
  case operazione of
       INVERSO     : scambia_interi( r.num, r.den ) ;
       ASSOLUTO    : begin
                       r.num := abs(r.num);
                       r.den := abs(r.den) ;
                     end ;
       FRAZIONARIO : r.num := r.num - round( r.num / r.den ) * r.den ;
       INTERO      : begin
                       r.num := round( r.num / r.den ) ;
                       r.den := 1 ;
                     end ;
       NEGATIVO    : r.num := -r.num ;
  end ;
  semplifica( r ) ;
end ;
procedure rispedisci_token( t : integer ) ;
begin
  flag_token_rispedito := true ;
  token_rispedito := t ;
end ;
function ottieni_token( var s : string ;
                        var n : integer ) : integer ;
var t : string ;
    e : integer ;
begin
  if flag_token_rispedito then
  begin
    ottieni_token := token_rispedito ;
    flag_token_rispedito := false
  end
  else
  begin
    while (s <> '') and (s[1] = ' ') do
          delete( s, 1, 1 ) ;
    if ( s = '' ) then ottieni_token := FINE_FORMULA
    else
    begin
      if ( s[1] in ['A'..'Z'] ) then
      begin
        t := '' ;
        while ( s <> '' ) and ( s[1] in ['A'..'Z'] ) do
        begin
          t := t + s[1] ;
          delete( s, 1, 1 ) ;
        end ;
        if t = 'INV' then ottieni_token := INVERSO
        else
        if t = 'NEG' then ottieni_token := NEGATIVO
        else
        if t = 'INT' then ottieni_token := INTERO
        else
        if t = 'ABS' then ottieni_token := ASSOLUTO
        else
        if t = 'FRA' then ottieni_token := FRAZIONARIO
        else
        ottieni_token := CATTIVO_TOKEN ;
      end
      else
      if ( s[1] in ['0'..'9'] ) then
      begin
        t := '' ;
        while ( s <> '') and ( s[1] in ['0'..'9'] ) do
        begin
          t := t + s[1] ;
          delete ( s, 1, 1 ) ;
        end ;
        val( t, n, e ) ;
        ottieni_token := NUMERO ;
        exit ;
      end
      else
      begin
        case s[1] of
          '+' : ottieni_token := ADDIZIONE ;
          '-' : ottieni_token := SOTTRAZIONE ;
          '*' : ottieni_token := MOLTIPLICAZIONE ;
          ':' : ottieni_token := DIVISIONE ;
          '/' : ottieni_token := LINEA_FRAZIONE ;
        end ;
        delete(s, 1, 1) ;
        exit ;
      end ;
    end ;
  end ;
end ;
function pop( var n : numero_razionale ) : boolean ;
begin
  if (puntatore_stack = 128) then pop := false
  else
  begin
    puntatore_stack := puntatore_stack + 1 ;
    n := stack[puntatore_stack] ;
    pop := true ;
  end ;
end ;
procedure push( n : numero_razionale ) ;
begin
  stack[puntatore_stack] := n ;
  puntatore_stack := puntatore_stack - 1 ;
end ;
function operatore_binario( id : integer ) : boolean ;
begin
  operatore_binario := id in
  [ADDIZIONE, SOTTRAZIONE, MOLTIPLICAZIONE, DIVISIONE] ;
end ;
function operatore_unario( id : integer ) : boolean ;
begin
  operatore_unario := id in
  [INVERSO, FRAZIONARIO, NEGATIVO, INTERO, ASSOLUTO] ;
end ;
procedure scrivi_razionale( n : numero_razionale ) ;
begin
  write(n.num) ;
  if n.den <> 1 then write('/',n.den) ;
end;
procedure scrivi_operazione( op : integer ) ;
begin
  case op of
    ADDIZIONE       : write(' + ' ) ;
    SOTTRAZIONE     : write(' - ' ) ;
    MOLTIPLICAZIONE : write(' * ' ) ;
    DIVISIONE       : write(' : ' ) ;
    INVERSO         : write('INV ' ) ;
    ASSOLUTO        : write('ABS ' ) ;
    FRAZIONARIO     : write('FRA ' ) ;
    INTERO          : write('INT ' ) ;
    NEGATIVO        : write('NEG ' ) ;
  end ;
end ;
procedure segnala_errore ;
begin
  writeln('errore di sintassi nell''espressione ! ' ) ;
  halt ;
end ;
procedure risolvi_espressione ( formula : string ) ;
var stato : integer ;
    token : integer ;
    n     : integer ;
    nr    : numero_razionale ;
    n1    : numero_razionale ;
    n2    : numero_razionale ;
begin
  stato := 0 ;
  while ( stato <> 99 ) do
  begin
        token := ottieni_token( formula, n ) ;
        case stato of
             0 : if ( token = NUMERO ) then
                 begin
                   nr.num := n ;
                   stato := 1 ;
                 end
                 else segnala_errore ;
             1 : if ( token = LINEA_FRAZIONE ) then
                    stato := 2
                 else
                 begin
                   nr.den := 1 ;
                   push( nr ) ;
                   rispedisci_token( token ) ;
                   stato := 3 ;
                 end ;
             2 : if ( token = NUMERO ) then
                 begin
                   nr.den := n ;
                   push( nr ) ;
                   stato := 3 ;
                 end ;
             3 : if token = FINE_FORMULA then stato := 99
                 else
                 if operatore_binario( token ) then
                 begin
                   if (pop(n2) and pop(n1)) then
                   begin
                      esegui_operazione_binaria( n1, n2, nr, token) ;
                      scrivi_razionale( n1 ) ;
                      scrivi_operazione( token ) ;
                      scrivi_razionale( n2 ) ;
                      write(' = ') ;
                      scrivi_razionale( nr ) ;
                      writeln ;
                      push( nr ) ;
                      stato := 3 ;
                   end
                   else segnala_errore ;
                 end
                 else
                 if operatore_unario( token ) then
                 begin
                   if pop(nr) then
                   begin
                     scrivi_operazione( token ) ;
                     scrivi_razionale( nr ) ;
                     esegui_operazione_unaria( nr, token ) ;
                     write(' = ' ) ;
                     scrivi_razionale( nr ) ;
                     push(nr) ;
                     writeln ;
                     stato := 3 ;
                   end
                   else segnala_errore ;
                 end
                 else
                 if token = NUMERO then
                 begin
                   nr.num := n ;
                   stato := 1 ;
                 end
                 else segnala_errore ;
        end ;
  end ;
  pop(nr) ;
  write('Il risultato dell''espressione e'' : ') ;
  scrivi_razionale( nr ) ;
  writeln ;
end ;
begin
  writeln ( 'risolutore espressioni postfisse' ) ;
  flag_token_rispedito := false ;
  puntatore_stack := 128 ;
  write('inserisci la formula : ' ) ;
  readln( formula ) ;
  risolvi_espressione( formula ) ;
end.
........................................................
.                                                      .
. Andrea Laforgia        (
andrea_...@bigfoot.com
) .
.                                                      .
........................................................

 SE AVETE QUALCHE MINUTO DA DEDICARMI VE NE SAREI MOLTO GRATA!!!!
... quanto grata ... ?

#3) Quesito rivolto al NG: "Secondo voi il fatto che sia una ragazza che
#cerca aiuto puo' influire in qualche modo sulle risposte ?"
Credo di no, pero' di certo a me piacerebbe vedere delle risposte che
abbiano un minimo di senso.
A buon intenditor...
........................................................


SE AVETE QUALCHE MINUTO DA DEDICARMI VE NE SAREI MOLTO GRATA!!!!


 
Senti, se non ha potuto non č colpa sua!
-- 
+-------*Le tre leggi del buon utente*-------+
|============================================|
+-Legge Zero---------------------------------+
|Un utente non puo' installare Windows, o cau|
|sera' la fine del suo PC e la rovina dell'u-|
|manita' !!!! Cobra(
franc...@iol.it
)      |
|                  (
maraf...@xoommail.com
)|
|============================================|

Senti, se non ha potuto non è colpa sua!
E di chi allora?
Ciao, Giuseppe
---------------------------------------------------------------------------
_Guybrush su IRCNet canale #programmazione
ICQ: 42227764
---------------------------------------------------------------------------