1 El lenguaje de programación ANSI C Gerardo Cruz González 1.1. Introducción al lenguaje C La Programación Estructurada, es un modelo o paradigma de programación, basado en tres mecanismos que se utilizan para definir el flujo o secuencia de ejecución de un programa. Esos mecanismos reciben el nombre de estructuras de control y se discutirán ampliamente en el capítulo dos de este libro. Un lenguaje de programación que aplique esas estructuras de control recibe el nombre de lenguaje estructurado. Uno de los lenguajes que toma ese modelo de programación es el lenguaje de programación C. 1.1.1. Lenguaje C El lenguaje C surge en la década de 1970 en un ambiente de programación Unix1 y de ahí se expandió a las universidades y a la industria. Hoy día C, junto con C++ y Java son de los lenguajes más utilizados para la realización de todo tipo de sistemas informáticos. Por lo tanto, a pesar de su longevidad, 1 Unix es un sistema operativo. 7 8 CAPÍTULO 1. EL LENGUAJE DE PROGRAMACIÓN ANSI C C es un lenguaje que los especialistas en ciencias de la computación deben conocer. 1.1.2. Evolución del lenguaje C La primera versión de C fue publicada por los autores del lenguaje Brian W. Kernighan y Dennis M. Ritchie en 1978. Las reglas definidas por ellos se tomaron como las reglas de facto para el lenguaje. Sin embargo, los fabricantes de compiladores (ver sección 1.1.3) comenzaron a introducir cambios arbitrarios en la definición del lenguaje, provocando que escribir un programa fuese confuso y complicado. Por esa razón, en el año de 1989, el Américan National Standars Institute (ANSI), publicó la especificación oficial del lenguaje C. Así cualquier programa que siguiera esas reglas, debe ser compilado por cualquier compilador del lenguaje C. El ANSI es un organismo estadounidense dedicado a supervisar el desarrollo de estándares para productos, servicios, procesos y sistemas en Estados Unidos. Toda la información referente a este organismo se puede leer en http://ansi.org Al pasar el tiempo el lenguaje C ha evolucionado y se ha tenido que ajustar a las nuevas necesidades de los programadores. Por ello, ANSI se ha visto obligado a generar nuevos estándares para el lenguaje. Los estándares son los siguientes: C89: Estas reglas son el resultado de un largo debate que inició en 1983 y terminó en 1989. C90: En 1990, ANSI realiza un ajuste menor a la versión anterior. En la práctica C89 y C90 son lo mismo. C99: Nueve años después, en 1999, ANSI actualiza las reglas del lenguaje. C11: En el año 2011, ANSI publica la definición actual de C. 1.1.3. Compiladores de C Un compilador es un programa de computadora que se utiliza para traducir el código que escribe un programador, a otro código equivalente. El Código que puede ejecutar una computadora se llama código ejecutable o simplemente ejecutable. En la industria del software es posible encontrar compiladores desarrollados por diferentes empresas u organizaciones. Entre los más populares están: 1.2. AMBIENTE DE PROGRAMACIÓN 9 Intel C++ Compiler: Es un producto comercial multiplataforma desarrollado por Intel. Compila tanto código C como C++. GNU Compiler Collection: Es un compilador multiplataforma de distribución libre desarrollado por el grupo GNU. Visual Studio de Microsoft: Es un producto desarrollado por Microsoft para sus diferentes versiones de Windows. Es importante aclarar que aunque existe una definición estandarizada del lenguaje, no todos los desarrolladores de compiladores las implantan al 100 %. Por ejemplo, Microsoft ha dicho que no implantará ningún cambio que rompa la compatibilidad entre C y C++, y el grupo GNU ha dicho que los cambios serán graduales, sin especificar fechas concretas. 1.2. Ambiente de programación Para programar en C se requiere una computadora, un sistema operativo, un compilador y un editor de texto. La computadora puede ser una PC, una Mac o cualquier otra; el sistema puede se MS-Windows en cualquiera de sus versiones, linux en cualquiera de sus presentaciones u OSX. El compilador puede ser cualquiera, siempre y cuando esté disponible para el sistema operativo de su elección y el editor de texto también puede ser cualquiera. El compilador que se utiliza en este libro es gcc en modo ANSI 2011 (c11), por estar disponible tanto en Windows, OSX, Linux y otros sistemas operativos menos conocidos, aunque el estudiante puede utilizar el que sea de su preferencia. 1.2.1. Desarrollo de programas en C Como el nombre del programa es importante tanto para el programador como para el compilador, a continuación se darán algunas recomendaciones para que los nombres no generen errores o confusiones. Nombre de un programa Un programa en C, puede tener cualquier nombre pero debe terminar en .c. Por ejemplo hola.c, nomina.c, etc. Cada sistema operativo tiene sus propias reglas para los nombres de los archivos. Se sugiere que para los nombres de sus archivos, solamente use letras, dígitos y subrayado. También se sugiere que los archivos que contienen código fuente de C, no terminen 10 CAPÍTULO 1. EL LENGUAJE DE PROGRAMACIÓN ANSI C en .C, .cc, .cpp o .c++ ya que algunos compiladores compilarían siguiendo las reglas del lenguaje C++ y no las de C. También considere que en los sistemas operativos tipo Unix, las letras minúsculas se consideran diferentes a las mayúsculas. Metodología de desarrollo Antes de explicar la metodología de desarrollo de software, se darán las definiciones necesarias para entender las secciones siguientes: Editor de texto: Es un programa que permite escribir texto sin formato. No confundir con procesador de texto. Código fuente: Es aquel que escribe el programador utilizando un editor de texto. Código objeto: Es aquel que genera el compilador a partir del código fuente. Código ejecutable: Es aquel que puede ser ejecutado por la computadora. Consecuentemente, los pasos para desarrollar un programa en C, son: (ver figura 1.1). Editar el programa, es decir, escribir el código fuente utilizando un editor de texto. Compilar el programa utilizando un compilador. Si no hay errores, el compilador traduce el código fuente a código objeto. En caso contrario, el programador debe corregir el error. Después de compilado, al código objeto resultante se le debe anexar el código de las bibliotecas o funciones necesarias para que pueda ejecutarse. De esto se encarga un programa llamado linker, el cual genera el programa ejecutable. En la siguiente sección se darán ejemplos de lo discutido anteriormente. 1.3. Estructura de un programa. El lenguaje de programación C se basa en la noción de función. Una función es una secuencia de instrucciones agrupadas bajo un solo nombre y 1.3. ESTRUCTURA DE UN PROGRAMA. 11 Figura 1.1: Ciclo de desarrollo. que opcionalmente generan un valor como respuesta. Por esta razón, todos los programas escritos en C, contienen una o más funciones2 y una de ellas, y solamente una, recibe el nombre de main(). La función main() es la función donde se inicia la ejecución del programa. Sin ella el programa no puede ejecutarse. 1.3.1. Hola Mundo. Para ejemplificar lo anterior se usará el programa del listado 1.1 Programa 1.1: Hola Mundo 1 2 3 4 5 6 #include < s t d i o . h> i n t main ( ) { p r i n t f ( " Hola Mundo\n" ) ; return 0 ; 2 Las funciones se estudian en el capítulo 3. 12 7 CAPÍTULO 1. EL LENGUAJE DE PROGRAMACIÓN ANSI C } Línea 1: se incluye un archivo fuente de nombre stdio.h. En ese archivo están declaradas las funciones de entrada y salida que acompañan al compilador de C. Note que el renglón inicia con # y que el nombre del archivo está encerrado entre los símbolos < y >. Línea 3: Se declara y se define la función main(). Toda función debe indicar el tipo de dato al que corresponde su resultado y entre paréntesis, debe indicar los parámetros de entrada que requiere para trabajar. Cuando no se específica el tipo de resultado, el compilador asume que el resultado de la función es de tipo entero (int). En este caso, explicitamente, se indica que main() regresa un dato de tipo int y que no requiere parámetros de entrada, por lo tanto sus paréntesis () quedan vacios. Líneas 4 y 7: La totalidad del código de una función debe estar delimitada entre { y }. Esas son las marcas de principio y fin de bloque y en este caso, de programa. Líneas 5: La función printf() declarada en stdio.h, se utiliza para imprimir los resultados de un programa. En este ejemplo, únicamente se quiere que en la pantalla aparezca la frase “Hola mundo”. Por eso se invoca o se llama a esa función con la cadena “Hola mundo”. En C, una cadena de caracteres es una secuencia de números, letras, espacios en blanco y otros símbolos, rodeados por comillas dobles. Por ejemplo:“la vida es hermosa”, es una cadena. La función printf() es una función especializada en formatear los datos que genera un programa, para que tengan un aspecto legible y agradable para el usuario. printf() toma los datos binarios de la memoria del programa, los traduce a un formato entendible por el humano y los escribe en la salida estándar del programa que se está ejecutando. La función printf() se discutirá ampliamente en la sección 1.7. La salida estándar es un bloque o fragmento de memoria RAM en donde se guardan los datos que un programa requiere imprimir. El sistema operativo decide si esos datos se envían a la pantalla, a la impresora, al disco, o a la entrada de otro programa. Por omisión, la conexión es hacia la pantalla. 1.3. ESTRUCTURA DE UN PROGRAMA. 13 Línea 6: En la línea 1, main() fue declarada de tipo entero. Por lo tanto, forzosamente debe regresar o retornar un valor de ese tipo. En este caso regresa un cero (0). El return 0 de main, tiene un significado importante: Por medio de ese 0, main() le está avisando al sistema operativo que terminó su ejecución de forma exitosa. Un valor diferente, índica que la ejecución terminó con algún problema o error. A continuación se presentará la manera en que se compila y ejecuta el programa. Para ello, se utilizará gcc en modo compatible con el ANSI 2011. 1.3.2. Compilando, ligando y ejecutando Después de escribir el código fuente, el programa se debe compilar y ligar para convertirlo en un programa ejecutable. P Todos los programas de éste libro serán compilados usando el compilador gcc. Entonces, suponiendo que el programa ya esté editado y que el archivo tenga por nombre hola.c, la secuencias de pasos es: Compilación y ligado: En este ejemplo basta con escribir en la consola: gcc -std=c11 hola.c <enter> Este comando, compila el programa y lo enlaza o liga con el código necesario para que sea un programa ejecutable. En linux el ejecutable se llamará a.out y en Windows, a.exe. La opción -std=c11, le índica al compilador que debe aceptar código conforme a las reglas establecidas por el ISO en el año 2011. Ejecución: Para ejecutarlo, en la consola de linux se deberá escribir: a.out <enter> o ./a.out<enter> donde el primer punto (.) significa “buscar comando en la carpeta actual” y la diagonal / es simplemente un separador entre el punto y el nombre del programa. En tanto que en la ventana de comandos de Windows, se debe escribir a<enter> para que el programa sea ejecutado. En Windows no es necesario escribir .exe al final del nombre del programa. Cambiando el nombre: Para que el ejecutable y el código fuente tengan el mismo nombre, gcc se debe invocar así: 14 CAPÍTULO 1. EL LENGUAJE DE PROGRAMACIÓN ANSI C Figura 1.2: Compilando programa gcc -std=c11 hola.c -o hola<enter> La opción -o hola, índica que el ejecutable deberá tener por nombre hola en lugar de a.out o de hola.exe en lugar a.exe. La figura 1.2 muestra la secuencia de pasos explicados anteriormente: En la siguiente sección se presentarán los tipos de datos disponibles en C. 1.4. Tipos de datos. El lenguaje de programación C tiene los siguientes tipos de datos: Tipo de datos entero (int), tipo de datos para manejo de caracteres (char ), tipo de datos de punto flotante de precisión sencilla (float ) y tipo de dato de punto flotante de precisión doble (double). A continuación explicará cada uno de ellos. 1.4.1. Tipo int El tipo de dato entero, como su nombre lo indica, solamente se utiliza para representar valores numéricos enteros, es decir sin punto decimal. Por ejemplo, los valores 5, 20, -10, -80 son enteros, pero 5.3, 30.8 y -8.2 no lo son. De acuerdo con [KR91], el tipo de dato int se usa para la manipulación de valores numéricos enteros y tiene modificadores que alteran su comportamiento y también la cantidad de bytes que se utilizan para su representación interna. A continuación se explicará todo lo referente al tipo de dato int y sus calificadores short, long, signed y unsigned. El tamaño en bytes que se muestra es el soportado por gcc tanto en Windows como en Linux. 1.4. TIPOS DE DATOS. 15 int: Entero “normal” de 32 bits (4 bytes). El rango de valores que puede almacenar es [−231 − 1, 231 − 1] short int: Entero de 16 bits (2 bytes). El rango de valores que puede almacenar es [−215 − 1, 215 − 1] long int: Entero de 32 bits (4 bytes). El rango de valores que puede almacenar es [−231 −1, 231 −1]. Dependiendo del hardware y del sistema operativo, un long int podría ser de 64 bits. La única garantía que existe es que su tamaño siempre será mayor o igual al de un int. signed int: Igual que un int pero especificando que soporta tanto valores positivos como negativos. unsigned int: Entero de 32 bits (4 bytes) que únicamente almacena valores iguales o mayores a cero. El rango de valores que puede almacenar es [0, 232 − 1] unsigned long int: Es un entero largo sin signo. unsigned short int: es un entero corto sin signo. Por otro lado, las constantes enteras siguen estas reglas: 127 es una constante de tipo entero. 127l o 127L es una constante de tipo long. 127u o 127U se considera una constante entera sin signo (unsigned). 127ul o 127UL se considera una constante entera unsigned long. Si un numero es muy grande para caber en un entero, se considera long. 0127 será tomada como una constante octal (inicia con el dígito cero). 0x127 o 0X127 será interpretado como una constante hexadecimal (inicia con 0x). 0X127UL se considera un constante entera hexadecimal unsigned long. 16 CAPÍTULO 1. EL LENGUAJE DE PROGRAMACIÓN ANSI C 1.4.2. Tipo char El tipo de dato char se usa para almacenar el código numérico del juego de caracteres ASCII. El código ascii consiste en asignarle un código numérico a un caracter. Por ejemplo, el código ascii del símbolo ’A’ es 0x41 y el de ’B’ es 0x42, etc. Esto se hace para que la computadora pueda manipular caracteres por medio de valores numéricos. Un char es un entero de 8 bits y se le puede aplicar el modificador signed o unsigned. La computadora solamente procesa datos numéricos en binario. Por eso es necesario asignarle valores numéricos a las letras y demás símbolos utilizados en los programas. 1.4.3. Tipo flotante Estos tipos se llaman así, porque internamente se representan utilizando notación científica: Por ejemplo, 35.21 se puede escribir como 3.521x101 o como 0.3521x102 . Note que el mismo valor se puede escribir variando de posición el punto decimal y el valor del exponente. Como el punto decimal se puede cambiar de posición, se dice que los valores son de punto flotante. Los flotantes se clasifican en float, double y long double. En Windows y Linux el tamaño de cada uno de ellos y el rango de valores que pueden representar son: float: flotante de precisión normal que utiliza 32 bits (4 bytes), cuyo rango de valores es [1.175494x10−38 , 3.402823x1038 ] double: flotante de precisión doble que utiliza 64 bits (8 bytes), cuyo rango de valores es [2.225074x10−308 , 1.797693x10308 ] long double: flotante que utiliza 96 bits (12 bytes). Por otro lado, las constantes de punto flotante, siguen éstas reglas: 127.32 es una constante double. 3.678e+2 representa la constante double 367.8, es decir, 3.678x102 . 3.678e-2 representa la constante double 0.03678, es decir, 3.678x10−2 . 127.32l o 127.32L representa una constante double. 127.32f o 127.32F representa una constante float. 1.5. VARIABLES, OPERADORES Y EXPRESIONES 1.5. 17 Variables, operadores y expresiones Las variables y las constantes son los objetos de datos básicos que se manipulan en un programa [KR91]. Constantes Las constantes son valores que nunca cambian. Por ejemplo: 3, 6, 10 y -1 son constantes porque no cambian. Variables Una variable es una región de memoria a la que se le asocia un nombre, un tipo de dato, un valor y una dirección o ubicación en la memoria de la computadora. Los valores almacenados en las variables cambian durante la ejecución del programa y una variable siempre debe declararse antes de utilizarse. Los nombres de la variables pueden contener uno o mas caracteres (algunos compiladores soportan nombres de variables de hasta 32 o incluso más de ellos). Los caracteres válidos son letras, dígitos y el carácter de subrayado (_). El nombre de una variable siempre debe iniciar con una letra y se debe recordar que el lenguaje C es sensible a minúsculas y mayúsculas: Por ello, la variable de nombre numAula se considera diferente a numAULA. Ejemplos: int numEstudiantes, numAula, numAULA; float pesoAdulto, pesoCachorro; Ejemplo de declaración e inicialización de variables; int numEstudiantes = 20, numAula = 3; float pesoAdulto = 14.5, pesoCachorro =1.5; Las variables no inicializadas contienen valores desconocidos, comúnmente llamados basura. Si en una expresión u operación se utiliza una variable no inicializada, el resultado estará indefinido. Expresiones En C, una expresión es una combinación de variables y de constantes por medio de operadores que generan un nuevo valor. Las expresiones combinan variables y constantes, por medio de los operadores, para producir nuevos valores. 18 CAPÍTULO 1. EL LENGUAJE DE PROGRAMACIÓN ANSI C Los expresiones, los operandos y los operadores están estrechamente relacionados. Por esa razón los ejemplos correspondientes se darán en las subsecciones siguientes. Operador de asignación El operador de asignación, representado por el símbolo =, se utiliza para asignar el valor de la expresión de la derecha, a la variable de la izquierda. Ejemplo: x=5; Aquí, el valor 5 se asigna a la variable x. 1.5.1. Operadores aritméticos En la tabla 1.1 se muestran los operadores arítmeticos disponibles en C. Todos ellos se consideran operadores binarios porque requieren de dos operandos para realizar la operación correspondiente. Operador Operación + suma - resta * multiplicación / división % modulo Tabla 1.1: Operadores comunes en C. A continuación se explicará cada uno de ellos. Suma (+): Este operador se usa para sumar dos valores numéricos. Ejemplo: int t; int temp = 30; t = temp + 2; 1.5. VARIABLES, OPERADORES Y EXPRESIONES 19 En este ejemplo, al valor almacenado en la variable temp, se le suma el valor 2 y el resultado se asigna o se almacena en la variable t. Resta (-): Este operador se usa para sustraer un valor numérico de otro. int t; int temp = 30; t = temp - 2; En este ejemplo, al valor almacenado en la variable temp, se le resta el valor 2 y el resultado se asigna o se almacena en la variable t. Multiplicación (*): Este operador se usa para multiplicar dos valores numéricos. Ejemplo: int t; int temp = 30; t = temp * 2; En este ejemplo, al valor almacenado en la variable temp, se multiplica por 2 y el resultado se asigna a la variable t. División (/): Este operador se usa para dividir dos valores numéricos. Ejemplo: float t; float temp = 30; t = temp / 2; En este ejemplo, al valor almacenado en la variable temp, se divide entre 2 y el resultado se asigna a la variable t. Módulo ( %): Este operador se usa para obtener el residuo de una división de números enteros. int t; int temp = 30; t = temp % 2; En este ejemplo, al valor almacenado en la variable temp, se divide entre 2 y el residuo de la división se almacena en la variable t. De los operadores vistos anteriormente, el operador módulo solamente está definido para enteros. 20 CAPÍTULO 1. EL LENGUAJE DE PROGRAMACIÓN ANSI C 1.6. Instrucciones de entrada y salida El lenguaje de programación C, no define instrucciones de lectura y/o escritura de datos (E/S). Para ello hace uso de las funciones definidas en la biblioteca estándar de entrada y salida. Las declaraciones o los prototipos de esas funciones están en un archivo llamado stdio.h. stdio.h se debe anexar a cualquier programa que requiera realizar ese tipo de operaciones mediante la instrucción #include <stdio.h> como se muestra en el primer renglón del programa 1.2. Programa 1.2: Incluir stdio.h 1 2 3 4 5 6 7 #include <s t d i o . h> i n t main ( ) { p r i n t f ( " Hola Mundo\n" ) ; return 0 ; } Las funciones que se discutirán a continuación son printf(), para escritura de datos y de scanf() para lectura de datos. 1.7. Función printf() La función printf está declarada en stdio.h y definida en la biblioteca estándar que acompaña al lenguaje C. Se especializa en escribir la información generada por un programa en un formato legible para el usuario. Está función es altamente sofisticada y sumamente potente. Se compone de dos partes: Una cadena de control que indica el formato en que deben escribirse los resultados generados por las expresiones. Una lista de las expresiones que generan los datos a ser escritos. Las expresiones se separan mediante coma (,). 1.7.1. printf() y los enteros En esta sección se mostrarán las diferentes opciones de que dispone la función printf() para imprimir valores de tipo entero y para ejemplificarlo, se usará el programa 1.3: 1.7. FUNCIÓN PRINTF() 21 Programa 1.3: Ejemplo de printf 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #include < s t d i o . h> i n t main ( ) { int k = 64; p r i n t f ( " El v a l o r de K en d e c i m a l e s % d" , k ) ; p r i n t f ( " \n" ) ; // El c u r s o r s e cambia a l i n i c i o // d e l s i g u i e n t e r e n g l o n p r i n t f ( " El v a l o r de K en o c t a l e s % o " , k ) ; p r i n t f ( " \n" ) ; p r i n t f ( " El v a l o r de K en h ex a d eci m a l e s % x" , k ) ; p r i n t f ( " \n" ) ; p r i n t f ( "K como c a r a c t e r : % c " , k ) ; p r i n t f ( " \n" ) ; return 0 ; } Línea 4: Se declara e inicializa la variable k con el valor decimal 64. Línea 5: Se invoca a la función printf() con la cadena de control y la variable a ser impresa. En C, toda cadena va delimitada por comillas . La cadena de control “El valor de K en decimal es %d” significa lo siguiente: • La parte .El valor de K en decimal es" se imprime tal cual, es decir, sin ningún cambio. • La parte que dice " %d" índica que en esa posición de la cadena aparecerá un valor entero decimal. En este ejemplo, ese espacio se reserva para que allí se imprima el valor de la variable k. Línea 8: La sección de cadena " %o" indica que en esa posición aparecerá un valor entero escrito en octal. Línea 10: La sección de cadena " %x" indica que en esa posición aparecerá un valor entero en hexadecimal. Línea 12: La sección de cadena " %c" indica que en esa posición aparecerá un carácter, es decir, un símbolo del conjunto de caracteres ASCII. La salida del programa 1.3 se puede ver en la figura 1.3. Note que un mismo valor se puede presentar de diferentes maneras. Su representación interna no cambia, pero su aspecto visual si. La función printf() no altera el valor de las variables, solamente los imprime. 22 CAPÍTULO 1. EL LENGUAJE DE PROGRAMACIÓN ANSI C Figura 1.3: Enteros con printf. 1.7.2. printf() y los flotantes Las opciones para imprimir valores de punto flotante son las siguientes: Si w=0.003123456, printf(“w = %f ”, w) imprimirá o escribirá w = 0.003123. En este contexto %f índica que el valor a escribir será interpretado como un float o double. Si w = 0.003123456, printf(“w = %.3f ”, w) imprimirá o escribirá w = 0.003. En este contexto %.3f índica que el valor a escribir será interpretado como un float o double y solamente considerará los primeros tres dígitos decimales. Si w=0.003123456, printf(“w = %e”, w) imprimirá o escribirá w = 3.123456e-03 que significa 3.123456 x 10−3 . En este contexto %e, índica que se usará notación científica para imprimir el valor. “ %.2e” significa notación científica con dos dígitos decimales. Para w =0.003123456, printf(“w = %e”, w) imprimirá 3.12 x 10−3 . Lo anterior se puede observar en el programa 1.4 y su salida en la figura 1.4. Programa 1.4: printf() y los flotantes 1 2 3 4 5 6 7 8 9 10 11 #include <s t d i o . h> i n t main ( ) { double w ; w = 0.003123456; p r i n t f ( "w = %f \n" , w ) ; p r i n t f ( "w = %.3 f \n" , w ) ; p r i n t f ( "w = %e \n" , w ) ; p r i n t f ( "w = %.2e \n" ) ; return 0 ; } 1.8. FUNCIÓN SCANF() 23 Figura 1.4: printf() y los flotantes 1.8. Función scanf() La función scanf() es la contraparte de printf(), es decir, se especializa en la lectura de datos provenientes de la entrada estándar del programa. (La mayoría de las veces, la entrada estándar está conectada al teclado de la computadora). Esta función trabaja así: Si se tiene una varible int k; y se requiere leer un valor para ella, se debe ejecutar: scanf(“ %d”, &k); donde la cadena de control o de formato “ %d” índica que se espera un valor de tipo entero y la expresión &k índica la dirección en memoria de la variable k. Observe el código del programa 1.5 y su salida en la figura 1.5. Programa 1.5: Lectura de un número sin formato. 1 #include <s t d i o . h> 2 i n t main ( ) 3 { 4 int k ; 5 p r i n t f ( " I n t r o d u c e un v a l o r de t i p o e n t e r o : " ) ; 6 s c a n f ( " % d" , &k ) ; 7 p r i n t f ( "k = % d\n" , k ) ; 8 return 0 ; 9 } Figura 1.5: Lectura de un entero. La función scanf(), exige conocer la dirección de la variable cuyo valor debe ser leído. Para ello, al nombre de la variable se le antepone el operador &. 24 CAPÍTULO 1. EL LENGUAJE DE PROGRAMACIÓN ANSI C El operador & se llama operador de referenciación. Cuando al nombre de la variable V se le antepone el operador &, (&V), se lee “en la dirección de V”. La cadena de control puede ser sofisticada: Por ejemplo, en la instrucción scanf(“( %d)”, &k); el usuario debe teclear (8) para que el valor 8 pueda leerse y guardarse en la variable k. Observe el código del programa 1.6 y su salida en la figura 1.6. Programa 1.6: Lectura de un número con formato. 1 #include <s t d i o . h> 2 i n t main ( ) 3 { 4 int k ; 5 p r i n t f ( " I n t r o d u c e un v a l o r de t i p o e n t e r o : " ) ; 6 s c a n f ( "( %d ) " , &k ) ; 7 p r i n t f ( "k = % d\n" , k ) ; 8 return 0 ; 9 } Figura 1.6: Lectura de una fecha. Suponga que se requiere leer una fecha, para ello en el programa se tiene la declaración int day, month, year; Para leer esos datos se puede hacer lo siguiente: scanf(“ %d/ %d/ %d”, &day, &month, &year ) Para que la lectura sea exitosa, el usuario debe teclear algo similar a 19/3/2014. Observe las diagonales tanto en la cadena de formato como en la línea de entrada tecleada por el usuario. También observe el código del programa 1.7 y su salida en la figura 1.7, mientras que el código fuente se puede obtener aquí. 1.8. FUNCIÓN SCANF() 25 Programa 1.7: Lectura de una fecha. 1 2 3 4 5 6 7 8 9 #include <s t d i o . h> i n t main ( ) { i n t day , month , y e a r ; p r i n t f ( " I n t r o d u c e una f e c h a en e l f o rm a to d/m/ a : " ) ; s c a n f ( " %d/ %d/ %d" , &day , &month , &y e a r ) ; p r i n t f ( "La f e c h a e s : %d/ %d/ %d\n" , day , month , y e a r ) ; return 0 ; } Figura 1.7: Lectura de una fecha. Para introducir valores de tipo float se debe cambiar ” %d” por ” %f ”. Las opciones de la función son muchas. Aquí solamente se ha presentado un pequeño bosquejo de lo que esta función puede hacer. 26 CAPÍTULO 1. EL LENGUAJE DE PROGRAMACIÓN ANSI C