Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en...

103
Fundamentos de programación en C

Transcript of Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en...

Page 1: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

Fundamentos de

programación en C

Page 2: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

1

ÍNDICE

TEMA 1: CONCEPTOS PREVIOS

Introducción. Estructura básica de un ordenador. Hardware. Software. Los algoritmos. Lenguajes programación. Ciclo de vida de una aplicación informática. Errores. Calidades de los programas. Metodología de la programación. Documentación de programas.

TEMA 2: METODOLOGÍA DE LA PROGRAMACIÓN

Objetos de un programa. Tipos de datos. Expresiones. Partes principales de un programa. Pseudocódigo. Estructura de un algoritmo representado en pseudocódigo. Identificadores estándar de tipos de datos. Instrucciones primitivas. Instrucciones alternativas. Instrucciones repetitivas. Elementos auxiliares.

Page 3: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

2

TEMA 3: EL C COMO LENGUAJE ESTRUCTURADO

Historia de C. Ventajas del C. Desventajas del C. Características del C. Formato de un programa de C. Tipos de datos. Declaración de variables. Constantes. Operadores. Instrucciones de asignación. Cadena de caracteres. Salida formateada por pantalla: Printf. Salida formateada por teclado: Scanf. Instrucciones de control selectivos. Instrucciones repetitivas. Apéndice. Conversación de tipos.

TEMA 4: COMENZANDO A PROGRAMAR

Las funciones y diseño modular. Estructura de una función. Argumentos de funciones (paso por valor). Las instrucciones return. Punteros. Argumentos de funciones ( paso por referencia). Variables globales y locales. Modos de almacenamiento. El preprocesador. Compilación y enlazado. Bibliotecas. La biblioteca de ANSI de C y las extensiones de Borland.

Page 4: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

3

TEMA 5: ESTRUCTURAS ESTÁTICAS

Introducción. Concepto de tablas. Tablas unidimensionales: vectores. Búsqueda y ordenación interna. Inserción de un vector ordenado. Borrado en un vector ordenado. Cadenas. Funciones de E/S para cadenas. Funciones para tratamientos de cadenas. Macros y funciones para tratamientos de cadenas. Tablas bidimensionales: matrices. Tablas tridimensionales: poliedros. Estructuras.

TEMA 6: ESTRUCTURAS DINÁMICAS

Introducción. Gestión dinámica de memoria. Estructuras dinámicas de datos. Listas enlazadas. Pilas y colas.

Page 5: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

4

TEMA 1: CONCEPTOS PREVIOS

INTRODUCCIÓN

Definición de informática.

– Conjunto de conocimientos científicos y técnicos que hacen posible el tratamiento automático de la información por medio de computadoras.

La computadora.

– Máquina capaz de aceptar datos de entrada, efectuar con ellos operaciones lógicas y/o aritméticas y proporcionar, bajo el control de un programa previamente almacenado en la propia computadora, datos de salida sin intervención de un operador humano.

– Características.- Rapidez, precisión y memoria. – Operaciones básicas.

Aritméticas. Lógicas. Almacenamiento.

El proceso de la información

– Componentes comunes Datos de entrada Algoritmo de resolución Información de salida

Retroalimentación (Feedback)

Page 6: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

5

Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen con precisión una secuencia

de operaciones a realizar, en orden, para resolver un determinado problema.

– Programa.- Algoritmo expresado en un lenguaje de programación adecuado.

– Fases de diseño Notación intermedia: Ordinogramas, pseudocódigos, etc. Codificación: Cobol, C, Pascal, etc. Traducción: Lenguaje Máquina.

Ejemplo. – Hallar la longitud de un vector situado en el plano cartesiano

Datos de entrada: – (x1, y1), (x2, y2)

Algoritmo: – Leer x1, y1, x2, y2 – Calcular Px = x2 – x1 – Calcular Py = y2 – y1 – Calcular R = raíz cuadrada ( Px · Px + Py · Py) – Imprimir R

Datos de salida: – R

Page 7: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

6

ESTRUCTURA BÁSICA DE UN ORDENADOR

Hardware. – Soporte físico, equipo físico o hardware. – Conjunto de circuitos electrónicos, cables, armarios, dispositivos

electromecánicos y otros elementos físicos que forman la computadora. Software.

– Soporte lógico, logical o software. – Conjunto de programas ejecutables por la misma que controlan y permiten su

funcionamiento.

Page 8: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

7

HARDWARE

Unidades de entrada. – Dispositivos de introducción de datos e instrucciones. – Transforman datos de entrada en señales binarias. – Teclado, ratón, escáner, lector de códigos de barras, micrófono, etc.

Unidades de salida. – Dispositivos que muestran los datos de salida en formatos inteligibles por los

operadores. – Transforman datos binarios en caracteres o gráficos. – Monitor, impresora, plotter, altavoz, etc.

Memoria principal, central o interna. – De acceso directo o aleatorio. – Direccionable a nivel de byte o palabra. – Muy rápida (nseg). – Poca capacidad (Megabytes). – Alto coste. – Tipos.

RAM (Random Access Memory). ROM (Read Only Memory)

Memoria secundaria, masiva, auxiliar o externa. – De acceso pseudodirecto. – Direccionable a nivel de sector o bloque. – Baja velocidad de acceso (mseg). – Capacidad casi infinita. – Bajo coste. – Tipos.

Acceso secuencial (cinta magnética). Acceso “directo” (disco magnético y óptico).

Page 9: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

8

Unidades de medida. – Byte.- Número de bits necesarios para almacenar un carácter; generalmente 8

bits. 1 Kilobyte (Kb) = 210 bytes 1 Megabyte (Mb) = 210 Kb = 220 bytes 1 Gigabyte (Gb) = 210 Mbytes = 1024 Mb

– Palabra.- Indica el número de bits que se pueden procesar y leer o escribir en paralelo.

Page 10: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

9

SOFTWARE

LOS ALGORITMOS

Funciones básicas. – Entrada de información

• Instrucción de entrada o lectura – Proceso – Salida de información

• Instrucción de salida o escritura. Requisitos de problemas computables.

– Preciso : Secuencia finita de operaciones en orden – Acciones no ambiguas: El significado de cada acción debe ser único – Finito: Debe acabar en un tiempo finito

Page 11: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

10

Determinar si un número es par. – En lenguaje natural.

Si el número se puede obtener sumando doses, es par. Si para construirlo hay que sumarle uno a cualquier secuencia de doses, es impar.

– Con forma de Algoritmo

Leer N

Repetir

Si N > 2 entonces N ¬ N – 2

Si N = 2 escribe “Par”

Si N = 1 escribe “Impar”

Hasta N = 1 ó N = 2

Fin

Un mismo problema puede tener multitud de soluciones algorítmicas. La bondad de un algoritmo se medirá por:

– El tiempo. – Los recursos.

Características deseables (para su fácil modif). – Sencillo. – Claro.

El diseño de algoritmos es una tarea creativa donde se combinan la imaginación y la experiencia.

Si se decide, tras su evaluación, que un algoritmo no es eficiente, será necesario o bien

diseñar uno nuevo o bien optimizar el original.

Optimizar un algoritmo consiste en introducir modificaciones en él, tendentes a disminuir el tiempo que necesita para resolver el problema o a reducir los recursos que utiliza.

Page 12: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

11

Algoritmo refinado

Leer N

M = parte entera (N/2)

M = M x 2

Si M=N entonces

Escribe “Par”

Sino

Escribe “Impar”

Algoritmo refinado 2

Leer N

Si resto (N/2) = 0 entonces

Escribe “Par”

Sino

Escribe “Impar”

Representación

Pseudocódigo

Leer N

M = parte entera (N/2)

M = M x 2

Si M=N entonces

Escribe “Par”

Sino Escribe “Impar”

Page 13: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

12

LENGUAJES DE PROGRAMACIÓN

Bajo nivel

– Lenguaje máquina

Inconvenientes

– Escrito con 0’s y 1’s o código intermedio (octal y hexadecimal). – Propio de microprocesador. – Estilo propio de los circuitos. – Operaciones simples. – Formato estricto. – Acceso a los datos mediante direcciones de memoria.

Bajo nivel – Lenguaje máquina

Ventajas

– No necesitan traducción. – Muy eficientes.

Rápidos. Exprime los recursos de la máquina.

Bajo nivel – Lenguaje ensamblador.

Utiliza mnemotécnicos. (ADD, MOV, JMP, etc.) Utiliza direcciones simbólicas. Precisa traducción (ensamblado). Macros (macroensambladores).

Page 14: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

13

– Aplicaciones Tiempo Real. Control de procesos. Programación gráfica.

Alto nivel – Utilizan simbología próximas al lenguaje natural. – Fáciles de aprender. – Fáciles de depurar. – Tiempo de desarrollo bajo. – Son multiplataforma. – Precisan de traductores.

Compiladores. Intérpretes.

CICLO DE VIDA DE UNA APLICACIÓN INFORMÁTICA

Análisis (Qué)

Proceso de determinar QUÉ se necesita hacer, antes de decidir CÓMO debe hacerse. (“descubrimiento”)

Diseño (Cómo)

Proceso de determinar cuál de las muchas soluciones es la mejor para lograr lo que se necesita hacer, respetando las restricciones tecnológicas y de presupuesto del proyecto. (“compromiso”)

Page 15: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

14

ERRORES

De compilación

– Errores sintácticos, corresponden al incumplimiento de las reglas sintácticas del lenguaje. Los detecta el compilador.

De ejecución

– Se deben generalmente a operaciones no permitidas.

De lógica

– Corresponden a la obtención por el programa de resultados que no son correctos. Se deben a la propia concepción del programa.

De especificación

– Se deben a la realización de unas especificaciones incorrectas motivadas por una mala comunicación entre el programador y quien plantea el problema.

CALIDAD DE LOS PROGRAMAS

Legibilidad: Ha de ser claro y sencillo, de tal forma que facilite su lectura y comprensión.

Fiabilidad: Ha de ser «robusto», es decir, capaz de recuperarse frente a errores o usos inadecuados.

Portabilidad: Su diseño debe permitir la codificación en diferentes lenguajes de programación, así como su instalación en diferentes sistemas.

Modificabilidad: Ha de facilitar su mantenimiento, esto es, las modificaciones y actualizaciones necesarias para adaptarlo a una nueva situación.

Eficiencia: Se deben aprovechar al máximo los recursos de la computadora, minimizando la memoria utilizada y el tiempo de proceso o ejecución.

Page 16: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

15

METODOLOGÍA DE LA PROGRAMACIÓN

Conjunto de métodos y técnicas disciplinadas que ayudan al desarrollo de los programas.

Programación Modular.

Programación Estructurada.

Programación Orientada a Objetos.

Programación Orientada a Eventos.

Programación Visual.

DOCUMENTACIÓN DE PROGRAMAS

Documentación Interna.

– Comentarios.

– Código autodocumentado.

Documentación Externa.

– Especificaciones del análisis.

– Descripción del diseño del programa.

– Descripción de las versiones si las hubiere.

– Descripción del programa principal y subprogramas.

– Manual de usuario.

– Manual de mantenimiento.

Page 17: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

16

TEMA 2: METODOLOGÍA DE LA PROGRAMACIÓN

OBJETOS DE UN PROGRAMA

Un objeto es

– Cualquier dato o código que ocupa memoria direccionable.

Se caracteriza por

– Nombre: Palabra creada por el programador (ej. edad_1)

– Tipo: Valores que puede tomar, operaciones que se permiten realizar y ocupación de memoria (ej. numérico entero)

– Valor: Elemento que se le asigna (ej. 21)

Constante.

Objeto cuyo valor permanece invariable a lo largo de la ejecución de un programa.

Variable.

Objeto cuyo valor puede ser modificado a lo largo de la ejecución de un programa.

Variables.

El concepto de variable es una abstracción del concepto de celda de memoria. Sus atributos son:

– Nombre o identificador : Hace referencia al área de memoria ligada a la variable. Los caracteres permitidos para la construcción de este nombre dependen del lenguaje de programación usado.

– Tipo: Conjunto de valores que puede tomar, así como las operaciones permitidas.

– Ámbito : Conjunto de instrucciones en el que aparece la variable.

– Tiempo de vida : Intervalo en el que el área de memoria está ligado a la variable.

– Valor: Información almacenada en el área de memoria ligada a la variable.

Page 18: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

17

TIPOS DE DATOS

El tipo de un objeto especifica la clase de valores o caracteres que pueden asignarse al objeto.

El rango de un tipo de datos numérico es el conjunto formado por todas sus cantidades representables, y viene determinado por el formato de representación en memoria.

Tipos de datos simples. Ejemplos.

Entero (int) 3 -35000

Real (float o double) -1.5 2x10-4 (2E-4)

Carácter (char) ‘a’ ‘?’ ‘Y’ ‘8’

Lógico Falso o Verdadero (0/1)

Puntero Una dirección de memoria

Tipos de datos

Simples Estructurados

Numéricos

No numéricos

Internos Externos

Entero Real Carácter Booleano Estáticos Dinámicos Ficheros Bases de datos

Cadena Vector Matriz Poliedro Listas Colas Árboles Pilas

Page 19: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

18

Alfanuméricos.

– El conjunto de caracteres representado depende del código que utilice la computadora, generalmente el ASCII (código estándar americano para intercambio de información) de 8 bits, por lo que se almacenan en un byte u octeto.

– Siguen un orden:

... 0 1 ... 9 ... A B ... Z ... a b c ... z ... ñ Ñ ...

– Se representan, en un programa, encerrados entre apóstrofes. (ej. ‘H’)

– Unidos forman cadenas de caracteres.

Page 20: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

19

Lógicos.

– Es un tipo de datos que sólo puede tener dos valores o estados: verdadero o falso.

– Se almacena en memoria mediante un octeto de ceros (0000 0000) para el valor FALSO, y cualquier otro valor (por ejemplo, 0000 0001) para el valor CIERTO.

Punteros.

– Es un tipo de datos que sólo puede almacenar la dirección de memoria de otro objeto.

– En C es imprescindible su uso para el paso por referencia a funciones.

EXPRESIONES

Una expresión es la representación de un cálculo necesario para la obtención de un resultado, es decir, devuelve un valor como resultado de evaluarse.

Una expresión consta de operadores (símbolos que denotan las operaciones) y operandos (objetos sobre los que actúan los operadores) y toma un valor que será el resultado de la ejecución de las operaciones indicadas.

Tipos de expresiones:

– Aritméticas: Si el resultado es de tipo numérico. – Lógicas o booleanas: Si el resultado es de tipo lógico (Verdadero o

Falso). – Carácter o alfanuméricas: Si el resultado es de tipo carácter.

Page 21: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

20

Orden de prioridad de operadores (en la mayoría de lenguajes de programación)

1. Paréntesis (comenzando por los más internos). 2. Signo. 3. Potencias (si existe este operador). 4. Productos y divisiones. 5. Sumas y restas. 6. Concatenación (de cadenas, si existe). 7. Relacionales. 8. Negación (NOT). 9. Conjunción (AND). 10. Disyunción (OR).

PARTES PRINCIPALES DE UN PROGRAMA

Un programa puede considerarse como una secuencia lógica de acciones (instrucciones) que manipulan un conjunto de objetos (datos) para obtener unos resultados.

– Bloque de declaraciones (Entorno del programa)

Identificación y características de los objetos del programa (constantes, variables, tablas, registros, ...) necesarios para almacenar información.

– Bloque de instrucciones (Especificación del algoritmo)

Conjunto de operaciones que se han de realizar para la obtención de los resultados deseados. Estas operaciones (instrucciones) se ejecutarán, desde la primera a la última, de una en una, salvo que determinadas instrucciones de control indiquen lo contrario.

Page 22: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

21

PSEUDOCODIGO

Lenguaje de especificación de algoritmos.

Lenguaje intermedio entre el lenguaje natural y el lenguaje de programación de alto nivel.

Permite el diseño del programa sin depender de ningún lenguaje de programación.

Todo pseudocódigo debe posibilitar:

Descripción de tipos de datos, constantes, variables, expresiones, archivos y otros objetos.

Instrucciones de entrada/salida.

Instrucciones de proceso.

Sentencias de control del flujo de ejecución.

Acciones compuestas.

ESTRUCTURA DE UN ALGORITMO REPRESENTADO EN PSEUDOCODIGO

En líneas generales

Programa <nombre del programa>

Entorno < descripción de los objetos>

Algoritmo < lista de instrucciones>

FinAlgoritmo

Page 23: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

22

De forma detallada:

Programa <nombre del programa>

Entorno

Constantes

<identificador de constante> = <valor> ...

Tipos

<tipo definido por el usuario> = <tipo (simple | estructurado | de usuario)>

Variables

<identificador de variable> : <tipo (simple | estructurado | definido por el usuario)>

Algoritmo

<instrucción 1>

<instrucción 2>

...

FinAlgoritmo

Reglas para la construcción de identificadores

1. Deben comenzar por un carácter de subrayado o por un carácter alfabético en mayúscula o en minúscula.

2. Resto de caracteres: letras, números o símbolos de subrayado.

3. Longitud variable dependiente del lenguaje

4. En C, las mayúsculas y las minúsculas tienen un tratamiento diferente.

5. No puede coincidir con una palabra reservada.

6. No debe tener el mismo nombre que una función.

Page 24: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

23

EJEMPLO PSEUDOCODIGO

Programa MiPrimerPrograma

Entorno /*Bloque de declaraciones*/

Constantes

IVA = 0.16

Variables

base_imponible : entero

total_factura : real

Algoritmo /*Bloque de instrucciones*/

Escribir (“Introduzca la base imponible: “)

Leer (base_imponible)

total_factura ← base_imponible + base_imponible * IVA

Escribir (“TOTAL FACTURA: “, total_factura)

FinAlgoritmo

EJEMPLO C

#include <stdio.h>

#define IVA 0.16

int main(void)

{

/*Bloque de declaraciones*/

int base_imponible; float total_factura;;

/*Bloque de instrucciones*/

printf(“Introduzca la base imponible: “);

scanf(“%d”,&base_imponible);

total_factura = base_imponible + base_imponible * IVA;

printf (“TOTAL FACTURA: %f“, total_factura);

getchar();

Page 25: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

24

IDENTIFICADORES ESTANDAR DE TIPOS DE DATOS

CLASIFICACIÓN DE LAS INSTRUCCIONES

Instrucciones primitivas: Se ejecutan de forma inmediata

– De asignación

– De entrada

– De salida

Instrucciones de control: Controlan el orden de ejecución de otras instrucciones

– Alternativas

– Repetitivas

Page 26: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

25

INSTRUCCIONES PRIMITIVAS

Page 27: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

26

INSTRUCCIONES ALTERNATIVAS

Page 28: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

27

Page 29: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

28

INSTRUCCIONES REPETITIVAS

Page 30: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

29

Page 31: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

30

ELEMENTOS AUXILIARES

• Contador

a = 0; // Inicialización

a = a + 1; // Incremento (a++; ++a;)

• Acumulador

a = 0; // Inicialización acum. sumas

a = a + valor; // Acumulación suma (a+=valor)

a = 1; // Inicialización acum. producto

a = a * valor; // Acumulación producto (a*=valor)

• Interruptor

b = 1; // O cualquier valor distinto de 0

if (a > 0)

b = 0; // O tb. b = !b;

Page 32: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

31

• Sangría

if (a > 0)

b = 1;

else

{

b = 2;

c = 9;

}

• Comentarios /* Esto es un comentario */

• Acciones compuestas

Una acción compuesta es aquella que ha de ser realizada dentro del algoritmo, pero que aún no está resuelta en términos de acciones simples y sentencias de control.

Page 33: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

32

TEMA 3: EL C COMO LENGUAJE ESTRUCTURADO

HISTORIA DEL C

Antecedentes del lenguaje C. FORTRAN.

- FORmula TRANslator.

- Primer compilador en 1957 para facilitar el trabajo de los programadores que, hasta entonces, programaban en ensamblador. Razones económicas: reducción de tiempo, mayor productividad.

- Notación similar a las matemáticas.

- Aplicaciones técnicas y científicas.

- Primer lenguaje de alto nivel.

Antecedentes del lenguaje C. ALGOL.

- ALGOrithmic Languaje.

- Entre 1957 y 1962 con la idea de ser un “lenguaje de programación universal”, de propósito más general e independiente de la máquina.

- Fue adquiriendo tendencia algebraica, orientándose hacia las aplicaciones científicas y de ingeniería.

De estructura clara con gran influencia en el desarrollo de otros lenguajes de alto nivel (Pascal y ADA) y en la arquitectura de muchos ordenadores

El lenguaje C. Del BCPL al B.

Partiendo del Algol, en 1967, Martin Richards inventó un nuevo lenguaje llamado BCPL.

El M.I.T. consiguió construir un sistema operativo multiusuario que se llamó MULTICS (MULTiplexed Information Computing System).

Ken Thompson, de los Laboratorios Bell de AT&T, fabricó una versión de MULTICS para un solo usuario. La escribió en ensamblador y se denominó UNICS.

Thompson, en 1970, modificó el BCPL con la idea de volver a escribir UNICS en un lenguaje de más alto nivel, aunque sólo consiguió un compilador de FORTRAN. El nuevo lenguaje se llamó B.

Page 34: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

33

El lenguaje C. Del B al C++.

Dennis Ritchie modifica el lenguaje B (llamándolo C) y consigue escribir el sistema UNICS, que ya se llamó UNIX, tanto multiusuario como multitarea.

1972-1973. El lenguaje C modificado por Ritchie, Thompson y Brian Kernighan, se distribuye gratuitamente junto al S.O. UNIX.

En 1978 Kernighan y Ritchie escriben el libro "The C Programming Language", que se convirtió en el documento de referencia del lenguaje.

Los fabricantes de compiladores crean extensiones del lenguaje y algunos programadores empiezan a crear variantes: Bjarne Stroustrup inventa en 1984 el C++.

VENTAJAS DEL C

Enorme flexibilidad y adaptabilidad.

– Sólo tiene 32 palabras reservadas.

– Bibliotecas

Compiladores pequeños y fáciles de transportar.

Concisión en la sintaxis.

– Instrucciones crípticas.

Hecho por y para programadores.

Éxito de UNIX, distribución gratuita en ambientes universitarios.

Eficiencia en la producción de código objeto.

Amplio juego de operadores.

Auge de los PCs y compiladores para DOS y Windows.

Page 35: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

34

DESVENTAJAS DEL C

No se comprueban los límites de los vectores.

La precedencia de los operadores no es totalmente intuitiva.

La sintaxis puede llegar a ser demasiado concisa.

– C ofuscado

CARACTERISTICAS DEL C

C es un lenguaje de nivel medio.

El código C es muy portable.

No es un lenguaje de tipos fuertes.

C tiene sólo 32 palabras reservadas.

– 27 por parte del estándar de Kernighan y Ritchie

– 5 incorporadas por el comité de estandarización ANSI

C es un lenguaje estructurado.

C es un lenguaje para programadores.

Ventajas respecto al lenguaje ensamblador.

Portabilidad del C.

Eficiencia del C.

Compiladores frente a intérpretes.

Page 36: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

35

FORMATO DE UN PROGRAMA DE C

Palabras reservadas:

Directivas – Instrucciones para el compilador. – Por ejemplo

#include <stdio.h> – Incluye en el programa elementos del fichero stdio.h – Es parte del compilador y aporta librerías de E/S de datos

funciones como printf(), scanf(), getchar(), ...

Sentencias – se ejecutan secuencialmente. – conviene escribir cada sentencia en una línea. – el símbolo punto y coma (;) del final de cada línea identifica a ésta como una

sentencia C o instrucción. el punto y coma es parte de la sentencia y no es un separador de

sentencias, como ocurre en el lenguaje Pascal. – en cada línea se puede escribir más de una sentencia – se puede espaciar una sentencia en más de una línea (no se debe partir en

mitad del texto entrecomillado).

Page 37: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

36

Comentarios – Hacen más comprensibles los programas. – Se utilizan los símbolos /* y */ para delimitarlos. – Todo el texto encerrado entre ellos será ignorado por el compilador. – Los comentarios no pueden anidarse. – Un comentario estilo C++ comienza con los caracteres //.

Termina al final de la línea, es decir: estos comentarios no pueden ocupar más de una línea.

En general, el estilo C se utiliza para comentarios de más de una línea, y el estilo C++, para comentarios de una sola línea.

TIPOS DE DATOS

Cinco tipos de datos básicos en C:

• carácter (char)

• entero (int)

• punto flotante (float)

• doble punto flotante (double)

• sin valor (void).

Los valores del tipo char se utilizan para almacenar caracteres ASCII o cualquier cantidad de 8 bits.

El tipo void se utiliza en tres casos:

• Para una función que no devuelve ningún valor. • Para una función que no tiene parámetros. • Para crear punteros genéricos.

Modificadores de tipo. – Se utilizan para alterar el significado del tipo básico – signed, unsigned, long y short. – Todos ellos se pueden aplicar a los tipos enteros base salvo a void.

Se puede aplicar unsigned y signed a los caracteres. Se puede aplicar long al tipo double. La utilización de signed sobre enteros y char es redundante

Page 38: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

37

DECLARACIÓN DE VARIABLES

Asocia un tipo de datos a una variable.

Todas las variables deben ser declaradas

tipo <lista_variables>;

tipo: un tipo de dato válido en C

lista_variables: uno o más identificadores separados por comas.

Ejemplos

unsigned int anio_nacimiento, numero_socios;

float importe, total_compra;

double distancia_sol, peso;

char letra, digito ;

Es posible iniciar una variable en el momento de su declaración:

Page 39: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

38

int dia = 15; // declaración e inicialización

short int coord_x =10, coord_y =12 ;

char caracter = ‘z’;

int blancos=11, negros=15, verdes=30;

CONSTANTES

C soporta las constantes de tipo cadena que se encierran entre comillas dobles.

Las constantes de tipo carácter se encierran entre comillas simples (apóstrofos).

Las cadenas son simplemente vectores de caracteres, se tratarán más adelante.

Algunos caracteres son imposibles de introducir desde el teclado.

C utiliza las constantes de carácter especiales de barra invertida que equivale a un carácter único.

Page 40: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

39

OPERADORES

C dispone de una gran variedad de operadores.

Operadores aritméticos.

Page 41: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

40

Los operadores de incremento y decremento pueden preceder (modalidad prefijo) o suceder (modalidad sufijo) al operando.

Modalidad sufijo:

variable++ variable--

Modalidad prefijo:

++variable --variable

Es indiferente escoger una modalidad u otra cuando la variable afectada de este operador va sola en una sentencia.

En el modo sufijo, primero se utiliza la variable afectada por el operador de incremento o decremento, y luego se incrementa o decrementa en 1 el valor de la variable.

En el modo prefijo, primero se incrementa o decrementa la variable afectada por el operador y luego se opera con ella.

C tiene una taquigrafía especial que simplifica la codificación de un cierto tipo de instrucciones de asignación.

<variable> += <expresión>;

Esta taquigrafía funciona para todos los operadores binarios de C.

Una expresión de relación o una expresión lógica, si es cierta toma el valor 1, y si es falsa toma el valor 0.

Page 42: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

41

C se diseñó para sustituir al lenguaje ensamblador por tanto soporta operadores a nivel de bit.

Sólo pueden usarse con los tipos int y char

sizeof es un operador unario en tiempo de compilación que devuelve la longitud, en bytes, de la variable o el especificador de tipo encerrado entre paréntesis al que precede.

La utilidad principal de sizeof es ayudar a generar código portable.

INSTRUCCIONES DE ASIGNACIÓN

Da valores a las variables.

Formato:

<nombre_variable> = <expresión>;

La expresión puede ser:

– una constante

– una combinación de variables, operadores y constantes.

El destino, o la parte izquierda, de la asignación debe ser una variable, no una función o una constante.

Asignaciones múltiples.

– C permite asignar el mismo valor a varias variables utilizando asignaciones múltiples en una única instrucción.

coordx = coordy = coordz = 0;

Page 43: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

42

– En los programas profesionales, a las variables se les asignan frecuentemente valores comunes utilizando este método.

Conversión de tipo en asignaciones.

– El valor de la parte derecha (expresión) de la asignación se convierte al tipo de la parte izquierda (variable destino)

CADENAS DE CARACTERES

Serie de uno o más caracteres.

"Esto es una tira“ "x"

Las comillas no forman parte de la cadena.

Las cadenas se declaran igual que los arrays unidimensionales.

char nombre_cadena [longitud];

En C no existe el tipo cadena. Es un array de caracteres.

Los caracteres de la cadena se almacenan en posiciones de memoria adyacentes.

La última posición del array el compilador del C coloca el carácter nulo \0 (código ASCII = 0).

- Por esta razón, para declarar arrays de caracteres es necesario que la longitud del array tenga un carácter más que la cadena más larga que pueda almacenar.

Para manejar tanto la entrada -scanf()- como la salida -prinft()- de la cadena se usa el

especificador %s.

strlen() da la longitud de la cadena hasta llegar al carácter nulo.

El operador sizeof nos facilitará la longitud del array.

Page 44: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

43

SALIDA FORMATEADA POR PANTALLA: PRINTF

printf(<cadena_formato>,<item1>,<item2>, ... );

El prototipo de la función printf() se encuentra en stdio.h.

cadena_formato es una tira de caracteres que contiene aquellos que se han de imprimir tal como aparecen en el entrecomillado y/o los especificadores de formato (se distinguen por el símbolo % ).

item1, item2,.. son las distintas variables, constantes o expresiones, cuyo valor se quiere imprimir. No tienen que aparecer obligatoriamente.

De este modo, la función printf() describe la manera en que han de imprimirse los

items en caso de que existan.

Debe aparecer una especificación de conversión por cada ítem

Modificadores

– Son apéndices que se agregan a los especificadores de conversión básicos para modificar la salida.

– Se colocan entre el símbolo % y el carácter que define el tipo de conversión:

% [-] [X] [.Y] [longitud] conversión

Page 45: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

44

-

– Indica que el item comience a escribirse empezando por la izquierda del campo que tenga asignado.

X

– Anchura mínima del campo; si no es suficiente se usa uno mayor.

.Y

– Número de decimales o máximo número de caracteres a imprimir.

– Por defecto en punto flotante se usan 6 decimales.

longitud

– Si la conversión es un nº entero :

h trata al argumento como short

l trata al argumento como long

– Si la conversión es un nº real:

L trata al argumento como long double

Consejos.

– Para imprimir columnas de datos utilizar campos de anchura fija lo suficientemente grandes.

– Cuando un número deba aparecer dentro de una frase conviene usar un campo igual o menor que el esperado que eviten blancos innecesarios.

ENTRADA FORMATEADA POR TECLADO: SCANF

Permite leer todos los tipos de datos predefinidos y convierte los números automáticamente al formato interno apropiado.

El prototipo de la función scanf() se encuentra en stdio.h.

int scanf(const char *cadena-formato, lista de argumentos);

Page 46: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

45

La cadena-formato determina cómo se deben leer los valores y cómo se almacenan en la variables apuntadas por los argumentos de la lista.

La cadena de formato está constituida por tres clases de caracteres:

Especificadores de formato.

Caracteres de espacio en blanco.

Caracteres distintos del espacio en blanco.

La función scanf() devuelve el número de campos que constituyen la entrada.

Especificadores de formato.

Van precedidos por el signo % e indican el tipo de dato que se va a leer.

Se asocian de izquierda a derecha con los argumentos de la lista de argumentos.

Para un número decimal %d o %i .

Para un entero sin signo %u.

Para un número en coma flotante %e, %f o %g.

Para enteros en octal y hexadecimal %o y %x.

La función scanf() detiene la lectura de un número cuando encuentra un carácter no

numérico.

Page 47: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

46

Lectura de caracteres individuales.

- Se pueden leer caracteres individuales utilizando getchar() o una

función alternativa.

- Con scanf() se hace mediante el especificador %c.

Cuando se leen otros tipos de datos, los espacios en blanco, tabuladores y caracteres de nueva línea son separadores de campo.

Cuando se lee un único carácter, los caracteres de espacio en blanco se leen como cualquier otro carácter.

Para leer una cadena se utiliza el especificador de formato %s.

Lee caracteres hasta que encuentre un carácter de espacio en blanco (o similar).

Los caracteres se van introduciendo en el array de caracteres y se añade un terminador nulo al resultado.

gets() lee una cadena hasta que se introduce un retorno de carro

scanf() lee una cadena hasta que se introduce el primer carácter de espacio en blanco.

INSTRUCCIONES DE CONTROL SELECTIVAS

Una expresión de relación o una expresión lógica, si es cierta toma el valor 1, y si es falsa toma el valor 0.

Una expresión cualquiera (combinación de operadores, constantes y/o variables) se considera cierta si tiene un valor distinto de 0, y se considera falsa sólo si toma el valor 0.

if (expresión) sentencia

La expresión podrá ser:

– de relación: if ( x > y )...

– lógica: if (sw)...

– aritmética if ( x + y )...

Page 48: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

47

Si la expresión es verdadera (si es distinta de 0) se ejecuta la sentencia; en caso contrario, se pasa a ejecutar la siguiente sentencia a if.

La sentencia o instrucción puede ser simple o compuesta.

– Si es simple, consistirá en una sola sentencia terminada en punto y coma.

– Si es compuesta, contendrá varias sentencias terminadas en punto y coma que están delimitadas por llaves, lo que se conoce como bloque.

El operador ? recibe el nombre de ternario porque requiere tres operandos.

<condicion> ? <expresion_1> : <expresion_2>

Si la condición es cierta, la expresión condicional (todo el conjunto) toma el valor de expresión_1; si es falsa (o sea, 0), toma el valor de expresión_2.

A > B ? mayor = A : mayor = B ;

mayor = A > B ? A : B ;

x = x>0 ? x : -x ;

switch compara sucesivamente un valor entero frente a una lista de constantes enteras.

switch (expresión_entera)

{

case cte_1: sentencias;

[ break ];

case cte_2: sentencias;

[ break ];

......

[ default : sentencias ; ]

Si queremos que dos etiquetas distintas den el mismo resultado se pueden poner juntas:

case x:

Page 49: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

48

case y: <instrucciones> ;

Dos constantes case del mismo switch no pueden tener los mismos valores.

Si se utilizan constantes de carácter en el switch, éstas se convierten automáticamente en sus valores enteros.

INSTRUCCIONES REPETITIVAS

while (condición)

sentencia

Se acepta una sentencia simple, una sentencia compuesta o una sentencia vacía.

do

sentencia

while (expresion);

for (expresion_1 ; expresion_2 ; expresion_ 3) sentencia

expresion 1 se realiza una sola vez, al comenzar el bucle for. Suele ser una inicialización.

expresion 2 es una condición que se evalúa antes de cada ejecución potencial del bucle; si es cierta (distinta de cero) se ejecuta una vez el bucle completo.

expresion 3 se evalúa al final de cada bucle; suele ser la actualización de las variables implicadas en la condición.

Se pueden dejar en blanco:

– La expresion_1, si la variable que controla el bucle ya viene inicializada.

– Si la expresion_2 no existe dará lugar a un bucle infinito puesto que un test vacío se considera cierto.

– La expresion_3 no hace falta si la actualización de la variable que controla el bucle se produce dentro del cuerpo del bucle.

Page 50: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

49

Se puede utilizar el operador coma (,) que enlaza las expresiones

– para realizar más de una inicialización

– más de una actualización.

– no tiene sentido utilizarlo en la expresion_2, pues no equivale ni al operador && ni al operador ||.

El operador coma evalúa las expresiones de izquierda a derecha.

El bucle for se puede utilizar para generar un retardo.

break

– Se usa en la sentencia switch, y en los bucles for , while y do while para salir

de dicho bucle y ejecutar la siguiente sentencia.

– Cuando se encuentra en una estructura anidada, la liberación afecta a la estructura más interna que la contenga.

continue

– Es utilizable en todos los bucles y no se puede usar en switch.

– Interrumpe el flujo del programa, evitando el resto de la iteración, y se dirige de nuevo a evaluar la expresión que condiciona la ejecución del bucle; si ésta es cierta comienza una nueva iteración.

ÁPENDICE. CONVERSACIÓN DE TIPOS

Reglas para efectuar conversiones de tipo:

En una operación en que aparezcan dos tipos diferentes se eleva la "categoría" del operando que la tiene menor para igualarla a la del mayor. Proceso conocido como "promoción".

El rango o categoría de los tipos, de menor a mayor, es: char, short, int, long, float, double. Los tipos unsigned tienen el mismo rango que el tipo a que están referidos.

En una sentencia de asignación, el resultado final de los cálculos se reconvierte al tipo de la variable a que están siendo asignados. Así pues, el proceso puede ser una "promoción" o una "pérdida de rango", según que la variable a asignar sea de categoría superior o inferior.

Page 51: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

50

Con el fin de conservar al máximo la precisión numérica, todas las variables y constantes float se convierten en double cuando se realizan cálculos aritméticos con ellas. Así se reduce enormemente el error de redondeo. Por supuesto, la respuesta final se reconvierte a float, si ese es el tipo declarado.

Cuando se convierte de enteros a caracteres, de enteros largos (long) a enteros y de enteros a enteros cortos (short), la regla básica consiste en eliminar la cantidad apropiada de bits más significativos.

Page 52: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

51

TEMA 4: COMENZANDO A PROGRAMAR

LAS FUNCIONES Y EL DISEÑO MODULAR

Cuando los problemas son arduos, es aconsejable distribuir el programa en módulos (en funciones).

Ventajas

– Los módulos son reutilizables a lo largo del programa.

– Se puede utilizar en diferentes programas.

– Los programas modulares son más fáciles de leer, de depurar y de mantener.

– Los nombres descriptivos clarifican la organización del programa.

– Las funciones se pueden desarrollar y depurar por separado.

Las funciones se pueden considerar como "cajas negras", definidas exclusivamente por la información que hay que suministrarles (su entrada) y el producto que devuelven (su salida).

Podremos interesarnos sólo por el diseño global del programa dejando para más tarde el resolver los detalles.

ESTRUCTURA DE UNA FUNCIÓN

Consta de dos partes principales: el encabezamiento y el cuerpo.

En el encabezamiento de una función se colocan:

- Las instrucciones del preprocesador

- La clase

- El tipo

- El nombre

- Los argumentos

Page 53: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

52

La clase (static o extern): Informa de su accesibilidad o visibilidad, es decir, su ámbito de actuación dentro del programa.

El tipo: Es el valor que retorna la función. Si la función no retorna ningún valor se utilizará el tipo void.

El nombre por el que se identifica a la funcion. Los argumentos. Se disponen unos paréntesis entre los cuales van los posibles

argumentos o parámetros formales, separados por comas si son varios. Para cada parámetro formal hay que especificar su tipo y su identificador. A través de éstos la función intercambia información con aquella desde la que ha sido llamada. Al igual que antes, se insertará la palabra void entre los paréntesis si la función no recibe argumentos.

El cuerpo contiene las diversas sentencias que forman la función, así como las definiciones y/o declaraciones de variables a emplear.

Entre otras podremos encontrar la sentencia return mediante la cual la función retorna un valor.

Las funciones usadas por main() o por cualquier otra función hay que declararlas antes de éstas.

Esta declaración previa de cada función se conoce como declaración del prototipo de función.

Cada declaración de prototipo debe coincidir con la correspondiente definición de función, excepto

o no es necesario precisar los identificadores de los argumentos

o detrás de los paréntesis se coloca un punto y coma

En C++, a la hora de declarar el prototipo de una función que no utiliza argumentos, es equivalente colocar entre paréntesis la palabra void o no colocar nada.

Para llamar a una función se escribe su nombre seguido por paréntesis y un punto y coma.

Si una función NO recibe argumentos, a la hora de llamarla se colocan detrás del nombre los dos paréntesis.

Cuando el programa en su ejecución se encuentra con una llamada a una función:

- realiza las instrucciones indicadas en ésta - cuándo termina, regresa a la siguiente línea de la llamada.

Page 54: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

53

ARGUMENTOS DE FUNCIONES (PASO POR VALOR)

Es frecuente que cuando una función f1() llame a otra, f2(), exista un intercambio de información.

A su vez, f2() podrá retornar a f1() un valor a través de la sentencia return, pero también puede retornar otros valores mediante los mencionados argumentos o parámetros.

Al definir una función se pueden colocar entre los paréntesis unas variables, precedidas de sus respectivos tipos, que se denominan argumentos formales.

Para darle un valor al argumento formal se utiliza, en la sentencia de llamada a la función, un argumento efectivo o parámetro actual.

- una constante - una variable - una expresión

El parámetro enviado es un valor específico que se asigna a la variable conocida como argumento formal.

La variable que recibe el valor tiene su propia dirección de memoria (paso por valor).

Los argumentos formales son locales a la función que los utiliza.

Cuando se necesita enviar más de un parámetro se puede formar una lista (de argumentos efectivos/argumentos formales) separándolos por comas.

Los argumentos efectivos y los formales, para una determinada función, deben coincidir en:

– número

– en tipo

– en orden

Page 55: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

54

LA INSTRUCCIÓN RETURN

El valor de cualquier expresión que aparezca a continuación de return queda asignado como valor de retorno de la función.

El valor devuelto puede ser asignado en el módulo de llamada a una variable, o utilizado como parte de una expresión.

El tipo del valor que se retorna debe coincidir con el que se escribe delante del nombre de la función que debe ser idéntico al que se antepone al prototipo.

El valor de retorno puede ser una expresión cualquiera y no precisa paréntesis.

Tiene el efecto adicional de finalizar la ejecución de la función y devolver el control a la sentencia siguiente a la de la llamada.

- Incluso si la sentencia no es la última de la función.

PUNTEROS

Un puntero contiene una dirección de memoria donde probablemente habrá algún dato que nos interesa.

Esto significa que un puntero apunta o señala a un espacio físico en memoria RAM y puede referenciar cualquier objeto que se encuentre en ella: variables de cualquier tipo básico, arrays, estructuras, etc.

Los punteros permiten acceder a los datos de forma indirecta, a través de su dirección, y entre sus ventajas están:

- Hacer que una función devuelva más de un valor. - Crear un código más compacto y eficiente ya que al usarlos nos acercamos a la

forma de trabajar de la máquina. - Manejar los arrays y cadenas de forma eficiente. - Soportar el uso de estructuras dinámicas, etc.

El operador & (ampersand) es un operador unario que devuelve la dirección de memoria de su operando.

Se le suele llamar operador de dirección.

Page 56: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

55

Ej. Si la variable p es un puntero a entero y la variable n un número entero, es posible realizar la asignación

p = &n;

para hacer que p apunte a n, es decir, que p contenga la dirección de memoria donde se encuentra n

Existen tanto constantes puntero como variables puntero.

– &x es una constante puntero y representa la dirección de la variable x. Es una constante ya que x no va a cambiar de dirección durante la ejecución del programa, y se dice &x apunta (o es un puntero) a x.

– Si una variable contiene la dirección de otra variable (de un objeto, en general), se dice que la primera es un puntero a la segunda.

Se declaran escribiendo el tipo del puntero (tipo base del puntero) y un asterisco seguido del nombre de la variable puntero.

tipo *nombre;

Lo habitual es que una variable puntero apunte a variables del mismo tipo que el tipo que se ha declarado para ella, puesto que existen determinadas acciones con punteros que requieren conocer el tipo de dato al que apuntan para calcular el tamaño de almacenamiento.

El operador de dirección o ampersand (&) y el operador de indirección o asterisco (*) se anulan al aplicarlos a la vez de la forma: *(&x).

Al declarar una variable como puntero hay que indicar el tipo de variable a la que está apuntando (tipo base del puntero), ya que las variables de tipos distintos ocupan diferentes cantidades de memoria, y existen operaciones con punteros que requieren conocer el tamaño de almacenamiento (véase el apéndice de este tema ARITMÉTICA DE PUNTEROS).

El operador de indirección * aplicado a un puntero, da el valor almacenado en la dirección apuntada por el mismo.

Page 57: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

56

Para acceder al contenido de n basta escribir su nombre o acceder mediante el puntero que la apunta *p.

ARGUMENTOS DE FUNCIONES (PASO POR REFERENCIA)

El convenio de paso de parámetros en C es la llamada por valor.

Se puede crear una llamada por referencia pasando un puntero al argumento.

Como lo que se pasa a la función es la dirección del argumento, se puede modificar el valor del argumento dentro de la función.

Los punteros se pasan a las funciones como cualquier otro valor pero declarándolos como de tipo puntero.

<tipo> *<nombre de variable>

El operador * se utiliza para acceder a la variable a la que apunta su operando.

A las funciones que usan parámetros de tipo puntero se deben llamar con la dirección de los argumentos (PASO POR REFERENCIA).

intercambia(&x,&y);

Ejemplo:

void intercambia(int *u, int *v)

{

int aux;

aux = *u;

*u = *v;

*v = aux;

}

Page 58: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

57

VARIABLES GLOBALES Y LOCALES

– Las variables globales son accesibles a lo largo de todo el programa y se pueden utilizar en cualquier parte del código.

– Se crean definiéndolas fuera de cualquier función.

– Atención: si la definición de la variable global está por debajo de la función o en otro archivo, será necesario declararla en la función que se quiere emplear usando la palabra clave extern.

– Las variables globales mantendrán sus valores durante toda la ejecución del programa.

– Si dentro de una función se define una variable local con el mismo nombre que una variable global, todas las referencias a ese nombre dentro de la función hacen referencia a la variable local y no tienen efecto sobre la variable global.

– El almacenamiento de las variables globales tiene lugar en una región de memoria fija definida para este propósito por el compilador.

– Se debería evitar el uso de variables globales por:

• Consumen memoria durante toda la ejecución del programa. • Hace que las funciones sean más dependientes. • Puede provocar errores en el programa debido a efectos colaterales no

deseados.

– Las variables locales son variables que sólo son conocidas por las funciones que las usan. Incluso en el caso de usar el mismo nombre de variable en distintas funciones, el ordenador es capaz de distinguirlas puesto que tienen un ámbito distinto y por tanto, a todos los efectos, son diferentes.

Page 59: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

58

MODOS DE ALMACENAMIENTO

Cada variable tiene un tipo, un identificador, un valor y un modo de almacenamiento, que puede ser : extern, auto, static o register.

El modo de almacenamiento de una variable queda establecido por el lugar donde se define y por la palabra clave empleada, y determina:

1. Las funciones en las que dicha variable es accesible (Ámbito).

2. Cuánto tiempo va a persistir una variable en memoria (Tiempo de vida).

Auto

– Todas las variables declaradas en una función son, por defecto, automáticas.

– Opcionalmente, se puede utilizar la palabra auto para declararlas. – Los argumentos formales son necesariamente variables automáticas. – Las variables automáticas tienen alcance local, o sea, sólo son

conocidas en la función donde se han definido. – Por ello, está permitido emplear los mismos identificadores para

variables diferentes en distintas funciones.

EJEMPLO AUTO

#include <stdio.h>

void main(void)

{

auto int a=3; /* Es lo mismo que int a, puesto que es local*/

printf("%d",a);

getchar();

}

Page 60: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

59

extern

– Cuando una variable se define fuera de una función se dice que es externa. Dicha variable externa puede ser declarada dentro de la función que la emplea utilizando la palabra clave extern: esta palabra clave informa al ordenador que debe buscar la definición de la variable fuera de la función.

– Las variables externas tienen alcance global y permanecen en memoria durante toda la ejecución del programa, ya que al no pertenecer a ninguna función en concreto no pueden eliminarse al acabar ninguna de ellas.

– - Se puede omitir por completo el grupo de declaraciones extern si las definiciones originales aparecen en el mismo fichero y antes de la función que las utiliza.

– Cuando se omite la palabra clave extern en una variable de una función, y su nombre coincide con el de una variable externa, se crea una nueva variable distinta y automática con el mismo nombre.

– Conviene ponerle "auto" para especificar expresamente que se ha evitado una definición de variable externa

EJEMPLO EXTERN

#include <stdio.h>

int a=34;

void main(void)

{

extern int b; /* Se dice que la variable b es externa, pero que está en otro lugar del fichero fuente */

b=56;

printf("a=%d, b=%d",a,b); /* Puede usarse a sin indicar que es externa porque su definición está escrita antes que la función que la usa */

getchar();

}

int b;

Page 61: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

60

static

– Son variables permanentes dentro de su propia función o archivo.

– No se pueden referenciar fuera de su función o archivo, pero mantienen sus valores entre llamadas.

– Tienen alcance local a la función donde se definen.

– Se inicializan una sola vez, cuando se compila el programa.

– Se induce al compilador a reservar memoria permanente para almacenarla de la misma forma que se hace para una variable global.

EJEMPLO STATIC

#include <stdio.h>

int f1(void)

{

static int n=0;

n++;

return n;

}

void main(void)

{

int a;

a=f1();

printf("a=%d\n",a);

a=f1();

printf("a=%d\n",a);

getchar();

}

Page 62: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

61

register

– Originariamente, sólo se aplicaba a variables de tipo int y char. Sin embargo, el estándar ANSI de C ha ampliado su ámbito.

– register solicita al compilador que almacene la variable de modo que permita el tiempo de acceso más rápido posible.

Para enteros y caracteres, normalmente, esto significa en el registro de la CPU en vez de en memoria, donde se almacenan las variables normales.

Para otros tipos de variables, el compilador puede utilizar cualquier otro que signifique disminuir su tiempo de acceso.

De hecho, también puede ignorar por completo la solicitud.

– En C++, se puede aplicar a las variables locales y a los parámetros formales de una función pero no a las variables globales.

– Debido a que una variable register puede estar almacenada en un registro de la CPU, no se puede obtener la dirección de una variable register (esta restricción sólo se aplica a C, y no a C++).

– En general, las operaciones se realizan mucho más rápido que sobre variables almacenadas en memoria principal pues no requieren acceso a memoria.

Esto hace que estas variables sean ideales para el control de bucles.

EL PREPROCESADOR

El código de un programa C (o C++) puede incluir instrucciones para el compilador.

Las directivas del preprocesador comienzan con un signo # y deben encontrarse en una sola línea.

#include, #define, #if, #endif#, #pragma, … son algunas de las directivas que podemos encontrar en un programa C.

Page 63: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

62

#define

– Especifica un identificador y una secuencia de caracteres que se sustituirá por el identificador.

– El identificador se llama nombre de macro y el proceso de sustitución se llama sustitución de macro.

– Ejemplos

• #define EURO 166.386

• #define CUADRADO(x) x*x

– El formato general de la directiva es:

#define nombre_macro secuencia_caracteres

Obsérvese que no aparece un punto y coma.

Puede existir cualquier número de espacios entre el identificador y la secuencia de caracteres, pero una vez que ésta comienza, sólo puede terminar con un retorno de carro.

– La sustitución de macro es simplemente el reemplazo de un identificador, por su cadena asociada.

– Si la cadena supera la longitud de una línea, se puede continuar en la siguiente línea colocando una barra invertida al final de la línea.

– Es una práctica común entre los programadores de C utilizar letras mayúsculas para los identificadores definidos.

– También, es mejor poner todos los #define al principio del archivo o, tal vez, en un archivo separado, en lugar de distribuirlos a lo largo del programa.

#include

– Indica al compilador que incluya el archivo fuente en el que aparece dicha directiva

– El nombre del archivo fuente adicional se debe encerrar entre comillas dobles o los símbolos < y >.

• Si se especifican nombres con camino explícito sólo se buscarán los archivos incluidos en estos directorios.

• Si el nombre del archivo se encierra entre comillas, primero se busca en el directorio de trabajo actual. Si el archivo no se encuentra, se busca en el directorio estándar.

• Si se encierra entre los símbolos < y >, se busca el archivo en los directorios estándares. En ningún momento se busca en el directorio actual de trabajo.

Page 64: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

63

COMPILACIÓN Y ENLAZADO

Biblioteca y enlace

– La mayoría de los programas incluyen llamadas a varias funciones que se encuentran en la biblioteca estándar de C.

– El lenguaje C define una biblioteca estándar que proporciona funciones que llevan a cabo las tareas necesarias más comunes.

– Cuando se llama a una función que no forma parte del programa, el compilador «recuerda» su nombre. Posteriormente, el enlazador combina el código escrito con el código objeto que se encuentra actualmente en la biblioteca estándar.

Compilación separada.

– El C permite dividir un programa en varios archivos y compilarlos por separado.

– Una vez compilados todos los archivos, estos se enlazan entre sí, junto con las rutinas de la biblioteca, para generar el código objeto completo del programa.

– Ventajas

• Una modificación que se realice en el código de uno de los archivos no implica volver a compilar el programa completo sino únicamente el módulo afectado.

• Se ahorra tiempo de compilación.

Mapa de memoria

– Un programa compilado en C crea y utiliza cuatro regiones de memoria:

La zona de memoria que contiene el código del programa.

La zona donde se almacenan las variables globales y estáticas.

La zona de memoria dinámica (heap o montículo) que es la región de memoria libre que puede utilizar el programa mediante las funciones de asignación dinámica de C. Crece hacia las direcciones altas de memoria.

Page 65: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

64

La pila (stack) que se utiliza para gran cantidad de tareas:

– Mantiene las direcciones de retorno de las funciones, los argumentos de las funciones y las variables locales.

– Almacena el estado actual de la CPU.

– Crece desde el límite superior de la memoria del programa hacia abajo.

Cómo se compila y enlaza

– En los primeros tiempos de la era informática al compilar un programa se obtenía código absoluto y todas las direcciones a que se hacía referencia en el programa se fijaban en tiempo de compilación.

– El programa sólo se podía cargar y ejecutar exactamente en una zona de memoria: la zona para la que se compiló

Cómo se compila y enlaza

– Actualmente cuando se compilan los programas se obtiene código reubicable:

• El enlazador será el encargado de combinar físicamente todos los archivos objeto para generar el archivo ejecutable.

• Los archivos objeto utilizan un direccionamiento relativo. • Cuando hay referencias externas a otros archivos, es el enlazador el

encargado de sustituir las referencias externas por las direcciones relativas apropiadas.

• Cuando el archivo se carga en memoria para su ejecución, el cargador convierte automáticamente las direcciones relativas en direcciones absolutas según la posición de memoria en la que se carga el programa

Cómo se compila y enlaza

Page 66: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

65

BIBLIOTECAS

Las bibliotecas son parecidas a los archivos objeto salvo que no todo el código de la biblioteca se añade al programa.

Una biblioteca es una colección de funciones.

– Un archivo de biblioteca almacena el nombre de cada función, el código objeto de la función y la información de reubicación necesaria para el proceso de enlace.

– Sólo se añaden al archivo ejecutable las funciones que se utilizan en el programa.

– Las funciones que son facilitadas con los compiladores de C se encuentran en una biblioteca

Bibliotecas estáticas y dinámicas.

– En una biblioteca estática el enlazador extrae los módulos precisos cuando enlaza, y los inserta en el fichero que contendrá la imagen ejecutable.

– En una guarda en el fichero ejecutable unas referencias a las posiciones donde están las funciones requeridas en la biblioteca.

– Al ejecutar el programa se ejecuta el cargador en tiempo de ejecución (run-time loader) que carga en memoria las funciones de la biblioteca dinámica y ejecuta así el programa completo.

– biblioteca dinámica el enlazador solamente

Bibliotecas estáticas y dinámicas.

– Al usar bibliotecas estáticas los ficheros ejecutables son más grandes,

El gasto de memoria del sistema es mayor, pues para cada programa distinto que se esté ejecutando en cierto momento y que use cierta función, provocará que dicha función esté repetida en memoria.

– Al usar bibliotecas dinámicas los ficheros ejecutables son más pequeños.

Se tarda más en cargar el programa en memoria.

El gasto de memoria es menor.

Los archivos deben estar siempre disponibles.

Page 67: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

66

Las funciones de la biblioteca usan ampliamente una serie de tipos y macros del preprocesador, que se definen apropiadamente en el fichero de cabecera adecuado.

En estos ficheros también se declaran los prototipos de las funciones correspondientes, y quizá alguna variable.

Existen varias cabeceras normalizadas; cada una de ellas corresponde a un grupo de funciones con un determinado campo de acción.

No se debe confundir biblioteca con cabecera.

– Una biblioteca es un archivo que contiene funciones y objetos compilados en código máquina.

– En cambio, una cabecera suele ser un fichero de texto con código fuente C; ahí están fundamentalmente las declaraciones de las funciones.

Existen quince cabeceras normalizadas por ANSI, y tres más que fueron añadidas en septiembre de 1994 por ISO y tratan de la internacionalización en más detalle que el original ANSI/ISO de 1990.

Cabeceras normalizadas

Las cabeceras no tienen por qué ser ficheros de texto fuente.

– En algunos sistemas pueden estar precompiladas, en un formato especial para que el compilador tarde menos en hacer su trabajo.

– En otros ni siquiera tiene que existir un fichero con ese nombre; puede que simplemente el preprocesador ya sepa qué es lo que tiene que hacer al recibir la directiva include.

– Sin embargo en UNIX las cabeceras sí son ficheros con texto, código fuente en C; y normalmente están en el directorio /usr/include.

Page 68: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

67

Todos los identificadores declarados en las cabeceras deben considerarse reservados; esto es, no deben redefinirse, ni usarse para otro propósito al igual que todos los nombres de macros o identificadores que empiecen por el signo de subrayado (_).

Las cabeceras pueden incluirse en cualquier orden, incluso más de una vez, pero antes de que se use cualquier función o macro definida en ella. Suelen ponerse al principio del fichero.

Use siempre la notación de ángulos para las cabeceras estándar.

LA BIBLIOTECA DE ANSI DE C Y LAS EXTENSIONES DE BORLAND

Poco antes, otro Organismo internacional, ISO (International Standards Organization), formó otro Comité para lo mismo, pues veían que el de ANSI era demasiado americano.

Se pusieron de acuerdo y aceptaron incluir en la biblioteca unas cuantas funciones nuevas y modificar otras, de forma que se pudiera escribir un programa que tuviera en cuenta las características culturales de cada país, como los separadores de decimales en números, o letras formadas por más de un carácter. Aunque ISO acabó su trabajo en 1990, éste sólo difiere del de ANSI en la redacción.

El comité de ISO ha seguido trabajando y, a propuesta de varios grupos y subcomités, en septiembre de 1994, publicó un artículo suplementario.

A partir de 1995 nuevas reuniones quizá produzcan la versión 2 del estándar ISO de C, y quizá esto influya en modificaciones a la biblioteca estándar.

Las funciones normalizadas de la biblioteca estándar estarán presentes en un ambiente de cómputo normal (sistema con teclado y monitor).

– Los programadores de sistemas como robots o máquinas, así como los escritores de la propia biblioteca pueden no tener ésta presente y usar solamente C puro.

– También existen evidentemente muchísimas bibliotecas especializadas en cualquier tema.

– Si un programa se puede escribir usando sólo la biblioteca estándar, se podrá transportar a cualquier ordenador que tenga un compilador C ANSI/ISO.

Page 69: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

68

Borland C++ cumple con el estándar ANSI y suministra todas las funciones definidas por éste.

Sin embargo, para permitir una utilización y un control de la computadora lo más completos posible, Borland C++ contiene muchas funciones adicionales no definidas por el estándar ANSI.

Incluyen un conjunto completo de funciones de pantalla y gráficos para DOS, funciones especiales de asignación de 16 bits y funciones de directorio.

– Siempre que no se piense transportar los programas, se pueden utilizar estas funciones extendidas.

Page 70: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

69

TEMA 5: ESTRUCTURAS ESTÁTICAS

INTRODUCCIÓN

Hasta ahora se han utilizado sólo datos de tipo simple (numéricos, carácter, ...).

En numerosas ocasiones es necesario utilizar un conjunto de datos relacionados entre sí.

Un conjunto de datos homogéneos (del mismo tipo) que se tratan como una sola unidad se denomina estructura de datos.

Si reside en la memoria central del ordenador se denomina estructura de datos interna.

Si reside en un soporte externo, se denomina estructura de datos externa.

Las estructuras de datos internas pueden ser:

– Estáticas: Tienen un número fijo de elementos determinado desde la declaración de la estructura en el comienzo del programa.

– Dinámicas: Tienen un número de elementos que varía a lo largo de la ejecución del programa.

Las estructuras internas estáticas más habituales son las tablas (arrays o arreglos).

Una tabla se corresponde con el concepto matemático de vector (1 dimensión), matriz (2 dimensiones) y/o poliedro (3 o más dimensiones). Por tanto, una tabla se puede estructurar en una, dos o más dimensiones.

La dimensión de una tabla coincide con el número de índices que utiliza.

Una tabla consiste en un número fijo y finito de elementos, todos del mismo tipo y bajo un nombre común para todos ellos.

0 1 2 3 4 5 6 7 ... N-1

┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐

│Val.1│Val.2│Val.3│Val.4│Val.5│Val.6│Val.7│Val.8│ ... │Val.N│

└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘

Page 71: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

70

Se denomina componentes a los elementos de una tabla, distinguiéndose cada uno por un índice que complementa al nombre de la tabla.

Longitud o tamaño de una tabla es el número de componentes que contiene.

El tipo de una tabla es el tipo de sus componentes (numéricos, carácter, cadena, etc).

Los componentes de una tabla se utilizan de la misma forma que cualquier otra variable

Antes de utilizar una tabla habremos de definirla en el entorno.

Las tablas se clasifican según su dimensión en:

– Unidimensionales – Bidimensionales – Multidimensionales

CONCEPTO DE TABLAS

Se denomina tabla a un conjunto finito y fijo de elementos del mismo tipo, que se hallan almacenados en posiciones consecutivas de memoria.

1. Los elementos de una tabla se referencia por un nombre común y por uno o varios índices que determinan su posición relativa en la memoria.

En C el primer índice que se puede utilizar es el que tiene el valor 0

En C el nombre de una tabla es un puntero a la dirección de memoria de comienzo de la tabla .

2. Todos los elementos de la tabla son del mismo tipo.

3. El nombre de una tabla sigue las reglas de formación de identificadores de variables.

4. Los índices, dependiendo del lenguaje de programación que se utilice, pueden ir encerrados entre paréntesis o entre corchetes.

Concretamente, el lenguaje C utiliza corchetes.

Page 72: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

71

5. Los índices deben ser números enteros; señalan el orden relativo en que están almacenados los elementos de la tabla. El número de índices determina la dimensión de la tabla.

6. Se llama longitud o tamaño de la tabla al número total de sus elementos.

7. La tabla es una estructura interna.

8. La tabla es un conjunto fijo de elementos y el número de estos elementos depende del valor definido en el programa. Las tablas son estructuras estáticas.

9. El hecho de que la tabla sea una estructura estática no representa ningún problema si el número de elementos que se van a necesitar está predeterminado. Debemos tender a sobredimensionar

10. Las operaciones que se suelen realizar son:

– Recorrido: Proceso de cada elemento de la tabla.

– Búsqueda: Obtener la posición ocupada por un elemento con un determinado valor.

– Ordenación: Organizar los elementos de la tabla de acuerdo con algún criterio. Solo se realiza sobre tablas unidimensionales: vectores.

– También se pueden insertar y/o borrar elementos de la tabla, pero sólo de una forma lógica, nunca física.

Puesto que las tablas son habitualmente fáciles de recorrer y de buscar en ellas y de ordenar, suelen utilizarse para almacenar conjuntos de datos relativamente fijos.

TABLAS UNIDIMENSIONALES: VECTORES

Los vectores son tablas de una sola dimensión,

– Se referencia con el nombre de la tabla y un índice.

Los índices son números enteros y consecutivos que indican la posición relativa de cada uno de los elementos dentro del vector.

– El valor del primer índice (en el lenguaje C) es el 0 y no se puede variar.

El identificador de cada elemento (nombre e índice) determina la posición de memoria donde se encuentra almacenado su contenido o valor.

El vector se denomina tabla unidimensional porque tiene un sólo índice de referencia.

Page 73: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

72

Definición

- Clase de almacenamiento - Tipo de cada uno de los elementos - Identificador del vector - Número de elementos (entre corchetes, en C). - Formato:

clase tipo identificador[num_elementos]

Es importante, pues, recordar que el 1º elemento de un vector corresponde al índice 0

Los vectores son tablas de una sola dimensión,

- Se referencia con el nombre de la tabla y un índice.

Los índices son números enteros y consecutivos que indican la posición relativa de cada uno de los elementos dentro del vector.

- El valor del primer índice (en el lenguaje C) es el 0 y no se puede variar.

El identificador de cada elemento (nombre e índice) determina la posición de memoria donde se encuentra almacenado su contenido o valor.

El vector se denomina tabla unidimensional porque tiene un sólo índice de referencia.

La definición de un vector indica al compilador la cantidad de memoria que tiene que reservar. El compilador lo calcula multiplicando el número de elementos por el espacio que ocupa cada uno.

Pueden inicializarse tanto vectores globales (externos) como locales, sean estáticos o no. Las tablas estáticas y las externas son inicializadas a 0 por defecto.

- Para inicializarlos se coloca la lista de valores entre llaves y separados por comas.

- Ejemplo: short int meses[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };

El operador sizeof proporciona el tamaño en bytes del vector.

Para obtener el número de elementos:

sizeof identif_array/(sizeof(tipo_array))

En C no se comprueban los límites de las tablas.

Paso de vectores a funciones.

Page 74: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

73

– Cuando se quiere pasar una tabla unidimensional a una función hay que pasarle la dirección del primer elemento pues en C no se puede pasar el vector completo como argumento a una función.

– El parámetro actual puede ser el nombre del vector o la dirección de memoria del primer elemento.

– El parámetro formal se puede declarar como:

• un vector no delimitado. • el puntero constante correspondiente al nombre del vector. • un vector delimitado.

– Todas indican un puntero al primer elemento.

BÚSQUEDA Y ORDENACIÓN INTERNA

Una de las operaciones más utilizadas con colecciones de datos es la búsqueda de un dato concreto de entre todos ellos.

La eficiencia de una búsqueda dependerá

– del grado de ordenación previa.

– de la idea que podamos tener sobre la ubicación de la información a buscar.

Existen una serie de algoritmos comunes tanto para la búsqueda de un dato como para la ordenación de una colección de ellos

No hay que desarrollar un algoritmo que funcione, hay que buscar el que lo haga de la mejor forma posible.

Los algoritmos de búsqueda pueden ser:

– Para datos no ordenados:

• Búsqueda lineal

– Para datos ordenados.

• Búsqueda lineal • Búsqueda binaria o dicotómica •

Page 75: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

74

Los métodos relacionados aquí se utilizan con estructuras de datos internas unidimensionales (tablas), es decir, no se utilizan para el caso de ficheros en disco.

Se considera que en los vectores no hay valores repetidos.

Utilizaremos estas declaraciones para la elaboración de todos los algoritmos:

#define N 10

int v[N];

Las funciones devuelven el índice del elemento a buscar o –1 en caso de no encontrarse.

Intuitivamente, el algoritmo de búsqueda lineal es el siguiente:

“Se recorre el vector desde el primer elemento al último hasta encontrar un elemento cuyo valor coincida con el buscado o hasta que se acabe el vector. En este último caso, el algoritmo debe indicar la no existencia de dicho valor en el vector”

Búsqueda binaria o dicotómica

– Este algoritmo es válido sólo y exclusivamente para vectores ordenados y consiste en “comparar en primer lugar con el componente central del vector que, si no es igual al valor buscado, se reduce el intervalo de búsqueda a la mitad derecha o izquierda, según donde pueda encontrarse el valor a buscar. El algoritmo termina si se encuentra el valor buscado o si el tamaño del intervalo de búsqueda queda anulado”.

En los casos en que existan repeticiones en el vector, del valor buscado, este algoritmo obtendrá uno de ellos aleatoriamente según los lugares que ocupen, los cuales necesariamente son consecutivos.

Page 76: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

75

Algoritmos de ordenación:

Page 77: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

76

Factores de eficiencia:

– El número de comparaciones, C.

– El número de movimientos de las mismas, M.

– Son función del número N de elementos.

Clasificación

– Métodos directos:

• Método de inserción directa • Método de selección directa

– Métodos de intercambio

• burbuja • burbuja con switch • sacudida • con incrementos decrecientes. Método Shell.

– Métodos avanzados

Mucho más complejos que los anteriores. Entre ellos encontramos el método QuickSort (qsort()), basado en un algoritmo recursivo (técnica de programación que permite la llamada de funciones a sí mismas), que veremos en temas posteriores.

Inserción directa (método de la baraja)

– Se toman los elementos del vector desde el segundo hasta el último y con cada uno de ellos se repite:

• Se copia del vector el elemento I-ésimo. • Desde el anterior al que estamos tratando y hasta el primero,

desplazamos un lugar a la derecha todos los que sean mayores para buscar su hueco.

• Encontrado el hueco del elemento, lo insertamos en él.

– Cuando tratamos al elemento i-ésimo, todos los anteriores se encuentran ordenados.

Page 78: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

77

Intercambio directo o “burbuja”

– Se recorre sucesivamente el vector comparando los elementos consecutivos e intercambiándolos cuando estén descolocados.

Se puede hacer de izquierda a derecha (desplazando los valores mayores hacia su derecha) o de derecha a izquierda (desplazando los valores menores hacia su izquierda).

– Consiste en realizar pasadas sucesivas direccionando desde el primer elemento hasta el penúltimo, comparando cada uno de ellos con el siguiente.

– Se va colocando el menor elemento en la primera posición, y por tanto excluido del resto.

Page 79: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

78

El método burbuja acerca cada elemento paso a paso. Para vectores pequeños puede ser aceptable.

Shell, denominado así en honor a su inventor consiste en comparar elementos separados por un intervalo grande.

– Inicialmente, ese intervalo corresponde con la mitad de la longitud del vector.

– Posteriormente, cuando ya todos los elementos separados por esa distancia están ordenados, se divide ese intervalo por dos y se opera de igual forma hasta que, finalmente, el salto se reduzca a 1.

INSERCIÓN EN UN VECTOR ORDENADO

El método consiste en buscar una posición en el vector e insertar en el mismo de forma ordenada.

Tenemos el siguiente vector:

Queremos Insertar 8:

Page 80: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

79

1.- Buscamos Hueco:

Queremos Insertar 8:

2.- Movemos las posiciones la derecha

Queremos Insertar 8:

3.- Metemos el valor

Page 81: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

80

BORRADO EN UN VECTOR ORDENADO

El método consiste en buscar una posición en el vector y borrar en el mismo de forma ordenada.

Tenemos el siguiente vector:

1.- Vamos a buscar el elemento a borrar con cualquier método de búsqueda de los vistos:

Por ejemplo buscamos el 9 para borrarlo:

2.- Movemos todas la posiciones hasta la posición y lo borramos :

Page 82: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

81

CADENAS

Las cadenas en C son vectores de caracteres que terminan con el carácter nulo, o sea, ‘\0‘.

C soporta la mayoría de las funciones más potentes de manipulación de cadenas.

Cadenas constantes

– Caracteres encerrados entre comillas.

– Se almacenan en posiciones adyacentes junto al ‘\0’ que no es necesario añadir.

– El modo de almacenamiento es static.

– Se utilizan cadenas constantes como argumentos de las funciones puts()-

muestra la cadena más un salto de línea- , printf(), etc..

Page 83: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

82

Cadenas constantes

– También pueden ser asignadas a macros:

Ejemplo:

– #define VOCALES "aeiou"

– .........

– puts(VOCALES);

– puts("Esta es una tira");

– printf(“%s\n%s\n”, VOCALES, "Esta es otra tira");

Cadenas constantes

– La frase entera entrecomillada actúa como puntero al lugar donde se ha almacenado la misma.

Ejemplo:

– printf("%s,%u,%c\n“,"Domínguez","Delgado", *"a tí dedicado");

– dará como resultado:

– Domínguez,4239842,a

Vectores de caracteres.

– Para inicializar un vector de caracteres se escribe...

• char tira1[]= {'L', 'e', 'n', 'g', 'u', 'a', 'j', 'e', ' ', 'C', '\0'};

• static char tira2[]= {'L‘, 'e', 'n', 'g', 'u', 'a', 'j', 'e', ' ', 'B', '\0'};

• extern char tira3[]= {'L', 'e', 'n', 'g', '.', ' ', 'C', ’+’, ’+’, '\0'};

– Observese el carácter nulo al final de la cadena.

Vectores de caracteres.

– Existe una forma más corta de inicialización:

• char tira1[] = "Lenguaje C";

• static char tira2[] = "Lenguaje B";

Page 84: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

83

• extern char tira3[] = "Leng. C++”;

– No es necesario indicar el tamaño del vector puesto que el compilador cuenta los caracteres y prepara el tamaño correspondiente.

Vectores de caracteres.

– Si especificamos su tamaño, el número de elementos declarados debe ser como mínimo superior en 1 a la longitud de la cadena.

• Si el tamaño es inferior se producirá un error; si es superior, los elementos sobrantes se inicializan a '\0'.

– Para un vector no inicializado:

• char nombre[81];

• Se tiene que declarar obligatoriamente el tamaño. • Se deberá controlar la entrada de caracteres para que su

número no sobrepase el espacio reservado (el tamaño menos 1).

FUNCIONES DE E/S PARA CADENAS

Función gets()

– Captura cadenas desde el teclado; la entrada termina al pulsar INTRO.

– La cadena es colocada en la dirección apuntada por su argumento, un puntero a carácter.

– El último carácter pulsado, el retorno de carro ( ‘\r’ ) no pasa a formar parte de

la cadena, siendo sustituido por el carácter nulo ( ‘\0’ ).

– A diferencia de scanf(), la función gets() sí permite que se introduzcan espacios

en blanco al entrar la cadena.

– Su prototipo es:

• char *gets (char *cadena);

– Devuelve un puntero a la cadena leída.

Page 85: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

84

– Un problema importante que puede aparecer al usar esta función es sobrepasar los límites de la tabla que se le pasa como argumento.

– Como alternativa, y para evitar este tipo de problemas, se puede usar la

función fgets() que se estudiará más adelante.

Función puts()

– La función puts() da salida sólo a cadenas más eficientemente que printf().

– puts() añade automáticamente un retorno de carro.

– Su prototipo es:

int puts (char * cadena) ;

– Devuelve 0 si se ejecuta correctamente y otro valor en caso contrario.

FUNCIONES PARA TRATAMIENTOS DE CADENAS

Utilizan el archivo de cabecera string.h.

– Función strcat()

char *strcat (char *cad1, const char *cad2);

• Concatena una copia de cad2 al final de cad1 y añade carácter \0.

• Esta función devuelve cad1 además en cad1 queda: cad1 + cad2.

• No se realizan comprobaciones de límites

Page 86: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

85

– Función strcmp()

int strcmp (const char *cad1, const char *cad2);

• Esta función compara, según el orden establecido por la tabla ASCII, dos cadenas y devuelve un entero que si:

- Menor que 0 cad1 es menor que cad2 -0 cad1 es igual que cad2 -Mayor que 0 cad1 es mayor que cad2

– Función strcpy()

char *strcpy (char *cad1, const char *cad2);

• copia el cad2 en cad1. • devuelve un puntero a cad1. • Si cad1 y cad2 se solapan, el comportamiento de la función es

indefinido.

– Función strncat()

char *strncat(char* cad1,const char* cad2,size_t cuenta);

• El tipo size_t está definido, mediante typedef, como un entero

sin signo. • Concatena a la cadena apuntada por cad1 un máximo de

cuenta caracteres de cad2 y al final un carácter nulo. • No modifica la cadena cad2.

• strncat devuelve cad1.

• No realiza comprobaciones de límite.

Page 87: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

86

– Función strncpy()

char *strncpy(char *dest,const char *fuente,size_t cuenta);

• Copia un máximo de cuenta caracteres de la fuente al destino.

• strncpy devuelve un puntero a dest.

• Cuando se solapan las cadenas dest y fuente, el

comportamiento de la función strncpy es indefinido.

• Si fuente tiene menos caracteres que cuenta, se añaden nulos

al final de dest hasta que se hayan copiado cuenta caracteres.

• Si fuente tiene más caracteres de lo que indica cuenta, se

copian cuenta caracteres al inicio de dest y sigue con los

caracteres que contenía inicialmente la cadena fuente

– Función strnset()

char *str nset (char *cad, int c, size_t cuenta);

• Define los primeros cuenta caracteres de la cadena apuntada

por cad con el valor de c.

• Devuelve cad.

– Función strstr()

char *strstr (const char *cad1, const char *cad2);

• Devuelve un puntero a la primera ocurrencia de la cadena apuntada por cad2 (sin considerar el carácter nulo de fin de cadena) dentro de la cadena apuntada por cad1.

• Devuelve un puntero nulo si no encuentra ninguna coincidencia.

Page 88: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

87

MACROS Y FUNCIONES PARA TRATAMIENTOS DE CADENAS

Están incluidas en ctype.h.

Macro isalnum()

int isalnum (int c);

– Devuelve un valor distinto de 0 si su argumento es una letra del alfabeto (mayúscula o minúscula) o un dígito; en caso contrario devuelve 0.

Macro isalpha()

int isalpha (int c);

– Devuelve un valor distinto de 0 si su argumento es una letra del alfabeto (mayúscula o minúscula); en caso contrario devuelve 0.

Macro isdigit()

int isdigit (int c);

– Devuelve un valor distinto de 0 si su argumento es un dígito; en caso contrario, devuelve 0.

Macro islower()

int islower (int c);

– Devuelve un valor distinto de 0 si su argumento es una letra minúscula; en caso contrario, devuelve 0

Macro ispunct()

int ispunct (int c);

– Devuelve un valor distinto de 0 si su argumento es un carácter de puntuación o un espacio en blanco; en caso contrario, devuelve 0.

Page 89: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

88

Macro isspace()

int isspace (int c);

– Devuelve un valor distinto de 0 si su argumento es un espacio en blanco, un retorno de carro, un tabulador horizontal, un tabulador vertical, un carácter de salto de línea o un carácter de nueva línea; en caso contrario, devuelve 0.

Macro isupper()

int isupper (int c);

– Devuelve un valor distinto de 0 si su argumento es una letra mayúscula (de la «A» a la «Z»); en caso contrario, devuelve 0.

Función tolower()

int tolower (int c);

– Si el argumento «c» es un letra mayúscula, esta función devuelve la letra minúscula equivalente a «c»; en cualquier otro caso, devuelve «c» sin modificar.

Función toupper()

int toupper (int c);

– Si el argumento «c» es un letra minúscula, esta función devuelve la letra mayúscula equivalente a «c»; en cualquier otro caso, devuelve «c» sin modificar.

Page 90: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

89

TABLAS BIDIMENSIONALES: MATRICES

Se declaran utilizando el formato general:

tipo nombre_array [primera_dimensión][segunda_dimensión];

– Ejemplo:

float lluvia [5][12];

Se inicializan colocando los valores de cada fila entre llaves y separados por comas. Los valores de diferentes filas se separan por comas. Todo el conjunto se encierra entre un par de llaves externo.

– Ejemplo:

int puntos[3][4]={{1,9,3,8},{2,6,4,6},{9,0,1,2}};

– Si entre un par de llaves hay más elementos se producirá un error; si hay menos se inicializan a 0.

Ejemplo:

int puntos [4][5]={ {1,2} , {5,6,7,2,0} , {9,0,4} };

– Es posible inicializar la matriz colocando sólo el par de llaves externas.

Ejemplo:

int puntos [4] [5] = { 1,2,0,0,0,5,6,7,2,0,9,0,4};

En este caso la tabla bidimensional se va llenando en orden por filas.

Paso de tablas bidimensionales a funciones

– Cuando se utiliza una tabla bidimensional como argumento de una función, se pasa un puntero al primer elemento del mismo.

– Se debe definir como mínimo la longitud de la segunda dimensión, debido a que el compilador necesita conocer la longitud de cada fila para indexar la tabla correctamente.

– También se puede especificar la primera dimensión, pero no es necesario.

Page 91: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

90

TABLAS TRIDIMENSIONALES: POLIEDROS

Se declaran utilizando el formato general:

tipo nombre_array [tam_1ra_dim] [tam_2da_dim] [tam_3ra_dim];

Cuando se pasa una tabla tridimensional a una función, el argumento efectivo es el nombre de la tabla y en los argumentos formales se puede especificar una tabla en la que hay que especificar obligatoriamente todas las dimensiones, excepto la primera.

ESTRUCTURAS

Una estructura es un conjunto de variables a las que se hace referencia bajo un mismo nombre, siendo una forma eficaz de mantener agrupada una información relacionada. Las variables que componen la estructura se llaman miembros de la estructura, o también, elementos o campos.

Una declaración de estructura forma una plantilla que puede utilizarse para crear estructuras de objetos.

La palabra reservada struct indica al compilador que se va a definir una estructura.

Por ejemplo, en una lista de personas la información relativa al nombre y teléfono se puede representar como una estructura.

struct agenda

{

char nombre[30];

char telefono[9];

};

La declaración anterior determina una “plantilla” que podremos usar luego para declarar objetos de nuestro programa. Obsérvese que termina con un punto y coma.

Page 92: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

91

Para declarar una variable con la estructura anterior, se debería escribir...

struct agenda mis_amigos;

Esto declara una variable llamada mis_amigos del tipo de la estructura agenda, es decir, que realmente ocupa la memoria suficiente como para almacenar dos valores, el nombre y el teléfono.

Si sólo se necesita una variable de un tipo de estructura, no es necesario indicar la etiqueta al definir la estructura. Esto significa que

struct

{

char nombre[30];

char telefono[9];

} mis_amigos;

declara una variable llamada mis_amigos del tipo de estructura que le precede.

Un miembro de la estructura se referencia indicando el nombre de variable de la estructura, seguido por un punto y, por último, el nombre del miembro.

strcpy (mis_amigos.telefono,“123456789");

gets(mis_amigos.nombre);

scanf(“%s”, mis_amigos.telefono);

Page 93: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

92

Posiblemente, la utilización más común de las estructuras son las tablas de estructuras. Por ejemplo, para declarar un vector de 100 elementos del tipo mis_amigos:

struct agenda mis_amigos[100];

Esto crea 100 variables con la organización de la estructura de tipo mis_amigos.

Para acceder a una determinada estructura del vector agenda, se indexa el nombre de la variable vector. Por ejemplo, para mostrar el telefono de la tercera estructura, se puede hacer lo siguiente

printf (“%s”, mis_amigos[2].telefono);

Page 94: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

93

TEMA 6: ESTRUCTURAS DINÁMICAS

INTRODUCCIÓN

Un programa guarda información en la memoria de dos formas:

– Variables locales y globales

• variables globales y estáticas (static)

– Almacenamiento en la zona de datos del programa.

• variables locales

– Almacenamiento en la pila.

• Estas variables requieren que el programador conozca, de antemano, la cantidad de espacio necesario para cada una de ellas

– Sistema de asignación dinámica.

• Se asigna tanto espacio de memoria libre para el almacenamiento de la información como sea necesario y se vuelve a convertir en memoria libre cuando ya se ha utilizado.

• La memoria libre se encuentra entre el área de almacenamiento permanente del programa (segmento de datos) y la pila.

• Esta región se denomina zona de memoria dinámica o heap (montón).

• Se puede reutilizar. • Permite la creación de estructuras complejas como listas

enlazadas y árboles binarios. • Para realizar asignación dinámica de memoria, se usan los

punteros. • El uso de punteros permite escribir programas grandes y más

flexibles, y especialmente útil cuando se escriben programas orientados a objetos.

Page 95: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

94

Se necesita usar punteros por:

– Si es necesario el paso por referencia de un parámetro a una función.

– Si se usan datos de tamaño desconocido en tiempo de compilación.

– Si los programas manejan datos de múltiples tipos.

– Si los programas utilizan listas encadenadas de registros o de objetos

El espacio necesario para almacenar el dato asociado a la variable, no se reserva en tiempo de compilación, por lo que hay que recurrir a funciones especializadas que realicen esta acción.

En el caso de los vectores puede ocurrir que se reserve o no, dependiendo del tipo de declaración que se realice.

– char texto[20]; //Reservada memoria para 20 variables de tipo char;

– char texto[]; // No reserva memoria.

– char *texto; //No reserva memoria.

Por tanto puede decidirse en tiempo de ejecución cuánta memoria se necesita.

Las funciones estándar de C que permiten reservar y liberar bloques de memoria se

incluyen en stdlib.h y son las siguientes:

free() Permite liberar el espacio asignado previamente

malloc() Permite alojar un bloque de memoria

Page 96: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

95

calloc() Permite alojar un bloque de memoria cuyos elementos se inicializan a 0

realloc() Permite volver a alojar un bloque de memoria

GESTIÓN DINÁMICA DE MEMORIA

Manejo de datos de tamaño desconocido

– Ejemplo.- Si se espera a reservar memoria para una cadena sobre el heap en tiempo de ejecución, se pueden asignar exactamente el número de bytes necesarios para que quepa.

– Esto es un ejemplo trivial, pero en una aplicación con cientos o miles de datos puede marcar la diferencia entre funcionar o dar error al quedarse sin memoria.

El heap

– El heap es toda la memoria que deja disponible el sistema operativo y que no está siendo usada por el código del programa, el segmento de datos y el de pila (stack).

Ejemplo memoria en tiempo de compilación

Page 97: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

96

Ejemplo de memoria en tiempo de compilación

Si el usuario no rellena la estructura completamente, se estará desperdiciando memoria; por ejemplo, si introduce los siguientes datos:

Memoria en tiempo de ejecución

- Evaluar en tiempo de ejecución cuánta memoria se necesita, y una vez conocido el tamaño se pide mediante la función malloc():

- void *malloc(size_t size);

- La función malloc() devuelve un puntero al primer byte de una región de memoria, asignada en el heap, cuyo tamaño en bytes es el valor indicado en el parámetro size. Si no hay suficiente memoria en la zona de memoria dinámica para satisfacer la petición, malloc() devuelve un puntero nulo (valor NULL).

Struct reg_alumno { Char nombre[15]; Char apellidos[25]; Int edad; };

Void LeerAlumnos (struct reg_alumno*a) { Printf(“Nombre del alumno:”); Gets(a->nombre); Printf(“Apellidos:”); Gets(a->apellidos); Printf(“Edad:”); Scanf(“%d”, &a->edad); }

Page 98: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

97

Ejemplo memoria en tiempo de ejecución

Ejemplo memoria en tiempo de ejecución

Struct reg_alumno { Char *nombre; Char *apellidos; Int edad; }; char aux [80];

Las cadenas se declaran como punteros que inicialmente no apuntan a ninguna dirección válida. La cadena aux contendrá la información real que se va a almacenar en las cadenas. Por ejemplo, si aux contiene “Eva”, el puntero nombre sólo necesita apuntar a una zona de memoria con capacidad para almacenar 4 bytes.

Nombre=(char*)malloc(4);

Reservaría 4 bytes de memoria en una dirección del heap y asignaría esa dirección al puntero nombre.

Page 99: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

98

Liberar la memoria ocupada

El problema de la gestión dinámica es la no-destrucción por parte del compilador de esa memoria cuando se acaba la validez de esa variable. El compilador liberará la memoria ocupada por los punteros, pero no la memoria a la que apuntan dichos punteros. Es decir, el programador es el encargado de liberar esa memoria, por lo que se deberá implementar una función que la libere totalmente, utilizando la función free(), cuyo prototipo es el siguiente:

void free(void *block);

void DestruirAlumno(struct reg_alumno *a)

{

free(a->nombre);

free(a->apellidos);

}

realloc()

Suponiendo que hemos definido un vector de 20 elementos de la siguiente forma:

int *v;

int tamanio = 20;

v = (int *) malloc (tamanio * sizeof(int));

realloc()

Si ahora necesitáramos un vector mayor, p.ej. de 25 elementos, habría que volver a localizar una zona de memoria libre lo suficientemente grande como para albergar, de forma consecutiva, los bytes necesarios para 25 enteros. Esto se realiza con la función realloc():

void *realloc(void *block, size_t size);

Page 100: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

99

donde block representa el vector actual y size el nuevo tamaño (en bytes) necesario. La función, en caso de que no devuelva NULL, copiará todos los datos de block en el nuevo vector dinámico.

tamanio = 25;

v = (int *) realloc (v, tamanio*sizeof(int));

Funcionamiento de realloc()

calloc()

– Funciona de la misma forma que malloc(), salvo que inicializa los elementos a 0.

– void *calloc(size_t nitems, size_t size);

– nitems será el número de elementos que se desea gestionar y size el número en bytes que ocupa cada elemento.

– Por ejemplo, para asignar de forma dinámica espacio para un vector de 20 enteros con valor inicial 0 se puede escribir:

v = (int *) calloc (20, sizeof(int));

– Al igual que malloc(), calloc() también devolverá un puntero NULL si no hay memoria suficiente.

Page 101: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

100

calloc()

Suponiendo que hemos definido un vector de 20 elementos de la siguiente forma

int *v;

int tamanio = 20;

v = (int *) calloc (tamanio, sizeof(int));

ESTRUCTURAS DINÁMICAS DE DATOS

Cuando se procesan conjuntos de datos cuyo espacio de almacenamiento no se puede predecir 'a priori' (en tiempo de compilación) y además la actividad de los mismos (inserciones y borrados) es frecuente, las estructuras de datos estáticas (los vectores) no son adecuadas para su implementación. Las razones son varias:

– Los vectores deben ser declarados en tamaño en el programa fuente, de modo que si se elige uno mayor que el necesario, entonces se malgasta espacio de memoria, y si se hace pequeño, podría no ejecutarse el programa.

– La operación de añadir datos al final del vector es un proceso rápido; sin embargo, las inserciones y eliminaciones en el interior del vector son lentas y complejas, ya que puede ser necesario desplazar cada elemento del éste para hacer espacio al nuevo elemento, o bien cerrar el espacio dejado por una eliminación.

– Si a esta dificultad se añaden los casos en que las operaciones anteriores sean frecuentes, se puede deducir que en estos casos las estructuras más idóneas son las estructuras dinámicas de datos.

Page 102: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

101

Listas enlazadas

– Listas (inserción y borrado en cualquier lugar, según clave)

– Pilas (inserción y borrado sólo por el final –LIFO Last In, First Out-)

– Colas (inserción por el final, borrado por el principio –FIFO First In, First Out-)

Árboles

LISTAS ENLAZADAS

Las listas enlazadas son una secuencia de nodos que se encuentran enlazados cada uno con el siguiente mediante un enlace o puntero. Cada elemento (nodo) de una lista enlazada debe tener dos campos: un campo (información) que contiene el valor de ese elemento y un campo (enlace o puntero) que indica la posición del siguiente elemento.

Los elementos de una lista están conectados o "enlazados" mediante sus campos enlace o puntero.

Los componentes de un nodo se llaman campos. Un nodo tiene al menos un campo de datos o valor y un campo enlace o siguiente. El campo enlace apunta (indica la dirección) al siguiente nodo de la lista. Existe una marca para fin de lista, que es la constante NULL.

struct nodo

{

struct nombre_estructura informacion;

struct nodo *siguiente;

};

Page 103: Fundamentos de programación en C · 2019. 10. 14. · INTALENTIA, Fundamentos de programación en C 5 Los algoritmos y los programas – Algoritmo.- Conjunto de reglas que definen

INTALENTIA, Fundamentos de programación en C

102

Si cada nodo únicamente tiene una referencia al nodo siguiente, se dice que la lista está enlazada de forma simple. Cuando se tienen dos referencias, una al nodo anterior y otra al siguiente, se dice que la lista está doblemente enlazada. Los nodos de una lista doblemente enlazada tienen la siguiente sintaxis:

struct nodo

{

struct nombre_estructura informacion;

struct nodo *siguiente;

struct nodo *anterior;

};

PILAS Y COLAS

Lo normal es que en una lista se inserten los elementos siguiendo un criterio de ordenación por uno de sus campos. Sin embargo, existen determinados casos en los que el orden de inserción y borrado en una pila debe cumplir unas características específicas:

PILA.- El último elemento que insertamos en la lista también es el primero que debe salir (estructura LIFO: Last In,First Out).

COLA.- El último elemento insertado es también el último en salir, y el primero que insertamos debe ser el primero en salir (estructura FIFO: First In, First Out).