04: Salida en pantalla

Introducción

Hemos hecho grandes progresos con nuestro programa, pero aún no hemos visto como mostrar los resultados de nuestros cálculos. El lenguaje Objective-C por si mismo no sabe como hacerlo, pero por suerte podemos utilizar funciones que han escrito otros ya. Hay varias opciones para mostrar resultados por pantalla. En este libro usaremos una función incluida en el entorno Cocoa de Apple: la función NSLog(). Esto es estupendo, porque no tenemos que preocuparnos (ni tenemos que programar nada al respecto) para obtener nuestros resultados en la pantalla.

Así que ¿dónde muestra los datos NSLog()? En Xcode existe la Consola para visualizar los mensajes de log. Para abrir la Consola, debemos seleccionar [Console] desde el menú [Run] (Cmd-Shift-R). Una vez que construyamos y ejecutemos nuestra aplicación, todos los mensajes aparecerán por ahí.

La función NSLog() se diseñó para mostrar mensajes de error, no para los resultados de una aplicación. De todas formas es tan fácil de usar que la hemos adoptado en este libro para visualizar nuestros resultados. Una vez que conozcas Cocoa en profundidad descubrirás técnicas más sofisticadas para hacerlo.

Uso de NSLog

Veamos como usar la función NSLog() con el siguiente código:

//[1]
int main()
{
    NSLog(@"Julia es mi actriz favorita.");
    return 0;
}

Al ejecutarlo, se producirá la aparición del texto "Julia es mi actriz favorita" en la Consola. El texto entre @" y " (lo que está entre las comillas dobles) es lo que se llama "cadena de caracteres", "cadena de texto" o simplemente "cadena" (en inglés "string").

Además de ese texto, la función NSLog() muestra información adicional, como la fecha actual y el nombre de la aplicación. Por ejemplo, la salida completa del programa [1] en mi sistema es:

2010-03-12 22:12:38.052 prueba1[5006:a0f] Julia es mi actriz favorita.

Una cadena puede tener una longitud de cero o más caracteres.

Nota: en los siguientes ejemplos sólo se muestran las sentencias interesantes de la función main()

//[2]
NSLog(@""); //[2.1]
NSLog(@" "); //[2.2]
 

La sentencia [2.1] contiene 0 caracteres y la llamamos cadena vacía (tiene una longitud 0). La sentencia [2.2] no es una cadena vacía aunque lo parezca. Contiene un espacio entre las comillas así que su longitud es 1.

Hay algunas secuencias de caracteres que tienen un significado especial dentro de las cadenas. Se les llama "secuencias de escape".

Por ejemplo para hacer que la última palabra de nuestra cadena empiece en una línea nueva, debemos incluir un código especial en la sentencia [3.1]. El código es \n, que significa "carácter de nueva línea".

//[3]
NSLog(@"Julia es mi actriz \nfavorita.");

Ahora la salida tiene un aspecto como este (sólo se muestra el contenido relevante):

Julia es mi actriz
favorita.

La contrabarra (\) en [3.1] se llama carácter de escape, ya que indica a la función NSLog que el siguiente carácter no debe ser impreso directamente en pantalla sino que tiene un significado especial: en este caso la "n" significa "salta a la siguiente línea".

En el caso (no muy habitual) de que quisieras mostrar un contrabarra en pantalla, podría parecer que tienes un problema. Si el carácter tras la contrabarra tiene un significado especial, ¿cómo será posible imprimir una contrabarra?. Pues simplemente poniendo dos contrabarras juntas. Esto indicará a la función NSLog que debe imprimir la segunda contrabarra. Aquí tenemos un ejemplo:

//[4]
NSLog(@"Julia es mi actriz favorita.\\n");

La sentencia [4.1] producirá, tras la ejecución, la siguiente salida:
Julia es mi actriz favorita.\n

Mostrar variables

Hasta ahora sólo hemos mostrado cadenas estáticas. Imprimamos ahora el resultado de un cálculo.

//[5]
int x, numeroAMostrar;
x = 1;
numeroAMostrar = 5 + x;
NSLog(@"El valor del entero es %d.", numeroAMostrar);

Fíjate que, entre los paréntesis, tenemos una cadena, una coma y el nombre de una variable. La cadena contiene algo curioso: %d. Al igual que la contrabarra, el carácter de porcentaje (%) tiene un sentido especial. Si va seguido de una d (abreviatura para indicar número entero en sistema decimal), hace que en esa posición se inserte el valor que va a continuación de la coma, en este caso el contenido de la variable numeroAMostrar. Al ejecutar el ejemplo [5] el resultado será:

El valor del entero es 6.

Para mostrar un número con decimales (en inglés se llama tipo "float"), usaremos %f en lugar de %d.

//[6]
float x, numeroAMostrar;
x = 12345.09876;
numeroAMostrar = x/3.1416;
NSLog(@"El valor del número con decimales es %f.", numeroAMostrar);

Más tarde, cuando aprendas a hacer repeticiones de cálculos, podrías queres realizar una tabla de valores. Imagina una tabla de conversión de grados Fahrenheit a Celsius. Si quieres que los datos mostrados tengan buena apariencia, necesitarás que los datos en cada una de las dos columnas tengan un ancho fijo. Puedes especificar ese ancho introduciendo un número entero entre % y f (o entre % y d según el tipo de variable). Aún así, si el ancho que especificas es menor que el ancho del número, prevalecerá el ancho del número.

//[8]
int x = 123456;
NSLog(@"%2d", x);
NSLog(@"%4d", x);
NSLog(@"%6d", x);
NSLog(@"%8d", x);

La ejecución del ejemplo [8] producirá la siguiente salida:
123456
123456
123456
  123456

En las dos primeras sentencias [8.2, 8.3] solicitamos demasiado poco espacio para que el número sea mostrado completamente, pero se toma el espacio igualmente. Sólo en la sentencia [8.5] se especifica un ancho mayor que el del valor, y es donde apreciamos los espacios adicionales que se han requerido para mostrar el número.

También es posible combinar la especificación del ancho y el número de decimales con los que queremos que se muestre el dato.

//[9]
float x=1234.5678;
NSLog(@"Reserva espacio para 10, y muestra 2 dígitos significativos.");
NSLog(@"%10.2f", x);

Mostrar múltiples valores

Por supuesto es posible mostrar más de un valor o cualquier combinación de valores [10.3]. Lo que debes hacer es asegurarte de indicar correctamente el tipo de cada dato (int, float), usando %d y %f.

//[10]
int x = 8;
float pi = 3.1416;
NSLog(@"El valor de x es %d, mientras que el valor de pi es %f.", x, pi);

Asignar los símbolos a los valores

Uno de los errores más comunes entre los principiantes es especificar incorrectamente el tipo en funciones como NSLog y otras. Si tus resultados no son los esperados o el programa rompe sin una razón, revisa las sentencias en las que asignas los tipos de dato.

Si es incorrecta la asignación del primer dato, puede que el segundo tampoco sea mostrado correctamente. Un ejemplo:

//[10b]
int x = 8;
float pi = 3.1416;
NSLog(@"El valor int es %f, mientras que el valor float es %f.", x, pi);
// Lo correcto sería : NSLog(@"El valor int es %d, mientras que el valor float es %f.", x, pi);

produce la siguiente salida por consola:

El valor int es 3.141600, y el float es nan.

Vincular con la librería Foundation

Estamos a solamente una pregunta y una respuesta de ejecutar nuestro primer programa.

¿Cómo hace nuestro programa para conocer la función NSLog()? Bien, realmente no la conoce, a menos que nosotros se lo digamos. Para hacerlo, tenemos que indicar al compilador que importe la librería en la que está implementada la función NSLog() (junto a otras muchas que iremos conociendo). La sentencia es la siguiente:

#import <Foundation/Foundation.h>

Ésta debe ser la primera sentencia en nuestro programa. Si juntamos todo lo que hemos aprendido en este capítulo obtendremos el siguiente código, que haremos funcionar en el siguiente capítulo.

//[11]
#import <Foundation/Foundation.h>
float calculaAreaDelCirculo(float radio);
float calculaAreaDelRectangulo(float ancho, float alto);
int main()
{
    float anchoDelDibujo, altoDelDibujo, areaDelDibujo,
        radioDelCirculo, areaDelCirculo;
    anchoDelDibujo  = 8.0;
    altoDelDibujo = 4.5;
    radioDelCirculo  = 5.0;
    areaDelDibujo = calculaAreaDelRectangulo(anchoDelDibujo, altoDelDibujo);
    areaDelCirculo = calculaAreaDelCirculo(radioDelCirculo);
    NSLog(@"Area del círculo: %10.2f.", areaDelCirculo);
    NSLog(@"Area del cuadrado: %f.", areaDelDibujo);
    return 0;
}

float calculaAreaDelCirculo(float radio)  // primera función personalizada
{
    float area;
    area = 3.1416 * radio * radio;
    return area;
}
float calculaAreaDelRectangulo(float ancho, float alto) // segunda función personalizada
{
    return ancho* alto;
}

Post new comment

The content of this field is kept private and will not be shown publicly.
Enter the code shown in the image:

CAPTCHA
This question is for testing whether you are a human visitor and to prevent automated spam submissions.
3 + 5 =
Solve this simple math problem and enter the result. E.g. for 1+3, enter 4.

Donate!





If you like what you find here and wish to support further development of this site, please donate via PayPal. No account required.

Syndicate

Syndicate content

User login

CAPTCHA
This question is for testing whether you are a human visitor and to prevent automated spam submissions.
9 + 2 =
Solve this simple math problem and enter the result. E.g. for 1+3, enter 4.
Enter the code shown in the image: