Вы находитесь на странице: 1из 19

Ctedra de AED

Ficha 03: Representacin de Algoritmos

Ficha 3
Representacin de Algoritmos
1.] Tcnicas de representacin de algoritmos: Diagramas de Flujo.

Hemos mostrado en fichas anteriores que el paso previo para el desarrollo de un programa
es el planteo de un algoritmo que muestre la forma de resolver el problema que se est
enfrentando. Los problemas que hemos analizado eran lo suficientemente simples como
para que el algoritmo fuese directo: unas pocas consideraciones respecto del proceso a
realizar y luego se pudo escribir el programa sin dificultades adicionales.
Sin embargo, en la gran mayora de los casos, los problemas o requerimientos que enfrenta
un programador no son tan sencillos ni tan directos. La lgica detrs del algoritmo puede ser
compleja, con demasiadas ramas lgicas derivadas del uso de condiciones (que veremos) o
demasiado cargada con situaciones especiales. Incluso un programador experimientado
podra tener dificultades para captar la estructura de esa lgica en casos complejos, o bien,
podra querer transmitir aspectos del algoritmo a otros programadores sin entrar en
demasiado detalle de complejidad, y en este caso el idioma hablado resulta ambigo.
En casos as suele ser til contar con herramientas de representacin general de algoritmos,
tales como grficos, que permitan que un programador pueda rescatar y reflejar con ms
claridad la lgica general del algoritmo, sin tener que preocuparse (por ejemplo) de los
elementos de sintaxis especfica de un lenguaje [1].
Los diagramas de flujo y el pseudocdigo son dos de estas tcnicas que ayudan a hacer
unvoca la representacin del algoritmo. Cada una de ambas, a su vez, admite innumerables
variantes que no deben preocupar demasiado al estudiante: siempre recuerde que se trata
de tcnicas auxiliares en el trabajo de un programador, que normalmente sern usadas a
modo de borrador o ayuda circunstancial, y podr adaptarlas a sus preferencias (salvo en
casos en que el programador trabaje en un contexto en el cual se hayan acordado reglas
especiales para el planteo de un diagrama o de un pseudocdigo, y aun as, esas reglas no
significarn un problema).
Un diagrama de flujo es un grfico que permite representar en forma clara y directa el
algoritmo para resolver un problema. Se basa en el uso de unos pocos smbolos unidos por
lneas rectas descendentes. Los smbolos de un diagrama de flujo pueden clasificarse en dos
grupos, y los ms comunes de ellos se pueden ver en la Figura 1:

Smbolos de representacin de procesos: cada uno representa una operacin para


transformar datos en resultados. A modo de ejemplo, el smbolo usado para representar
instrucciones de asignacin es un rectngulo y forma parte de este grupo.

Smbolos de representacin de operaciones de entrada y/o salida: cada smbolo


representa una accin o instruccin mediante la cual se lleva a cabo alguna operacin de
carga de datos o salida de resultados a travs de algn dispositivo. En nuestros diagramas,
se usarn para representar instrucciones de carga o entradas por teclado (mediante la

Ing. Valerio Frittelli - 55

Ctedra de AED

Ficha 03: Representacin de Algoritmos

funcin input() de Python 3) y tambin para las invocaciones a la funcin de salida por
consola estndar print() de Python 3.
Figura 1: Principales smbolos usados en un diagrama de flujo.

Smbolos de procesos

Smbolos de entrada / salida

inicio / fin de
diagrama

salida por impresora


(o tambin pantalla)

asignacin

carga por teclado

condicin

acceso a disco

ciclo (instruccin
de repeticin)

subrutina

El smbolo que hemos indicado como carga por teclado originalmente se usa tanto para
indicar una entrada genrica como una salida genrica, en forma indistinta. Aqu, genrica
significa que no es necesario en ese momento indicar en forma precisa el tipo de dispositivo
a usar y slo importa rescatar que se espera una operacin de entrada o de salida. Sin
embargo, para evitar ambigedad, aqu usaremos este smbolo slo para indicar una
entrada (no una salida), normalmente desde el teclado.
Y en el mismo orden de cosas, el smbolo que hemos indicado como salida por impresora
originalmente slo se usa para eso. Pero en este contexto lo admitiremos tambin para
indicar una salida por pantalla o consola estndar. Con este par de convenciones, tratamos
de evitar confusiones en cuanto al uso de smbolos que representen carga o visualizacin en
un diagrama, pero no lo olvide: un diagrama de flujo es una herramienta auxiliar y adaptable
a las necesidades del programador. Si se trabaja en un contexto colaborativo, simplemente
deben pactarse las convenciones de representacin y facilitar as el trabajo del equipo [1].
A modo de ejemplo de aplicacin, considere el siguiente problema simple:
Problema 4.) Se conoce la cantidad total de personas que padecen cierta enfermedad en todo el
pas, y tambin se sabe cuntas de esas personas viven en una ciudad determinada. Se desea saber
qu porcentaje representan estas ltimas sobre el total de enfermos del pas.
a.) Identificacin de componentes:

Resultados:

Porcentaje de enfermos de la ciudad con respecto al total


nacional.
(pc: nmero de coma flotante (o real))

Datos:

Cantidad de enfermos (nacional).


Cantidad de enfermos (ciudad).

(cn: nmero entero)


(cc: nmero entero)

Ing. Valerio Frittelli - 56

Ctedra de AED

Ficha 03: Representacin de Algoritmos


Procesos:
Problema de clculo de porcentaje en contexto de salud humana.
El clculo del porcentaje surge de una regla de tres: La cantidad de enfermos de
todo pais (cn) equivale al 100% del total y la cantidad de enfermos en la ciudad
(cc) equivale al porcentaje pedido pc, que entonces sale de: pc = cc * 100 / cn.
La expresin anterior para el clculo del porcentaje no incluye sumas ni restas, y
los dos operadores que aparecen (producto y divisin real) son de la misma
precedencia, por lo que primero se aplicar el producto, y luego la divisin. Pero
en trminos del resultado final, sera lo mismo dividir primero y multiplicar
despus, lo que podra expresarse as: pc = cc * (100 / cn).
Note que en una situacin real, el programador debera incluir algn tipo de
validacin al cargar los valores cn y cc, para evitar que se ingresen negativos.

b.) Planteo del algoritmo: Si bien este problema es tan sencillo que slo con lo anterior ya
bastara para pasar directamente al programa, mostramos aqu el algoritmo en forma de
diagrama de flujo para comenzar a ejercitar con esa herramienta:
Figura 2: Diagrama de flujo del problema de clculo del porcentaje.
Inicio

cn, cc
pc = cc * 100 / cn
pc
Fin

Como se ve, el diagrama se construye y se lee de arriba hacia abajo. Los smbolos que lo
componen se unen entre s mediante lneas rectas verticales, y como la lectura es
descendente, se asume que esas lneas de unin tambin lo son: no es necesario hacer que
terminen en punta de flecha (aunque podra hacerse si el programador lo desea).
El diagrama comienza y termina con el smbolo de inicio / fin de diagrama (ver Figura 1). En
el inicial se escribe la palabra Inicio (o alguna equivalente) y en el de cierre se escribe la
palabra Fin (o equivalente). Para indicar que se espera la carga por teclado de los valores de
las variables cn y cc se usa el paralelogramo indicado como smbolo de carga por teclado (ver
Figura 1), escribiendo dentro de l los nombres de ambas variables. El propio clculo del
porcentaje se escribe dentro del rectngulo que representa una asignacin. Y el smbolo de
salida por impresora o pantalla se usa para indicar que se espera mostrar el valor final de la
variable cuyo nombre se inscribe dentro de l (en este caso, la variable pc).
Note que un diagrama de flujo es genrico: se plantea de forma que (en lo posible) no se
haga referencia a lenguaje de programacin alguno. La idea es que una vez planteado el
diagrama, el programador escriba el programa usando el lenguaje que quiera. No hay (no
debera haber) diagramas de flujo para Python ni diagramas de flujo para Java o Basic o
Pascal Un nico diagrama debe servir de base para un programa en cualquier lenguaje 1.

No obstante, los programadores pueden tomarse algunas licencias y relajar esta regla. Si se sabe a ciencia
cierta que el lenguaje ser Python, por ejemplo, entonces el diagrama de flujo podra incluir instrucciones con
sintaxis especfica de Python (como y = x ** 2) y nadie debera molestarse o sorprenderse por ello.

Ing. Valerio Frittelli - 57

Ctedra de AED

Ficha 03: Representacin de Algoritmos

En general, un diagrama de flujo no debe incluir indicaciones de visualizacin de mensajes en


pantalla, salvo que eso de alguna manera ayude a entender la lgica general. Por caso, note
que en el diagrama anterior se indica la carga por teclado las variables cn y cc, pero no se
incluyen los mensajes que acompaan a la carga (como "Ingrese el total nacional: " o
"Ingrese el total de la ciudad: "). Lo mismo vale en la visualizacin del resultado final pc: slo
se indica el nombre de la variable a mostrar, y se omiten los mensajes auxiliares [1].
c.) Desarrollo del programa: Si se tiene un diagrama de flujo bien estructurado, el script o
programa se deduce en forma prcticamente directa:
__author__ = 'Ctedra de AED'
# ttulo general y carga de datos...
print('Ejemplo 4 - Clculo del porcentaje de enfermos')
cn = int(input('Cantidad de enfermos en el pas: '))
cc = int(input('Cantidad de enfermos en la ciudad: '))
# procesos...
pc = cc * 100 / cn
# visualizacin de resultados...
print('Porcentaje de la ciudad sobre el total pas:', pc, '%')

2.] Tcnicas de representacin de algoritmos: Pseudocdigo.

Otra tcnica muy usada por los programadores para representar genricamente un
algoritmo, es la que se conoce como pseudocdigo. Se trata de una herramienta por medio
de la cual se plantea el algoritmo sin usar grficas, escribiendo cada accin o paso en
lenguaje natural o cotidiano, sin entrar en detalles sintcticos de ningn lenguaje aunque
respetando ciertas pautas bsicas (como la indentacin). A diferencia de un programa
terminado, el pseudocdigo est pensado para ser ledo y entendido por una persona, y no
por un computador.
Dado que el programa fuente terminado en un lenguaje especfico se conoce como el cdigo
fuente, la palabra pseudocdigo hace referencia a una forma de cdigo incompleta o
informal (o sea, un cdigo que no llega a ser completo ni riguroso).
El nivel de profundidad que se refleje en el pseudocdigo depende de la necesidad del
programador, as como el nivel de formalismo o estructuracin en el planteo de cada paso. A
modo de ejemplo, el algoritmo para el mismo problema 4 de la seccin anterior (que ya
resolvimos con el diagrama de flujo de la Figura 2) podra replantearse mediante el siguiente
esquema de pseudocdigo:
Algoritmo:
1. Cargar en cn la cantidad de enfermos del pas
2. Cargar en cc la cantidad de enfermos de la ciudad
3. Calcular y asignar en pc el porcentaje: pc = cc * 100 / cn
4. Mostrar el porcentaje pc

Est claro que tratndose de un problema tan sencillo, es posible que no sea necesaria tanta
minuciosidad o detalle en la descripcin informal de cada paso. Si se desea claridad en el
significado de cada variable o clculo, lo anterior es aceptable. Pero en muchos casos, el

Ing. Valerio Frittelli - 58

Ctedra de AED

Ficha 03: Representacin de Algoritmos

siguiente replanteo ms reducido puede ser suficiente (si los programadores conocen el
contexto del problema):
Algoritmo:
1. Cargar cn
2. Cargar cc
3. Sea pc = cc * 100 / cn
4. Mostrar pc

Como se ve, quien plantea el pseudocdigo dispone de mucha libertad para expresar cada
paso. No hay un estndar general y las convenciones y reglas de trabajo pueden variar
mucho entre programador y programador, pero en muchos mbitos se suelen aceptar las
siguientes (que son las que bsicamente emplearemos en este curso cuando se requiera el
planteo de pseudocdigo)2:
Comenzar indicando en la primera lnea el nombre del proceso que se est
describiendo, seguido de dos puntos (como veremos, esto es tpico de Python). Si no
se conoce el nombre del proceso, escriba un descriptor genrico (Algoritmo en
nuestro caso).
Enumerar cada paso en forma correlativa. Si hubiese subpasos, enumerarlos en base
al paso principal3:
Algoritmo:
1. Paso 1...
2. Paso 2...
2.1. Subpaso 2.1...
2.2. Subpaso 2.2...
3. Paso 3...

Mantener el encolumnado o indentacin general, tanto a nivel de pasos principales


como a nivel de subpasos (ver ejemplo anterior).
Mantener consistencia: si tiene (por ejemplo) dos pasos de carga, designe a ambos
de la misma forma y con el mismo estilo. El siguiente replanteo del pseudocdigo que
vimos, no respeta la consistencia:
1.
2.
3.
4.

Cargar la variable cn
Ingrese en cc un valor
Sea pc = cc * 100 / cn
Mostrar pc

Como dijimos, cada programador decide la forma y el nivel de detalle y profundidad de su


pseudocdigo. En muchos casos, se usa el criterio de plantear pseudocdigos usando una
estructura anloga a la del lenguaje que se sabe que se usar luego para el desarrollo del
programa. En general, mientras ms se basa un pseudocdigo en las reglas y convenciones
sintcticas de un lenguaje en particular, ms estructurado se dice que es ese pseudocdigo.
En nuestro caso, a lo largo del curso emplearemos pseudocdigo con bastante libertad,
aunque siguiendo una estructura bsica inspirada en Python.
2

Obviamente, existen muchas otras convenciones y reglas y tanto el estudiante como sus profesores pueden
aplicar las que deseen.
3

Veremos en la Ficha 4 que una instruccin puede estar compuesta por otras instrucciones incluidas en ella, lo
cual la hace una instruccin compuesta. En contrapartida, una instruccin simple (como una asignacin o una
visualizacin o una carga) no contiene instrucciones incluidas.

Ing. Valerio Frittelli - 59

Ctedra de AED

Ficha 03: Representacin de Algoritmos

Como ya se dijo, tanto los diagramas de flujo como el pseudocdigo son tcnicas auxiliares
de representacin de algoritmos. En teora, al plantear un diagrama o un pseudocdigo se
hace de forma genrica, tratando de no apegarse a sintaxis ni convenciones de ningn
lenguaje, aunque en la prctica esto se relaja, dado que los programadores saben en qu
lenguaje trabajarn. Pero aun as, un mismo diagrama y/o un mismo pseudocdigo debe
plantearse de forma que pueda servir como base para un programa en cualquier lenguaje. A
modo de ejemplo, si se quiere escribir un programa que cargue por teclado el nombre de
una persona y a continuacin le muestre un saludo por consola estndar, podra tener la
siguiente estructura algortmica elemental planteada como diagrama y como pseudocdigo:
Figura 3: Diagrama y pseudocdigo para el problema de cargar el nombre y mostrar un saludo
Inicio
nombre

Algoritmo:
1. Cargar nombre: nombre del usuario
2. Mostrar 'Hola' y nombre

'Hola', nombre

Fin

El diagrama y el pseudocdigo que se ven arriba, sirven sin problemas para guiar el
desarrollo de un programa en el lenguaje que prefiera el programador. Como ejemplo, los
siguientes son cuatro programas en cuatro lenguajes diferentes (Pascal, Java, C++ y Python),
que implementan el algoritmo reflejado en el diagrama y el pseudocdigo [2]:
Figura 4: El mismo algoritmo en cuatro programas con diferentes lenguajes.
Pascal:

Java:

Program Hola;
Uses CRT;
Var
nombre: String[40];
Begin
WriteLn("Ingrese su nombre: ");
ReadLn(nombre);
WriteLn("Hola ", nombre);
End.

import java.util.Scanner;
public class Hola
{
public static void main(String [] args)
{
Scanner sc = new Scanner(System.in);
String nombre;
System.out.println("Ingrese su nombre: ");
nombre = sc.nextLine();
System.out.println("Hola " + nombre);

C++:
#include<iostream>
using namespace std;
int main()
{
char nombre[20];
cout << "Ingrese su nombre: ";
cin >> nombre;
cout >> "Hola " >> nombre >> endl;
return 0;

}
}

Python:
nombre = input("Ingrese su nombre: ")
print("Hola ", nombre)

Ing. Valerio Frittelli - 60

Ctedra de AED

Ficha 03: Representacin de Algoritmos

3.] Cadenas de caracteres: elementos adicionales.

Las cadenas de caracteres o strings constituyen un tipo de dato fundamental en todo


lenguaje de programacin. Como sabemos, en Python un string se define como una
secuencia de caracteres y por lo tanto, le son aplicables todos los operadores, funciones y
mtodos propios del manejo de secuencias [3].
Un literal (o sea, una constante) de tipo string es una secuencia de caracteres delimitada por
comillas dobles o por comillas simples (o apstrofos). Hemos visto que se pueden usar
indistintamente las comillas dobles o las comillas simples, pero si se comenz con un tipo, se
debe cerrar con el mismo tipo de comilla:
nombre = "Pedro"
provincia = 'Crdoba'

Lo anterior es til, por ejemplo, si se quiere almacenar literalmente una comilla doble o
simple como parte de una cadena constante: si el delimitador usado fue comilla doble,
entonces la comilla simple puede usarse dentro de la cadena como caracter directo, y
viceversa:
apellido = "O'Donnell"
autor = 'Anthony "Tony" Hoare'

Tanto en Python como en otros lenguajes (Java, C, C++, por ejemplo) se pueden usar
caracteres especiales llamados caracteres de escape o caracteres de control. Un caracter de
escape se forma con un smbolo de barra (\) seguido de algn caracter especial que acta en
forma de cdigo: cuando Python encuentra una secuencia que corresponde a un caracter de
escape dentro de un literal de tipo string, interpreta a la secuencia \caracter como un solo y
nico caracter.
En algunos casos, el caracter de escape provoca algn efecto en la salida por consola (y no
exactamente la visualizacin del caracter). Por ejemplo, el caracter "\n" produce el efecto de
un salto de lnea en la salida por consola cuando aparece dentro de una cadena (vea los
ejemplos en la grfica siguiente):
Figura 5: Efectos de uso del caracter de salto de lnea.
print("Hola\nMundo")

Hola
Mundo

instruccin
salida en consola
Hola
Mundo

print('Hola', '\n', 'Mundo')

instruccin
salida en consola

print('Hola\n\nMundo')

instruccin

Hola
Mundo

salida en consola

Ing. Valerio Frittelli - 61

Ctedra de AED

Ficha 03: Representacin de Algoritmos

Como se puede ver en el tercer ejemplo de la Figura 5, los caracteres de control pueden
combinarse: dos \n seguidos, producen dos saltos de lnea en la consola de salida.
Por otra parte, el caracter de control \t provoca un espaciado en la consola de salida,
equivalente a una "sangra" (o "espaciado horizontal" o "Tab") (normalmente, 4 espacios en
la misma lnea, a partir del cursor). Y todos pueden combinarse, repitiendo varios del mismo
tipo o agrupando dos o ms de tipos diferentes (ver Figura 6):
Figura 6: Efectos de uso del caracter de espaciado horizontal.
print("Hola\tMundo")

Hola

Mundo

instruccin
salida en consola
Hola

print('Hola\t\tMundo')

instruccin

Mundo

salida en consola
Hola

print('Hola\n\tMundo')

Mundo

instruccin

salida en consola

Los caracteres de escape \' y \" representan literalmente comillas simples o comillas dobles
y permiten entonces su uso dentro de cadenas en forma directa, sin importar si estas
cadenas fueron abiertas con el mismo tipo de delimitador [3]:
apellido = 'O\'Donnell' # almacena: O'Donell
autor = "Anthony \"Tony\" Hoare" # almacena: Anthony "Tony" Hoare

Tambin sabemos que los caracteres individuales de una cadena se almacenan como una
secuencia con ndices numerados desde cero en adelante, y que el ndice puede usarse para
acceder a esos caracteres, sin modificarlos (recuerde que una cadena es una secuencia
inmutable):
s = 'Hola'
print('Primeras dos letras: ', s[0], s[1])
s[2] = 'r' # error...

Una variable de tipo cadena (y cualquier variable en general) contiene en realidad la


direccin del byte de memoria donde la cadena comienza (y se dice entonces que la variable
apunta a esa direccin o a esa cadena):
s = 'Hola'

Ing. Valerio Frittelli - 62

Ctedra de AED

Ficha 03: Representacin de Algoritmos

Debe quedar claro que lo que no puede hacerse es cambiar el valor de un casillero de una
cadena ya creada y almacenada en memoria. En el ejemplo anterior, el intento de cambiar
la "l" en la casilla s[2] por una "r" (o sea, s[2] = "r") provoca un error de intrprete. Pero no
hay ningn inconveniente en que una variable que apuntaba a una cadena, pase a apuntar a
otra diferente (en este caso, se crea la nueva cadena y la anterior se pierde):

s = 'Hola'
s = 'Hora'
# Ok...

Para finalizar estar seccin, resaltamos un hecho interesante: los operadores suma (+) y
producto (*) en Python tambin pueden usarse con cadenas de caracteres. El primero
permite lo que se conoce como la concatenacin o unin de dos o ms cadenas: se crea una
nueva cadena que contiene a todas las cadenas originales, en el mismo orden en que se
unieron y una detrs de la otra [3]:
nombre = 'Guido'
apellido = "van Rossum"
completo = nombre + " " + apellido
print("Nombre completo: ", completo)
# muestra: Guido van Rossum

Y el segundo permite repetir una cadena varias veces concatenando el resultado:


replicado = nombre * 4
print("Nombre repetido: ", replicado)
# muestra: GuidoGuidoGuidoGuido

4.] Aplicaciones y casos de anlisis.

Toda esta seccin est dedicada al estudio y resolucin de problemas simples basados slo
en estructuras secuenciales de instrucciones. Cada problema ser planteado en la forma que
hemos sugerido hasta ahora: comprensin general del enunciado, planteo de un algoritmo
mediante un diagrama de flujo y mediante un pseudocdigo, y finalmente el desarrollo del

Ing. Valerio Frittelli - 63

Ctedra de AED

Ficha 03: Representacin de Algoritmos

programa en Python. La numeracin de cada problema, sigue en forma correlativa a los ya


planteados en la Ficha 2 y en lo que va de esta Ficha 3.
Problema 5.) La fuerza de atraccin entre dos masas m1 y m2 separadas por una distancia d, est
dada por la siguiente frmula4 de la mecnica clsica:
1 2
= (
)
2
con G = 6.673 * 10-8 (constante de gravitacin universal)
Escribir un programa que cargue las masas m1 y m2 de dos cuerpos y la distancia d entre ellos y
obtenga y muestre el valor de la intensidad de la fuerza de atraccin entre esos cuerpos.
a.) Identificacin de componentes:

Resultados:

Intensidad de la fuerza de atraccin entre dos cuerpos 5.


(f: nmero real)

Datos:

Masa de los dos cuerpos.


Distancia entre ellos.

Procesos:
Problema de fsica. El enunciado mismo del problema ya brinda la
frmula necesaria para el clculo, la que slo debe plantearse adecuadamente
para ser ejecutada en un programa. El valor de la constante G viene dado, y por lo
tanto no debe cargarse por teclado: simplemente se asigna el valor en una
variable auxiliar G y se usa sin ms. Esa asignacin y la frmula replanteada (con
sintaxis de Python) sera:

(m1, m2: nmeros reales)


(d: nmero real)

G = 6.673 * pow(10, -8)


F = (G * m1 * m2) / d ** 2
Por razones de sencillez, se supone aqu que los datos sern ingresados de forma
que las unidades de cada magnitud sean las correctas (por ejemplo, las masas en
kilogramos y la distancia en metros) y por lo tanto el programador no deber
incluir frmulas de conversin. Tambin suponemos que las masas y la distancia
sern cargadas como positivas, pero como siempre hemos indicado, en una
situacin real el programador debera incluir algn tipo de validacin al cargar
esos datos y para evitar que se ingresen negativos o cero.

b.) Planteo del algoritmo: Mostramos tanto el diagrama de flujo como el pseudocdigo a
continuacin:

Este problema fue sugerido por la Ing. Marina Crdenas, docente de esta Ctedra, quien tambin desarroll el
script en Python para resolverlo.
5

Respecto de la gravedad, la forma en que decrece a medida que nos alejamos de la Tierra, y los problemas
que causa su ausencia en un viaje al espacio, podemos sugerir la muy taquillera pelcula Gravity (Gravedad) del
ao 2013, dirigida por Alfonso Cuarn y protagonizada por Sandra Bullock y George Clooney. Un poco ms
vieja, pero muy vigente, es la famossima Apollo 13 de 1995, dirigida por Ron Howard y protagonizada por Tom
Hanks.

Ing. Valerio Frittelli - 64

Ctedra de AED

Ficha 03: Representacin de Algoritmos

Figura 7: Diagrama de flujo y pseudocdigo del problema de clculo de la fuerza de atraccin.

Inicio
G = 6.673 * 10-8
m1, m2, d

Algoritmo:
1. Sea G = 6.673 * 10-8
2. Cargar m1: masa del primer cuerpo
3. Cargar m2: masa del segundo cuerpo
4. Cargar d: distancia entre ellos
5. Sea f = (G * m1 * m2) / d2
4. Mostrar f: intensidad de la fuerza

f = (G * m1 * m2)/d2

Fin

c.) Desarrollo del programa: En base al diagrama y/o el pseudoccdigo, el script o programa se
deduce en forma simple:
__author__ = 'Ctedra de AED'
# asignacin de constantes...
G = 6.673 * pow(10,-8)
# ttulo general y carga de datos...
print('Ejemplo 4 - Clculo de la fuerza de atraccin')
m1 = float(input('Masa del primer cuerpo: '))
m2 = float(input('Masa del segundo cuerpo: '))
d = float(input('Distancia entre ambos: '))
# procesos...
f = (G * m1 * m2) / d**2
# visualizacin de resultados...
print('Fuerza de atraccin:', f)

En este programa aparecen cinco variables, y en cuatro de ellas (m1, m2, d y f) hemos usado
nombres en minscula, mientras que la restante (G) tiene su nombre en mayscula. De
acuerdo al lenguaje que se use, existen muchas convenciones en cuanto al estilo de
designacin de nombres de variables. En Python no hay una recomendacin especial, y slo
se pide que sea cual sea la que siga el programador sea claramente distinguible. En algunos
lenguajes se recomienda que todo nombre de variable comience con minscula. En otros,
que comience con mayscula. En otros, que se usen siempre minsculas Y as por el estilo.
En el anexo de Temas Avanzados (pgina 70) de esta Ficha 3 (con la que se cierra la Unidad 1
del programa de AED), hemos incluido una descripcin ms profunda del tema de los estilos
de desarrollo de cdigo fuente. Por ahora, y slo para cerrar el anlisis del programa del
clculo de la intensidad de la fuerza de atraccin, digamos que en el desarrollo de las Fichas
de Estudio de este curso, y en los ejemplos de ejercicios y programas resueltos que se

Ing. Valerio Frittelli - 65

Ctedra de AED

Ficha 03: Representacin de Algoritmos

entreguen a los estudiantes, aplicaremos las siguientes convenciones en cuanto a nombres


de variables6:

El nombre una variable se escribir siempre en minsculas (Ejemplos: sueldo, nombre, lado).

Cuando se quiera que el nombre de una variable agrupe dos o ms palabras, usaremos el
guin bajo como separador (Ejemplos: mayor_edad, horas_extra).

Excepcionalmente designaremos en maysculas sostenidas a alguna variable que represente


algn valor muy conocido y normalmente escrito en maysculas (Ejemplos: G (por la
constante de gravitacin universal que vimos en el programa anterior), o PI (por el nmero
pi), o IVA (por nuestro bendito impuesto al valor agregado)).

Veamos otro ejemplo de problema simple:


Problema 6.) La direccin de la carrera de Ingeniera en Sistemas de la UTN Crdoba necesita un
programa que permita cargar el nombre de un estudiante de quinto ao, el nombre del profesor
responsable de la Prctica Profesional Supervisada de ese estudiante, y el promedio general (con
decimales) del estudiante en su carrera. Una vez cargados los datos, se pide simplemente mostrarlos
en la consola de salida a modo de verificacin, pero de forma que el nombre del practicante vaya
precedido de la cadena "est." y el nombre del profesor supervisor se preceda con "prof.". El promedio
del alumno debe mostrarse redondeado, sin decimales, en formato entero.
a.) Identificacin de componentes:

Resultados:

"est. " + Nombre del practicante. (nom_est_final: string)


"prof. " + Nombre del supervisor. (nom_pro_final: string)
Promedio entero redondeado del practicante. (prom_final: int)

Datos:

Nombre del practicante.


Nombre del supervisor.
Promedio real del practicante.

Procesos:
Problema de procesamiento de cadenas y redondeo de nmeros,
en un contexto de gestin acadmica. Esencialmente, se trata de mostrar los
mismos datos que se cargaron, pero modificndolos ligeramente para obtener el
formato de salida pedido.

(nom_est_orig: string)
(nom_pro_orig: string)
(prom_orig: nmero real)

En principio, agregar el prefijo "est. " al nombre del estudiante es una simple
operacin de concatenacin o unin de cadenas, cuyo resultado podra volver a
almacenarse en la misma variable donde viene el nombre original del estudiante:
nom_est_orig = 'est. ' + nom_est_orig
Sin embargo, esto hara que el dato original se pierda. En este problema en
particular no parece un inconveniente mayor ya que el enunciado no pide volver a
usar ese dato en un proceso posterior. Pero en general ser recomendable que el
programador preserve los datos originales, de forma de poder volver a usarlos
ms adelante si los necesitase. Por lo tanto, se deben almacenar los resultados de
las concatenaciones en dos variables nuevas (una para el practicante y otra para
el profesor supervisor):
nom_est_final = 'est. ' + nom_est_orig
6

No obstante, los estudiantes (e incluso sus profesores) podrn usar otras convenciones reconocidas si las
prefieren. Slo se sugiere que se mantengan consistentes con ellas.

Ing. Valerio Frittelli - 66

Ctedra de AED

Ficha 03: Representacin de Algoritmos


nom_pro_final = 'prof. ' + nom_pro_orig
Y en cuanto al promedio, el dato viene como nmero real y se est pidiendo
mostrarlo como entero redondeado, lo cual puede hacerse en forma directa con
la funcin round() provista por Python y que presentamos en la Ficha 2:
prom_final = round(prom_orig)

b.) Planteo del algoritmo: Mostramos tanto el diagrama de flujo como el pseudocdigo a
continuacin:
Figura 8: Diagrama de flujo y pseudocdigo del problema de clculo de la fuerza de atraccin.

Inicio
nom_est_orig
nom_pro_orig
prom_orig

Algoritmo:
1. Cargar nom_est_orig: nombre del estudiante
2. Cargar nom_prof_orig: nombre del profesor

nom_est_final = 'est. ' + nom_est_orig

3. Cargar prom_orig: promedio del estudiante


4. Sea nom_est_final = 'est. ' + nom_est_orig

nom_pro_final = 'prof. ' + nom_pro_orig

5. Sea nom_prof_final = 'prof. ' + nom_prof_orig


6. Sea prom_final = round(prom_orig)

prom_final = round(prom_orig)

7. Mostrar nom_est_final
8. Mostrar nom_prof_final

nom_est_final, nom_prof_final
prom_final

9. Mostrar prom_final

Fin

c.) Desarrollo del programa: En base al diagrama y/o el pseudocdigo, el script o programa se
deduce en forma simple:
__author__ = 'Ctedra de AED'
# ttulo general y carga de datos...
print('Ejemplo 6 - Datos de Prctica Profesional Supervisada')
nom_est_orig = input('Nombre del estudiante: ')
prom_orig = float(input('Promedio general: '))
nom_pro_orig = input('Nombre del profesor: ')
# procesos...
nom_est_final = 'est. ' + nom_est_orig
nom_pro_final = 'prof. ' + nom_pro_orig
prom_final = round(prom_orig)
# visualizacin de resultados...
print('Practicante:', nom_est_final, '\t-\tPromedio:', prom_final)
print('Supervisor:', nom_pro_final)

Ing. Valerio Frittelli - 67

Ctedra de AED

Ficha 03: Representacin de Algoritmos

Todas las variables de este script han sido designadas con nombres que siguen el estilo
indicado al final del problema anterior: todo el nombre en letras minsculas y el uso del
guin bajo como separador.
El siguiente problema se sugiere para aplicar propiedades del resto de la divisin:
Problema 7.) Una pequea oficina de correos dispone de cinco casillas o boxes para guardar las
cartas que debe despachar. Cada casilla (que puede contener muchas cartas) est numerada con
nmeros correlativos del 0 al 4. Cada carta que se recibe tiene un cdigo postal numrico, y en base a
ese cdigo el despachante debe determinar en qu box guardar la carta, pero de tal forma que el
mismo sistema sirva luego para saber en qu caja buscar una carta, dado su cdigo postal. Disee un
esquema de distribucin que permita cumplir este requerimiento, cargando por teclado el cdigo
postal de tres cartas y mostrando en qu casilla ser almacenada cada una.
a.) Identificacin de componentes:

Resultados:

Nmeros de las casillas donde sern almacenadas las tres cartas


recibidas.
(n1, n2, n3: nmeros enteros)

Datos:

Cdigos postales de tres cartas

Procesos:
Problema de procesamiento aplicacin de relaciones de
congruencia, en un contexto de correo postal. Est claro que el enunciado
propone un nuevo desafo: disear un esquema de distribucin de cartas, pero sin
dar muchas pistas respecto de cmo hacerlo. No hay frmulas, ni pasos evidentes
indicados en ese enunciado. Slo hay un requerimiento. Y este tipo de situaciones
son las que ms tpicamente enfrentan los programadores en su trabajo: entienda
que las personas que soliciten sus servicios no saben nada de programacin ni de
algoritmos slo pueden decirle qu datos le darn y qu tipo de resultados
esperan obtener y el resto es tarea del profesional de la programacin.

(c1, c2, c3: nmeros enteros)

Veamos: El problema es tratar de asignar a cada cdigo postal posible un nmero


de casillero, sabiendo que estos ltimos estn todos en el rango del intervalo
entero [0, 4]. Una primera idea (errnea) podra ser tomar el ltimo dgito del
cdigo postal y usar ese dgito como nmero de casillero. Pero puede verse
fcilmente que esta estrategia no funciona: si el cdigo postal termina con
cualquier dgito mayor a 4 (como 5347, o 2238), no habr un casillero identificado
con ese dgito y el sistema de distribucin fallar7.
Una idea mejor surge de observar que el rango de posibles nmeros de casilleros
es exactamente igual al conjunto de posibles restos de la divisin por 5. Entonces,
si para cada cdigo postal simplemente se toma el resto de dividir por 5, se
obtendr inexorablemente un nmero entre 0 y 4 que puede ser asignado como
nmero de casillero para la carta en cuestin. As, la carta con cdigo postal 5347
ser asignada al casillero 2 (ya que 5347 % 5 = 2) y tambin ir al casilero 2 una
carta cuyo cdigo postal sea, por ejemplo, 3672 (ya que 3672 % 5 = 2).
En definitiva, y matemticamente hablando [4], cada casillero puede ser
equiparado a Z5n: la clase de congruencia (mdulo 5) con el subndice n igual al
resto de dividir por 5, como vimos en la Ficha 2. Los nmeros 5347 y 3672
pertenecen a Z52 y por ello las cartas con esos cdigos postales van al box 2. Los
7

Aceptamos que slo funcionar si el programador tuviese la suerte de contar con exactamente 10 casilleros
en lugar de 4.

Ing. Valerio Frittelli - 68

Ctedra de AED

Ficha 03: Representacin de Algoritmos


nmeros 8761 y 9236 pertenecen a Z51 y por eso las cartas con esos cdigos irn
al box 1.
Conclusin: nuestro algoritmo slo debe tomar el resto de dividir por n = 5 a cada
cdigo postal y mostrar ese resto. El nmero 5 (la cantidad de casilleros) puede
asignarse previamente como una constante inicial n, lo cual le da al cdigo fuente
algo de flexibilidad si luego el programador debe modificarlo: si el nmero de
casillas pasa de 5 a 13, por ejemplo, el programador slo deber cambiar el valor
de n y el resto del programa seguir funcionando correctamente.

b.) Planteo del algoritmo: Mostramos tanto el diagrama de flujo como el pseudocdigo a
continuacin:
Figura 9: Diagrama de flujo y pseudocdigo del problema de distribucin de cartas.

Inicio
n=5

c1, c2, c3

Algoritmo:
2. Sea n = 5

n1 = c1 % n

1. Cargar c1, c2, c3: cdigos postales de 3 cartas


2. Sea n1 = c1 % n

n2 = c2 % n

3. Sea n2 = c2 % n
4. Sea n3 = c3 % n

n3 = c3 % n

5. Mostrar n1, n2, n3: nmeros de casillas asignadas

n1, n2, n3

Fin
c.) Desarrollo del programa: En base al diagrama y/o el pseudoccdigo, el script o programa se
deduce en forma simple:
__author__ = 'Ctedra de AED'
# asignacin de constantes...
n = 5
# ttulo general y carga de datos...
print('Ejemplo 7 - Distribucin de cartas')
c1 = int(input('Primer cdigo postal: '))
c2 = int(input('Segundo cdigo postal: '))
c3 = int(input('Tercer cdigo postal: '))
# procesos...
n1 = c1 % n
n2 = c2 % n
n3 = c3 % n

Ing. Valerio Frittelli - 69

Ctedra de AED

Ficha 03: Representacin de Algoritmos

# visualizacin de resultados...
print('Cdigo postal:', c1, '\tasignado al box: ', n1)
print('Cdigo postal:', c2, '\tasignado al box: ', n2)
print('Cdigo postal:', c3, '\tasignado al box: ', n3)

La idea general usada en este problema para calcular el nmero del box que corresponde a cada
carta es la base de una tcnica de organizacin de datos para bsqueda rpida muy eficiente,
conocida como bsqueda por dispersin de claves (o como se la designa en ingls: hashing8). El
estudio de esta tcnica est fuera del alcance de este curso: se lleva a cabo en asignaturas o cursos
avanzados de estructuras de datos, ms adelante en la Carrera.

Anexo: Temas Avanzados


En general, cada Ficha de Estudios podr incluir a modo de anexo un captulo de Temas Avanzados,
en el cual se tratarn temas nombrados en las secciones de la Ficha, pero que requeriran mucho
tiempo para ser desarrollados en el tiempo regular de clase. El captulo de Temas Avanzados podra
incluir profundizaciones de elementos referidos a la programacin en particular o a las ciencias de la
computacin en general, como as tambin explicaciones y demostraciones de fundamentos
matemticos. En general, se espera que el alumno sea capaz de leer, estudiar, dominar y aplicar
estos temas an cuando los mismos no sean especficamente tratados en clase.

a.)

Convenciones de estilo de escritura de cdigo fuente en Python: la gua PEP.

Llegados a este punto parece prudente introducir algunos conceptos referidos a


convenciones y reglas de estilo cuando se programa en Python. Entre la muy extensa
documentacin de ayuda del lenguaje, se incluyen algunos documentos oficiales que
contienen sugerencias para que los programadores escriban cdigo fuente consistente,
entendible y claro para otros programadores. Entre esos documentos se destaca claramente
el conocido como PEP (iniciales de Python Enhancement Proposal o Propuesta de Mejora de
Python)9, que contiene muchos captulos dependiendo de cul sea el tema o aspecto del
lenguaje sobre el que se estn fijando convenciones [5].
En particular, el documento o captulo PEP 8 Style Guide for Python Code10 (o Gua de
Estilos para Cdigo Python) se centra especficamente en recomendaciones de estilo de
escritura de cdigo fuente en Python, y desde PEP 8 tomamos las recomendaciones que
siguen [6]. Por supuesto, la gua PEP 8 es mucho ms extensa, y lo que mostramos en este
resumen es una seleccin de las principales convenciones de estilo aplicables a un curso que
lleva slo tres semanas de desarrollo. Por supuesto, recomendamos encarecidamente al
estudiante que se acostumbre a consultar las guas PEP por su propia cuenta, para
mantenerse actualizado en cuanto a recomendaciones, reglas y convenciones .
Todo lenguaje tiene sus convenciones y recomendaciones de estilo. Entre los programadores
Python se habla de Filosofa Python para referirse a la forma de hacer las cosas en Python.
8

En este contexto, la palabra hashing se puede entender como "desmenuzamiento" o "hacer picadillo" o
"convertir en migajas". Justamente, la accin de tomar un nmero o clave original y obtener a partir de l un
resto simple, da la idea de haber desmigajado ese nmero para tomar slo una pequea parte del mismo (el
resto) para continuar el proceso.
9

Disponible en forma completa en https://www.python.org/dev/peps/.

10

Disponible en https://www.python.org/dev/peps/pep-0008/.

Ing. Valerio Frittelli - 70

Ctedra de AED

Ficha 03: Representacin de Algoritmos

En ese contexto, si un cdigo fuente respeta las convenciones de legibilidad y sencillez de la


Filosofa Python, se dice que es un cdigo pythnico (por pythonic code), mientras que lo
opuesto (complejo y poco claro) sera un cdigo no pythnico (por unpythonic). Por lo
pronto, entonces, comenzamos transcribiendo una famosa tabla informal de principios
pythnicos que fueron presentados graciosamente en forma de aforismos por el
desarrollador Tim Peters en el documento PEP 20 (conocido como El Zen de Python11) [7]:
Figura 10: El Zen de Python

Bello es mejor que feo.


Explcito es mejor que implcito.
Simple es mejor que complejo.
Complejo es mejor que complicado.
Plano es mejor que anidado.
Disperso es mejor que denso.
La legibilidad cuenta.
Los casos especiales no son tan especiales como para quebrantar las reglas.
Aunque lo prctico le gana a la pureza.
Los errores nunca deberan dejarse pasar silenciosamente.
A menos que hayan sido silenciados explcitamente.
Frente a la ambigedad, rechaza la tentacin de adivinar.
Debera haber una -y preferiblemente slo una- manera obvia de hacerlo.
Aunque esa manera puede no ser obvia al principio a menos que usted sea holands.
Ahora es mejor que nunca.
Aunque nunca es a menudo mejor que ya mismo.
Si la implementacin es difcil de explicar, es una mala idea.
Si la implementacin es fcil de explicar, puede que sea una buena idea.
Los espacios de nombres (namespaces) son una gran idea Hagamos ms de esas cosas!

Finalmente, presentamos aqu (de la gua PEP 8) un subconjunto de las convenciones de


estilo de escritura de cdigo en Python ms aplicables en este momento del curso
(insistimos: no dude en consultar la gua PEP 8 completa para ampliar estas referencias) [6]:
- Para indentar use 4(cuatro) espacios en lugar de tabs (tabuladores). El uso de
tabuladores introduce confusin, y con 4 espacios de indentacin tendr el equilibrio
justo entre "poco" y "demasiado".
- Corte sus lneas de cdigo en no ms de 79 caracteres por lnea. Esto le ayudar a
mantener visible gran parte del cdigo fuente en pantallas pequeas, y le permitir
mostrar varios archivos de cdigo fuente uno al lado del otro en pantallas grandes.
- Use lneas en blanco para separar funciones, clases y largos bloques de cdigo dentro
de una funcin o una secuencia (veremos la forma de desarrollar funciones ms
adeltante en el curso).

11

Por extrao que parezca, PEP 20 slo contiene la tabla de aforismos que hemos transcripto (aunque, por
supuesto, en ingls). Disponible en https://www.python.org/dev/peps/pep-0020/. Y an ms curioso: estos
aforismos estn incluidos en el SDK de Python a modo de Easter Egg (Huevo de Pascua): un tipo de mensaje
oculto en un programa que slo aparece si se sabe cmo encontrarlo (normalmente con alguna combinacin
no documentada de teclas, o con alguna instruccin especial en un programa). En el caso del Zen, lo ver si
abre el shell de Python y simplemente ejecuta la instruccin >>> import this (no incluya los signos >>> que
conforman el prompt del shell).

Ing. Valerio Frittelli - 71

Ctedra de AED

Ficha 03: Representacin de Algoritmos

- Cuando sea posible, coloque sus comentarios en lneas especficas para esos
comentarios (de ser posible, no los agregue en la misma lnea de una instruccin).
- Utilice cadenas de documentacin (dostrings) [8]: mantenga actualizada la
documentacin de sus programas (veremos esto ms adelante el curso).
- Coloque espacios alrededor de los operadores en un expresin, y despus de las
comas en una enumeracin, pero no inmediatamente a los lados de cada parntesis
cuando los use: a = f(1, 2) + g(3, 4).
- No utilice codificaciones de caracteres demasiado extraas si est pensando en que
su cdigo fuente se use en contextos internacionales. En cualquier caso, el default de
Python (que es UTF-8) o incluso el llamado texto plano (ASCII) funciona mejor.
- Del mismo modo, evite el uso de caracteres no-ASCII en el nombre de un
identificador (por ejemplo, en el nombre de una variable) si existe aunque sea una
pequea posibilidad de que su cdigo fuente sea ledo y mantenido por personas que
hablen en otro idioma.
- En cuanto al uso de comillas dobles o simples para delimitar cadenas de caracteres,
no hay una recomendacin especial. Simplemente, mantenga la consistencia: si
comenz con una forma de hacerlo, apguese a ella y no la cambie a cada momento.
Cuando necesite incluir un tipo de comilla (simple o doble) en una cadena, use la otra
para delimitarla (en lugar de caracteres de control que restan legibilidad).
- Si tiene operadores con diferentes prioridades, considere agregar espacios alrededor
de los que tengan menor prioridad, y eliminar los espacios en los que tengan
prioridad mayor. Use el sentido comn. Sin embargo, nunca coloque ms de un
espacio y siempre coloque la misma cantidad de espacios antes y despus del mismo
operador.
S:

No:
m
t
h
c

=
=
=
=

p + 1
x*2 - 1
x*x + y*y
(a+b) * (a-b)

p=p+1
t= x*2-1
h = x * x + y * y
c = (a + b) * (a - b)

- Como ya se indic, en Python no hay una recomendacin especial en cuanto a


convenciones de nombres o identificadores. En general, se sentido comn: sea cual
sea la la convencin que siga el programador, debe ser claramente distinguible y
mantenerse en forma coherente. Otra vez, digamos que en el desarrollo de las Fichas
de Estudio de este curso y en los ejemplos de ejercicios y programas resueltos que se
entreguen a los estudiantes, aplicaremos las siguientes convenciones en cuanto a
nombres de variables (y de nuevo, aclaramos que los estudiantes e incluso sus
profesores podrn usar otras convenciones reconocidas si las prefieren. Slo se
sugiere que se mantengan consistentes con ellas):

El nombre una variable se escribir siempre en minsculas (Ejemplos: sueldo, nombre, lado).

Cuando se quiera que el nombre de una variable agrupe dos o ms palabras, usaremos el
guin bajo como separador (Ejemplos: mayor_edad, horas_extra).

Excepcionalmente designaremos en maysculas sostenidas a alguna variable que


represente algn valor muy conocido y normalmente escrito en maysculas (Ejemplos: PI
(por el nmero pi), o IVA (por nuestro bendito impuesto al valor agregado)).

Ing. Valerio Frittelli - 72

Ctedra de AED

Ficha 03: Representacin de Algoritmos

- Nunca utilice la l ('letra ele' minscula) ni la O ('letra o' mayscula) ni la I ('letra i'
mayscula) como nombre simple de una variable: en algunas fuentes de letras esos
caracteres son indistinguibles de los nmeros 1 y 0 y obviamente causara confusin.

Crditos
El contenido general de esta Ficha de Estudio fue desarrollado por el Ing. Valerio Frittelli, para ser
utilizada como material de consulta general en el cursado de la asignatura Algoritmos y Estructuras
de Datos Carrera de Ingeniera en Sistemas de Informacin UTN Crdoba, en el ciclo lectivo 2015.
Actuaron como revisores (indicando posibles errores, sugerencias de agregados de contenidos y
ejercicios, sugerencias de cambios de enfoque en alguna explicacin, etc.) en general todos los
profesores de la citada asignatura como miembros de la Ctedra, y particularmente los ingenieros
Karina Ligorria, Marina Crdenas, Romina Teicher, Felipe Steffolani, Gustavo Federico Bett y Julieta
Fernndez, que realizaron aportes de contenidos, propuestas de ejercicios y sus soluciones, y
sugerencias de estilo de programacin, entre otros elementos.

Bibliografa
[1] V. Frittelli, Algoritmos y Estructuras de Datos, Crdoba: Universitas, 2001.
[2] V. Frittelli, D. Serrano, R. Teicher, F. Steffolani, M. Tartabini, J. Fenndez and G. Bett, "Uso de
Python como Lenguaje Inicial en Asignaturas de Programacin," in Libro de Artculos
Presentados en la III Jornada de Enseanza de la Ingeniera - JEIN 2013, Baha Blanca, 2013.
[3] Python Software Foundation, "Python Documentation,"
https://docs.python.org/3/. [Accessed 24 February 2015].

2015.

[Online].

Available:

[4] E. Gentile, Notas de lgebra I, Buenos Aires: Eudeba, 1976.


[5] Python Software Foundation, "PEP 0 - Index of Python Enhancement Proposals (PEPs)," 2015.
[Online]. Available: https://www.python.org/dev/peps/. [Accessed 14 March 2015].
[6] Python Software Foundation, "PEP 8 - Style Guide for Python Code," 2015. [Online]. Available:
https://www.python.org/dev/peps/pep-0008/. [Accessed 14 March 2015].
[7] Python Software Foundation, "PEP 20 - The Zen of Python," 2015. [Online]. Available:
https://www.python.org/dev/peps/pep-0020/. [Accessed 14 March 2015].
[8] M. Pilgrim, "Dive Into Python - Python from novice to pro," 2004. [Online]. Available:
http://www.diveintopython.net/toc/index.html. [Accessed 6 March 2015].

Ing. Valerio Frittelli - 73

Вам также может понравиться