Beruflich Dokumente
Kultur Dokumente
Introduccin
Uno de las mayores dificultades con las que se encuentran los hispanoparlantes que empiezan a programar es el idioma. Por una parte, la mayora de lenguajes de programacin se basan en el ingls, por lo que un estudiante de habla hispana tiene que aprender que "write" o "print" son las palabras equivalentes a "escribir". Adems, la mayora de lenguajes tienen rdenes que realmente son abreviaturas de una o varias palabras inglesas, de modo que el aprendiz tiene que entender o memorizar palabras como "printf" o "writeln" incluso para realizar las tareas ms sencillas. Para colmo, la mayora de entornos de programacin estn tambin en ingls (mens, mensajes de error y aviso, etc). Por eso, una herramienta habitual para ayudar a los que empiezan es el "Pseudocdigo", algo as como un falso lenguaje de programacin en espaol, que permite asimilar con ms facilidad las ideas bsicas. El pseudocdigo soluciona el primer problema: no hace falta aprender otros idiomas para entender los conceptos bsicos. Pero "histricamente" no solucionaba el problema del "entorno de programacin": no existan entornos para programar en pseudocdigo, as que tpicamente ha sido una herramienta para usar "con lapiz y papel". Algunas universidades han creado sus propios "intrpretes de pseudocdigo", para ayudar a los alumnos de primer curso a crear los programas "pensando en espaol", pero permitindoles adems probar esos programas desde un entorno "casi real". En cuanto a estos "intrpretes de pseudocdigo", que permiten teclear nuestro programa y ver cual sera el resultado, hay uno que me parece especialmente bueno: PSEINT, que adems realza con colores la sintaxis de nuestros programas para ayudar a detectar errores, tiene autocompletado para permitir ganar tiempo, est disponible para Windows y Linux, es gratuito (1), etc. ste es el que usaremos en este curso introductorio. Eso s, no existe un estndar claro en cuanto a pseudocdigo, puede que la sintaxis que empleen en tu universidad o centro de estudios sea ligeramente diferente a la que veremos aqu. Aun as, esperamos poder ayudarte a coger con facilidad las nociones bsicas. (1) PSEINT realmente es "de cdigo abierto": cualquiera puede ver cmo est creado, de forma que incluso si su autor perdiera el inters por el proyecto, otras personas podran retomarlo, lo que le garantiza una vida mucho mayor. PSEINT se puede descargar desde http://pseint.sourceforge.net/
que sea relativamente difcil incluso que otro programador tome el proyecto en su lugar para solucionar alguno de los problemas que tiene o para aadirle ms posibilidades. Si no te asusta el ingls, bien porque lo conozcas o bien porque ests dispuesto a aprender 30 palabras, ests de suerte: el pseudocdigo en ingls se parece a varios lenguajes de programacin, as que podras aprender los conceptos bsicos usando "entornos reales". Posiblemente Pascal sera el lenguaje que ms se parecera al pseudocdigo, y por eso durante mucho tiempo se ha considerado un lenguaje muy adecuado para aprender. Pero como ya hay muchos cursos de Pascal, vamos a optar por otra alternativa ms moderna: el lenguaje Python, bien diseado y que est disponible para muchos sistemas operativos. Por eso, veremos tambin cmo dar los pasos bsicos usando Python. Para descargar Python: en muchos sistemas, como Linux, no es necesario: forma parte del sistema bsico; pero si, como la mayora, usas Windows, Python no est preinstalado en tu sistema, tendras que descargarlo (gratuitamente, claro) desde http://www.python.org/download/
2-Toma de contacto
Vamos a empezar por lo ms sencillo: escribir en pantalla. Si queremos crear un programa que escriba algo en pantalla, usaremos la orden ESCRIBIR. A continuacin de esta palabras, entre comillas, escribiremos el texto que queremos que aparezca en pantalla.
Escribir "Hola"
Crear un programa que escriba Hola en la pantalla usando PSEINT tambin es igual de simple. En el caso de PSEINT, cada programa debe encerrarse entre las palabras "Proceso" (para indicar dnde comienza) y "FinProceso" (para sealar dnde termina). Pero eso no aade ninguna dificultad, porque cuando entramos a PSEINT, ese esqueleto de programa ya aparece escrito:
Nuestro programa debera tener un nombre: se nos propone que se llame "sin_titulo", pero mejor podemos hacer clic en esa palabra y escribir otro ttulo que recuerde mejor lo que va a hacer nuestro programa. De momento, bastar con "Ejemplo001", por eso de que es nuestro primer ejemplo. Despus, bajamos a la siguiente lnea y comenzamos a teclear la palabra "Escribir". Veremos que PSEINT se da cuenta, y nos recuerda cmo era la orden exacta, incluso cuando apenas llevamos unas pocas letras :
Cuando terminamos la palabra "Escribir", se nos propone que escribamos una o ms expresiones, separadas por comas; en nuestro caso, ser la palabra "Hola", entre comillas:
Nuestro programa est completo: podemos comprobar su funcionamiento pulsando el botn que recuerda al "Play" de los equipos de msica:
Y entonces aparecer una nueva ventana que nos muestra el resultado de nuestro programa (por supuesto, se trata de la palabra Hola):
Por supuesto, no slo podemos escribir textos prefijados. Podemos usar nuestro ordenador como calculadora, que nos muestre el resultado de una operacin aritmtica:
Proceso Ejemplo002 Escribir 20+30 FinProceso
Y como despedida por hoy, vamos a hacer algo un poco ms complejo: vamos a sumar dos nmeros que no estn prefijados dentro del programa, sino que deber teclear el usuario. Para eso, usaremos la orden "Leer", que nos permite leer lo que el usuario teclee y dejarlo guardado para utilizarlo despus. Debemos dar un nombre temporal a estos datos que leemos del usuario. Parece razonable que el primer nmero que teclee el usuario se llame algo como "primerNumero", y el segundo sea algo como "segundoNumero". El resultado que queremos obtener ser la suma de ese primer nmero y ese segundo nmero, as que nuestro programa podra quedar as:
Proceso Ejemplo003 Escribir "Dime un numero" Leer primerNumero Escribir "Dime otro numero" Leer segundoNumero Escribir "Su suma es ", primerNumero + segundoNumero FinProceso
En la prxima entrega puntualizaremos un poco ms lo que hemos hecho en este ltimo programa y veremos cmo comprobar condiciones. Eso ser dentro de una semana...
Y en Python?
En primer lugar, veamos la instalacin del entorno. Es poco ms que descargarlo de Internet y hacer clic en los botones de "Siguiente", pero vamos a verlo con detalle: Para descargar Python basta con entrar a su pgina oficial (python.org), dentro del apartado de Descargas (download):
Elegimos la versin que queremos descargar. En el momento de escribir este texto, las ltimas son la 3.1.2 (dentro de la "gama nueva") y la 2.7 (dentro de la "serie antigua"). Existen dos versiones paralelas porque la "serie antigua" es ligeramente incompatible con la nueva. Como nosotros no tenemos que trabajar con programas antiguos con Python, no tenemos por qu escoger la versin "antigua" y podemos optar por la versin 3, la nueva. Aun as, las capturas que incluyo a continuacin corresponden a la versin 2.7, para Windows. Descargamos el "Windows Installer" (instalador de Windows), que tendr cerca de 15 Mb de tamao:
Cuando lo recibamos, hacemos doble clic y Windows nos avisar del posible riesgo de seguridad:
Como sabemos que no es peligroso, decimos que S lo queremos "Ejecutar" y se nos preguntar si es slo para nosotros o para todos los usuarios con los que compartamos nuestro ordenador:
Se nos preguntar qu opciones queremos instalar (basta con aceptar lo que se nos propone):
Aparecer un nuevo "grupo de programas" en nuestro Men de Inicio de Windows, y en ese grupo de programas aparece IDLE, que es el editor de Python para Windows:
Y desde IDLE podemos crear y probar nuestros programas (pero no tengas prisa en entender todo lo que aparece en esta captura, lo iremos viendo poco a poco... ;-D )
Vamos a ver cmo quedaran nuestros primeros programas en Python: Para escribir, se usa la orden "print", a la que se le indica entre parntesis lo que queremos escribir. Si es un texto puro, deber estar entre comillas:
print ("Hola")
(Nota: en versiones antiguas de Python no era necesario usar parntesis en la orden "print"; en Python 3 y posteriores s lo es) En cuanto pulsemos "Intro", se muestra directamente el resultado de nuestra orden. Al contrario que en PseInt, no es necesario indicar el principio y el final del programa (o proceso). De igual modo, podemos hacer operaciones matemticas. Para escribir, se puede usar la misma orden "print" (aunque en Python existen formas an ms rpidas), pero sin comillas:
print (20+30)
Y si queremos que sea el usuario el que introduzca los datos, usaremos la orden "input". De modo que el programa que pide dos datos al usuario y muestra su resultado podra ser:
print ("Dime un numero") primerNumero = input() print ("Dime otro numero") segundoNumero = input() print ("Su suma es ") print (primerNumero + segundoNumero)
Puede que en versiones "modernas" de Python, 3.x o superiores, si introducimos los nmeros 3 y 5 se nos diga que su suma es 35. Esto se debe a que est tomando ese 3 y ese 5 como cadenas de texto, y el smbolo de suma (+) se puede utilizar tambin para unir (concatenar) varias cadenas en una. La forma de evitarlo es decirle que tome esos datos como nmeros enteros antes de sumar. Para eso, usaremos la palabra "int", e indicaremos entre parntesis lo que queremos que se trate como un nmero entero. As, la versin correcta en Python 3 del programa anterior (y que tambin funcionar correctamente en las ltimas versiones 2.x) sera:
print ("Dime un numero") primerNumero = int( input() ) print ("Dime otro numero") segundoNumero = int( input() ) print ("Su suma es ") print (primerNumero + segundoNumero)
En programas un poco ms largos, como ste, quiz no nos interese teclearlo de modo interactivo, obteniendo inmediatamente la respuesta a cada orden, sino que puede ser mejor teclear todo el programa y despus ponerlo en funcionamiento. Eso tambin es sencillo de hacer: Creamos una ventana nueva en el editor, entrando al men "File" y escogiendo la opcin "New window":
Para ponerlo en funcionamiento, entramos al men "Run" y escogemos la opcin "Run Module":
Si todava no habamos guardado en disco nuestro programa, se nos pedir que lo hagamos:
Como curiosidad poco importante, en Python se pueden fundir en un solo paso las acciones de avisar al usuario de lo que queremos y leer l dato que dicho usuario introduzca: la orden "input" permite indicar el texto de aviso, de modo que nuestro programa podra ser simplemente as, para Python 2.x:
primerNumero = input ( "Dime un numero " ) segundoNumero = input ( "Dime otro numero " ) print ("Su suma es ") print (primerNumero + segundoNumero)
y para Python 3
primerNumero = int (input ( "Dime un numero " )) segundoNumero = int (input ( "Dime otro numero " )) print ("Su suma es ") print ( primerNumero + segundoNumero )
De ahora en adelante usaremos esa ltima sintaxis (incluyendo "int") en los ejemplos, para que funcionen correctamente en cualquier versin reciente de Python.
Esas dos palabras, "primerNumero" y "segundoNumero" representan a nmeros que no tienen un valor prefijado. Eso es lo que llamaremos "variables". En las variantes de pseudocdigo que emplean en muchas universidades y centros de estudio (ya habamos avisado de que no existe ningn estndar totalmente asentado) debemos "declarar las variables" antes de usarlas: decir qu tipo de dato es el que querremos representar con ese nombre. En nuestro ejemplo anterior se trataba de dos nmeros enteros, as que el programa sera:
Proceso Ejemplo003b Variable primerNumero: Entero Variable segundoNumero: Entero Escribir "Dime un numero" Leer primerNumero Escribir "Dime otro numero" Leer segundoNumero Escribir "Su suma es ", primerNumero + segundoNumero FinProceso
Esto se debe a que en la mayora de lenguajes de programacin "reales" es necesario detallar qu tipo de datos querremos guardar en cada variable, para que la herramienta de programacin sepa exactamente qu cantidad de memoria ser necesaria para guardar ese dato. Insisto: no es el caso de PSEINT; con esta herramienta no es necesario declarar las variables, el propio entorno presupone de qu estamos hablando.
Por otra parte, no siempre querremos que el valor de una variable lo introduzca el usuario. Habr veces que seamos nosotros mismos los que demos el valor inicial a una variable desde nuestro programa, bien para usarlo en una serie de clculos posteriores, o bien por legibilidad (es ms fcil entender algo como "longitudCircunferencia = 2 * pi * radio" que algo como "longitudCircunferencia = 6.28 * radio". La forma de dar un valor a una variable es con la secuencia de smbolos "<-":
radio <- 3 longitudCircunferencia <- 2 * pi * radio
(esos smbolos representan una flecha, para indicar que el valor 3 se va a guardar en el espacio de memoria reservado para la variable llamada "radio"). Y qu ocurre si usamos una variable sin haberle dado valor? Esto pasa a veces por despiste, si tecleamos mal el nombre de una variable, como en este fragmento de programa:
primerNumero <- 2 Escribir primerNmero
Si lees ese fragmento con cuidado, vers que el nombre de la variable que aparece en la segunda lnea es incorrecto, falta la letra "u". Qu sucede en ese caso? En algunos lenguajes (pocos, afortunadamente) se da por sentado que es una variable nueva, y se le da el valor 0; en el caso de PseInt, igual que en la mayora de lenguajes actuales, obtendremos un mensaje de error que nos dir que estamos usando una variable que no tena valor. En la prxima entrega veremos cmo comprobar condiciones...
Y en Python?
Se aplican las mismas ideas: se puede usar variables, y no hace falta "declararlas". Su valor lo puede introducir el usuario, si lo indicamos con la orden "input" (que vimos en el tema anterior) o lo podemos fijar desde programa usando el smbolo "=" (en vez de la flecha "<-"), as:
radio = 3 longitudCircunferencia = 2 * pi * radio
Al igual que en PseInt, si intentamos usar una variable que no tiene valor (porque no se lo hemos dado nosotros ni lo ha introducido el usuario), obtendremos un mensaje de error.
El bloque "Si No" es opcional: podemos optar por no indicar lo que queremos que se haga cuando no se cumpla la condicin. Para ayudarnos a planificar el comportamiento de una secuencia de instrucciones, se suele usar como ayuda los llamados "diagramas de flujo". En estos diagramas, una condicin se representa como un rombo, del que salen dos flechas: una para la secuencia de acciones a realizar si se cumple la condicin y otra para cuando no se cumple:
As, si en PSeInt hacemos clic en el icono de la parte derecha que representa la condicin SI, aparece un esqueleto de programa casi completo, para que hagamos los cambios que nos interesen:
Slo tenemos que escribir la condicin que realmente nos interesa, y la serie de pasos a dar si se cumple y si no se cumple, de modo que nuestro programa podra quedar as:
Proceso Ejemplo004 Escribir "Dime un numero" Leer primerNumero Escribir "Dime otro numero" Leer segundoNumero Si primerNumero > segundoNumero Entonces Escribir "El primero es mayor" Sino Escribir "El segundo es mayor" FinSi FinProceso
En ese ejemplo hemos comparado si un valor es mayor que el otro (>). Los operadores de comparacin que tenemos disponibles son:
Ejemplo
3>2 'ABC'<'abc' 4=3 4>=5
Tambin podemos comprobar varias condiciones a la vez, para hacer construcciones como: "si a es mayor que b y b es mayor que c", o como "si a es igual a 1 o b es igual a 1". Los operadores lgicos que de los que disponemos son:
Ejemplo
Conjuncin (y). (7>4) & (2=1) //falso Disyuncin (o). (1=1 | 2=1) //verdadero Negacin (no). ~(2<5) //falso
Y en Python?
La orden "si" se traduce como "if", y la orden "si no" se traduce como "else". Ambas deben terminar con el smbolo de "dos puntos" (:). Las rdenes a realizar si se cumple la condicin, o bien en caso de que no se cumpla, se DEBEN escribir un poco ms a la derecha que la orden que las precede (pero no es para que sea ms legible, como hicimos con PseInt, sino por requisito del lenguaje):
primerNumero = int(input( "Dime un numero " )) segundoNumero = int(input( "Dime otro numero " )) if primerNumero > segundoNumero: print( "El primero es mayor" ) else: print )"El segundo es mayor" )
Los operadores que podemos usar para comparar no son exactamente los mismos que en PseInt:
Ejemplo
3>2 2<3 3 == 3 4 != 3 4 >= 5
Y las condiciones se pueden enlazar usando "y" (que se escribir en ingls, "and"), "o" (que ser "or") o "no" ("not"). Ejercicio propuesto: un programa que pida al usuario 3 nmeros y diga cual es el mayor de los tres. En la prxima entrega veremos ms formas de comprobar condiciones...
programacin (y por tanto, tambin en muchas variantes de pseudocdigo) existe una alternativa ms compacta y ms legible: la orden "SEGUN". Esta rden permite hacer unas cosas u otras segn el valor que tome una variable. Su uso sera as:
Segun variable Hacer valor1: pasos_a_dar_si_es_el_valor1 valor2: pasos_a_dar_si_es_el_valor2 valor3: pasos_a_dar_si_es_el_valor3 De Otro Modo: pasos_a_dar_si_es_otro_valor FinSegun
El bloque "De Otro Modo" es opcional: si detallamos todos los valores posibles, no sera necesario utilizarlo. El nmero de valores que podemos probar es indefinido: no tiene por qu ser 3, sino que pueden ser menos casos o muchos ms. Segn la variante de pseudocdigo (o el lenguaje de programacin) que empleemos, puede haber restricciones en el tipo de datos que es aceptable. Por ejemplo, en el caso de PseInt, la variable tiene que tener un valor numrico, no puede ser un texto. Al igual que ocurra con la orden SI, existe un smbolo que podemos usar en los diagramas de flujo para ayudarmos a planificar nuestro programa (aunqe este smbolo est menos extendido que el de SI):
As, si en PseInt hacemos clic en el icono de la parte derecha que representa la condicin SI, aparece un esqueleto de programa casi completo, para que hagamos los cambios que nos interesen:
Slo tenemos que escribir la condicin que realmente nos interesa, y la serie de pasos a dar si se cumple y si no se cumple, de modo que nuestro programa podra quedar as:
Proceso EjemploCasos Escribir "Introduzca la nota"; Leer nota; Segun nota Hacer 10: Escribir "Ha obtenido un sobresaliente alto"; 9: Escribir "Ha obtenido un sobresaliente bajo"; 8: Escribir "Ha obtenido un notable alto"; 7: Escribir "Ha obtenido un notable bajo"; 6: Escribir "Ha obtenido un aprobado alto"; 5: Escribir "Ha obtenido un aprobado"; De Otro Modo: Escribir "Ha suspendido"; FinSegun FinProceso
Pero no siempre habr que comprobar condiciones una nica vez. Es muy frecuente que haya que hacerlo de forma repetitiva. Por ejemplo, "pedir una contrasea al usuario hasta que sea la correcta", o an ms cercano al mundo real, "pedir una contrasea al usuario hasta que sea la correcta o agote sus intentos". De eso hablaremos en la prxima entrega.
Y en Python?
La orden "segn" se suele traducir como la palabra inglesa "case" o como "switch", segn el lenguaje de programacin que se utilice. Pero siendo estrictos, no es una orden necesaria: se podra imitar usando varias rdenes "si". Esa es la aproximacin que usa Python: no existe orden "segn", pero se puede imitar con varias ordenes "if...else" encadenadas. Eso tiene un problema: en Python, cada nuevo bloque "if" debera aparecer tabulado un poco ms a la derecha que el anterior, por lo que nuestro programa acabara pareciendo "una escalera", y resultando difcil de leer. Por eso, tenemos una orden "elif", como abreviatura de "else if", que no es necesario tabular. As, nuestro programa capaz de convertir de nota numrica a texto en Python quedara de la siguiente forma:
nota = int(input("Introduzca la nota ")) if nota == 10: print ("Ha obtenido un sobresaliente alto") elif nota == 9: print ("Ha obtenido un sobresaliente bajo") elif nota == 8: print ("Ha obtenido un notable alto") elif nota == 7: print ("Ha obtenido un notable bajo") elif nota == 6: print ("Ha obtenido un aprobado alto") elif nota == 5: print ("Ha obtenido un aprobado")
6 - Condiciones repetitivas
Habitualmente, una condicin se deber comprobar ms de una vez. Por ejemplo, una condicin de error puede repetirse: el usuario que introduce mal una contrasea por primera vez puede equivocarse en una segunda ocasin. Por eso, igual que cualquier lenguaje de programacin tiene una orden "si", la gran mayora de ellos tendr una orden "mientras", que permite que un fragmento de un programa se repita mientras una cierta condicin se siga cumpliendo (por ejemplo, mientras la contrasea que teclee el usuario sea incorrecta, el usuario deber volver a introducirla). Tambin existe un smbolo habitual en los diagramas de flujo para representar este tipo de condiciones repetitivas, en las que si se cumple la condicin, se realizan una serie de acciones y se vuelve a comprobar la condicin, y as sucesivamente hasta que la condicion no se cumpla:
Por ejemplo, un programa capaz de sumar muchos nmeros, todos los que el usuario quisiera, y en el que hubiera que escribir "0" para indicar que queremos terminar, podra ser as:
Proceso Mientras01 Escribir "Dime un numero"; Leer x; suma <- 0; Mientras x <> 0 Hacer suma <- suma + x; Escribir "Hasta ahora, la suma es ", suma; Escribir "Dime otro numero"; Leer x; FinMientras Escribir "Terminado"; FinProceso
Y en Python?
Sencillo: basta con saber que "mientras" se traduce a ingls como "while", y recordar que no existir nada equivalente al "FinMientras", sino que todo el bloque que se repita deber estar tabulado un poco ms a la derecha, as:
print ("Dime un numero") x = int( input ( ) ) suma = 0 while x != 0: suma = suma + x print ("Hasta ahora, la suma es ") print (suma) print ("Dime otro nmero") x = int( input ( ) ) print ("Terminado")
El resultado sera:
Dime un numero 4 Hasta ahora, la suma es 4 Dime otro numero 5 Hasta ahora, la suma es 9 Dime otro numero 7 Hasta ahora, la suma es 16 Dime otro numero 0 Terminado
Pero esto no es exactamente lo mismo que obtenemos con el programa en PseInt, porque Python avanza de lnea tras cada orden "print". Si queremos que se escriban dos cosas en la misma lnea, como en "Hasta ahora, la suma es 16", lo podemos hacer indicando que queremos usar un formato especial en el texto. Para dar este formato especial haremos lo siguiente: dentro del texto indicaremos con llaves { } la posicin en la que queremos que aparezca un dato adicional, y despus usaremos ".format" y detallaremos entre parntesis el dato que queremos que aparezca en esa posicin. Quedara as:
print ("Dime un numero") x = int( input ( ) ) suma = 0 while x != 0: suma = suma + x print ("Hasta ahora, la suma es {}".format(suma) ) print ("Dime otro numero") x = int( input ( ) ) print ("Terminado")
Por ejemplo, un programa que pida al usuario una clave de acceso, y que no le permita seguir hasta que la introduzca correctamente, se podra hacer as:
Proceso Repetir01 Repetir Escribir "Dime tu clave de acceso"; Leer clave; Si clave <> 1234 Entonces Escribir "Clave incorrecta"; FinSi Hasta Que clave=1234 Escribir "Bienvenido!"; FinProceso
Queda otra forma de repetir fragmentos de programa. Pronto estaremos con ella...
Y en Python?
Si traducimos "repetir" como "repeat" y "hasta que" como "until", ya tenemos la construccin que se usa en algunos lenguajes de programacin, como Pascal. En otros, como C y sus derivados (C++, Java, C#, PHP...) se usa "do...while" (hacer...mientras) para comprobar la comprobacin al final. Nuevamente, no es el caso de Python: no tenemos ninguna construccin que nos permita comprobar la condicin al final, as que deberamos reescribir el program ligeramente, tpicamente dando una primera pasada antes de la zona repetitiva, as:
print ("Dime tu clave de acceso: ") clave = int(input()) while clave != 1234: clave = int(input( "Clave incorrecta. Vuelve a introducir tu clave: " )) print ("Bienvenido!")
El resultado sera:
Dime tu clave de acceso: 23 Clave incorrecta. Vuelve a introducir tu clave: 234 Clave incorrecta. Vuelve a introducir tu clave: 1234 Bienvenido!
Si queremos intentar reescribirlo de una forma un poco ms parecida al original en PseInt, podemos hacer que no se compruebe la condicin al principio (o incluso nunca), sino que se interrumpa "desde dentro" con la orden "break" (romper), as:
while True:
clave = int(input("Dime tu clave de acceso: ")) if clave != 1234: print("Clave incorrecta") else: break print ("Bienvenido!")
Por ejemplo, un programa que mostrara los nmeros del 1 al 10, podra ser:
Proceso Para01 Para x <- 1 Hasta 10 Hacer Escribir x; FinPara FinProceso
Y obtendramos:
Hemos visto casi todas las construcciones que podremos encontrar en los lenguajes de programacin convencionales (y, por tanto, al planificarlos usando pseudocdigo). En la prxima entrega veremos alguna otra posibilidad, como el manejo de matrices y las funciones matemticas, para pasar despus a algunos ejemplos completos.
Y en Python?
La palabra "para" se traducira como "for", pero en vez de indicar "hasta" donde queremos llegar, le diremos qu "rango" (range) queremos recorrer. Por ejemplo, para ir del 1 al 10 usaramos "range(1,11)", porque se comienza en el primer nmero que indiquemos en el rango (1), pero no se llega a alcanzar el ltimo (11, luego se detiene en 10):
for x in range(1,11): print (x)
Mostrar los pares del 10 al 20 es casi igual de fcil: empezaremos en 10, terminaremos antes de llegar a 21, y aadimos un tercer dato que es el incremento que queremos en cada pasada (2), as
for x in range(10,21,2): print (x)
9 - Matrices.
Cuando necesitamos manejar muchos datos, generalmente hay soluciones ms efectivas que tener muchas variables. Por ejemplo, si hay que guardar 100 nmeros, suele ser ms eficiente almacenar esos 100 datos "juntos", formando una "matriz", en vez de usar 100 variables distintas. La palabra "matriz" es una traduccin del ingls "array". Algunos autores lo traducen alternativamente como tabla, vector o incluso "arreglo". Normalmente, en una matriz podremos acceder individualmente a cada uno de sus elementos usando corchetes: el primer dato sera algo como "dato[1]". Vamos a ver un ejemplo que nos pida 6 datos y luego los muestre en orden contrario al que se han introducido:
Proceso MostrarAlReves Dimension datos[6] Para i <- 1 Hasta 6 Hacer Escribir "Dime el dato numero ", i Leer datos[i] FinPara Escribir "Los datos al reves son: " Para i <- 6 Hasta 1 Con Paso -1 Hacer Escribir datos[i] FinPara FinProceso
Y en Python?
Para indicar que vamos a usar una matriz en Python, usaremos llaves: miMatriz = { } No es necesario indicar tamao. Como se empieza a numerar desde 0, y no desde 1, guardaremos los datos accediendo a la posicin "i-1", de este modo:
datos = { } for i in range(1,7): datos[i-1] = input( "Dime el dato numero {}: ".format(i) ) print ("Los datos al reves son: ") for i in range(6,0,-1): print ( datos[i-1] )
El resultado sera:
Dime el dato numero 1: 1 Dime el dato numero 2: 3 Dime el dato numero 3: 5 Dime el dato numero 4: 7
Dime el dato numero 5: 9 Dime el dato numero 6: 11 Los datos al reves son: 11 9 7 5 3 1
Como curiosidad, tambin se puede declarar el array indicando sus valores iniciales entre corchetes, as:
datos = [0,0,0,0,0,0] for i in range(1,7): datos[i-1] = input( "Dime el dato numero {}: ".format(i) ) print ("Los datos al reves son: ") for i in range(6,0,-1): print ( datos[i-1] )
Funcin
RC(X) ABS(X) LN(X) EXP(X) SEN(X) COS(X) TAN(X) ASEN(X) ACOS(X) ATAN(X)
Significado
Raz Cuadrada de X Valor Absoluto de X Logaritmo Natural de X Funcin Exponencial de X Seno de X Coseno de X Tangente de X Arco seno de X Arco coseno de X Arco tangente de X
(Si no sabes qu hace alguna de estas funciones, no te preocupes mucho, es seal de que hasta ahora no la has necesitado... ;-) Las ms importantes de ellas las probaremos directamente como parte de los ejercicios) En cuanto a los comentarios... casi cualquier lenguaje de programacin permite incluir aclaraciones, que nos ayuden a explicar la lgica del programa o cualquier detalle que no sea evidente. En el caso de PseInt, cualquier lnea que comience con una doble barra (//) se considerar un comentario y no se tendr en cuenta en el momento de analizar el cdigo:
// Ejemplo de comentario en un fuente de PseInt
Y en Python?
Existen bsicamente las mismas funciones (y alguna ms), pero con nombres en ingls, claro. Para usarlas antes hay que "importarlas" desde la librera de matemticas, como se ver en el siguiente ejemplo. Las funciones equivalentes a las anteriores son:
Funcin
Significado
math.sqrt(X) Raz Cuadrada de X math.fabs(X) Valor Absoluto de X math.log(X) Logaritmo Natural de X math.exp(X) Funcin Exponencial de X math.sin(X) Seno de X math.cos(X) Coseno de X math.tan(X) Tangente de X math.asin(X) Arco seno de X math.acos(X) Arco coseno de X math.atan(X) Arco tangente de X Pero tambin hay otras. Por ejemplo, "math.pow(x,y)" calcula el resultado de elevar un nmero a otro, "math.degrees(x)" convierte de radianes a grados y "math.radians(x)" de grados a radianes. Los nmeros al azar no son parte de la biblioteca "math", sino de "random": random.random() devuelve un nmero real entre 0 y 1, mientras que random.randint(1, 10) da un nmero entero entre 1 y 10 (ambos incluidos). Un ejemplo de uso de funciones matemticas sera
from math import sqrt valor = int(input( "Dime un numero: " )) print ( "Su raiz cuadrada es {}".format( sqrt(valor) ) )
11 - Ejercicios resueltos
a) Enunciados
1.- Crear un algoritmo que escriba "Hola" cinco veces. 2.- Crear un algoritmo que pida al usuario un nmero y le diga si es positivo, negativo o cero. 3.- Crear un algoritmo que pida al usuario 5 datos y muestre su suma. 4.- Crear un algoritmo que calcule la raz cuadrada del nmero que introduzca el usuario. Si se introduce un nmero negativo, debe mostrar un mensaje de error y volver a pedirlo (tantas veces como sea necesario). 5.- Crear un algoritmo que pida al usuario un nmero y un smbolo, y dibuje un cuadrado usando ese smbolo. El cuadrado tendr el tamao que ha indicado el usuario. Por ejemplo, si el usuario introduce 4 como tamao y * como smbolo, deber escribirse algo como: **** **** **** ****
2.- Crear un algoritmo que pida al usuario un nmero y le diga si es positivo, negativo o cero.
// 2.- Crear un algoritmo que pida al usuario un numero y le diga si es positivo, negativo o cero. Proceso Resuelto02 Escribir "Dime un numero"; Leer x; Si x > 0 Entonces Escribir "Es positivo"; Sino Si x < 0 Entonces Escribir "Es negativo"; Sino Escribir "Es cero"; FinSi FinSi FinProceso
4.- Crear un algoritmo que calcule la raz cuadrada del nmero que introduzca el usuario. Si se introduce un nmero negativo, debe mostrar un mensaje de error y volver a pedirlo (tantas veces como sea necesario).
// 4.- Crear un algoritmo que calcule la raz cuadrada del nmero // que introduzca el usuario. Si se introduce un nmero negativo, // debe mostrar un mensaje de error y volver a pedirlo // (tantas veces como sea necesario). Proceso Resuelto04 Repetir Escribir "Dime un numero"; Leer x; Si x < 0 Entonces Escribir "No puede ser negativo"; FinSi Hasta Que x >= 0 Escribir "Su raiz es ", rc(x); FinProceso
5.- Crear un algoritmo que pida al usuario un nmero y un smbolo, y dibuje un cuadrado usando ese smbolo. El cuadrado tendr el tamao que ha indicado el usuario.
2.- Crear un algoritmo que pida al usuario un nmero y le diga si es positivo, negativo o cero.
# 2.- Crear un algoritmo que pida al usuario un numero y le diga si es positivo, negativo o cero.
x = input ("Dime un numero ") if x > 0 : print ("Es positivo") elif x < 0 : print ("Es negativo") else : print ("Es cero")
suma = 0 for x in range(1,6): x = input ("Dime un dato ") suma = suma + x print ("Su suma es") print (suma)
4.- Crear un algoritmo que calcule la raz cuadrada del nmero que introduzca el usuario. Si se introduce un nmero negativo, debe mostrar un mensaje de error y volver a pedirlo (tantas veces como sea necesario).
# 4.- Crear un algoritmo que calcule la raiz cuadrada del numero # que introduzca el usuario. Si se introduce un numero negativo, # debe mostrar un mensaje de error y volver a pedirlo # (tantas veces como sea necesario).
from math import sqrt while True: x = input( "Dime un numero: " ) if x < 0: print ( "No puede ser negativo" ) else: print ( "Su raiz es {}".format( sqrt(x) ) ) break
5.- Crear un algoritmo que pida al usuario un nmero y un smbolo, y dibuje un cuadrado usando ese smbolo. El cuadrado tendr el tamao que ha indicado el usuario. Esta es la forma ms cercana a la de PseInt, con dos "for" anidados. Como el "smbolo" es texto, no podemos usar "input" para leerlo, o Python intentara interpretarlo como nmero; en su lugar, usaremos "raw_input":
# 5.- Crear un algoritmo que pida al usuario un numero y un simbolo, # y dibuje un cuadrado usando ese simbolo. El cuadrado tendra el tamanyo # que ha indicado el usuario. # Forma "general"
lado = input( "Dime el lado: " ) simbolo = raw_input( "Dime el simbolo de relleno: " )
for fila in range( 1 , lado+1 ): textoFila = '' for columna in range( 1 , lado+1 ): textoFila += simbolo print( textoFila )
Y esta es una forma alternativa ms compacta, usando * para repetir una cadena de texto varias veces:
# 5.- Crear un algoritmo que pida al usuario un numero y un simbolo, # y dibuje un cuadrado usando ese simbolo. El cuadrado tendra el tamanyo # que ha indicado el usuario. # Forma compacta
lado = input( "Dime el lado: " ) simbolo = raw_input( "Dime el simbolo de relleno: " ) for fila in range( 1 , lado+1 ): textoFila = simbolo * lado print( textoFila )
12 - Ejercicios propuestos
1.- Crear un algoritmo que pida al usuario 10 datos y muestre su promedio. 2.- Crear un algoritmo que calcule la raz cuadrada del nmero que introduzca el usuario. Si se introduce un nmero negativo, debe mostrar un mensaje de error y volver a pedirlo (tantas veces como sea necesario). 3.- Crear un algoritmo que pida al usuario 3 datos y diga cual es el mayor de los tres. 4.- Crear un algoritmo que pida al usuario 5 datos, luego le pida un valor con el que comparar, y finalmente diga cuales de esos 5 datos son mayores que el valor de comparacin. 5.- Crear un algoritmo que resuelva una ecuacin de segundo grado del tipo ax 2+bx+c=0. Las soluciones son x1 = (- b + raiz (b2 - 4ac)) / (2 a) , x2 = (- b - raiz (b2 - 4ac)) / (2 a) 6.- Crear un algoritmo que genere un nmero al azar entre el 1 y el 1000, y d al usuario la oportunidad de acertarlo en 10 intentos. Tras cada intento se le dir si ha acertado (y en ese caso terminar la ejecucin), si se ha quedado corto o si se ha pasado. 7.- Crear un algoritmo que pida al usuario una cantidad no definida de datos y calcule su suma. Debe estar preparado para un mximo de 100 nmeros, que pedir de uno en uno. Cuando se introduzca un valor 0, mostrar la suma de todos los anteriores y terminar la ejecucin. 8.- Crear un algoritmo que pida al usuario que introduzca una frase, y diga cuntas veces contiene la letra A (ya sea en maysculas o en minsculas).
Las dos ms sencillas son las que permiten convertir un texto a maysculas y a minsculas:
Proceso Cadenas01 Escribir "Dime tu nombre" Leer nombre Escribir "En maysculas quedara:" Escribir Mayusculas(nombre) Escribir "En minsculas quedara:" Escribir Minusculas(nombre) FinProceso
Para resolver problemas reales de computacin, hay otras dos funciones que dan mucho ms juego: una nos dicen la longitud de una cadena y otra permite extraer una subcadena, desde cierta posicin inicial hasta cierta posicin final:
Proceso Cadenas02 Escribir "Dime tu nombre" Leer texto Escribir "Con espacios quedara:" Para x <- 1 Hasta Longitud(texto) Hacer Escribir Sin Saltar Subcadena(texto, x, x) Escribir Sin Saltar " " FinPara Escribir "" FinProceso
(Si dejamos las opciones de PseInt sin modificar, las posiciones dentro de la cadena se empezarn a contar desde uno; ya sabemos, como vimos en el apartado sobre "Matrices", que en muchos otros lenguajes de programacin se empieza a contar desde cero). Tambin tenemos la posibilidad de "concatenar" dos cadenas, para formar una nueva cadena a partir de esas dos seguidas. As el quinto ejercicio resuelto se podra plantear tambin creando una Pero todava no est tan bien como debera: siempre estamos escribiendo 20 guiones, aunque el texto sea ms largo o ms corto. En la mayora de lenguajes de programacin se puede indicar detalles adicionales ("parmetros") para que se puedan utilizar desde dentro de esa subrutina. Por ejemplo, en nuestro caso podramos indicarle qu texto queremos escribir y qu longitud queremos que tenga la secuencia de guiones:
// Crear un algoritmo que pida al usuario un nmero y un smbolo, // y dibuje un cuadrado usando ese smbolo. El cuadrado tendr el // tamao que ha indicado el usuario. // Versin concatenando cadenas. // No funciona con versiones de PseInt de antes de Octubre de 2012 Proceso Resuelto05b Escribir "Dime el lado" Leer lado Escribir "Dime el simbolo de relleno" Leer simbolo filaDeSimbolos <- "" Para columna <- 1 Hasta lado Hacer filaDeSimbolos <- Concatenar( filaDeSimbolos, simbolo )
FinPara Para fila<-1 Hasta lado Hacer Escribir filaDeSimbolos FinPara FinProceso
Y en Python?
Las manipulaciones bsicas, como convertir a maysculas o minsculas, son igual de simples como en PseInt: se aade ".upper()" o ".lower()" al texto que queremos modificar:
nombre = input( "Dime tu nombre: " ) print ( "En maysculas sera {}".format( nombre.upper() ) ) print ( "En minsculas sera {}".format( nombre.lower() ) )
Extraer una letra de una cadena es como acceder a cualquier posicin de una matriz o un vector: se indica la posicin entre corchetes, como en "nombre[i]". Para una subcadena, basta indica la posicin inicial y la final, separadas por un smbolo de dos puntos: "nombre[desde:hasta]". Hay que recordar que se empieza a contar desde cero y que se termina en la longitud ("len") menos uno:
nombre = input( "Dime tu nombre: " ) print ( "Con espacios sera" ) for i in range(0, len(nombre)): print ( nombre[i], end="" ) print ( " ", end="" )
Como se ve, en Python (versin 3 y posteriores) podemos escribir cosas en la misma lnea, indicando un segundo detalle, que es que no queremos ningn smbolo al final de cada lnea: end="" Concatenar cadenas es muy fcil en Python: basta usar el smbolo de la suma (+):
nombre = "Juan" espacio = " " apellido = "Juanez" frase = nombre + espacio + apellido print ( frase )
Pero en Python se pueden hacer muchas ms cosas con las cadenas de texto que con PseInt. Por ejemplo, usando la misma nomenclatura de corchetes, se pueden emplear posiciones negativas para indicar que queremos contar desde el final de la cadena, o dejar una posicin en blanco para decir
"desde el principio" (si es la primera) o "hasta el final" (si es la segunda), o aadir un tercer dato para indicar de cunto en cunto hay que avanzar (y puede incluso ser un nmero negativo, para retroceder):
nombre = input( "Dime tu nombre: " ) print ( "Sus dos ltimas letras son: ", end="" ) print ( nombre[-2:] ) print ( "Y a partir de la tercera: ", end="" ) print ( nombre[2:] ) print ( "Al revs sera: ", end="" ) print ( nombre[::-1] )
Mucho ms legible. Pero todava no est tan bien como debera: siempre estamos escribiendo 20 guiones, aunque el texto sea ms largo o ms corto. En la mayora de lenguajes de programacin se puede indicar detalles adicionales ("parmetros") para que se puedan utilizar desde dentro de esa subrutina. Por ejemplo, en nuestro caso podramos indicarle qu texto queremos escribir y qu longitud queremos que tenga la secuencia de guiones:
Proceso SubProcesos03 EscribirSubrayado(" Primer ejemplo", 16) EscribirSubrayado(" Segundo ejemplo", 17) EscribirSubrayado(" Tercer ejemplo", 16) FinProceso Subproceso EscribirSubrayado(texto, cantidad) Escribir texto Para x <- 1 Hasta cantidad Hacer Escribir Sin Saltar "-" FinPara Escribir "" FinSubproceso
Aunque todava es un poco redundante: en general, querremos escribir tantos guiones como letras tenga el texto, as que no ser necesario indicar ese dato. Desde octubre de 2012, PseInt incluye ciertas funciones predefinidas para manejo de cadenas de texto; una de ellas es "Longitud", que nos indica la cantidad de letras que tiene un texto, de modo que nuestro programa se podra simplificar as:
Proceso SubProcesos04 EscribirSubrayado("Primer ejemplo") EscribirSubrayado("Segundo ejemplo") EscribirSubrayado("Tercer ejemplo") FinProceso Subproceso EscribirSubrayado(texto) Escribir texto
Para x <- 1 Hasta Longitud(texto) Hacer Escribir Sin Saltar "-" FinPara Escribir "" FinSubproceso
Tambin podemos crear funciones que realicen ciertas operaciones aritmticas y devuelvan un resultado, como las funciones matemticas que vimos en el tema 10. Se puede hacer con la misma palabra "subproceso" que hemos empleado hasta ahora, pero muchos lenguajes de programacin distinguen entre un "procedimiento" o "subrutina", cuando se da una serie de pasos pero no se devuelve ningn valor, y una "funcin", cuando s se devuelve un resultado, as que usaremos esta ltima nomenclatura. Se parece mucho a lo que hemos hecho hasta ahora, con la diferencia de que escogeremos un nombre para la variable que guardar el resultado, as:
Funcion resultado <- Maximo( n1, n2) Si n1 > n2 Entonces resultado <- n1 Sino resultado <- n2 FinSi FinFuncion Proceso Funciones01 Escribir "El mximo de 5 y 12 es:" Escribir Maximo(5,12); Escribir "El mximo de 25 y 12 es:" Escribir Maximo(25,12); Finproceso
Este programa crea una funcin que calcula cul es el mayor de los dos nmeros que se le indican como parmetro, y la usa dos veces, para mostrar el mximo de dos valores prefijados. No slo pdemos devolver valores numricos; tambin podemos devolver cadenas (como las funciones que vimos en el apartado 13) o "valores de verdad" (verdadero, falso). Por ejemplo, podemos crear una funcin que diga si un nmero es primo o no (lo vamos a hacer de la forma ms simple pero tambin de la menos eficiente: aplicar la definicin, probando a dividir entre todos los nmeros que hay entre 1 y n; si hemos encontrado dos divisores -o menos, para el nmero uno-, entonces el nmero es primo):
SubProceso resultado <- Primo ( num ) cantidadDivisores <- 0 Para cont <- 1 Hasta num Hacer Si num % cont = 0 Entonces cantidadDivisores <- cantidadDivisores + 1 FinSi Fin Para Si cantidadDivisores <= 2 Entonces resultado <- verdadero Sino resultado <- falso Fin Si Fin SubProceso Proceso PrimosDel1Al30 Para n <- 1 hasta 30 si Primo(n) Entonces Imprimir n
Hay ms detalles que comentar sobre funciones, pero son un poco ms avanzados, as que vamos a descansar un poco aqu de nuevos conceptos y a practicar lo que hemos visto...
Y en Python?
Los subprocesos o subrutinas se definen en Python con la palabra "def", deben tener parntesis despus del nombre (aunque estarn vacos si no hay parmetros) y la primera lnea debe terminar en "dos puntos", con todo su contenido tabulado hacia la derecha (igual que hacamos con las condiciones y con los bucles):
def subrayar(): for i in range(0, 20): print( "-", end="" ) print() print ( " Primer ejemplo" ) subrayar() print ( " Segundo ejemplo" ) subrayar() print ( " Tercer ejemplo" ) subrayar()
Como se puede ver en este ejemplo, en Python hay que declarar las funciones antes de usarlas (en PseInt no es necesario): Los parmetros, en caso de existir, se escribirn dentro del parntesis, y separados por comas:
def escribirSubrayado(texto): print(texto) for i in range(0, len(texto)): print( "-", end="" ) print() escribirSubrayado ( "Primer ejemplo" ) escribirSubrayado ( "Segundo ejemplo" ) escribirSubrayado ( "Tercer ejemplo" )
Si se trata de una funcin que devuelva valores, tambin se usar la palabra "def" para definirla, y los resultados se devolvern con la palabra "return":
def maximo(n1,n2): if n1 > n2: return n1 else: return n2 print("El mximo de 5 y 12 es:") print( maximo(5,12) ) print("El mximo de 25 y 12 es:") print( maximo(25,12) )
Y se pueden devolver valores no numricos, como cadenas o valores de verdad (verdadero, "True" o falso, "False"), de modo que as quedara la funcin que dice si un nmero es primo o no:
# Comprobacin de si un nmero es primo (ineficiente), # aplicando la definicin: divisible slo entre 1 y l mismo
def esPrimo(n): cantidadDivisores = 0 for i in range(1, n+1): if n % i == 0: cantidadDivisores = cantidadDivisores + 1 if cantidadDivisores <= 2: # Si solo hay 2 divisores, es primo return True else: # Si hay ms, no es primo return False