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 Unix 1 ydeahíseexpandióalasuniversidadesyalaindustria.hoydí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 sulongevidad, 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, elamérican National Standars Institute (ANSI), publicólaespecificaciónoficialdellenguaje 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. Losestándares son los siguientes: C89: Estasreglassonelresultadodeunlargodebatequeinicióen 1983 y terminó en 1989. C90: En1990,ANSIrealizaunajustemenoralaversiónanterior.En la práctica C89 y C90 son lo mismo. C99: Nueveañosdespués,en1999,ANSIactualizalasreglasdellenguaje. C11: Enelaño2011,ANSIpublicaladefiniciónactualdeC. 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: Esunproductocomercialmultiplataforma desarrollado por Intel. Compila tanto código C como C++. GNU Compiler Collection: Esuncompiladormultiplataformade 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. Porejemplohola.c, nomina.c, etc.cadasistemaoperativotienesus 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 enlos sistemas operativos tipo Unix, las letras minúsculas se consideran diferentes alasmayú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: Esunprogramaquepermiteescribirtextosinformato. No confundir con procesador de texto. Código fuente: Esaquelqueescribeelprogramadorutilizandouneditor de texto. Código objeto: Esaquelquegeneraelcompiladorapartirdelcódigo fuente. Código ejecutable: Esaquelquepuedeserejecutadoporlacomputadora. 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 funciones 2 yunadeellas,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 1 #i n c l u d e <stdio.h> 2 3 int main () 4 { 5 printf ("Hola Mundo\n"); 6 return 0; Programa 1.1: Hola Mundo 2 Las funciones se estudian en el capítulo 3.
12 CAPÍTULO 1. EL LENGUAJE DE PROGRAMACIÓN ANSI C 7 } Línea 1: se incluye un archivo fuente de nombre stdio.h. Enesearchivo 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(). Todafuncióndebeindicar 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 yqueno 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. EnC,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, esunacadena. 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, tieneunsignificado 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. Acontinuaciónsepresentarálamaneraenquesecompilayejecuta 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: Enesteejemplobastaconescribirenlaconsola: 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 yenwindows,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: Paraejecutarlo,enlaconsoladelinuxsedeberá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: Paraqueelejecutable yelcó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 odehola.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. Eltamañoenbytesquese muestra es el soportado por gcc tanto en Windows como en Linux.
1.4. TIPOS DE DATOS. 15 int: Entero normal de32bits(4bytes).elrangodevaloresquepuede almacenar es [ 2 31 1, 2 31 1] short int: Enterode16bits(2bytes).Elrangodevaloresquepuede almacenar es [ 2 15 1, 2 15 1] long int: Enterode32bits(4bytes).Elrangodevaloresquepuede almacenar es [ 2 31 1, 2 31 1].Dependiendodelhardwareydelsistema 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: Igualqueunint pero especificando que soporta tanto valores positivos como negativos. unsigned int: Enterode32bits(4bytes)queúnicamentealmacena valores iguales o mayores a cero. El rango de valores que puede almacenar es [0, 2 32 1] unsigned long int: Esunenterolargosinsigno. unsigned short int: esunenterocortosinsigno. 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 auncaracter.porejemplo,elcódigoasciidelsímbolo A es0x41 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.521x10 1 o como 0.3521x10 2.Notequeelmismovalorsepuedeescribirvariandode 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 ylinuxeltamañodecadaunodeellosyelrangodevaloresquepueden representar son: float: flotantedeprecisiónnormalqueutiliza32bits(4bytes),cuyo rango de valores es [1.175494x10 38, 3.402823x10 38 ] double: flotantedeprecisióndoblequeutiliza64bits(8bytes),cuyo rango de valores es [2.225074x10 308, 1.797693x10 308 ] long double: flotantequeutiliza96bits(12bytes). 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.678x10 2. 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 17 1.5. 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 laizquierda. 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. Acontinuaciónseexplicarácadaunodeellos. Suma (+): Esteoperadorseusaparasumardosvaloresnumé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, selesuma el valor 2 y el resultado se asigna o se almacena en la variable t. Resta (-): Esteoperadorseusaparasustraerunvalornuméricode otro. int t; int temp = 30; t = temp - 2; En este ejemplo, al valor almacenado en la variable temp, selerestael valor 2 y el resultado se asigna o se almacena en la variable t. Multiplicación (*): Esteoperadorseusaparamultiplicardosvalores numéricos. Ejemplo: int t; int temp = 30; t = temp * 2; En este ejemplo, al valor almacenado en la variable temp, semultiplica por 2 y el resultado se asigna a la variable t. División (/): Esteoperadorseusaparadividirdosvaloresnuméricos. Ejemplo: float t; float temp = 30; t = temp / 2; En este ejemplo, al valor almacenado en la variable temp, sedivide entre 2 y el resultado se asigna a la variable t. Módulo ( %): Esteoperadorseusaparaobtenerelresiduodeuna división de números enteros. int t; int temp = 30; t = temp % 2; En este ejemplo, al valor almacenado en la variable temp, sedivide 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. 1 #i ncl ude <stdio.h> 2 3 int main () 4 { 5 printf ("Hola Mundo\n"); 6 return 0; 7 } Programa 1.2: Incluir stdio.h Las funciones que se discutirán a continuación son printf(),paraescritura 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 #i n c l u d e <stdio.h> 2 int main () 3 { 4 int k = 64; 5 printf ("El valor de K en decimal es %d", k); 6 printf ("\n" ); // El cursor se cambia al in icio 7 // del siguiente renglon 8 printf ("El valor de K en octal es % o", k); 9 printf ("\n" ); 10 p r i n t f ( " El v a l o r de K en hexadecimal es % x", k ) ; 11 p r i n t f ( "\n" ) ; 12 p r i n t f ( "K como c a r a c t e r : % c ", k ) ; 13 p r i n t f ( "\n" ) ; 14 return 0; 15 } 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 ysolamenteconsiderarálosprimeros 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.Enestecontexto%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. 1 #i ncl ude <stdio.h> 2 int main () 3 { 4 double w; 5 w = 0.003123456; 6 printf ("w = %f\n", w); 7 printf ("w = %.3f\n", w); 8 printf ("w = %e\n", w); 9 printf ("w = %.2e\n"); 10 return 0; 11 } Programa 1.4: printf() y los flotantes
1.8. FUNCIÓN SCANF() 23 1.8. Función scanf() Figura 1.4: printf() ylosflotantes 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; yserequiereleerunvalorparaella,sedebe 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. Observeelcódigodel programa 1.5 y su salida en la figura 1.5. Programa 1.5: Lectura de un número sin formato. 1 #i n c l u d e <stdio.h> 2 int main () 3 { 4 int k; 5 printf ("Introduce un valor de tipo entero : "); 6 scanf ("%d", &k); 7 printf ("k = %d\n", k); 8 return 0; 9 } Figura 1.5: Lectura de un entero. La función scanf(), exigeconocerladireccióndelavariablecuyovalor 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. Observeelcódigodelprograma 1.6 y su salida en la figura 1.6. Programa 1.6: Lectura de un número con formato. 1 #i n c l u d e <stdio.h> 2 int main () 3 { 4 int k; 5 printf ("Introduce un valor de tipo entero : "); 6 scanf ("(%d)", &k); 7 printf ("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 queel código fuente se puede obtener aquí.
1.8. FUNCIÓN SCANF() 25 Programa 1.7: Lectura de una fecha. 1 #i ncl ude <stdio.h> 2 int main () 3 { 4 int day, month, year ; 5 printf ("Introduce una fecha en el formato d/m/a: " ); 6 scanf ("%d/%d/%d", &day, &month, &year ); 7 printf ("La fecha es : %d/%d/%d\n", day, month, year ); 8 return 0; 9 } 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