Introducción al lenguaje C. Introducción

Elementos de un programa C. Tipos básicos de datos. E/S básica. Sentencias de control. Funciones. Asignación dinámica de memoria. Ficheros. Ficheros indexados: la interfase Btrieve. Compilación y enlazado. Biblioteca de funciones de Turbo C

  • Enviado por: Juan
  • Idioma: castellano
  • País: España España
  • 15 páginas
publicidad
publicidad

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