sessiÓ 1 introducció - upc universitat politècnica de catalunyainfapli/lab.pdf– creació o...

Post on 06-Aug-2021

0 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

SESSIÓ 1

Introducció

Maquinari i programari

Informàtica

Maquinari(hardware)

Programari(software)

Programes

ProgramacióPart física

Electrònica i circuits

Mecanismes

Computador: Màquina electrònica programable que executa seqüències d’instruccions de manera automàtica.

Computador

CPU

Memòriainterna

UnitatEnt/Sort

Perifèrics

Usuari

Sistema Operatiu

Conjunt de programes que gestionen i administren els recursosd’un computador.

Recursos: - Memòria interna- Memòria externa- Gestió d’entrades i sortides

Actua com intermediari entre el hardware del computador il’usuari.

Subministra a l’usuari tot un conjunt de programes i utilitatsper tal de fer servir el computador.

Tipus bàsics de programes• Programes per fer funcionar el maquinari:

– Sistemes operatius• Llenguatges de programació

• alt nivell• baix nivell

• Programes d’aplicacions:– Processadors de textos, editors– Fulls de càlcul– Gestors de bases de dades– Comunicacions– Gràfics

Com entrar i com sortir

COM ENTRAR:’Boot Linux’ al menú d’inici. Trigará uns minuts.Login gràfic inicial:Triar “Idioma” “Catalán”Login gràfic inicial:Triar “Sesión”“gnome”.ALERTA: NO “gnome a prueba defallos”.Introdueix el teu nom d’usuari. ALERTA: NOposis xifres amb el teclat numèric de la dreta, SIposa-les amb les xifres de la fila d’adalt.Introdueix la teva contrasenya.

Prac. Lab. Se 1 – p.3/11

Com entrar i com sortir

COM SORTIR:Un cop acabada la classe CAL apagar el PC:Surt de la sessió amb opció del menu principal(el peu) “Terminar Sesión”.i, aleshores, en el menú “Sistema” triar “Apagar”.La torre s’apaga sola.

CAL APAGAR LA PANTALLA.

Prac. Lab. Se 1 – p.4/11

Estructura del sistema de fitxers

File System• Es pot trobar a /etc/fstab.

Es l’abreviatura de file system table.• /dev/hda és el primer disc dur.

/dev/hdb és el segòn; i així succ.• /dev/hda1 /dev/hda2 són les successives

particions del 1er. disc dur.• /media/cdrom és el lector de CD i

/media/floppy és el lector de disquets.

Prac. Lab. Se 1 – p.4/11

El CD i el disquet

DESPRÉS d’haver introduït el disquet i ABANSde treballar-hi:mount /media/floppy

DESPRÉS d’haver treballat amb el disquet iABANS de retirar-lo:umount /media/floppyPel CD, el mateix umount /media/cdrom

Prac. Lab. Se 1 – p.6/11

Directoris i subdirectoris

Carpetes i apartats• A cada volum (= disc dur, disquet, CD) hi ha

un arbre

• De cada nus de l’arbre hi penjen• nusos (fulls) terminals (fitxer=arxiu)• subarbres

Prac. Lab. Se 1 – p.5/11

Quatre comandes de Linux

GNU/Linux, valen per tots els Unix• cat: Escriure, equival al type• ls: Llista contingut, equival a dir• passwd (o yppasswd): Per canviar de

password (RECORDAR!).

• pwd: Ón soc? print working directory

Prac. Lab. Se 1 – p.7/11

Exercici 1

• Muntar el disquet mount /media/floppy

• Crear un directori en el dkt que s’anomenisessio1 mkdir sessio1

• Copiar el contingut del directori/home/profia/Practiques/PRACT1 al directorique acbem de crear sessio1

• Crear un directori dins del sessio1 qu hemcreat que s’anomeni prova

• Copiar el fitxer/home/profia/Practiques/PRACT1/vayatela.ccap al /media/floppy/sessio1/prova/tela.c

• Esborrar el directori prova

Prac. Lab. Se 1 – p.8/11

El procés d’implementació

EdicióPrograma font (.c)

Compilació

Programa objecte (.o)

Muntatge

Programa executable (.exe)

Execució

• Procés d’Edició– Creació o modificació d’un fitxer de text

Hi ha diferents tipus de programes que es poden utilitzar per editar:

• Editors• Processadors de textos

• Editor– Conjunt de programes qe serveixen per editar

textos. Per ex., emacs, edit.• Processadors de textos

– Conjunt de programes que s’utilitzen per la composició de textos. Per ex., wordperfect, wordstar.

EMACS

• Conjunt de programes de domini públic per l’ajut a l’edició de programes

• Fàcil accés, es troba instal·lat en una plataforma de treball.

• Consta d’un help i tutorials que es poden consultar ‘on line’

• Cal recordar que per editar un fitxer, cal situar-se en la unitat de disc dur /home/jo

• Utilitzarem la versió GNU-EMACS

Arranqueu emacs:

emacs &

Preparació de l’editor emacs 1

• Demanem execució de l’editor emacs

• options• customize emacs• top-level customization group• programming• tools• compilation

Prac. Lab. Se 1 – p.9/11

Preparació de l’editor emacs 2

• compile command• show• Escriure a la línia ón hi havia make

gcc -c -Wall -Wmissing-prototypes-Wstrict-prototypes -ansi -Wno-main

• save for future sessions

I, després a Options activar Syntax Highlighting

Prac. Lab. Se 1 – p.10/11

Comandes bàsiques de l’emacs emacs nom_fitxer

crtl X crtl S

crtl X crtl W

crtl X crtl C

crtl G

crtl X crtl F

crtl X I

Per iniciar l’edició d’un fitxer

Salva l’estat actual d’un fitxer

Salva el fitxer amb nom nou

Acaba l’edició sense modificar el fitxer(no es guarda) Aborta qualsevol comanda

Recuperar un fitxer

Insereix un fitxer a la posició del cursor

Exercici 1.2

1) Executeu l’EMACS

2) Obriu un nou fitxer en el directori que s’anomeni prova.c

3) Entreu un text

4) Guardeu el fitxer en el disquet

El procés de compilació i muntatgeEdició

Programa font (.c)

Compilació

Programa objecte (.o)

Muntatge

Programa executable (.exe)

Execució

Conceptes d’emacs• Bloc: porció de text d’un fitxer

– Marcar Inici (botó esquerra) i Final (botó dret)– Menú Editar: Copiar...

• Buffer: zones de memòria que contenen diferents fitxers.– Menú Buffers

• Finestra: Zones en la pantalla d’emacs– CTRL-X 2

• Frame: Finestres independents en una mateixa execució d’emacs.– Menú File: New frame...

Seqüència d’accions percopiar/moure/esborrar blocs

1.- Marcar el bloc:1.1.- Posar el cursor a l’inici del bloc1.2.- Amb el butó esquerra presionat

seleccionar tot el bloc.2.- Escollir l’operació d’edició:

Esborrar: Edit + Cut Guardar: Edit + Copy Recuperar:Edit + Paste

Buffers: Diferents àrees de treball

• Llista de tots els buffers:– Menú Buffers

* Indica els buffers no salvats a disc• Canviar de buffer:

– Menú Buffers i seleccionar el buffer que es vulgui

Exercici 1.3

1) Obriu, des d’EMACS, els fitxers exemple1.c i entsort.c

2) Obteniu en dues finestres diferents els dos fitxers.

3) Copieu el bloc A (veure pag. seg. ) del fitxer entsort.c al fitxer exemple1.c

4) Guardeu els dos fitxers.

entsort.c: bloc A

void EscriureReal ( float r ){

int ret;ret = printf (“%g”, r);assert( ret > 0);

}

void LlegirEnter(int *const i){

int ret;ret = scanf("%d", i);assert(ret == 1);

}

El procés de compilació i muntatgeEdició

Programa font (.c)

Compilació

Programa objecte (.o)

Muntatge

Programa executable (.exe)

Execució

Compilació: procés de traducció d’un llenguatge a un altre llenguatge

programa font en llenguatge C (.c)

COMPILADOR de C

programa en codi màquina de la CPU del computadorprograma objecte (.o)

Compiladors de CTurboCMicrosoftCQuickCLatticeCAztecVZortecCGnuC. . .

tots poden compilar segonsl’estàndard:

ANSI - C

COMPILACIÓ en GNU-C

gcc -c -O -Wall -Wmissing-prototypes -Wstrict-prototypes -ansi-Wno-main nom_fitxer.c

Com compilar des d’EMACS?

• ESC x• En la línia de comandes de l’EMACS cal

escriure:– compile <RETORN>

• Apareixerà la comanda:– gcc -c -O -Wall -Wmissing-prototypes -Wstrict-prototypes

-Wno-main -ansi

• Al final de la comanda cal afegir el nom del fitxer que es vol compilar:– gcc -c -O -Wall -Wmissing-prototypes -Wstrict-prototypes

-Wno-main -ansi nomfitxer.c <RETORN>

El procés de compilació i muntatgeEdició

Programa font (.c)

Compilació

Programa objecte (.o)

Muntatge

Programa executable (.exe)

Execució

Muntatge (linkar): procés d’enllaç de programa objecte amb les altres unitats muntables que són necessàries per generar un programa executable.

programa objecte (.o)

MUNTATGE

programa executable codi màquina de la CPU(.exe)

Com muntar des d’EMACS?

• ESC !• En la línia de comandes de l’EMACS surt el

missatge:• Shell command:

• En la línia de comandes de l’EMACS cal entrar:

• gcc nom_fitxer.o -o nom_fitxer.exe <RETORN>

El procés de compilació i muntatgeEdició

Programa font (.c)

Compilació

Programa objecte (.o)

Muntatge

Programa executable (.exe)

Execució

Execució del procés:

programa executable (.exe)

EXECUCIÓ

Interacció amb l’usuari

Com executar?

• Des de linia de comandes:– Obrir una pantalla alfanumérica– Posar en la línia el nom del fitxer

• Des de icones:– Doble clic en la icona de l’executable

Exercici 1.41) Copieu del directori:

/home/profia/Curs/Practiques/PRACT2 els fitxers: exemple1.c, exemple2.c

exemple3.c i exemple4.c2) Realitzeu el procés de compilació, muntatge i

execució dels 4 fitxers.

3) Copieu els fitxers graus1.c, graus2.c i graus3.c(versions de l’exemple3.c). Observeu si es produeixen errors i a quina etapa es produeixen.

SESSIÓ 2

Traduccions bàsiques

DE l’Algorisme AL llenguatge CEstructura general d’un algorisme

algorisme nom algorisme definicio_constants definició_tipus

declaració variables sentències falgorisme accions_funcions

DE l’Algorisme AL llenguatge C

algorisme nom algorisme definicio_constants definició_tipus

declaració variables sentències falgorisme subprogrames

inclusions

La part d’inclusions ha de contenir els fitxers que calgui de la llibreria estàndard

- Sempre: # include <assert.h>

# include <stdio.h>

- Quan s’usin objectes de tipus booleà: # include <stdbool.h>

- Quan s’usin funcions matemàtiques: exp, log, sin ,… : # include <math.h>

Estructura general

DE l’Algorisme AL llenguatge CEstructura general

algorisme nom algorisme definicio_constants definició_tipus

declaració variables sentències falgorisme subprogrames

inclusions

void main (void) {

}

DE l’Algorisme AL llenguatge CEstructura general

algorisme nom algorisme definicio_constants definició_tipus

declaració variables sentències falgorisme subprogrames

inclusions definició_constants definició_tipus

void main (void) {

}

DE l’Algorisme AL llenguatge CEstructura general

algorisme nom algorisme definicio_constants definició_tipus

declaració variables sentències falgorisme subprogrames

inclusions definició_constants definició_tipus

void main (void) { declaració_variables sentències }

DE l’Algorisme AL llenguatge C

Estructura general

algorisme nom algorisme definicio_constants definició_tipus

declaració variables sentències falgorisme subprogrames

inclusions definició_constants definició_tipus capçaleres_subprogrames void main (void) { declaració_variables sentències } subprogrames

Definició de Constants

const

nom_const : nom_tipus =expr_const

fconst

#define nom_const expr_const

Exemple:

const

MAX: enter = 25

fconst

# define MAX 25

Declaració de Variables

var nom_variable, nom_variable: nom_tipus fvar

nom_tipus_C nom variable, nom_variable ;

Exemple:

Atenció!!var

x: enter

y, z: real

a: caràcter

b: booleà

fvar

int x;

float y, z;

char a;

bool b;

Tipus elementals

enter

real

caràcter

booleà

int

float

char

bool

Recordeu que quan s’usa el tipus booleà en C cal incloure la llibreria: # include <stdbool.h> a l’apartat d’inclusions

Assignació

nom_variable :=expressió nom_variable = expressió ;

Assignació en C:Qualsevol assignació és permesa EXCEPTE SI SÓN TAULES:

El compilador no generarà un error però l’assignació no

funcionarà correctament

Atenció!!

Operadors en expressions

− no

− !

+ − ∗ / div mod

+ − ∗ / / %

Operadors en expressions

. , [ ]−, !

*, / , %+ , −

<, >, <=, >=== , != &&

||

< > = ≠ ≤ ≥ i o

< > == != <= >= & & | |

+

_

Prioritat

Atenció!! No confondre amb l’assignació

Exemplealgorisme intercanvivar

x,y,tmp:enterfvar

LlegirEnter(x)LlegirEnter(y)tmp:= xx:= yy:= tmpEscriureEnter(x)EscriureEnter(y)

falgorisme

# include <stdio.h># include <assert.h>

void main (void) {

}

Exemple algorisme intercanvivar

x,y,tmp:enterfvar

LlegirEnter(x)LlegirEnter(y)tmp:= xx:= yy:= tmpEscriureEnter(x)EscriureEnter(y)

falgorisme

#include <stdio.h># include <assert.h>

void main (void) {int x, y, tmp;

}

Exemple algorisme intercanvivar

x,y,tmp:enterfvar

LlegirEnter(x)LlegirEnter(y)tmp:= xx:= yy:= tmpEscriureEnter(x)EscriureEnter(y)

falgorisme

#include <stdio.h># include <assert.h>

void main (void) {int x, y, tmp;LlegirEnter(&x);LlegirEnter(&y);tmp = x; x = y; y = tmp;EscriureEnter(x);EscriureEnter(y);

}

Exemple #include <stdio.h># include <assert.h>void LlegirEnter(int *const i);void EscriureEnter(int i);void main (void) {

int x, y, tmp;LlegirEnter(&x);LlegirEnter(&y);tmp = x; x = y; y = tmp;EscriureEnter(x);EscriureEnter(y);

}void LlegirEnter (int *const i) {...}void EscriureEnter(int i) {...}

algorisme intercanvivar

x,y,tmp:enterfvar

LlegirEnter(x)LlegirEnter(y)tmp:= xx:= yy:= tmpEscriureEnter(x)EscriureEnter(y)

falgorisme

Entrada / Sortida

Llenguatge Algorísmic

acció EscriureEnter (ent e: enter)

acció EscriureReal (ent r: real)

acció EscriureCaracter (ent c: caràcter)

acció LlegirEnter (sort i: enter)

acció LlegirReal (sort r: real)

acció LlegirCaràcter (sort c: caràcter)

entsort.c: Sortida en llenguatge Cvoid EscriureEnter ( int i){

int ret;

ret = printf (“%d” , i);assert( ret > 0);

}

void EscriureCaracter (char c){

putchar ( c );}void EscriureReal ( float r)

{ int ret;

ret = printf (“%g”, r);assert( ret > 0);

}

entsort.c : Entrada en llenguatge Cvoid LlegirEnter (int *const i){

int ret;ret = scanf (“%d”, i);assert ( ret ==1 );

}

void LlegirReal (float *const r{

int ret;ret = scanf (“%f”, r);assert ( ret ==1 );

}

char LlegirCaracter ( char *const c ){

*c= getchar ( );}

Exercici 2.1: Traduiu a C:algorisme Perímetre

const pi: real = 3.1416

fconst var

r, p:realfvarLlegirReal(r)p := 2.0 * pi * rEscriureReal(p)

falgorisme

SESSIÓ 3

Composicions Algorísmiques

Composicions Algorísmiques

seqüencial (vist a sessió anterior)

condicional

iterativa

Condicional

si

expressió_booleana1→ sentències1

expressió_booleana2→sentències2

. . .

fsi

if ( expressió_booleana1 ) {

sentències1

} else if (expressió_booleana2 ) {

sentències2

. . .

} else assert (0);

Condicional

La darrera línia de la sentència condicional ( } else assert (0); )

assegura una bona construcció del si.

Exemple condicional

si

x > 5 → i := 10

x < 5 → i := 20

x = 5 → continuar

fsi

if ( x > 5 ) {

i = 10;

} else if ( x < 5 ) {

i = 20;

} else if ( x == 5 ) {

} else assert(0);

Iterativa

mentre expressió_booleana fer

sentències

fmentre

while (expressió_booleana) {

sentències

}

Exemple

while ( i <= N ) {

i = i + 1 ;

}

mentre i ≤ N fer

i := i + 1

fmentre

Exercicis 3.1 i 3.2

1) Traduiu a C els algorismes potencies1 i potencies2

(veure transparències següents)

2) Editeu els programes en els fitxers potencies1.c i

potencies2.c

Les accions EscriureEnter i LlegirEnter es troben

en el fitxer entsort.c

3) Compileu, munteu i executeu el programa

resultant

algorisme potencies1var

x,z,n : enterfvarLlegirEnter (x)si

x > 0 → z := 1n := 0mentre z < x fer

z := 2 * zn := n + 1

fmentre

EscriureEnter (n)

no (x > 0) → continuarfsi

falgorisme

algorisme potencies2var

x,y,z : enterfvarLlegirEnter (x)LlegirEnter (y)si

x > 0 i y > x → z := 1mentre z < x fer

z := 2 * zfmentre

mentre z <= y ferEscriureEnter (z)EscriureCaracter(‘ ‘)z := 2 * z

fmentre

no (x > 0 i y > x ) → continuarfsi

falgorisme

Exercici 3.3

1) Traduiu a C l’algorisme producte per sumes

(veure transparència)

2) Editeu el programa en el fitxer sumes.c Les

accions EscriureEnter i LlegirEnter es troben

en el fitxer entsort.c

3) Compileu, munteu i executeu el programa,

resolent els errors de compilació i muntatge.

algorisme productevar

x,y,z : enterfvar

LlegirEnter (x )LlegirEnter (y )si

x > 0 i y>0 →{ x = X, y=Y, X, Y>0 }z := 0mentre y ≠ 0 fer

z:= z + xy:= y – 1

fmentre{ z = X• Y }EscriureEnter (z)

no (x>0 i y>0 ) → continuarfsi

falgorisme

Les precondicions i

les postcondicions

no es tradueixen!!

SESSIÓ 4

Traducció de Tipus Estructurats

Traducció del tipus taula

tipus nom_tipus = taula [rang1, rang2,… ] de nom_tipus2ftipus

typedef nom_tipus2 nom_tipus[num_elem1][num_elem2]… ;

Rang_ALG: [ a . . b ]

num_elem = b - a + 1 → Rang_C: [ 0 . . num_elem-1]

ATENCIO!!!

Traducció del tipus taula a C

inclusions

# define N valor

typedef int T1[ N] ;

prototipus_subprogrames

void main (void) {

….

}

const

N : enter = valor

fconst

tipus

T1 = taula [ 1 . . N]

de enter

ftipus

Declaració d’una variable de tipustaula en C

var

t : tipusTAU

fvar

tipusTAU t ;

Accés a una variable de tipustaula en C

variable[index]

a ≤ index ≤ b

variable[indexC]

indexC = index - a

Accés a una variable de tipus taula en C

constN : enter = 15

fconsttipus

T1 = taula [ 1 . . N]de enter

ftipusvar

t : T1fvar….t[2] := t[4] + t[5]

# define N 15

typedef int T1[ N] ;

void main (void) {

T1 t ;

…..

t[1] = t[3] + t[4];

….

Traducció del tipus tupla tipus nou_tipus = tupla cam p1:t1 cam p2:t2 … cam pN :tN ftupla ftipus

typedef struct { t1 cam p1; t2 cam p2; … ; tN cam pN ;

} nou_tipus;

tipus

t_persona = tupla

edat: enter

altura: real

ftupla

ftipus

Exemple

typedef struct {

int edat;

float altura;

} t_persona;

Declaració d’una variable de tipus tupla en C

var

t : tipusTup

fvar

tipusTup t ;

Exercici 4.1

1) Traduiu l’algorisme següent a fibotau.cL’algorisme calcula la quantitat de nombres múltiples de 3 en la seqüència dels N primers nombres de Fibonacci usant una taula de N casselles

(nota: l’ús de la taula només és per il·lustrar els conceptes de la sessió)

2) Compileu, munteu i executeu el programa resultant

algorisme fibotauconst

N : enter = 20 fconsttipus

tauFib = taula [0 . . N-1] d’enterftipusvar

fib : tauFibi, qm3 : enter

fvar fib[0] := 0; fib[1] := 1; i := 2mentre ( i < N ) fer

fib[i] := fib[i-1] + fib[i-2]i: = i + 1

fmentre

qm3 := 0; i := 0

mentre ( i < N ) fersi

fib[i] mod 3 = 0 → qm3 := qm3 + 1

no(fib[i] mod 3 = 0) → continuarfsi

i := i + 1fmentre

EscriureEnter(qm3)

falgorisme

Exercici 4.21) Traduiu l’algorisme següent a fibotup.c

L’algorisme emmagatzema els N primers nombres de Fibbonaci i després elimina els que són múltiples de 7.(nota: Es defineix i s’usa una tupla per il.lustrarels conceptes de la sessió)

2) Compileu, munteu i executeu el programa resultant

algorisme fibotupconst

N : enter = 20 fconst

tipustauFib = taula [0 . . N-1] d’entertupFib = tupla

t: tauFib {contindrà els valors de Fibbonaci}n: enter {indica el nombre d’elements a fib.t}

ftuplaftipus

varfib : tupFibi, j : enter

fvar

fib.t[0] := 0

fib.t[1] := 1

fib.n := 2

mentre fib.n < N fer

fib.t[fib.n] := fib.t[fib.n-1] + fib.t[fib.n-2]

fib.n: = fib.n + 1

fmentre

i := 0mentre i < fib.n fer

sifib.t[i] mod 7 = 0 →

j := i + 1mentre j < fib.n fer

fib.t[j-1] := fib.t[j]j := j + 1

fmentrefib.n := fib.n – 1

no (fib.t[i] mod 7 = 0) → continuarfsii := i + 1

fmentreEscriureEnter(fib.n)

falgorisme

SESSIÓ 5

AccionsSubprogrames

Funcions

Paràmetres elementals i estructurats

De l’Algorisme al llenguatge C

algorisme nom_algorisme definició_constants definició_tipus declaració_variables sentències crida_subprograma falgorisme subprogrames

inclusions definició_constants definició_tipus capçaleres subprogrames void main (void) { declaració_variables sentències crida_subprograma } subprogrames

Implementació general d’un subprograma

Capçalera {

COS}

Implementació d’accions

acció nom_acció (param_formals, param_formals, ... )

declaració_variables sentències

facció

void nom acció (param formals, param_formals,...) { declaració_variables sentències }

Implementació de funcions

funció nom_funció(param_formal,..)

retorna nom_tipus

declaració_variables

sentències

retorna expressió

ffunció

nom_tipus nom_funció ( param_formal,.. )

{

declaració_variables

sentències

return expressió ;

}

Paràmetres formals: tipus elementals i tuples

ent nom_param, ... : nom_tipus

sort nom_param, ... : nom_tipus

ent/sort nom_param,...:nom_tipus

nom_tipus nom_param

nom_tipus ∗ const nom_param

nom_tipus *const nom_param

De l’Algorisme al llenguatge C

algorisme nom_algorisme definicio_constants definició_tipus declaració_variables sentències crida_subprograma falgorisme subprogrames

inclusions definició_constants definició_tipus capçaleres subprogrames void main (void) { declaració_variables sentències crida_subprograma } subprogrames

Capçaleres de Subprogrames

Capçaleres acabades en ‘;’

Acció:void nom acció (param formal, param formal,...);

Funció:nom_tipus nom_funció ( param_formal,... );

De l’Algorisme al llenguatge C

algorisme nom algorisme definicio_constants definició_tipus

declaració variables sentències crida_acció falgorisme accions_funcions

inclusions definició_constants definició_tipus capçaleres accions funcions

void main (void) { declaració_variables sentències crida_acció } accions_funcions

Crida a una acció: Paràmetres elementals i tuples

nom_acció ( paràmetre_actual,

paràmetre_actual, ... )

nom_acció ( paràmetre_actual,

paràmetre_actual, ... ) ;

nom_variable

expressió

nom_variable &nom_variable

expressió

Exemple de traducció de capçalera:paràmetres elementals i tuples

Crida Capçalera Ús dins del’acció

Entrada nom_var tipus nom_var nom_var

Sortida &nom var tipus *constnom_var

*nom_var(*nom var).camp

Ent/Sort &nom var tipus *constnom_var

*nom_var(*nom var).camp

acció prova( ent x: enter, sort y: enter, ent/sort p: t_persona, ent/sort z: enter)

void prova ( int x, int *const y, t_persona *const p, int *const z );

Nota: per l’exemple usem el tipus tupla t_persona definit a la sessió anterior

Exemple de traducció de cos: paràmetres elementals i tuples

Crida Capçalera Ús dins del’acció

Entrada nom_var tipus nom_var nom_var

Sortida &nom var tipus *constnom_var

*nom_var(*nom var).camp

Ent/Sort &nom var tipus *constnom_var

*nom_var(*nom var).camp

acció prova ( ent x: enter, sort y: enter,

ent/sort p: t_persona ,

ent/sort z: enter)

y:= x + z

z := y + z

p.edat := p.edat + x

facció

void prova ( int x, int *const y,

t_persona *const p,

int *const z ) {

*y = x + *z ;

*z = *y + *z ;

(* p).edat = (* p).edat + x

}

Traducció de crida: elementals i tuplesCrida Capçalera Ús dins de

l’accióEntrada nom_var tipus nom_var nom_var

Sortida &nom var tipus *constnom_var

*nom_var(*nom var).camp

Ent/Sort &nom var tipus *constnom_var

*nom_var(*nom var).camp

void main (void) {

...

a = 75;

b = 20;

c = 30;

p.edat = 24; p.altura = 1.80

prova ( a, &b, &p, &c ) ;

}

algorisme exemple

...

a := 75

b := 20

c := 30

p.edat := 24; p.altura := 1.80

prova ( a, b, p, c)

falgorisme

Exemple d’ús d’una ACCIÓ...void intercanvi (int *const x,

int *const y);

void main (void) {

int a, b, c, d;a= 1; b= 2; c= 3; d= 4;intercanvi (&a, &b);

intercanvi (&c, &d);

}

void intercanvi (int *const x, int *const y)

{int tmp;tmp = *x;*x = *y;*y= tmp;

}

Crida a una funció

Sempre forma part d’una expressió

nom_funció ( paràmetre_actual,

paràmetre_actual, ... )

nom_funció ( paràmetre_actual,

paràmetre_actual, ... )

nom_variable nom_variable

Exemple de traducció de capçalera

Crida Capçalera Ús dins de la funció

Entrada nom_var tipus nom_var nom_var

funció fun_prova( ent x: enter, ent y: enter) retorna enter

int fun_prova( int x , int y );

Exemple de traducció de cosCrida Capçalera Ús dins de la funció

Entrada nom_var tipus nom_var nom_var

funció fun_prova ( ent x: enter,

ent y: enter) retorna enter

retorna (2*y + x)

ffunció

int fun_prova ( int x, int y ) {

return (2*y +x) ;

}

Exemple de traducció de cridaCrida Capçalera Ús dins de la funció

Entrada nom_var tipus nom_var nom_var

void main (void) {

...

a = 75;

b = 20;

c = fun_prova ( a, b ) ;

}

algorisme exemple

a := 75

b := 20

c := fun_prova ( a, b);

falgorisme

Exemple d’ús d’una FUNCIÓ…

int potencia (int b, int e);

void main (void){

int x, y, z;

x=4; y=7;

z = 2*x + 3 * potencia (x,2*y);

z = potencia(z , 5);

}

int potencia (int b, int e){int n , p;

n=e; p=1;while (n!=0){

p=p*b;n=n-1;

}return p;

}

Traducció de capçalera amb paràmetrestipus TAULA

Crida Capçalera Ús dins de l’acció

Entrada nom_var const tipus nom_var nom_var

Sortida nom_var tipus nom_var nom_var

Ent/Sort nom_var tipus nom_var nom_var

acció nom_accio ( ent x: t_taula, sort y: t_taula, ent/sort z: taulac )

void nom_accio ( const t_taula x, t_taula y, taulac z);

Traducció de cos amb paràmetres tipus TAULA

Crida Capçalera Ús dins de l’acció

Entrada nom_var const tipus nom_var nom_var

Sortida nom_var tipus nom_var nom_var

Ent/Sort nom_var tipus nom_var nom_var

void nom_accio (const t_taula x,t_taula y,taulac z)

{....y [0] = y [1] + x [2];z [0]= ‘a’;....

}

accio nom_accio (ent x: t_taula,sort y: t_taula,

ent/sort z: taulac)....y [0] = y [1] + x [2];z [0]= ‘a’;....

faccio

Traducció de crida amb paràmetres tipus TAULA

algorisme exemple var

a, b: t_taulac: taulac

fvara[0]:=75; a[1]:=20; a[2]:=30;b[0]:=1; b[1]:=2; b[2]:=5nom_accio (a, b, c)

falgorisme

Crida Capçalera Ús dins de l’acció

Entrada nom_var const tipus nom_var nom_var

Sortida nom_var tipus nom_var nom_var

Ent/Sort nom_var tipus nom_var nom_var

…void main(void) {

t_taula a,b;taulac c;a[0]=75; a[1]=20; a[2]=30;b[0]=1; b[1]=2; b[2]=5;nom_acció (a,b,c);

}

Exercici 5.1: Subprogrames amb paràmetres de tipus elementals i tuples

1) Traduiu l’algorisme de la transparència

següent a fibtuSub.c

L’algorisme soluciona el mateix problema

plantejat a l’exercici 4.2 usant, aquí,

subprogrames.

2) Compileu, munteu i executeu el programa resultant

algorisme fibtuSub

constN : enter = 20

fconsttipus

tauFib = taula [0 . . N-1] d’entertupFib = tupla

t: tauFib {contindrà els valors de Fibbonaci}n: enter {indica el nombre d’elements a fib.t}

ftuplaftipusvar

fib : tupFibi : enter

fvar

inicia( fib)

i := 0mentre i < fib.n fer

sifib.t[i] mod 7 = 0 → moure( i, fib)

no (fib.t[i] mod 7 = 0) → continuarfsii := i + 1

fmentre

EscriureEnter(fib.n)

falgorisme

acció inicia( sort f : tupFib )

f.t[0] := 0

f.t[1]:= 1

f.n:=2

mentre f.n < N fer

f.t[f.n] := f.t[f.n-1] + f.t[f.n-2]

f.n: = f.n + 1

fmentrefacció

acció moure( ent i : enter, ent/sort f : tupFib ) var

j: enterfvar

j := i + 1mentre j < f.n fer

f.t[j-1] := f.t[j]

j := j + 1

fmentre

f.n := f.n – 1facció

Exercici 5.2: Subprogrames amb paràmetres de tipus taules

1) Traduiu l’algorisme de la transparència

següent a fibtaSub.c

L’algorisme soluciona el mateix problema

plantejat a l’exercici 4.1 usant, aquí,

subprogrames.

2) Compileu, munteu i executeu el programa resultant

algorisme fibtaSub

constN : enter = 20

fconst

tipustauF = taula [0 . . N-1] d’enter

ftipus

varfib : tauFi, qm3 : enter

fvar

iniciaTau( fib )

qm3 := 0i := 0mentre i < N fer

mult3( fib[i], qm3)

i := i + 1

fmentre

EscriureEnter(qm3)falgorisme

acció iniciaTau( sort f: tauF)var i: enter fvar

i:=2; f[0] := 0; f[1]:= 1mentre i < N fer

f[i] := f[i-1] + f[i-2]i: = i + 1

fmentrefacció

acció mult3( ent a: enter, ent/sort q3:enter ) si

a mod 3 = 0 → q3 :=q3 + 1

no (a mod 3 = 0 ) → continuarfsi

facció

Exercici 5.3: Ús de funcions

1) Obriu un fitxer en el disquet amb nom

mult13.c

2) Traduiu l’algorisme de la transparència

següent.

L’algorisme calcula el primer número

natural múltiple de 13 i capicua.

3) Compileu, munteu i executeu el programa

resultant

algorisme mult13_capicuavar

s:enterfvars:=13mentre no (capicua(s)) fer

s := s + 13fmentreEscriureEnter( s )

falgorisme

funció capicua (ent n:enter) retorna booleàvar

x, aux, n2 : enterfvarn2 := nx := n2 mod 10aux := 0mentre n2 > 0 fer

aux := aux * 10 + xn2 := n2 div 10x := n2 mod 10

fmentreretorna ( n = aux )

ffunció

Exercici 5.4: Exemple de traducció de taules

1) Traduiu a C l’algorisme següent a digits.cAquest algorisme compta el nombre de dígits 0, 1, 2, ... ,9 que apareixen globalment en la

seqüència de múltiples de 7 menors de 10000.

2) Compileu, munteu i executeu el programa resultant

algorisme compta_digitstipus

tdigit = taula [0 . . 9] de enterftipusvar

digits : tdigitt : enter

fvariniciar_digits (digits)t := 7mentre t<10000 fer

actualitza_digits (t, digits)t := t + 7

fmentreescriure_digits (digits)

falgorisme

accio actualitza_digits (ent n: enter, ent/sort t: tdigit )var

d : enterfvar

mentre n ≠ 0 ferd := n mod 10t[d] := t[d] + 1n := n div 10

fmentrefaccio

accio escriure_digits (ent d: tdigit)var

i : enterfvar

i := 0mentre i <= 9 fer

EscriureEnter ( d[ i ] )EscriureCaracter(‘ ‘)i := i + 1

fmentrefaccio

accio iniciar_digits (sort d:tdigit)var

i: enterfvar

i:=0mentre i<=9 fer

d[i] := 0i := i + 1

fmentrefaccio

SESSIÓ 6

Exercicis de tradució

Exercici 6.1

1) Traduir a llenguatge C l’algorisme de la pàgina següent en un fitxer sessio6.c

2) Compileu, munteu i executeu el programa resultant

algorisme sessio6const

N : enter = 10fconsttipus

ttaula = taula [ 0 . . N-1 ] de caracterftipusvar

t : ttaulai, compt : enter

fvar

ObtenirParaula ( t )i := 0compt := 0mentre i < N div 2 fer

sit[i] = t[N - i - 1] → Actualitzar ( t, i, compt )no (t[i] = t[N - i - 1]) → continuar

fsi

i := i + 1fmentreEscriureEnter ( compt )EscriureFrase ( t )

falgorisme

accio ObtenirParaula ( sort a : ttaula )var

j : enterx : caracter

fvarj := 0mentre j < N fer

LlegirCaracter ( x )a [ j] := xj := j + 1

fmentrefaccio

accio Actualitzar ( ent/sort a : ttaula,ent j : enter, ent/sort c : enter )

a [N - j - 1] := ’$’

c := c + 1

faccio

accio EscriureFrase ( ent a : ttaula )

varj : enter

fvarj := 0mentre j < N fer

EscriureCaracter ( a [j] )j := j + 1

fmentre

faccio

Exercici 6.2

1) Traduiu a llenguatge C l’algorisme de la pàgina següent en un fitxer exercici.c

2) Compileu, munteu i executeu el programa resultant

algorisme exerciciconst

N : enter = 15fconsttipus

tauent = taula [ 1 . . N ] de enterftipusvar

t : tauenti : enter

fvar

i := 1mentre i ☯ N fer

t[i] := i mod ( N div 4 ) i := i + 1

fmentrei := 1mentre i ☯ N fer

tractar ( t, i )i := i + 1

fmentreEscriureEnter ( t[N] )falgorisme

accio tractar ( ent/sort t : tauent, ent i : enter )varj : enter

fvarj := 1mentre j ☯ i fer

sit[j] ≥ t[i] → t[j] := t[j] - t[i]t[j] < t[i] → continuar

fsij := j + 1

fmentrefaccio

top related