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;


instruccions condicionals

estructura condicional

Guia per fer els exercicis: if then | if..then..else | if..then..else anidades | case

introducció

En aquesta pràctica es descriu una de les dues estructures de programació que alteren el flux de control d'un programa, l'estructura condicional, que ens permet seleccionar una sèrie de sentències a executar i no altres en funció d'una certa condició o del valor d'una variable. En aquests casos, més que mai, és molt d'agrair l'ús de la identació (ús de tabuladors) a l'hora d'escriure les sentències que van entre cada { i la seva respectiu }, els quals delimiten un conjunt d'accions que s'executaran com un bloc: o totes o cap, i que depenen que se satisfaci una condició.

exercicis

2.1 Fer un programa que donat un nombre enter determini si és positiu, negatiu o nul.

2.2 Realitzar un programa que permeti entrar dos numeros enters i determini si un és divisor de l'altre.

2.3 Realitzar un programa que demani tres nombres per teclat i els doni ordenats de menor a major. Se suggereix pensar-lo, abans de programar-lo utilitzant llapis i paper, ja que la solució no és trivial (en efecte, donats tres nombres les possibles combinacions en les quals poden quedar ordenats són 6, i en el nostre cas hem de tenir en compte les 6 possibilitats). Encara que realment no influïx en el programa, es pot suposar que els tres nombres que s'introduiran seran diferents entre si.

instrucció if...then...

La sentència if... then... és la sentència selectiva per excel·lència i apareix en la majoria de llenguatges de programació existents, encara que de vegades canviï un xic la sintaxi. La traducció al català seria la següent: si... llavors... La forma d'usar aquesta sentència és bastant simple.

exemple 2.1

writeln( 'quest programa demana un número i li diu si és major que 10 ' )

write ('Introdueixi un número');readln(numero)

if ( numero>10 ) then

write( "El número que has introduït és major que 10" )


instrucció if...then...else

Aquesta sentència podem considerar-la com una ampliació de l'anterior (en realitat, és l'anterior la qual és una reducció d'aquesta). La forma d'usar-la és:

exemple 2.2

Program notes01;
var
nota : integer;
begin
write('entra la teva nota');readln(nota);
if nota >=5 then
writeln('estàs aprovat')
else
writeln('estàs suspès);
end.

Observeu com la instrucció que va abans de l'else no porta punt i coma.

exemple 2.3

Program notes02;
var
nota : integer;
begin
write('entra la teva nota');readln(nota);
if nota >= 5 then
begin
writeln('estàs aprovat');
writeln('==felicitats==');
end
else
begin
writeln('estàs suspès');
writeln('== t’’has 'esforçarés ===');
end;
end.

observeu com aquest exemple és igual que l'anterior amb la salvetat que cada bloc d'instrucció de la instrucció if..then..else va entre Begin i End, el motiu es que s'executa més d'una instrucció i en aquest cas s'ha d'indicar al compilador on comença i on acaba el bloc d'instruccions.


exemple 2.4

write( 'Aquest programa demana dos nombres i els escriu ordenats alfaèticament '); rite('Entreu el primer nombre:');readln(nombre1)
write ('Entreu el segon nombre:' );readln(nombre2)
write( 'Els nombres ordenats:' )
if nombre1

begin

write( nombre1, ' i ', nombre2 )
write('s''ha executat el if');

end;
else
begin

write( nombre2, ' i ', nombre1 )
write('s''ha executat el else');

end;

if...then...else....anidades

Atès que dintre de les claus { i }, tant de la part then com de la part else d'una sentència selectiva hem d'escriure sentències, això ens possibilita l'escriure noves sentències if... then... else... (o if... then... solament si no fa falta el else...) dintre d'altre if... then... else.... D'aquesta manera es poden fer condicions més complexes que serien impossibles d'altra forma.

exemple 2.5

Writeln('Calculadora utilitzant If-Then-Else');
Write('Entra el primer número:'); Read(un);
Write('Entra l’’ operador +,-,*,/');Operador:=Readkey;
Writeln;
Write('Entra el segon número:'); Readln(dos);
control:=true; {inicialització de la variable boolean}
If operador='+' then
resultat:=un+dos
Else
If operador='-' then
resultat: = un-dos
Else
If operador='*' then
resultat:=un*dos
Else
If operador='/' then
resultat:=un/dos
Else
control:=false;
if control then
begin
Writeln;
Writeln('el resultat de',un,' ',operador, ' ',dos,' és',resultat)
End;
Else
Writeln('Operador desconegut');
{si tecla diferent signes matemàtics}


case

Aquesta forma de control, l'alternativa múltiple, s'utilitza quan s'avalua una expressió que pot contenir varies dades diferents i per cada dada el programa realitza un bloc d'accions especial.

L'exemple 2.6

ilustra la calculadora senzilla de l'exemple 2.5 però en aquest cas utilitzant l'estructura alternativa múltiple.

writeln('calculadora utilitzant case');
write('entra el primer número:');readln(un);
write('entra l' operador +,-,*,/');operador:=readkey; ;
write('entra el segon número:');readln(dos)
case operador of
'+': resultat:=un+dos;
'-': resultat:=un-dos;
'*': resultat:=un*dos;
'/': resultat:=un/dos;
else {si tecla diferent als signes matemàtics}
writeln('!!operador invàlid!!');
end; {fi del case}
writeln('resultat sense format : ',resultat);
writeln('resultat amb format : ',resultat:5:2);


instruccions entrada/sortida

entrada/sortida

Guia per fer els exercicis: escriptura | assignació | lectura | referències

introducció

En aquesta pràctica aprendrem els dos tipus d'instruccions que té un programa per entrar amb contacte amb l'usuari és el que es denomina interfície d'usuari, que són:

Instruccions d'entrada: serveixen per a demanar-li a l'usuari que introdueixi una dada.

Instruccions de sortida: mostren informació a l'usuari (normalment per pantalla).

Ambdós tipus d'instruccions es denominen instruccions seqüencials, grup al que també hem d'unir la instrucció d'assignació, que no està relacionada directament amb la interfície d'usuari, però que és imprescindible conèixer per a qualsevol llenguatge de programació.

exercicis

1.1 Fer un programa que demani a l'usuari tres nombres; a continuació que escrigui en pantalla la mitjana d'aquests tres nombres, la diferència de cada nombre respecte a la mitjana i la mitjana d'aquestes diferències.

1.2 Fer un programa que demani les longituds dels dos costats d'un rectangle i que a continuació digui quant val la seva àrea.

1.3 Realitzar un programa que escrigui en pantalla el següent:

Nom de l'autor: El teu nom (en blau)

Cognoms de l'autor: Els teus cognoms (en groc)

Data de realització: la data d'avui (en vermell )


instrucció d'escriptura: write

Aquesta ordre serveix per a escriure tant cadenes de caràcters com els valors que s'enmageatzement en els identificadors. Les cadenes s'han d'escriure entre cometes simples, els identificadors aniran entre comes.

exemple 1.1

write('Benvinguts al Pascal');
writeln( '5 peres més 14 pomes són ',5+14,' peces de fruita' )
write( ' i 6+7=', 6+7 )

Observeu com la instrucció writeln; a més d'escriure salta de línia.

Com es pot veure, tot el que es posa entre cometes és tractat com una cadena, i el compilador no s'encarrega de fer els comptes; però si ho posem sense cometes, es farà l'operació que hàgim especificat atès que ho tracta com un tipus de dada numèrica.

És a dir, que tot el que va entre cometes s'escriu directament en pantalla, i el que va sense cometes es canvia pel seu valor (si és una variable) o pel resultat (si és una operació), observeu el següent exemple.

exemple 1.2

nom:='Julia Pérez'
despesa:=15000
write( nom, ' portes gastats ' ,despesa, ' euros.')

instrucció d'assignació

Aquesta és una altra instrucció seqüencial, com la d'escriptura. Serveix per a emmagatzemar una dada en una variable, de manera que després puguem fer operacions amb aquesta variable o, millor dit, amb la dada que conté.

Observeu com en el exemple anterior la variable nom emmagatzema una dada alfanumèrica i la variable despesa emmagatzema una dada numèrica.

instrucció de lectura: read

La instrucció de lectura permet demanar dades a l'usuari, de manera que els nostres programes puguin fer càlculs amb dades diferents cada vegada que s'executen.

exemple 1.3

write( 'Escriviu un número');
readln(valor1);
write ('Escriviu un altre número');
readln(valor2);
document.write('El producte dels números és', valor1*valor2 );

operadors

operadors

matemàtics | relacionals | lògics | funcions matemàtiques | funcions de cadenes

introducció als operadors de Pascal

Una expressió és una combinació de operands i operadors. Ell que Pascal fa amb les expressions és avaluar-les perquè retornin un valor al programa.

tipus d'expressions

Dintre de les expressions distingim dues classes segons el tipus de dades que retornen al ser avaluades.

Aritmètiques: les quals retornen un valor numèric

Lògiques: les quals retornen true o false.

Les expressions s'utilitzen fonamentalment en les assignacions i en les parts condicionals de les sentències if, while i repeat.

Això és pot veure en el següent exemple:

Begin

i := 1

trobat := false;

while (i < final) and (not trobat) do

begin

(* mirar el elemento en la posicion i *)

(* si es, cambiamos "encontrado" a "true" *)

i := i + 1

end

end.

L'exemple tracta d'una recerca en un conjunt ordenat d'elements. En el while es testeja: si hi ha més elements i si ancara no s'ha trobat. Si no es complix alguna de les dues condicions se surt del bucle.

avaluació d'expressions regles

Per a avaluar una expressió no cal fer gens de l'altre món, doncs és ben senzill. Només cal saber sumar, restar, si un nombre és major que un altre, ... Hi ha tres regles de prioritat a seguir per a avaluar una expressió:

Primer, els parèntesis (si té)

Després, seguir l'ordre de prioritat d'operadors

Finalment, si apareixen dos o més operadors iguals, s'avaluen d'esquerra a dreta.

operadors artimèrics i la seva prioritat

*, /, DIV, MOD

primers en avaluar-se, tots tenen igual prioritat.

+, -

últims en avaluar-se, ambdós tenen igual prioritat.

operadors relacionals

Els operadors de relació serveixen per comparar dues expressions, retornant un valor de fals o cert.

Per exemple si X=1 i Y=2 : (X+Y) < 10 és una expressió lògica que val cert. "a" > "j" és una expressió lògica que val fals

Els operadors de relació són els següents :

Operador

Significat

<

Menor

>

Major

=

Igual

<=

Menor o igual

>=

Major o igual

<>

Diferent

operadors lògics

Els operadors lògics en Turbo pascal són no i i o en angles not, and i or.
Els resultats d'actuar sobre expressions lògiques venen donats per les taules de veritat dels operadors :

A

not A

cert

fals

fals

cert

A

B

A and B

cert

cert

cert

fals

cert

fals

cert

fals

fals

fals

fals

fals

A

B

A or B

cert

cert

cert

fals

cert

cert

cert

fals

cert

fals

fals

fals

regles de prioritat

Prioritat

operadors

Més alta (1er operació executada)

not

/ , *, div, mod

and

+, -, or

Més baixa (última operació executada)

<, >, =, <=, >=, >

funcions matemàtiques predefinides

Instrucció

Funció

Abs(x)

Proporciona el valor absolut d'una variable numèrica x.

ArcTan(x)

El arc que la seva tangent és x.

Chr(x)

Retorna el caràcter ASCII d'un enter entre O i 255.

Cos(x)

Proporciona el valor del coseno d' x.

Exp(x)

L'exponencial d'x(eX).

Frac(x)

Part decimal d'x.

Int(x)

Part entera d'x.

Ln(x)

Logaritme neperià d' x.

Odd(x)

True si x és impar, y fals si és par.

Ord(x)

Ordinal d'una variable tipus ordinal x.

Pred(x)

Ordinal anterior a la variable ordinal x.

Round(x)

Senser més pròxim al valor x.

Succ(x)

Ordinal següent a la variable ordinal x.

Sin(x)

Seno de x.

Sqr(x)

Quadrat d' x.

Sqrt(x)

Rael quadrada d' x, per a x>=O.

Trunc(x)

Part sensecera d' x.

operacions amb cadenes

Les dues operacions basicas són comparar i concatenar.

L’operador de concatenació (+) S'utilitza per a reunir diverses cadenes en una sola

Exemple

Cad1:='això és un exemple';

Cad2:='de concatenacion de cadenes';

Cadr:=cad1+cad2;

Write (cadr); {visualitzaria "això és un exemple de concatenacion de cadenes"}

La funció concat realitza la mateixa funció que l'operador de concatenació.

La sintáxis és:

Function concat (cad1,cad2,...:string): string;

La cadena buida o nul·la es representa amb dos caràcters apòstrofes seguits ' '.

L'accés als elements d'una cadena individualment es fa com si anés un array.

Exemple.

Cad1:='exemple';

Per a referir-nos al primer element ficarem cad1[1] que seria la lletra i.

La funcion Length proporciona la longitud lògica d'una cadena de caràcters.

Exemple.

Longitud:=length(cad1); La variable longitud prem el valor 7.

Instrucció

Funció

COPY

Extreu una subcadena de caràcters d'altra cadena de caràcters Copy (cadl,po,num)

Po: primera posició del caracter a extreure.

Num: nombre de caràcters que s'extreuen.

Po i Num han de ser sencers

POS

Determina si una cadena és subcadena d'una altra, en cas afirmatiu retorna la posició on comença la subcadena, en cas negatiu retornaria zero.

Pos (subcadena,cadena)

DELETE

Suprimeix el numero de caràcters que li diguem d'una cadena a partir de la posició que li indiquem

Delete (Cad,Po,Num)

INSERT

Insereix una cadena de caràcters en una altra a partir d'una posicion donada.

Insert (subcadena,destinació,posicion)

Subcadena: Cadena a inserir

Destinació: Cadena on es va a inserir

Posicion: Lloc a partir del com es va a inserir

UPCASE

Retorna el caràcter majúscules

Upcase(x)

On x es una variable de tipus char.

STR

Converteix un valor numerico a la corresponent cadena de caràcters que ho representa.

Str(valor,cad)

VAL

Procediment invers a Str, és a dir, retorna el valor numèric d'una cadena.

Val(cad,variable,codigo)

Cad: la cadena a convertir en valor numerico.

Variable: el numero que s'obtingui.

Codigo: zero si s'ha pogut convertir.