Bioinformàtica - 1er trimestre curs 2012/2013 - UPFSeminari 2
Introducció als algorismes (I)
En el següent enllaç trobareu els apunts en format PDF corresponents a la part d'introducció als algorismes.
Aquest seminari introdueix el tema de la programació i el desenvolupament d'algorismes mitjançant el llenguatge de programació Perl. Els conceptes més importants que heu d'entendre són:
Un exemple recent de desenvolupament d'un programari (software) altament complexe ha estat el que ha fet possible l'aterratge autònom del vehicle de la NASA Curiosity al planeta Mart (intenteu entendre quantes línies de codi informàtic han arribat a programar per fer això possible):
Trobareu mes informació a la plana de la missió científica a Mart de la NASA.
Malgrat aquest es un exemple d'una tasca de programació informàtica altament complexa, els conceptes fonamentals sobre els que estan desenvolupats tots els programes que han fet possible aquesta l'aterratege autònom del Curiosity són els mateixos que veurem avui a classe.
acció: és un aconteixement que té lloc en un periode de temps finit i produeix un resultat ben definit i previst.
el fet de que una acció duri un temps finit vol dir que es pot trobar
l'instant del temps en què comença i l'instant del temps en què
acaba.
informació: per tal de poder entendre el resultat
de l'algorisme, és necessari que durant el temps entre l'instant en
què comença l'algorisme i l'instant en què acaba, poguéssim
observar o obtenir informació sobre el que està passant.
estat: el conjunt d'informació observat en un
instant de temps donat (entre el principi i el final) s'anomena ''estat''.
algorisme: un algorisme és una seqüència
d'accions que ens porta d'un estat inicial a un estat final en el qual
obtenim el resultat.
la construcció d'un algorisme consisteix en descobrir quines accions elementals cal
organitzar en el temps i, també, consisteix en
escollir la forma d'organitzar-les
per tal d'obtenir el resultat.
això requereix:
constants: són valors explícits que no varien
en el curs d'execució de l'algorisme. També es coneixen com a
literals. Per exemple:
el conjunt d'operadors aritmètics en el llenguatge
Perl és el següent:
les expressions regulars són un tipus (no aritmètic) d'expressió.
quin valor imprimirà l'algorisme anterior ?
què imprimirà l'algorisme anterior, ''parell'' o ''senar'' ?
Tota composició iterativa compleix:
L'especificació d'aquestes condicions és útil a l'hora d'entendre una
composició iterativa o de dissenyar-ne una desde zero donat que,
Com ara, aquestes podrien ser les condicions inicials, finals i invariants de
l'exemple anterior:
vector: és un tipus de variable que pot emmagatzemar
més d'un valor i que permet l'accés indexat dels seus valors. També
es coneix sovint com a taula o array. Per exemple:
emmagatzema a un vector que es diu ''v'' els valors de l'u al cinc, i la
darrera instrucció imprimeix el primer valor del vector, es a dir un
1. Teniu en compte que els valors d'un vector van indexats des de la
posició 0 fins a la n-1, per un vector amb n valors.
al programa anterior fem anar una composició alternativa amb una
condició formada per una sola comparació alfanumèrica
($v[$i] eq 'T'). Si volguéssim contar el nombre de
dinucleòtids TT necessitariem construir una expressió
lògica formada per dues comparacions i un operador lògic de
conjunció. Els operadors lògics en Perl són:
on cond, cond1 i cond2 fan referencia a condicions
com ara:
el programa que ens contaria els dinucleòtids TT podria ser aquest:
Intenteu fer per a la primera sessió de problemes (Seminari 5) els següents 4 exercicis
que trobareu a les pàgines 9 i 10 dels apunts: 1.2, 1.3, 1.4, 1.6 i 1.7.
un programa és la implementació d'un algorisme en
un llenguatge de programació determinat (per exemple el Perl).
Estructures algorísmiques bàsiques
1, 2, 10, 3.1416, ''hola''
variables: una variable és un nom associat a un
espai a la memòria de l'ordinador on s'emmagatzema una constant o be
una estructura de dades.
considerarem dues classes de variables: les variables singulars
i les variables plurals.
les variables que anomenarem singulars seran aquelles que estan
associades a un únic valor, mentre que les variables que anomenarem
plurals seran aquelles que estan associades a dos o mes valors.
ens podem referir a una variable escrivint simplement el seu nom, com ara
x, v o i. No obstant, sovint utilitzarem la notació del llenguatge Perl
que distingeix explícitament el caràcter singular o plural d'una variable,
de la següent forma:
direm que a una variable li assignem un valor quan
especifiquem quin valor volem que prengui la variable. Exemples
d'assignacions són:
$a = 2
$a = 2 + 1
$a = $a + 1
expressions: anomenarem expressió a l'especificació
sintàcticament correcta d'una o més operacions sobre un conjunt de
variables, constants i funcions. Exemples d'expressions són:
1 + 1
$a + 2
3 * log($a)
($a + $b) * 2
Operador
Exemple
Resultat
Suma
$a + $b
suma de a i b
Resta
$a - $b
resta de a menys b
Multiplicació
$a * $b
producte de a i b
Divisió (quocient)
$a / $b
divisió de a per b
Divisió (residu, mòdul)
$a % $b
residu de dividir a per b
la composició seqüencial:
$a = 2;
$b = $a;
$b = $b + $a * 4;
print $b;
operadors de comparació:
Comparació
Numèrica
Alfabètica
Igual
==
eq
No igual
!=
ne
Més petit que
<
lt
Més gran que
>
gt
Més petit o igual que
<=
le
Més gran o igual que
>=
ge
la composició alternativa (o condicional):
$a = 4;
$b = 7;
$c = ($a * $b) + 1;
if ($a % 2 == 0) {
print "parell\n";
}
else {
print "senar\n";
}
la composició iterativa:
$i = 0;
$s = 0;
while ($i < 10) {
$i = $i + 1;
$s = $s + $i;
}
print $s;
què fa l'algorisme anterior ?
Disseny d'algorismes iteratius
@v = (1,2,3,4,5);
print $v[0];
els algorismes iteratius consisteixen principalment d'un esquema
algorísmic en el que una o més accions poden executar-se
repetidament sense have d'especificar-les mes d'un cop. Per exemple,
utilitzarem un algorisme iteratiu per sumar els valors d'un vector:
@v = (1,2,3,4,5);
$i = 0;
$s = 0;
while ($i < 5) {
$s = $s + $v[$i];
$i = $i + 1;
}
print $s;
suposem que al vector ''v'' tenim una seqüència d'ADN i volem
contar quants nucleòtids T hi ha en aquesta seqüència.
Això es pot resoldre de la següent forma:
@v=('A','T','T','G','C','C','T','A');
$i=0;
$n=0;
while ($i < 8) {
if ($v[$i] eq 'T') {
$n = $n + 1;
}
$i = $i + 1;
}
print "hi han ",$n," nucleotids T\n";
Operador
Significat
cond1 && cond2
conjunció cond1 i cond2
cond1 || cond2
disjunció cond1 o cond2
!cond
negació no cond
$a == 2
$v[$i] eq 'b'
$x != 3.5
$j >= 10
$v[0] ne ' '
etc..
@v=('A','T','T','G','C','C','T','A');
$i=1;
$n=0;
while ($i < 8) {
if ($v[$i] eq 'T' && $v[$i-1] eq 'T') {
$n = $n + 1;
}
$i = $i + 1;
}
print "hi han ",$n," dinucleotids TT\n";
Exercicis