Diferencia entre revisiones de «PrInf04: Comunicación con el usuario»
(→Pedir información al usuario) |
(→Pedir información al usuario) |
||
| Línea 53: | Línea 53: | ||
# Ejecuta el mismo comando, pero responde ahora ''1:5''. Ejecútalo otra vez, y responde ''rand(5)''. ¿Cuál es el resultado? ¿Por qué? | # Ejecuta el mismo comando, pero responde ahora ''1:5''. Ejecútalo otra vez, y responde ''rand(5)''. ¿Cuál es el resultado? ¿Por qué? | ||
# Igual que hemos introducido vectores y matrices, podemos intentar introducir texto. Por ejemplo, vamos a pedir tu nombre. Introduce tu nombre cuando te lo pida el comando: {{#tag:source|n = input('Introduce tu nombre: ');|lang="matlab"}} ¿Ha fallado el comando? ¿Por qué? | # Igual que hemos introducido vectores y matrices, podemos intentar introducir texto. Por ejemplo, vamos a pedir tu nombre. Introduce tu nombre cuando te lo pida el comando: {{#tag:source|n = input('Introduce tu nombre: ');|lang="matlab"}} ¿Ha fallado el comando? ¿Por qué? | ||
| + | # Si no introducimos el valor tal y como lo asignaríamos a una variable, es probable que el comando falle. En particular, para introducir texto, tenemos que usar las comillas simples para delimitar el texto. Esto es algo engorroso. Ningún programa pide al usuario que conozca los detalles sobre cómo se representa la información en el lenguaje en el que está programado. Imagina que Facebook te pidiera usar comillas simples para escribir tu nombre. Para evitar las comillas al introducir texto, usamos un nuevo argumento en ''input'' {{#tag:source|n = input('Introduce tu nombre: ', 's');|lang="matlab"}} ¿Falla ahora al introducir tu nombre? ¿Cómo lo has introducido? | ||
| + | # El comando ''input'' solo tiene este argumento especial para el caso del texto. Todos los demás tipos de datos tienen que introducirse siempre tal y como se asignarían a una variable. También podemos poner cualquier expresión cuando el comando nos pide introducir algo, y el resultado se asignará a la variable. | ||
== Ejercicio post-práctica == | == Ejercicio post-práctica == | ||
[[Categoría:Prácticas de Informática]] | [[Categoría:Prácticas de Informática]] | ||
Revisión del 18:23 3 jul 2013
Los programas que vamos a escribir necesitarán en la mayoría de ocasiones interactuar con el usuario, ya sea mostrándole información, ya sea pidiéndole información para realizar los cálculos. En esta práctica vamos a ver cómo escribir mensajes en la pantalla (desde mensajes sencillos con el contenido de una variable, hasta mensajes más complicados con formato) y cómo recoger información proporcionada por el usuario a través del teclado.
Contenido
1 Vídeos previos
Antes de realizar esta práctica, es recomendable ver estos vídeos del Curso de Introducción a la Programación. No es imprescindible verlos antes de hacer la práctica, pero sí recomendable. Si no has podido verlos antes, empieza la práctica, y vuelve a los vídeos después de la práctica.
También es recomendable haber realizado antes la práctica 1, en particular la parte de creación y manipulación de variables.
2 Comandos que se aprenderán en esta práctica
En esta práctica vamos a ver qué significan los siguientes comandos de MATLAB / Octave
| disp | fprintf | input |
3 Contenido de la práctica
3.1 Mostrar el contenido de variables
La manera más sencilla de mostrar el contenido de una variable es simplemente no incluir el punto y coma al final de una asignación o de una línea de código, y dejar que se muestre el resultado. Esta técnica puede ser útil cuando estamos desarrollando un programa, para ver resultados intermedios, y ayudar en la depuración del programa. Pero cuando tenemos el programa terminado, deberíamos cuidar los mensajes que se muestran en pantalla, y no mostrar detalles internos innecesarios al usuario. Para estas situaciones, es mejor usar los comandos disp y fprintf.
- Vamos a ver un ejemplo sencillo. Crea una variable de nombre a que tenga de valor 2.7, sin olvidar el punto y coma final. Muestra su contenido con El comando disp muestra en la pantalla el contenido de la variable.
disp(a)
- El comando disp interacciona directamente con la pantalla. Lo que se muestra no es el resultado de una operación, sino que es el comando disp interactuando directamente con el dispositivo de salida, es decir, la pantalla. Para comprender este punto vamos a ejecutar el siguiente comando (fíjate en el punto y coma final) ¿Por qué se muestra el resultado si hemos incluido el punto y coma al final? ¿Cuál es el cometido del punto y coma? En general, la mejor estrategia es siempre poner el punto y coma final en todos los comandos. Solo deberíamos quitarlo para mostrar resultados intermedios cuando estemos realizando pruebas. En cambio, si queremos mostrar al usuario la salida de un programa, hay que usar los comandos adecuados según el mensaje
disp(a);
- Se pueden mostrar los resultados de variables de muy diversos tipos (textos, matrices, etc). Crea una matriz B aleatoria de orden 5, con números entre el 7 y el 16, sin que ningún elemento tenga parte decimal. No te olvides del punto y coma final. Ahora ejecuta En general, disp mostrará correctamente cualquier variable de cualquier tipo.
disp(B);
- Otro tipo de datos que se puede mostrar con disp es texto. En un lenguaje de programación se conoce como cadena de texto al conjunto de caracteres que forman un texto. Por ejemplo Hola caracola es una cadena de texto, formada por los caracteres H, o, etc. El término cadena proviene de la Teoría de Autómates y de Lenguajes de Programación, y ha sido heredada en la implementación y diseño de lenguajes de programación. Históricamente, este tipo de información tenía un tratamiento especial en los lenguajes, aunque los lenguajes modernos (como el lenguaje M) permiten manipular texto de manera sencilla. Veamos un ejemplo con disp En Octave UPM, las cadenas de texto se delimitan usando comillas simples. En el ejemplo mostrado se asigna una cadena de texto a la variable t, que se muestra a continuación en la pantalla. La línea de código anterior ilustra otra de las ventajas de terminar los comandos con punto y coma. Como Octave UPM ya sabe que el comando anterior ha terminado, entiende que lo que viene a continuación es un nuevo comando. Hay que destacar también que disp muestra el contenido de la variable. Es decir, no vemos las comillas porque no forman parte del contenido de la variable. Las comillas solo sirven para que le indiquemos a Octave UPM que lo que incluimos entre ellas es un texto.
t = 'Hola mundo'; disp(t);
- En todos los ejemplos anteriores hemos asignado un resultado a una variable y luego hemos mostrado la variable. Nada nos impide mostrar el resultado directamente. Por ejemplo En este caso, el resultado es el mismo que en el punto anterior, pero no hemos usado una variable intermedia.
disp('Hola mundo'); - También podemos poner el resultado de cualquier operación matemática. Por ejemplo, ¿Qué muestra el comando en este caso? ¿Se ha asignado el resultado a la variable ans? ¿Podrías explicar por qué?
disp(4^3);
3.2 Mostrar mensajes formateados
El comando disp se limita a mostrar el contenido de una única variable. Si queremos combinar varias variables y texto en el mismo mensaje, es necesario usar un comando más complejo, pero también más versátil. Este comando es fprintf. En este comando, además de las variables que queremos mostrar, hay que indicar unos modificadores de formato, donde le decimos cómo mostrar el contenido de una variable.
- El primer modificador que vamos a ver es el que nos permite mostrar números enteros. El modificador es %d. Veamos un ejemplo: ¿Qué salida produce este comando?
a = 42; fprintf('El valor es %d', a); - Como habrás comprobado, el prompt de Octave UPM aparece ahora justo a continuación del mensaje, no en la siguiente línea. Éste es un comportamiento algo tonto del comando fprintf. Como nos permite modificar el formato totalmente, no asume nada acerca del mensaje; ni siquiera que tiene que saltar a la siguiente línea de texto tras mostrar el mensaje. Para saltar una línea podemos usar el caracter especial '\n'. Por ejemplo, ¿Cuál es el resultado ahora? ¿Cuál es la diferencia con la salida en el caso anterior?
fprintf('El valor es %d\n',a); - El salto de línea puede ponerse en cualquier lugar del mensaje. Por ejemplo: ¿Qué resultado produce este comando? Comprueba dónde están los saltos de línea en el mensaje, y cómo ha saltado de línea en cada sitio al mostrar el mensaje. El caracter '\n' no es un modificador de formato, sino que es un tipo de caracter especial, ya que no imprime nada visible en la pantalla. Pero Octave UPM lo trata internamente como cualquier otro caracter (como 'a','b','c', etc).
fprintf('El\nvalor\nes %d\n',a); - El modificador %d se puede usar con cualquier valor numérico. Nosotros lo hemos usado con valores sin decimales, pero también podemos intentar el siguiente comando ¿Cuál es el resultado del comando anterior? ¿Ha cambiado el valor de a? ¿Por qué?
a = 42.75; fprintf('El valor es %d\n', a); - Para mostrar números con decimales podemos usar el modificador %f. Por ejemplo, ¿Cuántos decimales se muestran en el resultado?
fprintf('El valor es %f\n', a); - Podemos controlar el número de decimales que se muestran. Por ejemplo, si queremos solo tres decimales en la pantalla: Es importante entender que el número de decimales que se muestran en la pantalla no tiene nada que ver con el número de decimales que contiene la variable representada. ¿Qué ocurre si le pedimos que solo muestre un decimal?
fprintf('El valor es %.3f\n', a); - La potencia de fprintf radica en la capacidad de crear mensajes complejos. Por ejemplo, usando más de una variable en el mismo mensaje. Veamos un ejemplo:
c = 7; v = 7.90; fprintf('La velocidad del coche %d es %.3f m/s\n', c, v); - También podemos combinar texto que estuviera dentro de una variable. Para mostrar texto tenemos que usar el modificador %s. Por ejemplo:
c = 'Ford'; v = 7.90; fprintf('La velocidad del coche %s es %.3f m/s\n', c, v);
3.3 Pedir información al usuario
El comando para pedir información al usuario es input, que nos permite pedir cualquier tipo de dato (números, vectores, matrices, texto) y asignarlo a una variable.
- El comando input por defecto puede recibir cualquier tipo de información. Por ejemplo, escribe 42 cuando el siguiente comando te pida el dato; Comprueba el valor de x tras ejecutar el comando.
x = input('Dame un numero: '); - Ejecuta el mismo comando, pero responde ahora 1:5. Ejecútalo otra vez, y responde rand(5). ¿Cuál es el resultado? ¿Por qué?
- Igual que hemos introducido vectores y matrices, podemos intentar introducir texto. Por ejemplo, vamos a pedir tu nombre. Introduce tu nombre cuando te lo pida el comando: ¿Ha fallado el comando? ¿Por qué?
n = input('Introduce tu nombre: '); - Si no introducimos el valor tal y como lo asignaríamos a una variable, es probable que el comando falle. En particular, para introducir texto, tenemos que usar las comillas simples para delimitar el texto. Esto es algo engorroso. Ningún programa pide al usuario que conozca los detalles sobre cómo se representa la información en el lenguaje en el que está programado. Imagina que Facebook te pidiera usar comillas simples para escribir tu nombre. Para evitar las comillas al introducir texto, usamos un nuevo argumento en input ¿Falla ahora al introducir tu nombre? ¿Cómo lo has introducido?
n = input('Introduce tu nombre: ', 's'); - El comando input solo tiene este argumento especial para el caso del texto. Todos los demás tipos de datos tienen que introducirse siempre tal y como se asignarían a una variable. También podemos poner cualquier expresión cuando el comando nos pide introducir algo, y el resultado se asignará a la variable.