240 likes | 419 Views
TABLAS. Sintaxis nombre_nuevo_tipo = tabla [rango, rango,...] de nombre_tipo donde rango se define como primer_rango .. ultimo_rango siendo primer_rango y ultimo_rango expresiones de constantes de tipo entero el número de elementos que se pueden guardar en la
E N D
TABLAS • Sintaxis nombre_nuevo_tipo = tabla [rango, rango,...] de nombre_tipo donde rango se define como primer_rango .. ultimo_rangosiendo primer_rango y ultimo_rango expresiones de constantes de tipo entero el número de elementos que se pueden guardar en la tabla es igual a ultimo_rango–primer_rango+1
Exemple de problema que utilitza cadenes Algoritme comparar_2paraules Var p1,p2:paraula ; j: enterfvar j := 1;p1[j] := LlegirCaràcter() mentre p1[j] != ‘ ‘ fer j := j+1 p1[j] := LlegirCaràcter() fmentre p1[j]:= NUL mentre p2[j] != ‘ ‘ fer j := j+1 p2[j] := LlegirCaràcter() fmentre p2[j]:= NUL
Si p1>p2 llavors j := 1; mentre p1[j] != NUL fer EscriureCaràcter(p1[j]) j := j+1 fmentre sino j := 1; mentre p2[j] != NUL fer EscriureCaràcter(p2[j]) j := j+1 fmentre fsi falgoritme
#include <string.h> typedef char paraula[20]; void main(void){ paraula p1,p2; cin>>p1; cin>>p2; If (strcmp(p1,p2) == 0){ cout<<“ Son iguals”<<endl;} else if (strcmp(p1,p2) < 0){ cout<< p1<< “Es menor”;} else { cout<<p2<<“Es menor”;} }
Llegir dues matrius de N*N, i escriure el resultat de sumar-les Definir tipus matriu Definir variables tipus matriu Llegir les dues matrius Escriure el resultat de sumar-les component a component
Llegir matriu per j en [1..N] fer ; accedir a cada fila per k en [1..N] fer ; accedir a cada columne m1[j,k] := LlegirEnter() fper fper Ex: Si N és 2 I l’entrada 2 3 5 7 j = 1 k= 1 m1[1,1] --- 2 j = 1 k= 2 m1[1,2] --- 3 j = 2 k= 1 m1[2,1] --- 5 j = 2 k= 2 m1[2,2] --- 7
Algoritme sumar_2matrius const N: enter = 20 fconst tipus matriu = taula [1..N,1..N] deenter ftipus var m1, m2 :matriu; j,k: enterfvar per j en [1..N] fer per k en [1..N] fer m1[j,k] := LlegirEnter() fper fper per j en [1..N] fer per k en [1..N] fer m2[j,k] := LlegirEnter() fper fper
Escriure la suma per j en [1..N] fer per k en [1..N] fer EscriureEnter (m1[j,k] + m2[j,k]) fper fper
Algoritme sumar_2matrius const N: enter = 20 fconst tipus matriu = taula [1..N,1..N] deenter ftipus var m1, m2 :matriu; j,k: enterfvar per j en [1..N] fer per k en [1..N] fer m1[j,k] := LlegirEnter() fper fper per j en [1..N] fer per k en [1..N] fer m2[j,k] := LlegirEnter() fper fper per j en [1..N] fer per k en [1..N] fer EscriureEnter (m1[j,k] + m2[j,k]) fper fper
Llegir dues matrius de N*N, i escriure el resultat de multiplicar-les Definir tipus matriu Definir variables tipus matriu Llegir les dues matrius Multiplicar-les Escriure el resultat
Multiplicar dues matrius A cada component jk de la matriu resultant guardar el resultat de sumar el producte de cada element de la fila j de la primera matriu amb cada element de la columne k de la segona M1 M2 1 2 3 5 6 7 2 1 3 9 11 13 3 2 1 15 14 5 M3 1*5+2*9+3*15 1*6+2*11+3*14 1*7+2*13+3*5 2*5+1*9+3*15 2*6+1*11+3*14 2*7+1*13+3*5 3*5+2*9+º*15 3*6+2*11+1*14 3*7+2*13+1*5 per j en [1..N] fer ; accedir a cada fila per k en [1..N] fer ; accedir a cada columne m3[j,k]=0 per l en [1..N] fer ; calcular el sumatori de producte de m3[j,k] = m3[j,k]+m1[j,l] * m2[l,k] fper fper fper
Algoritme producte_2matrius const N: enter = 20 fconst tipus matriu = taula [1..N,1..N] deenter ftipus var m1, m2 ,m3:matriu; j,k,l: enterfvar per j en [1..N] fer per k en [1..N] fer m1[j,k] := LlegirEnter() fper fper per j en [1..N] fer per k en [1..N] fer m2[j,k] := LlegirEnter() fper fper per j en [1..N] fer ; accedir a cada fila per k en [1..N] fer ; accedir a cada columne m3[j,k] := 0 per l en [1..N] fer ; calcular el sumatori de producte de m3[j,k] = m3[j,k] +m1[j,l] * m2[l,k] fper fper fper per j en [1..N] fer per k en [1..N] fer EscriureEnter (m3[j,k]) fper fper
Determinar si tots els elements de la diagonal d’una matriu són 0 Plantejat com una cerca: Trobar el primer element de la diagonal que NO sigui 0 Algoritme Determinar si diagonal es 0 const N: enter = 20 fconst tipus matriu = taula [1..N,1..N] deenter ftipus var m:matriu; j,k: enter ; trobat : booleàfvar per j en [1..N] fer per k en [1..N] fer m1[j,k] := LlegirEnter() fper fper
trobat := fals ; j:= 1 mentre j<= N i no trobat fer si m[j,j] != 0 llavors trobat := cert fsi j:= j +1 Fmentre Si trobat llavors EscriureCaràcter(‘N’) sino EscriureCaràcter(‘S’) fsi
Algoritme Determinar si diagonal es 0 const N: enter = 20 fconst tipus matriu = taula [1..N,1..N] deenter ftipus var m:matriu; j,k: enter ; trobat : booleàfvar per j en [1..N] fer per k en [1..N] fer m1[j,k] := LlegirEnter() fper fper trobat := fals ; j:= 1 mentre j<= N i no trobat fer k:= 1 mentre k<= N i no trobat fer si j = k I m[j,k] != 0 llavors trobat := cert fsi k:= k +1 fmentre j:= j +1 fmentre si trobat llavors EscriureCaràcter(‘S’) sino EscriureCaràcter(‘S’) fsi
Algoritme Cercar número const N: enter = 20 fconst tipus matriu = taula [1..N,1..N] deenter ftipus var m:matriu; j,k,num: enter ; trobat : booleàfvar per j en [1..N] fer per k en [1..N] fer m[j,k] := LlegirEnter() fper fper num := LlegirEnter() trobat := fals ; j:= 1 mentre j<= N i no trobat fer k:= 1 mentre k<= N i no trobat fer si m[j,k] = num llavors trobat := cert fsi k:= k +1 fmentre j:= j +1 fmentre si trobat llavors EscriureCaràcter(‘S’) sino EscriureCaràcter(‘N’) fsi
Algoritme Cercar número igual a suma de coordenades const N: enter = 20 fconst tipus matriu = taula [1..N,1..N] deenter ftipus var m:matriu; j,k: enter ; trobat : booleàfvar per j en [1..N] fer per k en [1..N] fer m[j,k] := LlegirEnter() fper fper trobat := fals ; j:= 1 mentre j<= N i no trobat fer k:= 1 mentre k<= N i no trobat fer si m[j,k] = j+k llavors trobat := cert fsi k:= k +1 fmentre j:= j +1 fmentre si trobat llavors EscriureCaràcter(‘S’) sino EscriureCaràcter(‘N’) fsi
Determinar si una matriu és simètrica Plantejat com una cerca: Trobar el primer element de la matriu que no sigui simètric Algoritme Determinar si es simetrica const N: enter = 20 fconst tipus matriu = taula [1..N,1..N] deenter ftipus var m:matriu; j,k: enter ; trobat : booleàfvar per j en [1..N] fer per k en [1..N] fer m1[j,k] := LlegirEnter() fper fper
trobat := fals ; j:= 1 mentre j<= N i no trobat fer k:= 1 mentre k<= N i no trobat fer si m[j,k] != m[k,j] llavors ; condició de no simètric trobat := cert fsi k:= k +1 fmentre j:= j +1 Fmentre Si trobat llavors EscriureCaràcter(‘n’) sino EscriureCaràcter(‘S’) fsi
trobat := fals ; j:= 1 mentre j<= N i no trobat fer k:= 1 mentre k<j i no trobat fer ; millora: només accedir si m[j,k] != m[k,j] llavors ; a la matriu inferior trobat := cert fsi k:= k +1 fmentre j:= j +1 Fmentre Si trobat llavors EscriureCaràcter(‘n’) sino EscriureCaràcter(‘S’) fsi
Taula de taules tipus tparaules = taula[1..20] de paraula paraula = taula[1..25] de caràcter Ftipus Var tp: tparaules; j,k:enter fvar
Legir seqüència de paraules acabada en “.” i una nova paraula i cercar aquesta paraula a la taula de paraules Algoritme cercar Var tp: tparaula; j,k:enter; p:paraula fvar k:= 1; j := 1;tp[j][k] := LlegirCaràcter() mentre tp[j][k] != ‘ ‘ fer k := k+1 tp[j][k] := LlegirCaràcter() fmentre tp[j][k] := NUL Mentre tp[j] != “.” fer j:= j+1 ; k:= 1; tp[j][k] := LlegirCaràcter() mentre tp[j][k] != ‘ ‘ fer k := k+1 tp[j][k] := LlegirCaràcter() fmentre tp[j][k] := NUL fmentre
j := 1;p[j] := LlegirCaràcter() mentre p[j] != ‘ ‘ fer j := j+1 p[j] := LlegirCaràcter() fmentre p[j] := NUL; trobat := fals; j:= 1 Mentre tp[j]!= “.” i no trobat fer si tp[j] = p llavors trobat := cert fsi j:= j+1 Fmentre Si trobat llavors EscriureCaràcter(‘S’) sino EscriureCaràcter(‘N’) fsi