Ingeniero Técnico en Informática de Gestión
Introducción al lenguaje C. Introducción
Introducción
al
Lenguaje C
Contenido
1. Introducción 1
Breve historia 1
Ejemplo 1: #include, main(), printf() 2
Ejemplo 2: scanf() 4
Ejemplo 3: Funciones con argumentos 6
Ejemplo 4: Funciones que devuelven valores 8
Ejercicios 9
2. Elementos de un programa C 11
Introducción 11
Constantes 11
Identificadores 14
Palabras Reservadas 14
Comentarios 15
Operadores, expresiones, sentencias 15
Efecto lateral 25
Las directivas #include y #define 26
Ejercicios 28
3. Tipos básicos de datos 31
Tipos básicos de datos 31
Cómo declarar variables 32
Modificadores del tipo de una variable 33
Variables locales y variables globales 34
Clases de almacenamiento 36
Inicialización de variables 39
Ejercicios 40
4. E/S básica 41
Tipos de E/S 41
E/S de caracteres 41
E/S de cadenas de caracteres 43
E/S formateada 44
La función fprintf () 51
Control de la pantalla de texto 51
Ejercicios 60
5. Sentencias de control 62
La estructura if 62
La estructura switch 63
Bucles 66
Sentencia break 73
Sentencia continue 73
Etiquetas y sentencia goto 74
Función exit() 75
Ejercicios 77
6. Funciones 81
Introducción 81
Argumentos de funciones 82
Valores de retorno de una función 84
Prototipos de funciones 85
Recursividad 87
La biblioteca de funciones 89
Ejercicios 91
7. Matrices y punteros 95
¿Qué es una matriz? 95
¿Qué son los punteros? 95
Matrices unidimensionales 99
Cadenas de caracteres 101
Punteros y matrices 106
Matrices bidimensionales 107
Matrices de más de 2 dimensiones 109
Cómo inicializar matrices 110
Matrices como argumentos de funciones 111
Argumentos de la función main() 113
Matrices de punteros 115
Punteros a punteros 115
Punteros a funciones 116
Ejercicios 118
8. Otros tipos de datos 123
Introducción 123
Tipos definidos por el usuario 123
Estructuras 124
Uniones 132
Enumeraciones 137
Ejercicios 139
9. Asignación dinámica de memoria 141
Almacenamiento estático y dinámico 141
Las funciones malloc() y free() 142
Matrices asignadas dinámicamente 144
Colas dinámicas 146
Ejercicios 149
10. Ficheros 151
Canales y ficheros 151
Abrir y cerrar ficheros 152
Control de errores y fin de fichero 154
E/S de caracteres 155
E/S de cadenas de caracteres 157
E/S de bloques de datos 158
E/S con formato 162
Acceso directo 162
Ejercicios 165
11. Ficheros indexados: la interfase Btrieve 169
Introducción 169
Descripción de Btrieve 169
Gestión de ficheros Btrieve 170
El Gestor de Datos Btrieve 172
El utilitario BUTIL 173
Interfase de Btrieve con Turbo C 177
Operaciones Btrieve 178
Ejemplos 182
Códigos de error Btrieve 188
Ejercicios 189
12. Compilación y enlazado 193
Introducción 193
Modelos de memoria 193
El compilador TCC 195
El enlazador TLINK 197
El bibliotecario TLIB 199
La utilidad MAKE 200
Un ejemplo sencillo 201
13. La biblioteca de funciones de Turbo C 207
Introducción 207
Funciones de E/S 207
Funciones de cadenas de caracteres 210
Funciones de memoria 212
Funciones de caracteres 214
Funciones matemáticas 216
Funciones de sistema 217
Funciones de asignación dinámica de memoria 225
Funciones de directorio 226
Funciones de control de procesos 229
Funciones de pantalla de texto 232
Otras funciones 234
14. Soluciones a los ejercicios 239
Capítulo 1: Introducción 239
Capítulo 2: Elementos de un programa C 240
Capítulo 3: Tipos básicos de datos 244
Capítulo 4: E/S básica 244
Capítulo 5: Sentencias de control 248
Capítulo 6: Funciones 253
Capítulo 7: Matrices y punteros 260
Capítulo 8: Otros tipos de datos 275
Capítulo 9: Asignación dinámica de memoria 278
Capítulo 10: Ficheros 280
Capítulo 11: Ficheros indexados: la interfase Btrieve 285
1
Introducción
Breve historia
El Lenguaje C fue creado en 1972 por Dennis Ritchie en un PDP-11 de Digital Equipment Corporation bajo el sistema operativo UNIX. Fue el resultado final de un proyecto que comenzó con un lenguaje llamado BCPL (Basic Combined Programming Language) diseñado por Martin Richards en 1967, que a su vez estaba influenciado por el lenguaje CPL (Combined Programming Language) desarrollado por las universidades de Cambridge y Londres. A partir del BCPL, Ken Thompson creó un lenguaje llamado B, que fue el que condujo al desarrollo del Lenguaje C.
Durante muchos años el estándar para C fue el que se suministraba con la versión 5 de UNIX. Pero con la creciente popularidad de los microordenadores aparecieron muchas implementaciones diferentes (Quick C de Microsoft, Turbo C de Borland, etc.) que, aunque eran altamente compatibles entre sí, tenían algunas diferencias. Por ello, en 1983 se creó un comité que elaboró el documento que define el estándar ANSI de C.
El Lenguaje C es un lenguaje de nivel medio, es decir, sin ser un lenguaje de alto nivel como COBOL, BASIC o Pascal, tampoco es un Lenguaje Ensamblador.
Las principales características del Lenguaje C son:
-
Tiene un conjunto completo de instrucciones de control.
-
Permite la agrupación de instrucciones.
-
Incluye el concepto de puntero (variable que contiene la dirección de otra variable).
-
Los argumentos de las funciones se transfieren por su valor. Por ello, cualquier cambio en el valor de un parámetro dentro de una función no afecta al valor de la variable fuera de ella.
-
La E/S no forma parte del lenguaje, sino que se proporciona a través de una biblioteca de funciones.
-
Permite la separación de un programa en módulos que admiten compilación independiente.
Originalmente el Lenguaje C estuvo muy ligado al sistema operativo UNIX que, en su mayor parte, está escrito en C. Más adelante se comenzó a utilizar en otros sistemas operativos para programar editores, compiladores, etc. Aunque se le conoce como un lenguaje de programación de sistemas, no se adapta mal al resto de aplicaciones. De hecho, hoy en día un alto porcentaje de software para ordenadores personales está escrito en Lenguaje C. Por ejemplo, el sistema operativo MS-DOS.
En este capítulo realizaremos un rápido recorrido por algunas de las características del lenguaje a través de unos ejemplos muy sencillos. En los siguientes capítulos estudiaremos con mucho más detalle la mayor parte de los aspectos del Lenguaje C. Este estudio lo basaremos en la implementación de Borland: el Turbo C. Estos programas pueden ejecutarse desde el entorno integrado de Turbo C o compilándolos y enlazándolos desde la línea de órdenes del DOS (Capítulo 12).
Ejemplo 1: #include, main(), printf()
Comenzaremos por un ejemplo sencillo: un programa que muestra en pantalla una frase.
/* Ejemplo 1. Programa DOCENA.C */
#include <stdio.h>
main ()
{
int docena;
docena = 12;
printf ("Una docena son %d unidades\n", docena);
}
Este programa hace aparecer en pantalla la frase "Una docena son 12 unidades". Veamos el significado de cada una de las líneas del programa.
/* Ejemplo 1. Programa DOCENA.C */
Es un comentario. El compilador de Turbo C ignora todo lo que está entre los símbolos de comienzo (/*) y fin (*/) de un comentario. Los comentarios delimitados por estos símbolos pueden ocupar varias líneas.
#include <stdio.h>
Le dice a Turbo C que en el proceso de compilación incluya un archivo denominado stdio.h. Este fichero se suministra como parte del compilador de Turbo C y contiene la información necesaria para el correcto funcionamiento de la E/S de datos.
La sentencia #include no es una instrucción C. El símbolo # la identifica como una directiva, es decir, una orden para el preprocesador de C, responsable de realizar ciertas tareas previas a la compilación.
Los archivo *.h se denominan archivos de cabecera. Todos los programas C requieren la inclusión de uno o varios archivos de este tipo, por lo que normalmente es necesario utilizar varias líneas #include.
main ()
Es el nombre de una función. Un programa C se compone de una o más funciones, pero al menos una de ellas debe llamarse main(), pues los programas C empiezan a ejecutarse por esta función.
Los paréntesis identifican a main() como una función. Generalmente, dentro de ellos se incluye información que se envía a la función. En este caso no hay traspaso de información por lo que no hay nadaescrito en su interior. Aún así son obligatorios.
El cuerpo de una función (conjunto de sentencias que la componen) va enmarcado entre llaves { y }. Ese es el significado de las llaves que aparecen en el ejemplo.
int docena;
Es una sentencia declarativa. Indica que se va a utilizar una variable llamada docena que es de tipo entero. La palabra int es una palabra clave de C que identifica uno de los tipos básicos de datos que estudiaremos en el Capítulo 3. En C es obligatorio declarar todas las variables antes de ser utilizadas. El ";" identifica la línea como una sentencia C.
docena = 12;
Es una sentencia de asignación. Almacena el valor 12 a la variable docena. Obsérvese que acaba con punto y coma. Como en la mayoría de los lenguajes, el operador de asignación en C es el signo igual "=".
printf ("Una docena son %d unidades\n", docena);
Esta sentencia es importante por dos razones: en primer lugar, es un ejemplo de llamada a una función. Además ilustra el uso de una función estándar de salida: la función printf().
La sentencia consta de dos partes:
-
El nombre de la función: printf().
-
Los argumentos. En este caso hay dos separados por una coma:
-
"Una docena son %d unidades\n"
-
docena
Como toda sentencia C acaba con punto y coma.
La función printf() funciona de la siguiente forma: el primer argumento es una cadena de formato. Esta cadena será lo que, básicamente, se mostrará en pantalla. En la cadena de formato pueden aparecer códigos de formato y caracteres de escape.
Un código de formato comienza por el símbolo % e indica la posición dentro de la cadena en donde se imprimirá el segundo argumento, en este caso, la variable docena. Más adelante estudiaremos todos los códigos de formato de Turbo C. En este ejemplo, %d indica que en su lugar se visualizará un número entero decimal.
Un carácter de escape comienza por el símbolo \. Son caracteres que tienen una interpretación especial. La secuencia \n es el carácter nueva línea y equivale a la secuencia LF+CR (salto de línea + retorno de cursor).
La función printf() pertenece a la biblioteca estándar de C. Las definiciones necesarias para que funcione correctamente se encuentran en el archivo stdio.h, de ahí que sea necesaria la sentencia #include <stdio.h>.
Ejemplo 2: scanf()
El siguiente programa realiza la conversión de pies a metros usando la equivalencia:
1 pie = 0.3084 metros
El programa solicita por teclado el número de pies y visualiza en pantalla los metros correspondientes.
/* Ejemplo 2. Programa PIES.C */
#include <stdio.h>
main ()
{
int pies;
float metros;
printf ("\n¿Pies?: ");
scanf ("%d", &pies);
metros = pies * 0.3084;
printf ("\n%d pies equivalen a %f metros\n", pies, metros);
}
Estudiaremos ahora las novedades que aparecen en este programa.
float metros;
Es una sentencia declarativa que indica que se va a utilizar una variable llamada metros, que es del tipo float. Este tipo de dato se utiliza para declarar variables numéricas que pueden tener decimales.
printf ("\n¿Pies?: ");
Es la función printf() comentada antes. En esta ocasión sólo tiene un argumento: la cadena de control sin códigos de formato. Esta sentencia simplemente sitúa el cursor al principio de la siguiente línea (\n) y visualiza la cadena tal como aparece en el argumento.
scanf ("%d", &pies);
scanf() es una función de la biblioteca estándar de C (como printf()), que permite leer datos del teclado y almacenarlos en una variable. En el ejemplo, el primer argumento, %d, le dice a scanf() que tome del teclado un número entero. El segundo argumento, &pies, indica en qué variable se almacenará el dato leído. El símbolo & antes del nombre de la variable es necesario para que scanf() funcione correctamente. Aclararemos este detalle en capítulos posteriores.
metros = pies * 0.3084;
Se almacena en la variable metros el resultado de multiplicar la variable pies por 0.3084. El símbolo * es el operador que usa C para la multiplicación.
printf ("\n%d pies equivalen a %f metros\n", pies, metros);
Aquí printf() tiene 3 argumentos. El primero es la cadena de control, con dos códigos de formato: %d y %f. Esto implica que printf() necesita dos argumentos adicionales. Estos argumentos encajan en orden, de izquierda a derecha, con los códigos de formato. Se usa %d para la variable pies y %f para la variable metros.
printf ("\n%d pies equivalen a %f metros\n", pies, metros);
El código %f se usa para representar variables del tipo float.
Ejemplo 3: Funciones con argumentos
Veremos ahora dos ejemplos de programas que utilizan funciones creadas por el programador. Una función es una subrutina que contiene una o más sentencias C. Viene definida por un nombre, seguida de dos paréntesis () entre los que puede haber o no argumentos. Los argumentos son valores que se le pasan a la función cuando se llama.
Veamos, en primer lugar, un ejemplo de una función sin argumentos.
/* Ejemplo 3.1 - Programa FUNCION1.C */
#include <stdio.h>
main ()
{
printf ("\nEste mensaje lo muestra la función main()");
MiFuncion ();
}
/* Definición de la función MiFuncion() */
MiFuncion ()
{
printf ("\nEste otro lo muestra MiFuncion()");
}
En este ejemplo se utiliza la función MiFuncion() para mostrar en pantalla una frase. Como se ve, MiFuncion() se invoca igual que printf() o scanf(), es decir, simplemente se escribe el nombre de la función y los paréntesis. La definición de MiFuncion() tiene el mismo aspecto que main(): el nombre de la función con los paréntesis y, seguidamente, el cuerpo de la función encerrado entre llaves.
El siguiente ejemplo ilustra el uso de una función con argumentos. El programa visualiza el cuadrado de un número entero por medio de una función que recibe dicho número como argumento.
/* Ejemplo 3.2 - Programa FUNCION2.C */
#include <stdio.h>
main ()
{
int num;
printf ("\nTeclee un número entero: ");
scanf ("%d", &num);
cuadrado (num);
}
/* Definición de la función cuadrado() */
cuadrado (int x)
{
printf ("\nEl cuadrado de %d es %d\n", x, x * x);
}
cuadrado (int x)
Es la declaración de la función cuadrado(). Dentro de los paréntesis se pone la variable que recibirá el valor pasado a cuadrado() y de qué tipo es. Así, si se teclea el valor 6, se almacena en num y al hacer la llamada cuadrado (num), la variable num se copia en la variable x, que es con la que trabaja internamente la función cuadrado().
Es importante mantener claros dos términos:
El término ARGUMENTO se refiere a la variable usada al llamar la función.
El término PARÁMETRO FORMAL se refiere a la variable de una función que recibe el valor de los argumentos.
También es importante tener claro que la copia de variables se hace sólo en una dirección: del argumento al parámetro formal. Cualquier modificación del parámetro formal realizado dentro de la función no tiene ninguna influencia en el argumento.
... ARGUMENTO
...
cuadrado (num)
...
...
Al hacer la llamada a la función cuadrado() el ARGUMENTO num se copia en el PARÁMETRO FORMAL x.
Cuadrado (int x)
{ PARÁMETRO
printf (... ); FORMAL
}
Otro detalle a tener en cuenta es que el tipo de argumento que se utiliza para llamar a una función debe ser el mismo que el del parámetro formal que recibe el valor. Así, no debe llamarse a la función cuadrado con un argumento de tipo float (más adelante veremos que C permite cierta flexibilidad en este aspecto).
Ejemplo 4: Funciones que devuelven valores
Para finalizar el capítulo veremos un ejemplo que utiliza una función que devuelve un valor. El siguiente programa lee dos números enteros del teclado y muestra su producto en pantalla. Para el cálculo se usa una función que recibe los dos números y devuelve el producto de ambos.
/* Ejemplo 4 - Programa MULT.C */
#include <stdio.h>
main ()
{
int a, b, producto;
printf ("\nTeclee dos números enteros: ");
scanf ("%d %d", &a, &b);
producto = multiplica (a, b);
printf ("\nEl resultado es %d", producto);
}
/* Definición de la función multiplica() */
multiplica (int x, int y)
{
return (x * y);
}
Las novedades que se presentan en este programa se comentan a continuación.
scanf ("%d %d", &a, &b);
La cadena de control de scanf() contiene dos códigos de formato. Al igual que ocurre en printf(), se precisan dos argumentos más, uno por cada código de formato. Los dos números se teclean separados por espacios en blanco, tabuladores o por la tecla Intro.
return (x * y);
La palabra clave return se usa dentro de las funciones para salir de ellas devolviendo un valor. El valor devuelto mediante return es el que asume la función. Eso permite tener sentencias como
producto = multiplica (a, b);
es decir, sentencias en las que la función está a la derecha del operador de asignación. Para nuestros propósitos actuales podemos decir (aunque esto no sea exacto) que después de la sentencia return la función multiplica() actúa como si fuese una variable que almacena el valor devuelto.
Los paréntesis son opcionales, se incluyen únicamente para clarificar la expresión que acompaña a return. No deben confundirse con los paréntesis de las funciones.
Ejercicios
1. Encuentra todos los errores del siguiente programa C:
include studio.h
/* Programa que dice cuántos días hay en una semana /*
main {}
(
int d
d := 7;
print (Hay d días en una semana);
2. Indica cuál sería la salida de cada uno de los siguientes grupos de sentencias:
a) printf ("Historias de cronopios y famas.");
printf ("Autor: Julio Cortázar");
b) printf ("¿Cuántas líneas \nocupa esto?");
c) printf ("Estamos \naprendiendo /naprogramar en C");
d) int num;
num = 2;
printf ("%d + %d = %d", num, num, num + num);
3. Escribe un programa que calcule el área de un círculo de radio R y la longitud de su circunferencia. Solicitar el valor de R por teclado, mostrando en la pantalla los mensajes necesarios (S = π ⋅ R2 ; L = 2 ⋅ π ⋅ R).
4. Sean dos cuadrados de lados L1 y L2 inscritos uno en otro. Calcula el área de la zona comprendida entre ambos, utilizando para ello una función (que se llamará AreaCuadrado) que devuelve el área de un cuadrado cuyo lado se pasa como argumento.
14 Introducción al Lenguaje C
1. Introducción 15
Descargar
Enviado por: | Juan |
Idioma: | castellano |
País: | España |