Microsoft word - examen juny 2002-2003 - solucio.doc
Fonaments de la Programació Solució El present document il·lustra una possible solució a l’examen de l’assignatura Fonaments de la Programació. Aquesta no és l’única solució possible, n’hi ha d’altres perfectament acceptables.
1HOLA, NO FAS MALA CARA. NO HAS BERENAT?.
presentació obrir el fitxer de text per llegir mentre no acabar fer
actualitzar fitxer de dades amb la paraula llegida
Fonaments de la Programació Solució
MAXIM : constant integer := 25; subtype rangParaula is integer range 1.MAXIM; type TParaula is array (rangParaula) of character;
llegir mentre no s’arribi a fi de fitxer i es
(amb aquest ‘botar blancs’ ja estam en condicions
mentre no fi de fitxer i no blanc ni coma ni punt fer
guardar un blanc al final com a sentinella
frecuencia : natural; -- No hi haurà freqüències negatives
copiar al fitxer temporal la paraula com a nova
si no si s’ha arribat al final del fitxer origen
modificar la paraula per que sigui la nova
Fonaments de la Programació Solució
with Ada.Text_IO, Pparaules, PFrequencies, Ada.Sequential_IO; use Ada.Text_IO, Pparaules, PFrequencies; procedure exercici_1 is -- També es podria fer ús de Ada.Command_Line per llegir -- els fitxers. fitxer_text : constant String := "fitxer.txt"; fitxer_origen : constant String := "original.dat"; fitxer_desti : constant String := "desti.dat"; fitxer : Ada.Text_IO.File_Type; paraula : TParaula; primera_vegada : boolean := true; begin Put_Line("Vaig a llegir el fitxer "&fitxer_text& " i actualitzaré "&fitxer_origen& " creant "&fitxer_desti); open(fitxer, In_File, fitxer_text); while not End_Of_File(fitxer) loop get(fitxer, paraula); if primera_vegada then primera_vegada := false; Actualitzar(fitxer_origen, fitxer_desti, paraula); else Actualitzar(fitxer_desti, fitxer_desti, paraula); end if; end loop; close(fitxer); end exercici_1;
with Ada.Text_IO; use Ada.Text_IO; package Pparaules is MAXIM : constant integer := 25; subtype rangParaula is integer range 1.MAXIM; type TParaula is array (rangParaula) of character; procedure get(f : in out file_type; p : out TParaula); function "=" (a,b : in TParaula) return boolean; procedure put(p : in TParaula); end Pparaules;
Fonaments de la Programació Solució
package body Pparaules is procedure put(p : in TParaula) is i : rangParaula := 1; begin while p(i) /= ' ' loop put(p(i)); i:=i+1; end loop; end put; -- funcio per saber si es tracta d'un caràcter vàlid o no function separador(c : in character) return boolean is begin return c = '.' or c = ',' or c = ' '; end separador; -- procediment per llegir del fitxer de text les paraules procedure get(f : in out file_type; p : out TParaula) is lletra : character := ' '; i : rangParaula := 1; begin while not End_Of_File(f) and separador(lletra) loop get(f, lletra); end loop; -- Escriure la primera lletra, si n'hi ha. -- Això simplifica el següent bucle if not separador(lletra) then p(i) := lletra; i := i+1; end if; -- Anar copiant la paraula llegida fins acabar while not End_Of_File(f) and not separador(lletra) and i < MAXIM loop get(f, lletra); if not separador(lletra) then p(i) := lletra; i := i + 1; end if; end loop; -- Si la paraula era massa llarga fer-ho saber. if i = MAXIM and not separador(lletra) then Put_Line("Trobada una paraula massa llarga"); end if; p(i) := ' '; -- col·locar el sentinella end get; -- Funció per comparar dues paraules i dir si són iguals function "=" (a,b : in TParaula) return boolean is i : rangParaula := 1; begin while i < MAXIM and a(i) = b(i) and a(i) /= ' ' loop i := i + 1; end loop; return a(i) = b(i) and a(i) = ' '; end "="; end Pparaules;
Fonaments de la Programació Solució
with Ada.Sequential_IO, Pparaules; use Pparaules; package PFrequencies is type TFrequencia is record
frequencia : natural; -- No hi haurà freqüències negatives
end record; package Freq_IO is new Ada.Sequential_IO(TFrequencia); use Freq_IO; procedure Actualitzar(origen, desti : in String; paraula : in TParaula); procedure Copiar(origen, desti : in out Freq_IO.File_Type); procedure put(freq : in TFrequencia); end PFrequencies;
with Ada.Text_IO; use Ada.Text_IO; package body PFrequencies is procedure put(freq : in TFrequencia) is begin put(freq.paraula); put(" "&freq.frequencia'IMG); end put; procedure Obrir(f : in out Freq_IO.File_Type; nom : in String) is begin open (f, out_file, nom); exception when others => create(f, out_file, nom); end Obrir; procedure Copiar(origen, desti : in out Freq_IO.File_Type) is item : TFrequencia; begin while not End_Of_File(origen) loop read(origen, item); write(desti, item); end loop; end Copiar; procedure Actualitzar(origen, desti : in String; paraula : in TParaula) is f_origen, f_desti, temporal : Freq_IO.file_type; item : TFrequencia; acabar : boolean := false; begin obrir(temporal, "Fitxer_Temporal_Exercici_1_2002_2003.dat");
Fonaments de la Programació Solució
open(f_origen, In_File, origen); if End_Of_File(f_origen) then item.paraula := paraula; item.frequencia := 1; write(temporal, item); else while not acabar loop read(f_origen, item); if item.paraula = paraula then item.frequencia := item.frequencia + 1; acabar := true; elsif End_Of_File(f_origen) then write(temporal, item); item.paraula := paraula; item.frequencia := 1; acabar := true; end if; write(temporal, item); end loop; -- Copiar el que resta de fitxer while not End_Of_File(f_origen) loop read(f_origen, item); write(temporal, item); end loop; end if; close (f_origen); -- Copiar les dades al fitxer desti des del temporal reset (temporal, In_File); obrir(f_desti, desti); Copiar(temporal, f_desti); close(f_desti); reset(temporal, Out_file); close(temporal); end Actualitzar; end PFrequencies;
Fonaments de la Programació Solució
package QuadratsMagics is ERRORQuadratMagic : exception; type Ttauler is array (integer range <>, integer range <>)
type quadratMagic(N : integer) is record tauler : Ttauler(1.N, 1.N); end record; function quadrat_magic(q : in quadratMagic) return boolean; procedure get(q : out quadratMagic); procedure put(q : in quadratMagic); end QuadratsMagics;
package body QuadratsMagics is function quadrat_magic(q : in quadratMagic) return boolean is suma, control : integer; begin control := 0; for i in 1.q.N loop control := control + q.tauler(1,i); end loop;
Fonaments de la Programació Solució
-- Per a cada 'fila' mirar si la suma es manté for i in 2.q.N loop suma := 0; for j in 1.q.N loop suma := suma + q.tauler(i,j); end loop; if suma /= control then raise ERRORQuadratMagic; end if; end loop; -- Per a cada 'columna' mirar si la suma es manté for j in 1.q.N loop suma := 0; for i in 1.q.N loop suma := suma + q.tauler(i,j); end loop; if suma /= control then raise ERRORQuadratMagic; end if; end loop; -- Comprovar una diagonal suma := 0; for i in 1.q.N loop suma := suma + q.tauler(i,i); end loop; if suma /= control then raise ERRORQuadratMagic; end if; -- Comprovar la diagonal que quedava suma := 0; for i in 1.q.N loop suma := suma + q.tauler(i,q.N-i+1); end loop; if suma /= control then raise ERRORQuadratMagic; end if; -- si no s'ha generat cap excepció arriba al final i, -- per tant es tracta d'un quadrat màgic. return true; end quadrat_magic; -- Seguirien les implementacions del procediments get i put end QuadratsMagics;
Fonaments de la Programació Solució
p1(x1,y1) p2(x2,y2) → d(p1,p2)=sqrt((x1-x2)2+(y1-y2)2)
s = (a+b+c)/2 area = sqrt(s*(s-a)*(s-b)*(s-c))
Ada.Numerics.Generic_Elementary_Functions
end record; MAXIM : constant integer := 100; type llargPoligon is new integer range 0.MAXIM; subtype rangPoligon is llargPoligon range 1.llargPoligon’LAST; type taulaPunts is array (rangPoligon) of Punt; type Poligon is record
Fonaments de la Programació Solució
mentre no s’hagin llegit tots els punts
per a tots els punts del primer al penúltim
dibuixar una línia negra entre el punt i el següent
dibuixar una línia negra entre el darrer punt i el primer
per a tots els punts del primer al penúltim
calcular la distància del punt al següent
calcular la distància entre el darrer punt i el primer
escriure un missatge amb la suma de les distancies
per a tots els punts del primer al penúltim
calcular l’àrea del triangle definit entre
el punt, el següent punt, i el centre.
calcular l’àrea del triangle definit entre
el darrer punt, el primer punt, i el centre.
escriure un missatge amb la suma de les àrees
Fonaments de la Programació Solució
with Ada.Text_IO, Adagraph, PPoligons; use Ada.Text_IO, Adagraph, PPoligons; procedure exercici_3 is poli : Poligon; type toperacio is (llegir, dibuixar, perimetre, area, sortir); operacio : toperacio; procedure Mostra_Menu is espais : constant String(1.25) := (others => ' '); begin Put_line(espais&"Opcions"); Put_line(espais&"======="); new_line; Put_line(espais&"l.- llegir un nou polígon"); Put_line(espais&"d.- dibuixar el polígon"); Put_line(espais&"p.- indicar el perímetre"); Put_line(espais&"a.- indicar l'àrea"); Put_line(espais&"s.- sortir de l'aplicació"); new_line; put(espais&"opció ::> "); end Mostra_Menu; function llegir_Opcio return toperacio is lletra : character; correcte : boolean := false; opcio : toperacio; begin while not correcte loop Mostra_Menu; get(lletra); correcte := lletra = 'l' or lletra = 'L' or lletra = 'd' or lletra = 'D' or lletra = 'p' or lletra = 'P' or lletra = 'a' or lletra = 'A' or lletra = 's' or lletra = 'S'; -- botar-se tot el que es pugui haver introduit while not end_of_line loop get(lletra); end loop; if not correcte then Put_line("No has escollit cap opcio"); end if; end loop;
Fonaments de la Programació Solució
-- determinar l'opció en funció de la lletra picada case lletra is when 'l' | 'L' => opcio := llegir; when 'd' | 'D' => opcio := dibuixar; when 'p' | 'P' => opcio := perimetre; when 'a' | 'A' => opcio := area; when 's' | 'S' => opcio := sortir; when others => null; end case; return opcio; end llegir_Opcio; procedure dibuixar(p : in Poligon) is MaxAmple, MaxAlt : integer; begin Get_Max_Size(MaxAmple, MaxAlt); Open_Graph_Window(MaxAmple, MaxAlt); Clear_Window(White); Draw_Poligon(p, black); Display_Text(1,1,"Pica una tecla per acabar", Black); Wait_For_Key; Close_Graph_Window; end dibuixar; poligon_definit : boolean := false; begin put_line("Benvigut al programa de càlcul de polígons"); new_line; loop operacio := llegir_Opcio; exit when operacio = sortir; if operacio /= llegir and not poligon_definit then put_line("Primer s'ha d'introduir un poligon"); else case operacio is when llegir => put_Line("Introdueix les dades del polígon"); get(poli); poligon_definit := true; -- Ara ja es té un poligon when dibuixar => dibuixar(poli); when perimetre => perimetre(poli); when area => area(poli); when others => null; end case; end if; end loop; new_line; put_line("Això és tot"); end exercici_3;
Fonaments de la Programació Solució
with Adagraph; -- pel color del poligon use Adagraph; package PPoligons is type Punt is private; type Poligon is private; function distancia(a, b : in punt) return float; procedure get(p : out Poligon); procedure Draw_Poligon(p : in Poligon; color : in Extended_Color_Type); procedure perimetre(p : in Poligon); procedure area(p : in Poligon); private type Punt is record
end record; MAXIM : constant integer := 100; type llargPoligon is new integer range 0.MAXIM; subtype rangPoligon is llargPoligon range 1.llargPoligon'LAST; type taulaPunts is array (rangPoligon) of Punt; type Poligon is record
with Ada.Text_IO, Ada.Integer_Text_IO; with Ada.Numerics.Generic_Elementary_Functions; use Ada.Text_IO, Ada.Integer_Text_IO; package body PPoligons is package Float_Functions is new Ada.Numerics.Generic_Elementary_Functions(float); use Float_Functions; function distancia(a, b : in punt) return float is separate; procedure get(p : out Poligon) is separate; procedure Draw_Poligon(p : in Poligon; color : in Extended_Color_Type) is separate; procedure perimetre(p : in Poligon) is separate; procedure area(p : in Poligon) is separate; end PPoligons;
Fonaments de la Programació Solució
separate(PPoligons) function distancia(a, b : in punt) return float is begin return sqrt(float(a.x-b.x)**2 + float(a.y-b.y)**2); end distancia;
separate(PPoligons) procedure get(p : out Poligon) is nombre : integer; begin -- llegir el nombre de punts fins que aquest valor sigui -- correcte loop Put("Nombre de punts 1."&MAXIM'IMG&": "); get(nombre); exit when nombre >0 and nombre <= MAXIM; Put_Line("Valor erroni"); end loop; p.nombre := llargPoligon(nombre); -- canvi de tipus for i in 1.p.nombre loop put_line("Punt "&i'IMG); put(" x: ");get(p.punts(i).x); put(" y: ");get(p.punts(i).y); end loop; end get;
separate(PPoligons) procedure Draw_Poligon(p : in Poligon; color : in Extended_Color_Type) is begin for i in 1.p.nombre-1 loop Draw_Line(p.punts(i).x, p.punts(i).y, p.punts(i+1).x, p.punts(i+1).y, color); end loop; Draw_Line(p.punts(p.nombre).x, p.punts(p.nombre).y, p.punts(1).x, p.punts(1).y, color); end Draw_Poligon;
Fonaments de la Programació Solució
separate(PPoligons) procedure perimetre(p : in Poligon) is perim : float := 0.0; begin for i in 1.p.nombre-1 loop perim := perim + distancia(p.punts(i), p.punts(i+1)); end loop; perim := perim + distancia(p.punts(p.nombre), p.punts(1)); put_line("Perímetre del polígon: "&perim'IMG); end perimetre;
separate(PPoligons) procedure area(p : in Poligon) is area : float := 0.0; centre : Punt; function areaTriangle(p1, p2, p3 : in Punt) return float is a,b,c,s : float; begin a := distancia(p1, p2); b := distancia(p2, p3); c := distancia(p3, p1); s := (a+b+c) / 2.0; return sqrt(s*(s-a)*(s-b)*(s-c)); end areaTriangle; begin -- Primer calcula el centre. La mitjana de tots els punts centre.x := 0; centre.y := 0; for i in 1.p.nombre loop centre.x := centre.x + p.punts(i).x; centre.y := centre.y + p.punts(i).y; end loop; centre.x := centre.x / integer(p.nombre); centre.y := centre.y / integer(p.nombre); -- Després calcula l'àrea de tots els triangles (pi,pi+1,centre) for i in 1.p.nombre-1 loop area := area + areaTriangle(p.punts(i),p.punts(i+1), centre); end loop; area := area + areaTriangle(p.punts(p.nombre), p.punts(1), centre); put_line("Àrea del polígon: "&area'IMG); end area;
NOTA
PENSAMENT FILOSÒFIC CONTEMPORANI S. XIX – XX UNED Sènior PENSAMENT FILOSÒFIC CONTEMPORANI S. XIX – XX (o les qüestions mai resoltes en el món contemporani) Docent Humbert Ruiz Gil, llicenciat en Filosofia per la Universitat de Barcelona, habilitat com a educador social i Postgrau en Economia Cooperativa per UAB-IGOP-APOSTA Presentació de la guia del curs 1. Context
Lazard Global Thematic Equity Performance (Gross of fees; through 31 January 2014) Performance reported gross of fees. Past performance is not necessarily indicative of future performance. Benchmark returns MSCI net official numbers. Source: MSCI. Based on a representative account. Commentary Market Overview Equity markets swooned in January. The emerging markets fell most as capital