dijous, 14 d’abril del 2011

punters

punters

Amb el punters podem representar estructures de dades dinàmiques, estructures on podem augmentar o disminuir el nombre de components en temps d’execució del programa.

Aquests tipus de dada es declara en la secció TYPE utilitzant el símbol ^ de la forma següent:

Type

Cadena=^Caracters;

Caracters = ‘A’..’B’,

Var ApuntaCadena:Cadena;

Un altre exemple:

Type

ApuntaElement=^element;

Element=Record

info:string[20];

apuntador:ApuntaElement;

end;

Var ApuntaDada : ApuntaElement

La instrucció que ens permet crear variables de tipus Caracters o Element, definits en els exemples anteriors és el procediment NEW(), així continuant amb l’exemple podríem utilitzar el procediment NEW() de la forma següent:

New(ApuntaCadena)

New(ApuntaDada)

DISPOSE() És el procediment que permet retorna al sistema un element creat amb NEW().

La paraula reservada NIL s’utilitza per índica que é l’últim element que forma part de la estructura.

El següent mòdul descriu com seria el procés de crear una llista d’elements.

Begin

New(apuntaDada);

primer:=apuntaDada;

repeat

aux:=apuntaDada;

New(apuntaDada);

aux^.apuntador:=apuntaDada;

read(continuar);

until continuar=‘N’;

apuntaDada^.apuntador:=NIL;

End;

Si voleu més informació sobre l’ús de punters en llistes consulteu Estructures de dades En estructures de dades es realitzaran les pràctiques amb punters.

fitxers

fitxers

En un programa utilitzem uns identificadors que ens permeten indicar com es realitzar la comunicació entre el programa i l’exterior. Els valors d’aquests identificadors es perdent en finalitzar la execució del programa, si volem conservar aquests valors per ser utilitzats posteriorment en una nova execució del programa o per ser utilitzats en un altre programa caldrà emmagatzemar els valors en un fitxer.

Per poder accedir a un fitxer cal declarar-lo prèviament en el programa amb la paraula reservada FILE OF... que indica que l’identificador assignat és un fitxer.

Exemple

Type

Tarjeta=record

Nom:string[20];

Cognom:string[20];

Num_cass:string[30];

End;

Var

Fitxa = FILE OF tarjeta;

La característica d’aquesta estructura de dades és que els elements del fitxer són accessibles de forma seqüencial ( de un en un començant pel primer)

Preparació dels fitxers

Abans d’utilitzar qualsevol operació d’escriptura o lectura sobre un fitxer aquest s’ha de preparar. Les següents instruccions permeten fer la preparació:

ASSIGN(f,c) assigna un fitxer físic a u fitxer lògic

REWRITE(f) Eliminar tot el contingut del fitxer i el deixa preparat per realitzar escriptures.

RESET(f) prepara el fitxer per la lectura situant el marcador en el primer registre del fitxer.


Operacions de lectura i escriptura en fitxers de dades

READ(F,V) Llegeix els valors del fitxer de dades F i els guarda en la variable V i avança el marcador de lectura al següent component.

WRITE(F,V) escriu els valors de la variable V en el fitxer de dades.

EOF(F) Flase si queden dades per llegir, true si s’ha arribat a final del fitxer.

CLOSE(f) tanca el fitxer.

Operacions de lectura i escriptura en fitxers de text

READ(F,V) Llegeix caràcters, els tradueix al valor del tipus de la variable V i li assigna.

READLN(F,V) Igual que read però a més a més passa a la següent línia de text, ignorant els caracters que queden a la línia.

WRITE(f,e) Tradueix el valor de l’expressió e en una seqüència de caràcters i l’escriu en el fitxer.

WRITE(f) Escriu els caràcters que indican el final de la línia.

EOF(f) Flase si queden línies per llegir, true si s’ha arribat a final del fitxer.

EOLN(f) False si queden caràcters en la línia actual. True si no queden caràcters en la línia ctual.

CLOSE(f) tanca el fitxer.

Vegeu un exemple de tractament amb fitxers.

program ex_fitxers;

uses crt;

type dades=record

nom:string[20];

alias:string[20];

end;

fitxer=file of dades;

procedure inicialitzar(var f1:fitxer);

begin

assign(f1,'c:\jugadors.txt');

rewrite(f1);

close(f1);

end;

procedure obrir(var f1:fitxer);

begin

assign(f1,'c:\jugadors.txt');

reset(f1);

end;

procedure tancar(var f1:fitxer);

begin

close(f1);

end;

procedure afegir(var f1:fitxer; reg1:dades);

begin

seek(f1, filesize(f1));

write('entra el nom:');readln(reg1.nom);

write('entra el alias:');readln(reg1.alias);

write(f1,reg1);

end;

procedure borrar(var f1:fitxer; reg1:dades;nom:string);

begin

while not eof(f1) do

begin

read(f1,reg1);

if reg1.nom<>nom then

{ no hi cap funci¢ que elimini un registre }

{ la eliminaci¢ del registre s'hauria de fer de forma l•gica }

{ ‚s a dir copiar els registre que no s'eliminen a un altre fitxer}

{ un fitxer auxiliar }

end;

end;

procedure llistat (var f1:fitxer; reg1:dades);

begin

Writeln('nom alias');

while not eof(f1) do

begin

read(f1,reg1);

writeln(reg1.nom:2,reg1.alias:20);

end;

end;

procedure menu(var ch:char);

begin

clrscr;

writeln('----- Men£ -----');

writeln;

writeln('1: crear fitxer');

writeln('2: afegir registre');

writeln('3: eliminar');

writeln('4: llistat');

writeln('5: Sortir');

write('entra la opci¢');

readln(ch);

end;

var f:fitxer;

reg:dades;

op:char;

nom:string[20];

begin

repeat

repeat

menu(op);

until op in['1'..'5'];

case op of

'1':inicialitzar(f);

'2':begin

obrir(f);

afegir(f,reg);

tancar(f);

end;

'3':begin

obrir(f);

write('entra nom a leiminar');

readln(nom);

borrar(f,reg,nom);

tancar(f);

end;

'4':begin

obrir(f);

llistat(f,reg);

writeln('prem una tecla per continuar');readkey;

tancar(f);

end;

end;

until op='5';

end.

Exercicis sobre fitxers

7.-1 Proveu l’exemple anterior i implementeu el mòdul d’eliminar un registre del fitxer de dades.

7.-2 Realitzeu una nova versió del programa SUDOKO on definiu un fitxer de dades on s’emmagatzemi el nom i el temps del jugador. El fitxer de dades ha de representar la classificació de les persones que han jugat al SUDOKO i ha d’estar ordenat en funció del temps en que s’ha trigat a resoldre el joc (de menys a més temps).

El Programa ha de permetre entra un nou nom si el nom del jugador ja existeix.


registres

registres

Un registre és una estructura de dades amb components de diferents tipus. Els registres permeten més flexibilitat alhora de representar les dades i permeten tractar la informació de tot el registre o per parts (cada camp en particular) Per definir un registre s’utilitza la paraula reservada Record. Vegeu un exemple de declaració:

Type

Naixement=record

Dia: 1..31;

Mes: 1..12;

Any: integer;

End;

Var

Data:Naixement;

Noteu com els registres es declaren en la secció TYPE.

Noteu també que és necessari declarar una variable del tipus record per poder realitzar les operacions necessàries amb el registre. Mai s’utilitza l’identificador del tipus record com si fos una variable.

Diferencies entre els Record i el Array

1.- Com es pot veure en l’exemple un registre pot tenir components de diferents tipus mentre que en un array els components són del mateix tipus.

2.- Quan es vol seleccionar un dels elements del registre s’utilitza el seu nom, mentre que els elements dels array es seleccionen per subíndex.

Ús del Record

Per tractar la informació d’un camp del registre cal utilitzar l’identificador de la variable registre seguida de un punt i l’identificador del camp.

data.dia:=25;

data.dia:=data.dia+2;

Write(data.dia);

Read(data.mes);

Com es pot veure en l’exemple, totes les propietats aplicables a una variable són aplicables a un camp d’un registre. Operacions aritmètiques, assignació, etc.


Exercicis sobre registres

6.-1 L’hospital de Meritxell vol gestionar informàticament la ocupació dels seus llits. L’hospital té 3 plantes destinades a llits on cada planta hi ha 10 llits, de forma que numerem les plantes de 1 a 3 i els llits de 1 a 50.

S’ha decidit muntar una estructura de dades consistent en una matriu bidimensional que anomenarem hospital, on les files representen les plantes i les columnes els llits. A cada element de la matriu, que representa un llit d’una planta concreta, emmagatzemarem l’estat del llit (ocupat o lliure), el número de la CASS i el nom del pacient.

Sobre aquesta estructura de dades es permet ingressar nous pacients i donar d’alta pacients (deixar lliure el llit que ocupava).

Utilitzeu el llenguatge Pascal per dissenyar aquesta estructura e dades i feu el programa que permeti ingressar un pacient en una habitació lliure i donar d’alta un pacient alliberant així una habitació.

vectors

vectors

taules i matrius

Una taula o vector està constituïda per elements del mateix tipus, als quals s’accedeix amb un índex. Per definir una taula o una matriu s’utilitza la paraula reservada ARRAY

La diferencia entre una taula i una matriu és que la primera té un sol índex amb un valor inicial i un final, mentre la matriu en té dos d’index un per les files i un per les columnes tots dos amb els seus corresponents valors inicial i final.

Declaració d’una Variable Taula:

Var nom_taula:ARRAY[valor_inicial_index..valor_final_index] OF Tipus;

Molt sovint es necessari passar com a paràmetre aquesta variable, en aquests casos cal que la taula es declari com un nou tipus de variable.

Declaració d’un Tipus Taula:

Type mensual=array[1..12]of Real;

Var imports:mensual;

Declaració d’un Tipus Matriu:

Type

fila=1..10;
Columna=1..12’;
nom_matriu=ARRAY[fila,columna] OF Tipus;

exemple 5.1 el següent programa entra en un vector les despeses de cada mes i després calcula la suma.

program taules;

uses crt

Type mensual=array[1..12]of Real;

Var imports:mensual;

mes:byte;

suma:Real;

procedure Entrada(var despesa:mensual);

begin

for mes:=1 to 12 do

begin

Write('Despesa del mes ', mes,’....’);

Readln(despesa[mes]);

end;

end;

procedure Calcul( Var total:Real; despesa:mensual);

Begin

for mes:=1 to 12 do

total:=total+despesa[mes];

end;

begin

clrscr;

Writeln('calcul despesa anual');

Entrada(imports);

calcul(suma,imports);

Write('Total anual',suma:10:2);

Readln;

end.

exemple 5.2 calcula la suma de 2 matrius

Program suma_de_matrius;

Const MAX = 10;

Type tmatriu = array[1::MAX, 1::MAX] of real;

Var t1, t2, suma: tmatriu;

Procedure suma(m1,m2:tmatriu; var resultat:tmatriu);

Var i, j: integer;

Begin

For i:=1 To MAX Do
For j:=1 To MAX Do
resultat[i,j] := m1[i,j] + m2[i,j]

End;

Begin

llegir(t1,t2)
suma(t1,t2)
escriure(suma)

End


Exercicis sobre taules i matrius

Els següents exercicis s’han de realitzar utilitzant mòduls.

5.1.- Escriviu un programa que permeti entra 10 valors numèriques dins un vector i que calculi i escrigui per pantalla el valor màxim, el mínim i la mitja dels valors continguts en el vector.

5.2.- Escriviu un programa que realitzi la fusió (merge) de dos vectors ordenats, de forma que obtinguem un nou vector també ordenat. Suposeu que els 2 vectors són de 10 posicions, podeu omplir els vectors cada cop en l’execució del programa o recomanable inicialitzar-los dins del programa.

5.3.- El tractament dels string és igual que el d’una taula de caràcters. Per tal de practicar el string realitzeu un programa que entrat un caràcter reconti el nombre de vegades que apareix en una frase. Si es vol la frase pot ser sempre la mateixa.

5.4.- llegiu una paraula i escriviu-la en sentit contrari.

5.5.- Escriviu un programa en Pascal que permeti omplir una matriu amb valors numèrics, introduïts pel teclat.

5.6.- Escriviu un programa que sumi dos matrius de 3 x 3. Els valors de les matrius són introduïts per l’usuari.

5.7.- Utilitzem una matriu de 20*5 per emmagatzemar les notes dels alumnes. Les files corresponent als alumnes i les columnes als diferents parcials. Realitzeu els següents càlculs:

Doneu la mitja de cada alumne.

Doneu la mitja de cada parcial.

Doneu la mitja de l’assignatura.

units

units

Les units són grups de funcions o procediments compilats que poden ser cridats i utilitzats des de qualsevol programa en Turbo Pascal. Les units no són arxius executables per si sols, depenen del programa que les crida per poder realitzar la seva funció

estructura de la unit

Les units en Pascal estan compostes per 4 parts:

DECLARACIÓ; és obligatòria i s'identifica el nom de la unit que es crea.

INTERFACE; es realitza la declaració de tots els elements que poden ser utilitzats pel programa que crida la unit, per exemple altres units, constants, nous tipus, variables i la declaració dels procediments i funcions, no el codi

IMPLEMENTATION; és la secció exclusiva de la unit , pot tenir o no declaració de constants, variable...Així com el contingut dels procediments i funcions declarats en la Interface

UNIT ONP;

INTERFACE

Var num:integer;

Procedure SUMA(A,B:Integer; Var C:Integer);

Procedure RESTA(A,B:Integer; Var C:Integer);

IMPLEMENTATION

Procedure SUMA(A,B:Integer; Var C:Integer);

BEGIN

C:=A+B;

END;

Procedure RESTA(A,B:Integer; Var C:Integer);

BEGIN

C:=A-B

END;

Begin End.


compilació de la unit

Primer; cal gravar l'arxiu en la carpeta de treball amb el mateix nom que la unit F2

Segon; per compilar una unit i deixar-la preparada per la seva utilització cal utilitzar l'opció Options / Directories / Exe & TPU directory, i indicar quina és la carpeta de treball

Tercer; a continuació, per compilar la unit cal utilitzar l'opció Compile del menú Compile, es necessari verificar que l'opció Destination estigui en Disk, abreviant ALT + F9

procediments i funcions

procediments i funcions

índex: procediments - funcions - units

introducció

Variables locals i globals

Les variables locals només poden ser utilitzades dins del mòdul on estan declarades. Les variables globals poden ser utilitzades en qualsevol part del programa.

És possible donar el mateix nom a una variable local i a una global en el mateix programa, però el procediment no podrà utilitzar la variable global ja que dona preferència a les locals.

paràmetres

Els paràmetres serveixen per passar informació entre el programa i els mòduls i viceversa. Els paràmetres en pascal poden ser: 1. Valor : equivalent al paràmetre d'entrada en pseudocodi. Identificador, ...: :tipus2. Referència: equivalent al paràmetre d'entrada/sortida en pseudocodi. var identificador, ...: :tipus

exercicis

4.1 Proveu els exemples de procediments i funcions que teniu tot seguit.

4.2 Realitzeu un programa modular, utilitzant procediments que simuli una calculadora.

4.3 Realitzeu un programa modular, utilitzant funcions que simuli una calculadora.

4.4 Realitza un programa modular que passi un número natural de base 10 a base 2.

exemples procediments

Un procediment és un grup d'instruccions que realitzen una tasca concreta i que actuarà com una instrucció més del Pascal.

Una procediment en Pascal pot cridar un altre procediment sempre que aquest s'hagi declarat abans de ser utilitzat.


exemple 4.1

Program procediments1;
var resposta:char; lg:integer; {variables globals}

Procedure Pinta_simbol(longitud :integer); {pas paràmetre per valor}
var x:byte; {variable local}
begin

for x:=1 to longitud do Write('$');
end;

begin{--- Començament bloc principal del programa ---}
repeat

clrscr;
Write(‘quants simbols vols pintar?’);
Readln(lg);
Pinta_simbol(lg); {crida del procediment}
write(‘vols continuar’);resposta:=readkey;

until upcase(resposta)=’N’;

end.

exemple 4.2

Program procediments2;
var a,b:Integer; {variables globals}

procedure canvi(Var x,y: Integer); {pas paràmetre per referència}
Var aux: integer; {variable local}
begin

aux:=x;
x:=y;
y:=aux;

end;

Begin
readln(a,b);
canvi(a,b);
writeln('els valors intercanviats ara són ', a,b);
end.

exemple 4.3

Program operacions_basiques;
uses crt;
var
numero1,numero2, rsuma: integer;
op:char;

procedure legir(var n1,n2:integer); {pas paràmetre per referència}
begin

clrscr;
write('Numero 1: ');readln(n1);
write('Numero 2: ');readln(n2);
end;

procedure suma(n1,n2:integer; var rs :integer); {pas paràmetre per valor i referència}
begin
rs:=n1+n2;

end;
begin (* --------------programa principal -------------- *)
repeat

llegir(num1,num2);
write( prem 1...suma, 2...resta, 3....producte, 4....divisió);
op:=readkey;

case op of

‘1’: suma(num1,num2,ClrScr;

End;

write(‘vols continuar’);resposta:=readkey;

until upcase(resposta)=’N’;

end.

exemples funcions

Les funcions són al igual que els procediments, un conjunt d'instruccions que poden ser utilitzades en qualsevol lloc del programa, la diferència entre les funcions i els procediments és que les funcions sempre retornen un valor.

exemple 4.4 definneix una funció que retorna el promig de 2 numeros reals.

function promig(a,b:real):real;
var {no hi ha variables locals}
begin
promig:=(a+b)/2;
end

Com les funcions retornen un valor específic la forma més usual d'utilitzar-les és mitjançant una assignació d'una variable a la funció

exemple 4.5 mostra l'ús de la funció de l'exemple anterior.

x:=5.89;
y:=9.23;
z:=promig(x,y)
write(z);

write(promig(x,y); {una altra forma d’invocar i visualitzar el resultat de la funció }


també es podria presentar el resultat directament per pantalla tal com es mostra a continuació

exemple 4.6

x:=5.89;
y:=9.23
writeln('el promig de',x,' i ',y,'és:',promig(x,y);

instruccions estructura iterativa

estructura iterativa

Guia per fer els exercicis: des de | repeteix | mentre

introducció

En aquesta pràctica presenten els diferents tipus de bucles amb que conta Pascal, d'una banda un bucle amb comptador (FOR) i per l'altre dos bucle amb sentinella (REPEAT...UNTIL i WHILE).

La diferència entre les estructures de control iteratives i les selectives és que mentre aquestes fan que unes sentències s'executin i unes altres no, les iteratives fan que cert grup de sentències s'executin diverses vegades, sense haver d'escriure-les més que una vegada en el programa.

exercicis

3.1 Fer un programa que demani nombres a l'usuari fins que la suma dels mateixos sigui major que 1000.

3.2 Fer un programa que demani 10 nombres a l'usuari i a continuació li indiqui quant val la mitjana dels mateixos.

3.2 Fer un programa que demani nombres a l'usuari fins que el producte dels mateixos sigui major que 1000 i menor que 2000.

Bucle For...

El bucle FOR... s'ha d'usar quan les sentències que ho componen es van a repetir un nombre exacte de vegades, és a dir, la condició perquè se surti és que s'hagi executat el bucle un nombre determinat de vegades. La sintaxi per a aquest bucle és:

FOR valor inicial TO valor final i FOR valor inicial DOWNTO valor final

exemple 3.1 calcula el factorial del número 6

writeln('factorial del número 6')
FOR i := 1 TO 6 DO
fact:=fact*i
write(fact) ;

Observeu com que el valor inicial del for és inferior que el valor final s'utilitza el TO


El següent exemple escriu els numeros del 100 al 1, en aquest cas s'utilitza el DOWNTO ja qeu el valor inicial és major que el final.

exemple 3.2

FOR i :=100 DOWNTO 1 DO
write(i', ,)

repeat...until

Aquest segon tipus de bucle es caracteritza perquè les sentències que formen el cos del bucle s'executen almenys una vegada, i se segueixen executant mentre certa condició sigui veritable. Heus aquí la sintaxi:

REPEAT

Sentencias

UNTIL ( condicion )

exemple 3.3

Un exemple característic on s'usa REPEAT ... UNTIL... és el dels filtres per a les entrades. En el següent exemple es demana a l'usuari que digui S o N, i mentre digui altra cosa no se li deixa seguir:

REPEAT

write('entra una S per continuar o una N per finalitzar');
n:=readkey;

UNTIL (n='S') or( n='N') ;

exemple 3.4; un altre filtre per núm. positius

REPEAT

WRITE('Escriu un número positiu' ) ; readln(numero);

UNTIL ( numero > 0 );


Bucle while

Igual que l'anterior, aquest és un bucle dels denominats controlats per sentinella ja que hi ha una condició que és la qual a cada moment determina si es torna a executar el bucle o si se segueix amb les instruccions que hi ha després d'ell. Aquest bucle s'ha d'usar quan no sapiguem el nombre de vegades que es va a iterar el mateix. És a dir, serveix per a un nombre d'iteracions qualsevol.. La seva sintaxi és la qual segueix:

exemple 3.5

{ Llegim dades i les processem fins que s'introdueixi un zero. }
WHILE x<>0 DO
BEGIN

WRITE('Introdueix una dada (0 per acabar) : ');
READLN(x);
sumatori := sumatori + x;

END;