programacion - en - c-metodologia - algoritmos - y-estructura - de - datos - editorial - mcgraw - hill

programacion - en - c-metodologia - algoritmos - y-estructura - de - datos -...

(Parte 1 de 7)

PROGRAMACI~N EN c Metodología, algoritmos

'

y estructura de datos

L Ignacio Zahonero Martinez

Departamento de Lenguajes y Sistemas Informáticos e Ingeniería del Software

Facultad de Informática/Escuela Universitaria de Informática Universidad Pontificia de Salamanca. Cumpus Madrid

MADRID BUEN,OS AIRES CARACAS -,GUATEMALA. LISBOA MÉXICO NUEVA YORK PANAMA SAN JUAN SANTAFE DE BOGOTA SANTIAGO SA0 PA,ULO AUCKLAND HAMBURG0 LONDRES MILAN MONTREAL NUEVA DELHI PARIS SAN FRANCISCO SIDNEY SINGAPUR ST. LOUIS TOKIO *TORONTO

Prólogo ,
Capítulo 1. Introducción a la ciencia de la computación y a la programación
1.1. ¿Qué es una computadora?
1.2. Organización física de una computadora (hardware)
1.2.1. Dispositivos de EntradafSalida (E/S)
1.2.2. La memoria central (interna)
1.2.3. La Unidad Central de Proceso (UCP)
1.2.4. El microprocesador
1.2.5. Memoria auxiliar (externa)
1.2.6. Proceso de ejecución de un programa
1.2.7. Comunicaciones: módems, redes, telefonía RDSI y ADSL
1.3. Concepto de algoritmo
1.3.1. Características de los algoritmos
1.4. El software (los programas)

PARTE I. METODOLOGíA DE LA PROGRAMACIÓN 1.2.8. La computadora personal multimedia ideal para 1 1.5. Los lenguajes de programación

1.5.4. Lenguajes de alto nivel
1.6. El lenguaje C: historia y características
1.6.1. Ventajas de C
1.6.2. Características
Capítulo 2. Fundamentos de programación
2.1. Fases en la resolución de problemas

1.6.3. Versiones actu ..

2.1.1. Análisis del problema
2.1.2. Diseño del algoritmo
2.1.3. Herramientas de la programación
2.1.4. Codificación de un programa

xv

vi Contenido

2.2. Programación modular

2.1.7. Documentación y

2.3.1. Recursos abstractos

2.3. Programación estructura tructurada: estru

2.7.1. Aserciones
2.7. Métodos formales de verificación de programas
2.8. Factores en la calidad del software

2.6.8. Iteración y e

Capítulo 3. El lenguaje C: elementos bá
3.1. Estructura general de un programa en,._...

PARTE I. FUNDAMENTOS DE PROGRAMACI~N EN c 3.1.1. Directivas del prepro

3.1.3. Función main ( )

3.1.2. Declaraciones global

3.1.5. Comentarios
3.2, Creación de un programa

3.1.4. Funciones definidas PO 3.3. El proceso de ejecución de 3.4. Depuración de un program

3.4.2. Errores lógicos
82
3.4.5. Errores en tiempo de
90
90

90 . . . . . . . . . .

3.6.5. Signos de puntuación y separadores92
3.6.6. Archivos de cabecera92
3.7. Tipos de datos en C92
3.7.1. Enteros(int)93
3.7.3. Caracteres (char)
3.8. El tipo de dato LÓGICO
3.9. Constantes
3.8.1. Escritura de valores lógicos97
es98
3.9.2. Constantes definidas (simbólicas)101
3.9.3. Constantes enumeradas
3.9.4. Constantes declaradas con latile
3.10.1. Declaracion103
3.10.2. Inicialización de variables105
3.10.3. Declaración o definición105
3.1. Duracióndeunavariable106
3.1.1. Variables locales106
3.1.2. Variables globales106
3.1.3. Variables dinámicas107
3.12.1. Salida
3.12.2. Entrada1
3.12.3. Salida de cadenas de caracteres112
3.12.4. Entrada de cadenas de caracteres112
3.13. Resumen113
3.14. Ejercicios113
3.10. Variables,
3.12. Entradas y salidas

Contenido vi¡ 3.7.2. Tipos de coma flotante ( f 1 oat ?

Capítulo 4. Operadores y expresiones114
4.1. Operadores y expresiones1 16
4.2. Operador de asignación116
4.3.1. Asociatividad119
4.3.2. Uso de paréntesis120
4.3. Operadores aritméticos117 ...
4.5. Operadores relacionales
4.6. Operadores lógicos125
4.6.1. Evaluación en cortocircuito127
4.6.2. Asignaciones booleatias (lógicas)128
4.7. Operadores de manipulación de bits129
4.7.1. Operadores de asignación adic130
4.8. Operador condicional132
4.9. Operador coma
4.7.2. Operadores de desplazamiento de bits (», «)
4.7.3. Operadores de direcciones131

4.4. Operadores de increment n y decrementación 13 1

4.12.1. Conversión im
4.12.3. Conversión explícita136
4.14. Resumen137
4.12.2. Reglas ......... ........

4.10. Operadores especiales 4.10.1. El operador ( ) 4.10.2. El operador [ ] 4.1. El operador SIZEOF . 4.12. Conversiones de tipos 4.13. Prioridad y asociatividad . ... 136

4.15. Ejercicios137
4.16. Problemas139
Capítulo 5. Estructuras de selección: sentencias if y switch142
5.1. Estructuras de control144
5.2. Lasentencia if

vi¡¡ Contenido

5.4. Sentencias i f - el se anidadas150

5.3. Sentencia i f de dos alternativas: i f - e 1 se

5.4.1. Sangría en las sentencias i 5.4.2. Comparación de sentencias

5.5. Sentencia de control switch154
5.5.1. Caso particular de case159
5.5.2. Uso de sentencias swi t c
5.6. Expresiones condicionales: el operador ? :
5.8. Puesta a punto de programas

5.9. Errores frecuentes de programación

5.7. Evaluación en cortocircuito de expresiones lógicas161
5.10. Resumen164
5.1. Ejercicios
5.12. Problemas167
6.1. La sentencia whi 1 e

Capítulo 6. Estructuras de control: bucles

6.1.2. Terminaciones anormales de un ciclo174

6.1.1. Operadores de inc

6.1.4. Bucles while con cero iteraciones174
6.1.6. Bucles controlados por indicadores (banderas)

6.1.3. Diseño eficiente d 6.1.7. La sentencia break en

6.1.5. Bucles controlados por centinelas175
6.1.8. Bucles while (true)178
6.2. Repetición: el bucle €or
6.2.1. Diferentes usos de bucles for184
6.3. Precauciones en el uso de for185
6.3.1. Bucles infinitos
6.3.2. Los bucles for vacíos
6.3.3. Sentencias nulas en bucles for188
6.3.4. Sentencias break y continue
6.4. Repetición: el bucle dowhi le .............. ............................. 190
6.4.1. Diferencias entre while y do-while
6.6. Diseño de bucles
6.6.1. Bucles para diseño de sumas y productos
6.6.2. Fin de un bucle194
6.6.3. Otras técnicas d196
6.6.4. Bucles for vacíos196
6.7. Bucles anidados197
6.8. Resumen
6.9. Ejercicios
6.10. Problemas203

188 191 6.5. Comparación de bucles while, for y do-whi le 6.1. Proyectos d 206

Capítulo7. Funciones208
7.1. Conceptodefunción210
7.2. Estructuradeunafunción211

7.2.1. Nombre de una función ...................................................... 213

Contenido

7.2.2. Tipo de dato de retorno

7.2.3. Resultados de una función

7.2.4. Llamada a una función
7.3. Prototipos de las funcionesI . . . . . . . . . . . . . . . . . . .

7.3.1. Prototipos con un número no

.~~....
7.4. Parámetros de una función
7.4.3. Diferencias entre paso de variables por valor y por referencia
7.4.4. Parámetros cons t de una función
7.6. Ámbito (alcance) . . . . . . . . ................................
7.6.2. Ambito del archivo fuente
7.6.3. Ambito de una función
7.6.4. Ambito de bloque
7.6.5. Variables locales
7.7.1. Variables automáticas
7.7.2. Variables externas
7.7.3. Variables registro
7.7.4. Variables estáticas
7.8. Concepto y uso de funcione a

7.6.1. Ambito del programa .

7.9.3. Funciones de conversión de caracteres
7.10.1. Funciones matemáticas
7.10.2. Funciones trigonométricas
7.10.3. Funciones logm’tmicas y exponenciales
7.10.4. Funciones aleatorias
7.7. Clases de almacenamiento
7.9. Funciones de carácter
7.10. Funciones numéricas . . . . . . ........................
7.13. Visibilidad de una función
7.13.2. Variables estáticas y automáticas
7.14. Compilación separada . . . . . .............................
7.17. Resumen
7.19. Problemas
Capítulo 8. Arrays (listas y tablas) . . . . .............................
8.1.2. Subíndices de un array
8.1.4. El tamaño de los arrays

7.9.1. Comprobación alfabética y de dígitos 7.9.2. Funciones de prueba de caracteres espe 7.13.1. Variables locales fren 8.1.3. Almacenamiento en me

s arrays

8.1.5. Verificación del rango

8.4. Arrays multidimensionales

8.2. Iniciaiización de un array 8.3. Arrays de caracteres y cadenas de 8.4.1. Inicialización de arrays mu

8.4.2. Acceso a los elementos de los arrays bidimensionales271
8.4.3. Lectura y escritura de arrays bidimensionales272

X Contenido 8.4.4. Acceso a elementos mediante bucles

8.4.5. Arrays de más de dos dimensiones274 ..................................
8.4.6. Una aplicación práctica274
8.5. Utilización de arrays como parámetros276
8.5.1. Precauciones
8.5.2. Paso de cadenas como parámetros
8.6.1. Algoritmo de la burbuja282
8.7. Búsqueda en listas284
8.8. Resumen
8.9. Ejercicios
8.6. Ordenación de listas282 .....................................
8.7.1. Búsqueda secuencia1 ............................. 28.5
8.10. Problemas ............. 291
Capítulo 9. Estructuras y uniones
9.1. Estructuras
de una estructura
9.1.2. Definición de variables de estructuras
9.1.3. Uso de estructuras en asignaciones
9.1.4. Inicialización de una declaración de estructuras
9.1.5. El tamaño de una estructura
9.2. Acceso a estructuras
9.3.1. Ejemplo de estructuras anidadas
9.4. Arrays de estructuras
9.6. Uniones
9.7. Enumeraciones
9.8. Campos de bit
9.9. Resumen
Capítulo 10. Punteros (apuntadores)322
10.1. Direcciones en memoria324
10.2. Concepto de puntero (apuntador)
10.2.1. Declaración de punteros
10.2.2. Inicialización (iniciación327

10.2.3. Indirección de punteros

10.3. Punteros null y void
10.4. Punteros a punteros331
10.5. Punteros y arrays332
10.5.1. Nombres de arrays nteros332
10.5.2. Ventajas de los punteros
10.6.1. Inicialización de u3.5
10.7. Punteros de cadenas3.5
10.7.1. Punteros versus arrays

10.2.4. Punteros y verificación d 10.6. Arrays de punteros ........................

10.8. Aritmética de punteros336
10.8.1. Una aplicación de ón de caracteres338
10.9. Punteros constantes frente a punteros a constantes339
10.9.1. Punteros constantes339
10.9.2. Punteros a constantes339
340
10.1.1. Inicialización de u343
348
349
10.13. Resumen
10.14. Ejercicios352
353
Capítulo 1. Asignación dinámica de memoria354
1.1. Gestión dinámica de la memoria356
1.2. Función malloc ( )357
1.2.1. Asignación de memoria de un tamaño desconocido361
1.1.1. Almacén libre (free store)357
1.2.2. Uso de mal loc ( ) para arrays multidimensionales
1.3. Liberación de memoria, función free ( )
1.4. Funciones de asignación de memoria call í )y realloc í)364
1.4.1. Función calloc ()364
1.4.2. Función realloc ()365
1.5. Asignación de memoria para array368
1.5.1. Asignación de memoria interactivamente369
1.5.2. Asignación de memoria para un array de estructuras371
1.8. Resumen376
1.9. Ejercicios376
1.10. Problemas377
1.6. Arrays dinámicos

Contenido Xi 1.7. Reglas de funcionamiento de la asignaci

Capítulo 12. Cadenas378
12.1. Conceptodecadena380

12.1.1. Declaración de variables de cadena 12.1.2. Inicialización de variables de cadena

12.2.2. Función putchar ( )385
12.2.3. Función puts ( )
389
389
12.5.1. La función s t391
adenas392
12.6.2. Las funciones strcat ( )y strncat ( )393
12.5. Asignación de cadenas391
12.7. Comparación de cadenas
12.7.3. La función strncmp ( ) .................... 396
12.7.4. La función strnicmp ( )
12.8. Inversión de cadenas
12.9.2. Función strlwr ( )
12.10. Conversión de cadenas a números399
12.10.1. Función atoi ()399
12.10.2. Función atof ( )
12.10.3. Función ato1 (1400
12.10.4. Entrada de números y cadenas
12.1.2. Función strrchr ()402
12.1.3. Función strspn ()
12.1.5. Función strpbrk ()403
12.1.6. Función strstr (1
12.1.7. Función strtok ()
12.12. Resumen405
12.14. Problemas
12.1. Búsqueda de caracteres y cadenas ...........................
12.1.4. Función strcspn () ....... 403
12.13. Ejercicios

xi¡ Contenido

Capítulo 13. Entradas y salidas por archivos410
13.2. Puntero FILE412
13.3. Apertura de un413
13.3.1. Modos de apertura de un archivo414
13.3.2. NULL y EOF415
13.3.3. Cierre de archivos415
13.4. Creación de un archivo secuencia1416
13.1. Flujos 412
417
421
423
13.5.2. Función de lectura f read ( )424
13.6.1. Función f seek ( )

PARTE Ill. ESTRUCTURA DE DATOS 13.7. Datos externos al programa co

13.6. Funciones para acceso aleatorio426
13.6.2. Función ftell ()431
13.8. Resumen434
435
13.10. Problemas436
Capítulo 14. Listas enlazadas438
14.1. Fundamentos teóricos440
14.2. Clasificación de las listas enlazadas441
14.3. Operaciones en listas enlazadas442
14.3.1. Declaración de un nodo442
14.3.2. Puntero de cabecera y cola443
14.3.3. El puntero nulo4
14.3.4. El operador - > de selecció445
14.3.5. Construcción de una lista445

Contenido xiii 14.3.6. Insertar un elemento en una lista 447

14.3.7. Búsqueda de un elemento453
14.3.8. Supresión de un nodo en una lista454
14.4. Lista doblemente enlazada456
14.4.1. Declaración de una lista doblemente enlazada
14.4.3. Supresión de un elemento en una lista doblemente enlazada
14.5. Listas circulares462
14.5.1. Insertar un elem en una lista circular462
14.7. Ejercicios468
14.8. Problemas468
14.4.2. Insertar un elemento en una lista doblemente enlazada
459
14.5.2. Supresión de un elemento en una lista circular463
14.6. Resumen 467
Capítulo 15. Pilas y colas
15.1. Concepto de pila ........... ...............
15.1.1. Especificaciones de una
15.2. El tipo pila implementado con arrays
15.2.1. Especificación del tipo pi 1 a
15.2.2. Implementación de las operaciones sobre pilas
15.2.3. Operaciones de verificación del estado de la pila
15.3. Colas
15.4. El tipo cola implementada con arrays
15.4.2. Especificación del tipo cola
15.4.3. Implementación del tipo cola
15.5.1. Declaración del tipo cola con listas
15.4.4. Operaciones de la cola
15.5. Realización de una cola con una lista enlazada
eraciones del tipo c o 1 a con listas
15.6. Resumen
15.7. Ejercicios
15.8. Problemas

15.4.1. Definición de la especificación de una cola 15.5.2. Codificación de 1

475 I I 1 484 I

Capítulo 16. Árboles
I 16.1. Árboles generales
504
16.3.1. Equilibrio

16.4.1. Diferentes ti [I

16.4. Estructura de un árbol binario511
e expresión
I
16.7.2. Recomdo enorden ...... 521
16.7.3. Recomdo postorden522

16.3.2. Árboles binarios completos ................... 525

528
16.9.1. Búsqueda528
16.9.2. Insertar un nodo
531
16.9.5. Recorridos de un árbol535
535
536
16.13. Problemas540
542
545
575
Apéndice C. Palabras reservadas de C++
Apéndice D. Guía de sintaxis ANSIASO estándar C++
Apéndice E. Biblioteca de funciones ANSI C
Apéndice F. Recursos (Libros/Revistas/URL de Interne713

xiv Contenido ÍNDICE ......................... .............................. ........ 727

y componentes y el mundo Web (C++, Java,) que dominan el campo informático y de la computación.

i Por qué un libro de C al principio del siglo XXI? A pesar de haber cumplido ya sus bodas de plata (25 años de vida), C viaja con toda salud hacia los 30 años de edad que cumplirá el próximo año. Sigue siendo una de las mejores opciones para la programación de los sistemas actuales y el medio más efi- ciente de aprendizaje para emigrar a los lenguajes reina, por excelencia, en el mundo orientado a objetos

i Cuáles son las características que hacen tan popular a este lenguaje de programación e idóneo como primer lenguaje de programación en las carreras profesionales de programador (de aplicaciones y de sistemas) y del ingeniero de software? Podemos citar algunas muy sobresalientes:

Es muy portable (transportable entre un gran número de plataformas hardware y plataformas sof- ware, sistemas operativos). Existen numerosos compiladores para todo tipo de plataformas sobre los que corrren los mismos programas fuentes o con ligeras modificaciones.

Es versátil y de bajo nivel, por lo que es idóneo para tareas relativas a la programación del siste- ma.

A pesar de ser un excelente lenguaje para programación de sistemas, es también un eficiente y potente lenguaje para aplicaciones de propósito general.

Es un lenguaje pequeño, por lo que es relativamente fácil construir compiladores de C y además es también fácil de aprender.

Todos los compiladores suelen incluir potentes y excelentes bibliotecas de funciones compatibles con el estándar ANSI. Los diferentes fabricantes suelen añadir a sus compiladores funcionalida- des diversas que aumentan la eficiencia y potencia de los mismos y constituye una notable venta- ja respecto a otros lenguajes.

El lenguaje presenta una interjGaz excelente para los sistemas operativos Unix y Windows, junto con el ya acreditado Linux.

Es un lenguaje muy utilizado para la construcción de: sistemas operativos, ensambladores, pro- gramas de comunicaciones, intérpretes de lenguajes, compiladores de lenguajes, editores de textos, bases de datos, utilidades, controladores de red, etc.

Por todas estas razones y nuestra experiencia docente, decidimos escribir esta obra que, por otra par- te, pudiera completar nuestras otras obras de programación escritas para C++, Java, Turbo Pascal y Visual Basic. Basados en estas premisas este libro se ha escrito pensando en que pudiera servir de xv xvi prólogo referencia y guía de estudio para un primer curso de introducción a la programación, con una segunda parte que, a su vez, sirviera como continuación, y de introducción a las estructuras de datos todo ello utilizando C, y en particular la versión estándar ANSI C, como lenguaje de programación. El objetivo final que busca es, no sólo describir la sintaxis de C, sino y, sobre todo, mostrar las características más sobresalientes del lenguaje, a la vez que se enseñan técnicas de programación estructurada. Así pues, los objetivos fundamentales del libro son:

Énfasis fuerte en el análisis, construcción y diseño de programas. Un medio de resolución de problemas mediante técnicas de programación. Una introducción a la informática y a las ciencias de la computación usando una herramienta de

Enseñanza de las reglas de sintaxis más frecuentes y eficientes del lenguaje C.

En resumen, éste es un libro diseñado para enseñar a programar utilizando C, no un libro diseñado para enseñar C, aunque también pretende conseguirlo. No obstante, confiamos que los estudiantes que utilicen este libro se conviertan de un modo razonable en acérrimos seguidores y adeptos de C, al igual que nos ocurre a casi todos los programadores que comenzamos a trabajar con este lenguaje. Así se tra- tará de enseñar las técnicas clásicas y avanzadas de programación estructurada.

programación denominada C (ANSI C).

LA EVOLUCI~N DE c: c++

C es un lenguaje de programación de propósito general que ha estado y sigue estando asociado con el sistema operativo UNIX. El advenimiento de nuevos sistemas operativos como Windows (95,98, NT, 2000 o el recientemente anunciado XP sobre la plataforma. NET) o el ya muy popular Linux, la versión abierta, gratuita de Unix que junto con el entorno Gnome está comenzando a revolucionar el mundo de la programación. Esta revolución, paradójicamente, proporciona fuerza al lenguaje de programación de sistemas C. Todavía y durante muchos años C seguirá siendo uno de los lenguajes lideres en la ense- ñanza de la programación tanto a nivel profesional como universitario. Como reconocen sus autores Kernighan y Ritchie, en El Lenguaje de Programación C, 2.” edición, C, aunque es un lenguaje idóneo para escribir compiladores y sistemas operativos, sigue siendo, sobre todo, un lenguaje para escribir aplicaciones en numerosas disciplinas. Ésta es la razón por la que a algo más de un año para cumplir los 30 años de vida, C sigue siendo el lenguaje más empleado en Facultades y Escuelas de Ciencias e Inge- niería, y en los centros de enseñanza de formación profesional, y en particular los innovadores ciclos de grado superior, así como en centros de enseñanza media y secundaria, para el aprendizaje de legio- nes de promociones (generaciones) de estudiantes y profesionales.

Las ideas fundamentales de C provienen del lenguaje BCPL, desarrollado por Martin Richards. La influencia de BCPL sobre C continuó, indirectamente, a través del lenguaje B, escrito por Ken Thomp- son en 1979 para escribir el primer sistema UNIX de la computadora DEC de Digital PDP-7. BCPL y B son lenguajes «sin tipos» en contraste con C que posee una variedad de tipos de datos.

En 1975 se publica Pascal User Manual and Report la especificación del joven lenguaje Pascal

(Wirth, Jensen 75) cuya suerte corre en paralelo con C, aunque al contrario que el compilador de Pas- cal construido por la casa Borland, que prácticamente no se comercializa, C sigue siendo uno de los reyes de la iniciación a la programación. En I978 se publicó la primera edición de la obra The C Pro- gramming Language de Kernighan y Ritchie, conocido por K&R.

En 1983 el American National Standards Institute (ANSI) nombró un comité para conseguir una defi- nición estándar de C. La definición resultante se llamó ANSI C, que se presentó a finales de 1988 y se aprobó definitivamente por ANSI en 1989 y en 1990 se aprobó por ISO. La segunda edición The C Programming Language se considera también el manual del estándar ANSI C. Por esta razón la espe- cificación estándar se suele conocer como ANSVISO C. Los compiladores modernos soportan todas las características definidas en ese estándar.

prólogo xvii

Conviviendo con C se encuentra el lenguaje C++, una evolución lógica suya, y que es tal el estado de simbiosis y sinergia existente entre ambos lenguajes que en muchas ocasiones se habla de C/C++ para definir a los compiladores que siguen estas normas, dado que C++ se considera un superconjunto de C.

C++ tiene sus orígenes en C, y, sin lugar a dudas, Kemighan y Ritchie -inventores de C,- son «padres espirituales» de C++. Así lo manifiesta Bjarne Stroustrup -inventor de C++- en el prólogo de su afamada obra The C++ Programming Lunguage. C se ha conservado así como un subconjunto de C++ y es, a su vez, extensión directa de su predecesor BCPL de Richards. Pero C++, tuvo muchas más fuentes de inspiración; además de los autores antes citados, cabe destacar de modo especial, Simula 67 de Dah1 que fue su principal inspirador; el concepto de clase, clase derivada yfunciones virtuales se tomaron de Simula; otra fuente importante de referencia fue Algol 68 del que se adoptó el concepto de sobrecarga de operadores y la libertad de situar una declaración en cualquier lugar en el que pueda aparecer una sentencia. Otras aportaciones importantes de C++ como son las plantillas (templates) y la genericidad (tipos genéricos) se tomaron de Ada, Clu y ML.

C++ se comenzó a utilizar como un «C con clases» y fue a principios de los ochenta cuando comen- zó la revolución C++, aunque su primer uso comercial, fuera de una organización de investigación, comenzó en julio de 1983. Como Stroustrup cuenta en el prólogo de la 3." edición de su citada obra, C++ nació con la idea de que el autor y sus colegas no tuvieran que programar en ensamblador ni en otros lenguajes al uso (léase Pascal, BASIC, FORTRAN,...). La explosión del lenguaje en la comunidad infor- mática hizo inevitable la estandarización. proceso que comenzó en 1987 [Stroustrup 941. Así nació una primera fuente de estandarización The Annotated C++ Reference Manual [Ellis 891'. En diciembre de 1989 se reunió el comité X3J16 de ANSI, bajo el auspicio de Hewlett-Packard y en junio de 1991 pasó el primer esfuerzo de estandarización internacional de la mano de ISO, y así comenzó a nacer el están- dar ANSVISO C++. En 1995 se publicó un borrador estándar para su examen público y en noviembre de 1997 fue finalmente aprobado el estandar C++ internacional, aunque ha sido en 1998 cuando el pro- ceso se ha podido dar por terminado (ANSIASO C++ Draft Standard).

El libro definitivo y referencia obligada para conocer y dominar C++ es la 3.a edición de la obra de Stroustrup [Stroustrup 971 y actualizada en la Special Edition [Stroustrup 2000]*.

C++ es un superconjunto de C y su mejor extensión. Éste es un tópico conocido por toda la comunidad de programadores del mundo. Cabe preguntarse como hacen muchos autores, profesores, alumnos y profesionales ¿se debe aprender primero C y luego C++? Stroustrup y una gran mayoría de programa- dores, contestan así: «No sólo es innecesario aprenderprimero C, sino que además es una mala idea». Nosotros no somos tan radicales y pensamos que se puede llegar a C++ procediendo de ambos caminos, aunque es lógico la consideración citada anteriormente, ya que efectivamente los hábitos de programa- ción estructurada de C pueden retrasar la adquisición de los conceptos clave de C++, pero también es cierto que en muchos casos ayuda considerablemente en el aprendizaje.

Este libro supone que el lector no es programador de C, ni de ningún otro lenguaje, aunque también somos conscientes que el lector que haya seguido un primer curso de programación en algoritmos o en algún lenguaje estructurado, llámese Pascal o cualquier otro, éste le ayudará favorablemente al correc- to y rápido aprendizaje de la programación en C y obtendrá el máximo rendimiento de esta obra. Sin embargo, si ya conoce C++, naturalmente no tendrá ningún problema, en su aprendizaje, muy al con- trario, bastará que lea con detalle las diferencias esenciales de los apéndices C y D de modo que irá i r

' Traducida al español por el autor de este libro junto con el profesor Miguel Katnb, de la Universidad de la Habana [Ellis 941 Esta obra qe encuentra en proceso de traducción al español por un equipo de profesores de vanas universidades españolas coordi- nadas por el autor de esta obra xviii Prólogo integrando gradualmente los nuevos conceptos que irá encontrando a medida que avance en la obra con los conceptos clásicos de C++. El libro pretende enseñar a programar utilizando dos conceptos funda- mentale s :

1. Algoritmos (conjunto de instrucciones programadas para resolver una tarea específica).

2. Datos (una colección de datos que se proporcionan a los algoritmos que se han de ejecutar para encontrar una solución: los datos se organizarán en estructuras de datos).

Los dos primeros aspectos, algoritmos y datos, han permanecido invariables a lo largo de la corta his- toria de la informáticdcomputación, pero la interrelación entre ellos sí que ha variado y continuará haciéndolo. Esta interrelación se conoce como paradigma de programación.

En el paradigma de programación procedimental @rocedural o por procedimientos) un problema se modela directamente mediante un conjunto de algoritmos. Un problema cualquiera, la nómina de una empresa o la gestión de ventas de un almacén, se representan como una serie de procedimientos que manipulan datos. Los datos se almacenan separadamente y se accede a ellos o bien mediante una posi- ción global o mediante parámetros en los procedimientos. Tres lenguajes de programación clásicos, FORTRAN, Pascal y C, han representado el arquetipo de la programación procedimental, también rela- cionada estrechamente y -a veces- conocida como programación estructurada. La programación con soporte en C++, proporciona el paradigma procedimental con un énfasis en funciones, plantillas de funciones y algoritmos genéricos.

(Parte 1 de 7)

Comentários