El lenguaje de programación ANSI C

Anuncio
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
Descargar