sessiÓ 1 introducció - upc universitat politècnica de catalunyainfapli/lab.pdf– creació o...
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