Estructura de un programa en C

++

El formato general de un programa en C++ es el siguiente :

/ | ENCABEZADO < | \

Definición de constantes y macros, declaración de variables globales, Inclusión de archivos.

void main(void) <---línea de cabecera de la función principal. {<-------------Inicio de bloque.......... ......... ......... <--Cuerpo de la función principal..........} <-------------Fin de bloque.

En el listado 1.1 se muestra un programa que despliega en la pantalla del monitor el mensaje: El Lenguaje C++ es poderoso
// PRIMER.CPP // // Despliega un mensaje en la pantalla. #include <stdio.h> // Para utilizar la función printf()

void main(void) { printf("El lenguaje C++ es poderoso\n"); }

1.2.- Archivos de cabecera.
El listado 1.1 contiene la línea :
#include <stdio.h>

En ella, stdio.h es el nombre de un archivo de cabecera en el cual se encuentran declarados los prototipos de las funciones y macros que se utilizan para la entrada/salida estándar. Existe un extenso grupo de archivos de cabecera, y cada uno de ellos sirve para manejar un grupo de funciones relacionadas. La extensión h de estos archivos es la inicial de la palabra header. Generalmente estos archivos se incluyen en las primeras líneas de los archivos que contienen el código fuente de los programas en C++ . El compilador de C++ desplegará un mensaje de error cuando se trate de utilizar una función sin antes haber incluido el archivo de cabecera que contiene el prototipo de ella.

1

Los archivos de cabecera son almacenados en el directorio INCLUDE cuando se instala el paquete del compilador.

1.3.- Comentarios.
En el C++ existen dos formas de manejar los comentarios: La primera sirve para escribir comentarios que abarcan varias líneas, y utiliza los caracteres /* para marcar el inicio de un comentario, y los caracteres */ para marcar el final, como se ve en los siguientes ejemplos:
/* Este es un pequeño comentario */ /* Este es otro comentario, pero a diferencia del anterior, utiliza varias líneas.

Observe que también puede incluir líneas en blanco (como la anterior y la siguiente).
*/

La segunda forma solo sirve para comentarios que abarcan una línea o parte de ella, y utiliza los caracteres // al principio del comentario. El fin del comentario queda marcado por el fin de la línea, como se muestra a continuación:
// Este es un comentario de una línea, // y este es otro. void main(void) // Este comentario ocupa parte de la línea.

Los comentarios de una sola línea pueden anidarse dentro de los comentarios de varias líneas, como en :
/* El principio del comentario de varias líneas. // Primer comentario de una sola línea. // Segundo comentario de una sola línea. */ Fin del comentario de varias líneas.

El preprocesador es un programa que viene incluido en los compiladores de C++, y se encarga de ejecutar ciertas órdenes llamadas DIRECTIVAS DEL PREPROCESADOR. Estas directivas empiezan con el carácter # ( Numeral ). Al inicio de la compilación, el compilador invoca al preprocesador, quien actúa de acuerdo a la directiva correspondiente. Las directivas del preprocesador pueden clasificarse en tres grupos principales :

2

1.4.1.- Inclusión de archivos
Pueden incluirse los contenidos de otros archivos de texto en el archivo que contiene código en C++ . Esto se logra por medio de la directiva #include en cualquiera de las tres formas siguientes : #include <nombre_archivo> /* nombre_archivo se buscará solamente en el directorio INCLUDE */ #include "nombre_archivo" /* nombre_archivo se buscará en el directorio de trabajo actual */ #include "d:\trayectoria\nombre_archivo" /* En este caso, nombre_archivo será buscado en el directorio especificado en trayectoria */ Ejemplo: #include "C:\DATOSCPP\PANTALLA.C"

1.4.2.- Reemplazamiento de cadenas y procesamiento de macros
El reemplazamiento de cadenas consiste en sustituir (antes de efectuar la compilación) cada una de las ocurrencias de cierta cadena (llamada constante simbólica) por otra cadena equivalente. Esto de logra por medio de la directiva #define, como se muestra en los siguientes ejemplos:
#include <stdio.h> #define CADENA "El Lenguaje C++ es poderoso\n" void main(void) { printf(CADENA); }

En este caso, el preprocesador sustituirá CADENA por El Lenguaje C++ es poderoso, de tal manera que el compilador se encontrará con la instrucción: printf("El Lenguaje C++ es poderoso\n");
#define VALMAX 1000

Aquí, se está definiendo la constante simbólica VALMAX, cuyo valor será el entero 1000.

3

La directiva #define también sirve para declarar macros, las cuales incluyen una ó más instrucciones del Lenguaje C++ , como en:
#define CUBO(N) ((N)*(N)*(N))

Esta macro puede utilizarse en una instrucción de la siguiente forma:
r = CUBO(5);

El preprocesador sustituye lo anterior por:
r = ((5)*(5)*(5));

Las macros pueden tomar formas complejas y ocupar varias líneas de código, como se muestra en el siguiente ejemplo:
#define REDOND(x) ((x)>=0?((x)+1/VALOR1)*(1-1/VALOR1): \ ((x)-1/VALOR1)*(1+1/VALOR1))

Obsérvese que al final de la primera línea se escribió una diagonal invertida ( \ ), la cual sirve como enlace.

1.4.3.- Compilación condicional
Existe un grupo de directivas del preprocesador que permiten controlar cuales partes del código fuente se van a compilar al cumplirse ciertas condiciones. A continuación se muestra una lista de tales directivas; dejándose la ejemplificación de su uso para unidades más avanzadas de este trabajo.
#if #ifdef #if defined(algo) #ifndef #else #elif #endif

Además de las directivas vistas hasta aquí, existen las siguientes:
#error #pragma inline #pragma warn #pragma saveregs

1.5.- La Función main()
4

Todo programa de C++ debe contener una función llamada main() (principal), la cual sirve de enlace con el sistema operativo que se esté utilizando. Cuando se intente obtener un programa ejecutable(.EXE ) a partir de un archivo que no contenga una función main(), el compilador desplegará un mensaje de error. Al invocar a un programa escrito en C++, desde el indicador de presencia del sistema operativo, se le pueden pasar ciertos valores que se llaman argumentos, los cuales van a ser recibidos por la función principal. Esta, a su vez, va a regresar un valor de retorno al sistema operativo que la invocó. La devolución del valor de retorno se hace por medio de la instrucción return, por ejemplo: return 0 ; La explicación acerca de la utilización de argumentos en la función main() requiere del conocimiento de apuntadores, por lo que se tratará en la unidad 6.

1.6.- Identificadores
Los nombres que son utilizados para referenciar variables, funciones, etiquetas y demás objetos que se manejan con el Lenguaje C++, son referidos en forma genérica como identificadores.

1.6.1.- Identificadores creados por el usuario
El usuario debe cuidar que los identificadores creados por él cumplan las siguientes: Reglas generales para los identificadores: 1.- Pueden estar formados por: a.- Letras mayúsculas y/o minúsculas. b.- El carácter de subrayado. c.- Los dígitos del 0 al 9. 2.- El primer carácter debe ser una letra o el carácter de subrayado. 3.- Pueden contener un número arbitrario de caracteres; pero Borland C++ considera como significativos los primeros 32 o los n primeros que decida el programador, donde:

5

y las palabras sin marca son las palabras reservadas del C estándar. las marcadas con @ son las palabras añadidas por Borland al C. por lo que : SUMA.1 <= n <="32" 4.. son identificadores que tienen asignado un uso específico y no podrán ser utilizadas como identificadores creados por el usuario...Entrada/Salida 6 .2.1 son las palabras reservadas específicas de C++. 5. Suma y suma son identificadores diferentes. La tabla 1..Palabras reservadas de Borland C++.Palabras reservadas Las palabras reservadas.1. 1.1 muestra las palabras reservadas de Borland C++ + _asm asm auto break case _cdecl cdecl char class const continue _cs default delete do double @ @ @ @ @ @ + @ + _ds else enum _es _export extern _far far _fastcall float for friend goto _huge huge if inline int _interrupt interrupt _loadds long _near near new operator _pascal pascal private protected public register return _saveregs @ _seg short signed sizeof _ss static struct switch template this typedef union unsigned virtual void volatile while @ @ @ @ + + @ @ + + + @ @ @ + @ + @ + + + Tabla 1.7.Se toma en cuenta la diferencia entre letras mayúsculas y minúsculas. 1. Las palabras marcadas con + en la tabla 1.6..No puede utilizarse el mismo identificador para dos objetos que se encuentren dentro del mismo ámbito. como su nombre lo indica.

La sustitución de los elementos se hace de acuerdo a los comandos de formato incluidos en cadena_formato..h En esta forma.7. El formato general para la función printf() es: printf(<cadena_formato> .1. A continuación analizaremos cada una de estas funciones y macros: 1. donde: cadena_formato es una cadena de caracteres encerrada entre comillas dobles. . A continuación explicaremos cada una de estas dos formas.h. ). la entrada/salida se maneja de dos formas. <elem> .7. La primera consiste en la utilización de las funciones cuyos prototipos vienen declarados en el archivo stdio.1..h se encuentran definidos. En la tabla 1. La segunda es propia del C++ y consiste en el manejo de objetos y operadores cuyas definiciones se encuentran en el archivo iostream. 1. Esta cadena es enviada a la pantalla ( la salida estándar ) después de haber sustituidos los elementos listados después de la cadena. <elem> . y es la forma que tradicionalmente ha utilizado el Lenguaje C. scanf(). más no en el lenguaje C++ como veremos más adelante.1.En el Lenguaje C++. los prototipos de las funciones printf(). se requiere la inclusión de la siguiente línea al principio del programa fuente: #include &ltstdio.2 se muestran los comandos de formato más usuales: 7 .Funciones declaradas en stdio..La función printf() Esta función es la mas utilizada en C para desplegar información en la pantalla.h .. entre otros. los cuales empiezan con un símbolo de porciento ( % ) .h> En el archivo stdio. gets() y puts() además de las macros getc(x) y putc().

1.147'483.4E-4932 a 3. Tipo Tamaño (bits) Precisión Rango de valores: char 8 .4E+38 double 64 15 digitos 1.Comando Sirve para: %d entero %u entero sin signo %ld entero largo %p valor de apuntador %f número de punto flotante %e número de punto flotante en valor exponencial %c carácter %s cadena de caracteres %x entero en formato hexadecimal %o entero en formato octal Tabla 1. -32.1 Los listados 1.767 short int 16 .7E-308 a 1..4E-38 a 3.535 long 32 . . A fin de poder mostrar algunos ejemplos de aplicación de la función printf(). Direcciones de memoria far pointer 16 .3.2.2 a 1. 0 a 4..295 float 32 7 dígitos 3.767 int 16 .147'483. se presenta aquí la tabla 1. 0 a 65.Tipos de datos.767 unsigned int 16 .768 a 32.294'967.8 muestran ejemplos de utilización de formatos por medio de la función 8 .647 unsigned long 32 . . -32.Comandos de formato.7E+308 long double 80 19 digitos 3.768 a 32.648 a 2. Direcciones de memoria Tabla 1.768 a 32. 0 a 255 enum 16 .3 que contiene los tipos de datos disponibles en el compilador de Borland C++ 3. -32. tamaños y rangos en Borland C++ 3. -2. -128 a 127 unsigned char 8 . near pointer 16 .4E+3932 void .

return 0. printf("y = %13d EN DECIMAL\n". printf("y = %13d EN DECIMAL\n".3 // IMPRIME ENTEROS EN HEXADECIMAL #include <stdio.h> int main() { 9 . printf("y = %13o EN OCTAL\n". printf("y = %13d ENTERO CON SIGNO\n".y). return 0. return 0. return 0. } Listado 1.2 // IMPRIME ENTEROS EN OCTAL #include <stdio. printf("%13d\n".5 // IMPRIME NUMEROS CON PUNTO FLOTANTE #include <stdio. printf("y = %13x EN HEXADECIMAL\n".h> int main() { int y=12345.y).y). } Listado 1.h> int main() { int y= -12345. } Listado 1.// IMPRIME ENTEROS EN "DECIMAL" #include <stdio.y).y).y).h> int main() { int y=12345.4 // IMPRIME ENTEROS SIN SIGNO #include <stdio.h> int main() { int y=12345. printf("y = %13u ENTERO SIN SIGNO\n". } Listado 1.y).

.... printf("\n%25... printf("x = %12. printf("\n%-10s"..10s". printf("La utilidad es del %2d %\n". ..b]s donde: ..c)."DESPLEGADO DE CADENAS EN LENGUAJE C++").JUSTIFICA A LA IZQUIERDA a NUMERO DE ESPACIOS DISPONIBLES PARA DESPLEGAR b NUMERO MAXIMO DE CARACTERES QUE PUEDEN DESPLEGARSE */ printf("\n%10s".1f\n".45."DESPLEGADO DE CADENAS EN LENGUAJE C++".h> int main() { /* Formato: %[-a... desplegará : La utilidad es del 30 % 10 ...} float x=123.."DESPLEGADO DE CADENAS EN LENGUAJE C++").10s".. return 0.. printf("%c%c%c\n".. } Listado 1. } Listado 1. .7 // IMPRIME CADENAS DE CARACTERES #include <stdio...y). int utilidad. b='Y'. return 0. double y=678. utilidad).. utilidad = 30.a.90.. Por ejemplo: ..8 Para desplegar el símbolo de porciento puede escribirse en cadena_formato : % . Listado 1.b.h> int main() { char a='X'.2f\ny = %12...."DESPLEGADO DE CADENAS EN LENGUAJE C++") printf("\n%-25.10s". return 0..6 // IMPRIME CARACTERES #include <stdio.. c='Z' ."DESPLEGADO DE CADENAS EN LENGUAJE C++").x. printf("\n%.

2 La función scanf() debe utilizarse con cautela cuando se van a introducir valores numéricos y de cadenas de caracteres en una sola instrucción.7. <elem> . 11 . Es por esto que se han desarrollado las funciones gets() y puts(). ) .1. 1.h 1. Estas macros están definidas en el archivo stdio. y la almacena en variables previamente declaradas.Las macros getc() y putc() La macro getc(c) toma un caracter desde el teclado y lo almacena en la variable c.. como en: gets(nombre). .2.7.1. normalmente del teclado.1.7.4.2. <elem> .. El formato para la función scanf() es : scanf( <cadena_formato> . putc() despliega un caracter en la pantalla. 1. específicas para la entrada/salida de cadenas de caracteres. La función gets() toma una cadena de caracteres desde el teclado y la almacena en la variable cuyo identificador aparece como argumento en la invocación a gets().Funciones declaradas en conio.1.3. La función scanf() utiliza la mayoría de los comandos mostrados en la tabla 1. La función puts() despliega en la pantalla una cadena de caracteres que se encuentra almacenada en la variable cuyo identificador aparece como argumento en la invocación a la función puts(). Los significados de <cadena_formato> y <elem> son los mismos que en el caso de la función printf() ..h..Las funciones gets() y puts() Las funciones scanf() y printf() sirven para varios formatos. Por su parte.. por lo cual son muy voluminosas.7.La función scanf() Esta función toma la entrada..

y corresponden a la columna y el renglón de la esquina inferior derecha de la nueva ventana.h se encuentran definidos los objetos cin y cout. El objeto cout utiliza al operador sobrecargado << para enviar datos hacia la salida estándar( normalmente la pantalla ). es necesario incluir la linea: #include <conio.La consola es un concepto heredado de los ambientes multiusuario. En las implementaciones de Borland C++ existe una serie de funciones que manejan la entrada/salida por la consola. establece la ventana actual. El flujo de entrada/salida es utilizado para enviar datos desde una fuente ( productor ) a un destino ( consumidor ) . y está formada por el teclado y el monitor. getch(). El objeto cin utiliza al operador sobrecargado >> para tomar datos desde la entrada estándar( habitualmente el teclado ). getche(). elegante e intuitiva que la de stdio.. además de un mecanismo más eficiente y flexible.b pertenecen a la columna y el renglón de la esquina superior izquierda. window(a. los valores x.x.b. toma un carácter desde el teclado y no lo despliega en la pantalla.3. posiciona el cursor en la posición establecida por la columna a y el renglón b. que limpia la pantalla y posiciona el cursor en la esquina superior izquierda de la ventana actual. La palabra iostream tiene su origen en las palabras: input output stream . En esta forma se tiene una vasta jerarquía de clases para el manejo de entrada/salida para archivos y dispositivos. Para poder utilizar las funciones relacionadas con la consola. entre otras: clrscr(). toma un carácter desde el teclado y lo despliega en la pantalla.7.h C++ provee una nueva forma para manejar la entrada/salida.h es el archivo de cabecera donde se encuentran declarados los prototipos de las funciones que manejan la entrada/salida estándar por la consola.h> Donde conio. 12 . En el archivo iostream.y).b). proporcionando una sintaxis más sencilla. Los valores a. gotoxy(a. 1.Objetos declarados en iostream.h . por lo que puede traducirse como flujo de entrada/salida.

07. " << nombre << " !!" .h . En este contexto. cin>> nombre . int numero = 150 .h> int main() { char nombre[10] . } Listado 1.Constantes 13 . cout << " NOMBRE : " .05). ventana2. variables.window(10. clrscr() y gotoxy() declarados en constrea.25). cout << "!! HOLA .40. No debe confundirse el significado que se dá aquí al vocablo objeto con el que tiene en la Programación Orientada a Objetos.9.1.07). así como los manipuladores window(). } Listado 1.1.h> int main() { char nombre[30]. cout << "\n" . 2.window(10.h> #include <constrea. llamaremos objeto a una región identificable de memoria que puede almacenar un valor fijo o variable.h> #include <iomanip..10. cout << "\nSUELDO : $ " .. cout << "CUAL ES TU NOMBRE ? " . ventana1.10). ventana0.clrscr().Constantes.clrscr(). operadores En esta unidad se trata el manejo de los objetos donde se almacenan los datos.20.Veamos como se utilizan estos elementos en un pequeño ejemplo: #include <iostream.h.. ventana1.window(1. constream ventana0. cin>> sueldo . ventana0.80. ventana2. cin.Uso de manipuladores. return 0. 2. return 0 ..05.getline(nombre. así como las operaciones que pueden realizarse con los valores almacenados.10. como se muestra en el listado 1. #include <iostream. cout << "NUMERO: " << setw(3) << numero.clrscr().Ejemplo de utilización de cin y cout También es posible especificar el ancho de un campo por medio del manipulador setw() . ventana1. float sueldo . que se encuentra declarado en iomanip. ventana2 .

. Ejemplo: const int smin = 15300 . además de un valor que permanece fijo durante el tiempo de ejecución. que empiezan con 0X ó 0x (cero x) Ejemplo: const int mem = 0xFFFF ..Caracteres.a).Podemos definir a una constante como una localidad de memoria (objeto). Ejemplo: const char inicial = 'A' . se clasifican en cuatro clases: • • • • • • • • • • • • I).. se obtendrá el efecto explicado en ella. En la unidad 1 se estudió la manera de definir constantes por medio de la directiva #define . Si el carácter que sigue a la diagonal es alguno de los caracteres mostrados en la tabla 2.295. II).1. compuestos de uno o más caracteres encerrados entre comillas sencillas (apóstrofes). I. que pueden escribirse en formato: I.294'967. Para manejar los caracteres de control se utilizan las secuencias de escape que empiezan con el carácter de diagonal hacia atrás (\) seguida de un carácter. usando del formato mostrado a continuación: const <tipo> <identificador> = <valor> Ejemplo: const int iva = 10 .b). que deben empezar con un 0 (cero). Aquí definiremos a las constantes utilizando el modificador const... Secuencia Caracter Efecto \a BEL Sonido de la bocina \b BS Retroceso \f FF Alimentación de forma \n LF Nueva línea \r CR Retorno de carro \t HT Tabulación horizontal \v VT Tabulación vertical 14 .b).Enteros. (decimal 27) I. permitidos por Borland C++.Decimal. se visualizará el carácter tal cual. Los valores para las constantes.Octal. Ejemplo: const int lim = 030 . la cual tiene un nombre y un tipo de dato asociados.Hexadecimal. pero si es cualquiera de los demás caracteres del Código ASCII. con valores de 0 a 4.

. Ejemplos: 3. fresa = uva+5} . uva. 0.2. y entonces : pera uva manzana fresa = 0 = 1 = 10 = 6 2. Ejemplo: enum frutas { pera...Secuencias de escape.Enumeración. fresa } . . donde: pera. . uva. '\007\007' III). además de un valor que puede cambiarse durante el tiempo de ejecución.1. manzana y fresa son constantes de enumeración y tienen los siguientes valores: pera uva manzana fresa = = = = 0 1 2 3 Pueden asignarse valores explícitos como en: enum frutas {pera.Punto flotante. son identificadores definidos en declaraciones de tipo enum.4 . manzana. 34e3 .0 . '\n\t' . Por ejemplo: 'AB' .\\ \' \" \? \O \x \ ' " ? O H Diagonal hacia atrás Comilla sencilla Comilla doble Interrogación Cualquiera O=Número octal de hasta tres dígitos Cualquiera H=Número hexadecimal Tabla 2. manzana = 10 . Borland C++ permite el uso de dos caracteres juntos como valores de caracteres. cualquiera con punto decimal ó con formato exponencial. -3. 15 .. uva .135 .Variables Una variable es un espacio de memoria que tiene un nombre y un tipo de dato asociados.075E12 IV)..

{ int x=20. básicamente. ] . char prim = 'A' ... float desc . seg . ... Bajo este enfoque. se generaliza el concepto de ámbito local. int x=5... a través de la introducción del concepto de bloque. . se tienen las siguientes clases de ámbito: Ambito de BLOQUE. El formato para la declaración de una variable o grupo de variables es el siguiente: [.. { // x del bloque 1 // x del bloque 2 // x del bloque 3 16 ... 2. { int x=10. otro ..... El ámbito va a depender.. del lugar del programa en que aparece la declaración. y pueden declararse variables dentro de cada bloque. Si..En el Lenguaje C++ puede declararse una variable en cualquier lugar del programa.. Ejemplos: int algo..3... int suma = 0 . todas serán consideradas como variables diferentes. en diferentes bloques. existen variables con el mismo identificador.. Es posible anidar una serie de bloques..Ambito El ámbito es una zona de programa donde puede utilizarse un identificador para accesar su objeto .. Un bloque está formado por las instrucciones delimitadas por un par de llaves { }..... acum = 0 . Así que puede tenerse: . inicial = 1 . var2. En el Lenguaje C++. con la única restricción de que la declaración preceda a la primera instrucción donde se utiliza tal variable....

.4..Duración estática 17 ....x). El ámbito de los identificadores utilizados dentro de los paréntesis en la declaración de prototipo de una función.. y el ámbito de sus identificadores abarca todos los bloques contenidos en el archivo en cuestión. int x=30.. finaliza con la declaración del prototipo.... y no puede utilizarse la instrucción goto para saltar de una función a otra. por ejemplo. printf("x=%d".x). Lo más recomendable es no utilizar los mismos identificadores y no intentar manejar variables en un ámbito diferente al que pertenecen.... // x del bloque 4 // x=30 // x=20 // x=10 // x=5 Debe tenerse cuidado al utilizar identificadores iguales para diferentes variables. El identificador de una etiqueta debe ser único dentro de una función. } printf("%d"..4.. Ambito de FUNCION. } printf("%d".. tienen memoria asignada durante el tiempo de ejecución. 2.Duración La duración define el periodo de tiempo durante el cual los identificadores declarados tienen objetos asignados en memoria. ..... Ambito de PROTOTIPO DE FUNCION. En esta clase sólo se encuentran los identificadores que se utilizan como etiquetas cuando se tienen instrucciones goto. Las variables.. Las variables declaradas fuera de cualquier bloque en un archivo son consideradas como variables globales.} printf("%d"..1.. . Ambito de ARCHIVO.... por lo que: una variable con éste ámbito puede ser utilizada en las funciones del archivo que estén definidas después del punto donde se declaró dicha variable. Existen tres clases de duración: 2.x).x).

. en ausencia de un valor inicial explícito 2. Cuando se utiliza el especificador de clase de almacenamiento register.Enlace En la creación de un programa ejecutable. tienen duración estática.Los objetos con duración estática están localizados en memoria durante todo el tiempo de ejecución del programa.4. son creados en la pila de la memoria RAM ó en los registros del microprocesador. Los objetos de duración local deben utilizarse siempre en un ámbito local ó de función. íntimamente relacionados con su ámbito: • • • . el archivo objeto (. las variables con ámbito de archivo y las variables con especificadores de clase de almacenamiento static ó extern. Todos los identificadores tienen uno de los siguientes atributos de enlace.exe). por invocaciones a funciones específicas. se implica el uso del especificador de clase de 2. Posteriormente. primero se lleva a cabo la compilación de diversas unidades de traslación.obj) . SIN ENLACE. conocidos también como objetos automáticos. 18 .Duración local Los objetos de duración local.5. Las funciones. las cuales se componen del código fuente junto con los archivos incluidos. ENLACE INTERNO. . ENLACE EXTERNO.2.3. se enlaza con librerías preexistentes para obtener el archivo ejecutable (..Duración dinámica Los objetos de duración dinámica se crean y se destruyen. El enlace es el proceso que permite a cada instancia de un identificador asociarse correctamente con un objeto o función particular. Los objetos con duración estática son inicializados a cero .4. . 2.. durante el tiempo de ejecución de un programa. La memoria asignada a éstos objetos es liberada cuando finaliza la ejecución del bloque donde fueron creados. El almacenamiento de estos objetos se dá en el área de reserva de la memoria RAM llamado montículo.

. // DEFINICION de variables globales Listado 2. Cada instancia de un identificador con enlace externo representa al mismo objeto ó función a través de todo el conjunto de archivos y librerías que componen el programa. Si la declaración de un identificador de un objeto ó función contiene el especificador extern . 3..Estos atributos se determinan a través del emplazamiento y los formatos de las declaraciones. b).2. junto con el uso ( implícito ó explícito ) de los especificadores de clase de almacenamiento static ó extern. Para aclarar lo relacionado con el especificador extern.Los identificadores de ámbito de bloque para objetos declarados sin el el especificador extern. Si un identificador de objeto con ámbito de archivo se declara sin especificador de clase de almacenamiento. Cualquier identificador de objeto ó archivo que tenga ámbito de archivo tendrá enlace interno si su declaración contiene el especificador static. c). A continuación se presentan las: REGLAS PARA LOS ENLACES INTERNO Y EXTERNO: 1.CPP int edad..1. 19 . el identificador tendrá enlace externo.Los parámetros de las funciones.1 y 2. el identificador tendrá el enlace correspondiente a una declaración con ámbito de archivo.Cualquier identificador declarado para ser algo diferente de un objeto ó función ( p. Cada instancia de un identificador con enlace interno representa al mismo objeto ó función solamente dentro de un archivo. Para C++.. char nombre[31]. si el mismo identificador aparece con ambos tipos de enlace en el mismo archivo. el identificador tendrá enlace externo.EXTERN1.ej. Los siguientes identificadores no tienen atributo de enlace: • • • a). Si una función se declara sin un especificador de clase de almacenamiento. 2. 4. que define las variables globales. un identificador typedef ). Los identificadores sin enlace representan entidades únicas.CPP. // EXTERN1. su enlace está determinado como si se hubiera utilizado el especificador extern. revisemos los listados 2.

.. En el archivo EXTERN2.4. " << nombre << " ?" .6..2.PRJ. void main() { cout << "\nCUAL ES TU NOMBRE ? " . en el cual se incluyen los archivos EXTERN1.1.CPP.OBJ y EXTERN2. 2. el cual determina la cantidad de espacio de almacenamiento que se le asigna a cada uno de los objetos de tal tipo.6. como se muestra en la tabla 2.1.1.6.h> // DECLARACION de variables globales que: extern int edad.CPP #include <iostream.2 . Finalmente.6. cin>> edad .3.6.Operadores ariméticos Los operadores aritméticos se aplican sobre objetos con valores numéricos. cout << "\nCUANTOS AÑOS TIENES.Operadores Los objetos que se manejan en C++ van a tener un tipo de dato asociado. } Listado 2.0 20 . se compila el proyecto y se obtiene el archivo ejecutable EXTERN.Operadores aritméticos. En esta sección estudiaremos los operadores. " << nombre << "\n" .Operadores entre bits. 2. // se encuentran en otro archivo extern char nombre[].// EXTERN2.6. A = 100. Las operaciones serán representadas a través de identificadores específicos llamados operadores. cin>> nombre .. cout << " TE FALTAN " << 100-edad .EXTERN2.. 2.CPP se definen las variables globales edad y nombre. Y = 30 . que declara y utiliza variables globales definidas en otro archivo.5. En el archivo EXTERN1.CPP se declaran las variable edad y nombre utilizando el modificador extern. Posteriormente se compila este archivo para obtener el archivo EXTERN1.Operadores Relacionales. así como el conjunto de operaciones que podrán realizarse con los valores almacenados.6. cout << "\n\n" ..EXE 2.OBJ.. 2..CPP. agrupándolos en: 2.0 . Sean: X = 20 . cout << " PARA LLEGAR A LOS CIEN.Operadores lógicos. se crea un proyecto al que puede llamarse EXTERN. 2. B = 200.Operadores de asignación.

5 % Módulo Z=Y%X Z=10 ++ Incremento X++ X=21 Decremento XX=19 Tabla 2.3..2.Operadores entre bits 21 .6. Los resultados coincidirán con los valores de verdad: FALSO igual a CERO VERDADERO diferente de CERO Los operadores relacionales en C++ son : > = Mayor que Mayor ó igual que <= Menor ó igual que="=" Igual que !="Diferente" que ( No igual que ) 2. 2.Operadores lógicos Los operadores lógicos se aplican sobre los enunciados que resultan de las operaciones relacionales..Operadores aritméticos.Operadores relacionales Los operadores relacionales se usan para comparar los valores que resultan de reducir expresiones..4.6. y el resultado siempre será un valor de verdad.2. Los operadores lógicos son: && || ! Y O NO ( Conjunción ) ( Disyunción ) ( Negación ) 2..6.Operador Operación Ejemplo Resultado + Adición Z=X+Y Z=50 Sustracción Z=Y-X Z=10 * Multiplicación Z=X*Y Z=600 / División Z=Y/X Z=1.

6. Los operadores entre bits son: & | ^ ~ >> Y O O ( Conjunción ) ( Disyunción ) ( Disyunción Exclusiva ó XOR ) ( Complemento a uno ó NOT ) ( Desplazamiento a la DERECHA ) << ( Desplazamiento a la IZQUIERDA ) A continuación se presentan ejemplos de algunas operaciones entre bits: Ejemplo 2. la instrucción en C++ se escribiría : indice & 127 . En este caso.6.Con estos operadores se puede realizar la comprobación. Para esto puede utilizarse la operación de conjunción entre bits. suponiendo que se quiere cambiar el bit de paridad de 1 a 0 . Si tenemos la declaración: char indice = 81 . y.1: Supongamos que se quiere cambiar el bit de paridad ( el de la extrema izquierda ) de uno a cero. Ejemplo 2. La operación manual tomaría la siguiente forma: 22 . La operación realizada a mano es : 01111111 11010001 <-----.2 Se requiere que en el número 112 tengan valor 1 los bits que correspondan con los del número 7 que tengan valor 1.127 en binario 01010001 <-----. colocación ó desplazamiento de los bits actuales de una variable de los tipos int y char.indice operador> & <-----. la operación a utilizar es la disyunción entre bits. quedando las instrucciones en la siguiente forma: char masc . masc = 112 | 7 .resultado En este caso se utilizó el número 127 porque es el único número entero que puede escribirse en un octeto ( byte ) y que tiene los siete primeros bits con valor 1.

la expresión puede constar de una combinación de varios identificadores. Operador Significado Ejemplo: Equivale a: = Asignación múltiple .7 en binario 01110111 <-----. los lugares desocupados del estremo contrario van siendo ocupados por ceros. Los operadores de asignación sirven para asignar un valor derecho a un valor izquierdo. Las expresiones utilizadas como valor izquierdo corresponden a objetos cuyos valores pueden cambiar durante la ejecución de un programa. hacia la izquierda ó hacia la derecha. += Suma asigna X+=Y X=X+Y -= Resta asigna X-=Y X=X-Y *= Multiplicación asigna X*=Y X=X*Y 23 .resultado Ejemplo 2. de una variable entera ó de carácter.5. como se muestra en la tabla 2.6.01110000 <-----. 2.6. como se ve a continuación: x = 125 ^ 120 .Operadores de asignación El estudio de los operadores de asignación requiere del conocimiento de los conceptos de valor izquierdo ( lvalue ) y de valor derecho ( rvalue ).3 . Manualmente se tendría: 01111101 <------. char x . Un valor izquierdo es una expresión que designa un objeto. Un valor derecho es una expresión formada por cualquier combinación de objetos y operadores que pueda ser reducida a un valor.. y están formados por la combinación del operador de asignación simple = con otro operador. en la expresión correspondiente a un valor izquierdo aparece el identificador de una variable.3 La disyunción exclusiva sirve para poner a uno los bits del primer operando cuyos correspondientes bits en el segundo operando sean distintos. Generalmente. Cuando el valor izquierdo se refiere a la dirección de una variable.120 en binario 00000101 <------. Los unos que salen por los extremos no se pueden recuperar(no hay rotación) . A medida que los bits son desplazados hacia un extremo.resultado Los operadores de desplazamiento mueven todos los bits.125 en binario operador> 01111000 <------.112 en binario operador> | 00000111 <-----.

sólo una salida.3.. 3. 24 .Secuencia A este grupo pertenecen las instrucciones que están formadas por una o varias expresiones simples colocadas una a continuación de la otra..Instrucciones de iteración. Los operadores estudiados hasta aquí no son todos los que existen en el C++. asigna Conj. instruccion_N . Su diagrama de flujo se presenta en la figura 3.. 3.3.Instrucciones de secuencia.. asigna Disyunción asigna X/=Y X%=Y X<<Y X>>Y X&=Y X^=Y X|=Y X=X/Y X=X%Y X=X<<Y X=X>>Y X=X&Y X=X^Y X=X|Y Tabla 2...1..1. instruccion_2 . asigna Dezplaz.. 3... De acuerdo a las características de cada una. es necesario utilizar algún operador no tratado en esta unidad. Si. posteriormente... 3. der./= %= <<= >>= &= ^= |= Divide asigna Residuo asigna Dezplaz. las clasificaremos en grupos de estructuras básicas de: 3.Instrucciones de selección.2.. izq. e/bits asigna Disy.. . Las estructuras básicas deben cumplir con la condición básica de la Programación Estructurada de: sólo una entrada. sino los que a mi juicio son indispensables para iniciar el estudio del lenguaje. La sintaxis para las instrucciones estructurados en secuencia es la siguiente: instruccion_1 .Operadores de asignación. en ese momento se estudiarán las características particulares de tal operador.Instrucciones de control En esta unidad estudiaremos las instrucciones que sirven para controlar el flujo de ejecución de un programa en C++ . exclu.1.

La instrucción switch 3.1.2. else es opcional.2.. y su sintaxis es : if( condición ) [else] [bloque_2] donde: bloque_1 y bloque_2 pueden estar formados por uno ó más instrucciones.La instrucción if .. En C++ se tienen las siguientes instruccións de selección: 3.2. 25 . bloque_2 tampoco existirá.2..else 3.La instrucción if .3.1. y en caso de no existir.-Selección A este grupo pertenecen aquellas instrucciones que sirven para que la ejecución del programa tome una de varias opciones existentes en una ramificación.else Esta instrucción permite elegir entre dos opciones de ejecución.2.

else if(condición_2) bloque_2.Al ejecutarse esta estructura. resulte un valor de verdad verdadero. en caso contrario (si el valor de verdad es falso)... primero se evalúa la condición.... Esta estructura puede anidarse para elgir entre un grupo de más de dos opciones. A continuación se muestran algunos ejemplos de aplicación de la instrucción if-else #include <iostream. En caso de que. if(ncontrol<=0) cout << "NUMERO INVALIDO. de esta evaluación.....".. se ejecutarán las instrucciones que forman el bloque_1.. else bloque_N. cout << "NUMERO DE CONTROL: ". cin>> ncontrol...h> void main() { long ncontrol..... else if(condición_3) bloque_3.2. El diagrama de flujo para la estructura if-else se presenta en la figura 3. tomando la siguiente forma: if(condición_1) bloque_1. else cout << "CORRECTO !!" << "\n\n\n". se ejecutarán las instrucciones del bloque_2.. } 26 . ..

...... se interrumpe la ejecución de la instrucción.. como es el caso de manejo de menús....... clrscr().... en caso de que coincida con el valor de Const_2.".... se ejecuta el Bloque_2 .... } A la entrada en una instrucción switch.. En caso de que el resultado coincida con Const_1...Uso de if-else #include <iostream. se ejecutan las instrucciones contenidas en el Bloque_X. se ejecuta el Bloque_1 y break interrumpe la ejecución del instrucción.h> void main() { int calif. Su sintaxis es: switch(expresión_entera) { case Const_1 : Bloque_1 ..... cout << "CALIFICACION: ".........3.. else if( (calif>= 70) && (calif <=100)) cout << "CALIFICACION APROBATORIA.......Uso de if-else-if 3. else if(calif < 0) cout << "ERROR: CALIFICACION DEMASIADO BAJA . if(calif > 100) cout << "ERROR: CALIFICACION DEMASIADO ALTA .... Esta instrucción es preferible que el uso de anidamientos de varios if-else..La instrucción switch Esta instrucción es útil cuando se tiene que elegir entre más de dos opciones...2.. .... case Const_2 : Bloque_2 ... . } Listado 3...Listado 3.2.1. break . case Const_N : Bloque_N ..2... ...". break .". y si el resultado no coincide con ninguno de los valores constantes.h> #include <conio. primero se evalúa la expresión_entera... Esta estructura puede representarse con el diagrama mostrado en la figura 3.. cin>> calif............ En caso de existir default:... default : Bloque_X ..... 27 .. break ....". Lo mismo pasa en caso de que el resultado coincida con cualquiera de los otros valores constantes........ else cout << "CALIFICACION REPROBATORIA..

cout << "1.8). cout << "RUTINA DE ELIMINACION\n". case '3': clrscr().h> void main() { char opcion.10). gotoxy(30. gotoxy(30.MODIFICACION". gotoxy(30.12).ELIMINACION". cout << "RUTINA DE MODIFICACION\n". gotoxy(30.break.CREACION". cout << "2. break. case '0': clrscr().. cout << "SU OPCION ? ".. clrscr(). cout << "MENU DE OPCIONES". gotoxy(30. cout << "3.. cout << "OPCION INVALIDA.h> #include <conio.. } } 28 .18).\n". cout << "SALIDA AL SISTEMA OPERATIVO\n".. default:clrscr().Es recomendable el uso de la instrucción switch en el caso del manejo de un menú de opciones como se observa en el listado 3.14).. cout << "RUTINA DE CREACION\n". switch(opcion) { case '1': clrscr(). break.SALIDA". cout << "0. gotoxy(30... break. #include <iostream. opcion= getche().5). cout << "\n\n". case '2': clrscr().3.

Listado 3. La sintaxis de la instrucción while es la siguiente: while(condición) bloque. de entrada. 29 . se tienen: 3. Si el resultado de la evaluación es un valor igual a cero ..1. el bloque de instrucciones no se ejecuta y finaliza la ejecución de la instrucción.3. En caso de que el resultado de tal evaluación sea un valor diferente de cero . En el Lenguaje C++. en el cual debe existir una instrucción que modifique la condición. ya que de lo contrario ejecutará un ciclo infinito ( loop ).La instrucción while Con esta instrucción se maneja una estructura en la que...3. En la figura 3.Uso de switch 3. se evalúa una condición.3.La instrucción do .3..3.. 3.3.1.La instrucción for Para el manejo de las estructuras de iteración.while 3.Iteración Las estructuras de iteración se utilizan en la ejecución repetida de un bloque de instruccións.La instrucción while 3..2.4 se presenta el diagrama de la instrucción while.3. se ejecuta un bloque de instrucciones.

h> #include <conio. clrscr(). sólo que en este caso primero se ejecuta el bloque de instrucciones y después se evalúa la 30 . while(valor!=FALSO) { cout << "\nTeclee un valor entero ( 0="salir" ) : ".while La instrucción do-while tiene un comportamiento similar a while..h> #define FALSO 0 void main() { int valor=1. cin>> valor..El listado 3. #include <iostream.3.4.4 muestra el uso de la instrucción while.La instrucción do . } } Listado 3.2.Uso de la instrucción while 3.

31 . Con esto se asegura que el bloque se ejecutará al menos una vez.h> void main() { char opcion. gotoxy(30. do{ // inicia ciclo 1 clrscr().5. La instrucción do-while puede representarse con el diagrama mostrado en la figura 3. while(condición). Como una aplicación de la instrucción do-while .h> #include <conio.5).5 una variante al problema resuelto en el listado 3.3 . Esta es la sintaxis de la instrucción do-while : do bloque.condición. #include <iostream. se presenta en el listado 3.

gotoxy(30. gotoxy(30. do{ // inicia ciclo 2 clrscr(). // fin ciclo 1 } Listado 3. pero sí lo son los tres punto y coma que los separan.8). La sintaxis de la instrucción for es la siguiente: for(inicialización .. window(42. cout << "SALIDA AL SISTEMA OPERATIVO\n".// fin ciclo 2 window(1..MODIFICACION". case '3': clrscr(). getch(). gotoxy(30. case '2': clrscr().5.10). condición . break. cout << "RUTINA DE MODIFICACION\n". condición control Los bloques de inicialización. case '0': clrscr()... Mientras. cout << "RUTINA DE ELIMINACION\n". for es la más versátil.42. entre otras características. permite la declaración de variables dentro de su estructura. es un bloque de instrucciones separadas por comas y que controlan la variación de los valores de las variables utilizadas.12).18)." }while((opcion < '0')|| (opcion>'3')). cout << "3..25).18). gotoxy(30.". } cout << "\n\nPULSE CUALQUIER TECLA PARA CONTINUAR.18. gotoxy(30.SALIDA".CREACION". control) bloque..La instrucción for Entre las instrucciones de iteración. se ejecutará el bloque de instrucciones.cout << "MENU DE OPCIONES". es una instrucción que puede evaluarse de tal forma que se obtenga como resultado un valor de verdad ( falso ó verdadero ). cout << "SU OPCION ? ".80. // ciclo infinito // no realiza tarea alguna 32 . condición y control no son obligatorios. }while(opcion! ="0" ).3.1.. ya que.3. de tal suerte que la forma mínima de una instrucción for quedaría así: for(. donde: inicialización es un bloque de instrucciones que puede incluir la declaración de las variables involucradas y la asignación de valores iniciales.14). cout << "RUTINA DE CREACION\n". cout << "0. cout << "2.) . cout << "1.Aplicación de la instrucción do-while 3. se cumpla la condición. break.ELIMINACION". switch(opcion) { case '1': clrscr(). break. opcion="getche(). break.

y++) { gotoxy(y.Diseño de funciones Las funciones son el módulo básico para la construcción de programas en C++.6 muestra el uso de la instrucción for.6. cout << '.El diagrama para la instrucción for se muestra en la figura 3. #include <iostream. El listado 3.6. } Listado 3.. x <= 25 .h> int main() { clrscr(). } } return 0.h> #include <conio. for(int x=1 . con frecuencia es necesario utilizar funciones adicionales que pueden ser accesadas a través del enlace de 33 . Además de la función main().x).Utilización de la instrucción for 4.. if((x="=25)" && (y="=80))" getch(). y <="80" . x++) { for(int y="1" .'.

. debemos distinguir entre: declarar. En el ejemplo 4.librerías precompiladas ó a través de su definición en el archivo de código fuente ó en archivos de cabecera.. no habrá 34 .1. pero no se le reserva espacio en memoria. En esta unidad estudiaremos los procedimientos necesarios para el manejo de las funciones definidas en el código fuente. Con esto. La existencia de argumentos dependerá de la tarea que va a realizar la función. Es en la definición donde se incluye el cuerpo de la función. 4. pero el par de paréntesis es requisito indispensable.Declaración de funciones Cuando se declara una función.Definición de funciones La definición de una función implica reservarle espacio de almacenamiento en memoria. tome nota de las características de ella. como son: el tipo de dato que retorna. su nombre y los tipos de argumentos que va a recibir.2.1. Cuando se define una función se le está reservando espacio de almacenamiento en memoria. En principio. Desde los orígenes del Lenguaje C ha existido la distinción entre definir y declarar una función. ya que la confusión de éstos términos es causa de frecuentes problemas. en cambio cuando se declara solo se está avisando que más adelante se encuentra una función con ciertas características. y que por el momento. e identificador es el nombre de la función. se presenta una aplicación de la definición. El formato general de la definición de una función es el siguiente: tipo { } identificador( argumentos ) bloque. 4. de acuerdo al tipo de dato a retornar. donde: tipo es el tipo de dato que va a retornar la función. la declaración y la invocacion de funciones. se está avisando al compilador que más adelante encontrará la definicion de tal función. definir e invocar una función.

y que no recibirá argumentos.1.3. En este caso. podría haberse escrito así : float calcula(float arg). En el ejemplo 4. sino que basta con incluir los tipos de datos de los argumentos. sólo que en el caso de la declaración se escribe un punto y coma al final. sólo que el ámbito de tales identificadores estará restringido a la declaración de la función correspondiente.1 se tienen las líneas: 35 . así como los argumentos ó parámetros que requiere para realizar su tarea.1. como se observa en el ejemplo 4. En la declaración de la función calcula() se especifica que va a retornar un valor de tipo float. representan la declaración de las funciones ó la declaración de los prototipos de las funciones saludo() y calcula(). float calcula(float).Invocación a funciones Una invocación ó llamada a una función implica pasarle el control de la ejecución del programa. por lo que es innecesaria su inclusión. En la declaración de la función saludo() se especifica que no va a retornar valor alguno. las líneas: void saludo(). También cabe hacer notar que en la declaración no se requiere escribir identificadores para los argumentos. Si el número de argumentos. la declaración: float calcula(float). y que va recibir un argumento de tipo float. Se pueden incluir identificadores de argumentos.ningún problema en invocar a la función en un bloque de programa ubicado antes del lugar donde se encuentra escrita su definición. o los tipos correspondientes no coinciden entre la declaración y la línea de encabezado de la definición de la función el compilador marcará un error. el identificador arg no tiene uso alguno. Es importante observar que la declaración de una función es parecida a la línea de encabezado de su definición . 4. En el listado 4. Por lo tanto.

el compilador verifica si ya se realizó la declaración ó la definición de la función invocada. // ENCABEZADOS #include <iostream. //INVOCACION A LA FUNCION calcula() En la primera. La realidad es que se puede omitir el prototipo si escribimos la definición de la función antes de su primera invocación.OBJ correspondiente. } // DEFINICION DE LA FUNCION saludo() void saludo() { clrscr(). Lo anterior puede sugerir que el prototipo de la función invocada es indispensable.2. } // DEFINICION DE LA FUNCION calcula() float calcula(float x) { return( x * 1.1. como se muestra en el ejemplo 4. //INVOCACION A LA FUNCION calcula() cout << "PRECIO : $ " << precio. pasándosele como argumento una copia del valor que tiene la variable costo.h> // DEFINICION DE LA FUNCION saludo() void saludo() { clrscr(). El valor retornado por calcula() se asigna a la variable precio.6). precio. float calcula(float).4. enviará un mensaje de error diciendo que la función invocada debe tener un prototipo. //INVOCACION A LA FUNCION saludo() precio = calcula(costo). // ENCABEZADOS #include <iostream. } Listado 4.6). se invoca a la función saludo() y no se le pasa ningún argumento. En caso de no existir ni declaración ni definición previa. En ese momento se detiene la compilación y no se genera el archivo . } // DEFINICION DE LA FUNCION calcula() float calcula(float x) { return( x * 1. } // 36 . se invoca a la función calcula().El prototipo de una función ¿es obligatorio? Cuando encuentra la primera invocación a una función. En la segunda. saludo(). cout << "COSTO : $ ".Diseño de funciones utilizando prototipos.h> #include <conio.. 4.h> #include <conio. cout << "!! BIENVENIDO A LA VENTA ESPECIAL !!". cout << "!! BIENVENIDO A LA VENTA ESPECIAL !!".saludo().h> // DECLARACION DE FUNCIONES void saludo().. // DEFINICION DE LA FUNCION PRINCIPAL void main() { float costo. //INVOCACION A LA FUNCION saludo() precio = calcula(costo). clrscr(). cin>> costo.

....2.double).double).. //APLICA.. La declaración de prototipos también sirve para que el usuario de un programa conozca la forma de utilización de la función.....OBJ Archivo que contiene el código objeto.DEFINICION DE LA FUNCION PRINCIPAL int main() clrscr(). FUNCION saludo() FUNCION calcula() } Listado 4.. cuando se escribe la línea: #include <stdio. a=13500. sin tener que proporcionarle el código fuente.. precio... es recomendable utilizarlo.... Los archivos pudieran tomar la forma mostrada a continuación: ARITME.. { float costo. cout << "COSTO : $ "... //ARITME.. Por ejemplo.45... b=16763........... Aunque el prototipo no es obligatorio. } Este es el criterio que se sigue al utilizar los archivos de cabecera que contiene el paquete compilador.Diseño de funciones sin uso de prototipos...87. double resta(double...... .....HPP: CONTIENE LOS PROTOTIPOS DE LAS FUNCIONES double suma(double..OBJ cout << result.. saludo(). result = suma(a... donde se definen las funciones aritméticas. si tenemos un programa que maneja operaciones matemáticas podemos distribuir a los usuarios el código objeto que contenga las definiciones de las funciones y un archivo de cabecera que contenga los prototipos.b).h> #include "ARITME.h> 37 ..HPP" //Incluye el archivo que contiene //los prototipos de las funciones //aritméticas void main(void) { double result. Por ejemplo.. ya que de esta manera se permite al compilador verificar que el número y tipos de argumentos utilizados en la invocación (parámetros actuales) coinciden con los de la definición (parámetros formales). //INVOCACION A LA precio = calcula(costo). //INVOCACION A LA cout << "PRECIO : $ " << precio.CPP: PROGRAMA FUENTE ELABORADO POR // EL USUARIO #include <iostream. // Invocación a la función suma() // definida en ARITME.... return 0. . cin>> costo.

Enseguida viene el nombre de la función. dando la impresión de que a una sola función se le ha "sobrecargado de tareas". La composición del nombre ampliado ocurre a nivel del compilador. Se respetan las reglas establecidas para la creación de identificadores. Aquí surge la pregunta: ¿ cómo distingue el compilador entre cada una de las funciones suma() ?. suma(float.float). que pueden compartir el mismo nombre entre varias de ellas. Debido a que varias funciones sobrecargadas pueden usar el mismo identificador. devuelve entero double suma(double. C++ utiliza el concepto de nombres ampliados para controlar cada función individualmente. Por ejemplo.5. razón por la cual se les llama funciones sobrecargadas. precedido por el carácter @. Una de las excepciones la constituyen las funciones. Si la función no es parte de una clase. El nombre ampliado de una función se construye tomando como base el nombre de la función y los tipos de los argumentos. Las reglas básicas usadas en Borland C++ para los nombres ampliados son relativamente simples como se observa a continuación : 1. El tipo de retorno de la función no se utiliza en la formación del nombre ampliado.Sobrecarga de funciones En la mayoría de los casos. A continuación se muestran los prototipos para cada una de las funciones que comparten el nombre suma : int float suma(int.int). el nombre ampliado empieza con el símbolo @ seguido por el nombre de la función. El Lenguaje C++ permite resolver este problema por medio de la sobrecarga de funciones. 38 . Se utiliza primero el nombre de la clase. precedido por el carácter @. no al nivel del enlazador.double). 2. que dos objetos dentro del mismo ámbito no deben tener el mismo nombre. supongamos que deseamos una función que sirva para sumar números. los identificadores ó nombres de los objetos deben ser únicos. esto es. Lo ideal sería contar con una sola función que realizara la suma de números de diferentes tipos y que retornara un valor de acuerdo al tipo de resultado. El enlazador resuelve fácilmente las referencias externas para sobrecargar las funciones debido a que éstas tienen nombres ampliados únicos. 3..se está incluyendo el archivo que contiene los prototipos de las funciones que se utilizan para el manejo de la entrada/salida 4. // Recibe enteros.

Tipo de argumento Letras void v void* pv unsigned char uc unsigned char* puc unsigned char& ruc signed char zc signed char* pzc signed char& rzc int i int* pi int& ri unsigned int ui unsigned int* pui unsigned int& rui long l long* pl long& rl unsigned long ul unsigned long* pul unsigned long& rul float f float* pf float& rf double d double* pd double& rd Tabla 4.Letras para los tipos de argumentos en la creación de nombres ampliados. se pueden predecir fácilmente los nombres ampliados de las funciones. como se muestra a continuación: 39 .1.1 muestra una lista de las letras que se utilizan para manejar los tipos predefinidos de C++ en la formación de los nombres ampliados..4. Utilizando la tabla 4. La tabla 4. El nombre de la función está seguido por una secuencia $q .1. las letras minúsculas que le siguen designan cada tipo de argumento declarado.

. @despliega$qpzc int suma(int. @imprim$qv void imprim(int). en ocasiones es necesario enviarle algunos elementos indispensables para realizar su tarea. la función invocada no podrá modificar los valores de las variables utilizadas como parámetros actuales. sino que trabajará con las copias que se le envían. En este caso.double). // SE INVOCA A precio() Y SE LE ENVIA UNA 40 . Al igual que las variables locales.float).unsigned int*). 4.1. 4. @redim$qlpui void despliega(char*)..int. @imprim$qi void imprim(int. Estas copias son recibidas en los parámetros formales. los cuales se comportan como variables locales pertenecientes a la función invocada.Paso de parámetros Cuando se invoca a una función.3. @suma$qdd 4.6.6. enviados en la invocación. El listado 4. #include <iostream. @suma$qii float suma(float. cin>> costo. Dependiendo de la naturaleza de los parámetros. se pierden los valores que envió el módulo invocador. void main(void) { double costo.Declaración de funciones Nombre ampliado void imprim(void). clasificaremos el paso de ellos en: 4. @imprim$qiii int redim(long. se llaman parámetros actuales.6. cout << "COSTO : $ ". precio(costo). @suma$qff double suma(double. 4.1.Paso Por Valor. una vez que termina la ejecución de la función invocada. las variables pertenecientes a los parámetros formales se destruyen..Paso por valor Se realiza un paso de parámetros por valor cuando se envía una copia de los valores de los parámetros actuales.6. y por lo tanto.Argumentos Predeterminados.Paso Por Referencia..h> #define NL cout << "\n" void precio(double).2.int)..int).3 muestra el paso de parámetros por valor.6. Estos elementos.

h> void oferta(float &). } Listado 4. 4. podemos decir que es preferible utilizar una variable existente en lugar crear una nueva. como se muestra en el listado 4. cout << recibido. cout << "PRECIO REBAJADO: N$ " << bajo. gotoxy(1. cout << "¿ CUAL ES EL PRECIO ?.6. cout << costo.2.. Según lo anterior. el paso de parámetros por referencia se realiza creando un alias del identificador de la variable que forma el parámetro actual. // EL VALOR DE costo SE CONSERVA DESPUES // DE LA INVOCACION A precio() } void precio(double recibido) { recibido="recibido" * 1. En C++. N$ " . } void oferta(float & bajo) { bajo *="0.4 .8" . cin>> precio. cout << "¿ DIJO USTED N$ " << precio << " ?".16). #include <iostream.Paso de parámetros por referencia. gotoxy(20. por lo que la función oferta() realmente modifica el valor contenido en dicha variable. oferta(precio). gotoxy(20. El paso de parámetros por valor puede sustituirse por un paso de 41 . gotoxy(20.3. gotoxy(20.. se puede decir que bajo es otro identificador asociado a la variable precio.Paso de parámetros por valor. // SE MODIFICA EL VALOR DE LA // COPIA GURDADA EN recibido NL. cout << " ESO ES CON EL 20 % DE DESCUENTO".25). clrscr().h> #include <conio.4. En el listado 4.12). void main(void) { float precio. y eliminar el paso de parámetros por valor.5..24).Paso por referencia A diferencia del paso por valor.4. } Listado 4.// COPIA DEL VALOR DE costo NL. el paso por referencia permite que la función invocada modifique el valor original de las variables usadas como argumentos.14).

y tienen como objetivo simplificar el manejo de los valores de los parámetros actuales utilizados.. A éstos se les llama argumentos predeterminados..Argumentos predeterminados Cuando se declara el prototipo de una función. int porcentaje = 20.8 "PRECIO REBAJADO: N$ " << rebajado.parámetros por referencia donde se utilice el modificador const.h> // DECLARACION DEL PROTOTIPO DE LA FUNCION desc(). #include <iostream.. clrscr().Paso por valor utilizando referencias.6. es posible asignar valores iniciales a los argumentos.h> #include <conio. cout << "¿ DIJO USTED << " ESO DIJE. gotoxy(1. 4. gotoxy(20. El valor del precio cambia para cada artículo.h> void seudoferta(const float &).. N$ " << precio << " ?".24). Supóngase el problema de calcular del precio de un artículo.16). rebajado="bajo" * 0.5. // AL ARGUMENTO DE TIPO ENTERO porcentaje SE LE ASIGNA // UN VALOR INICIAL DE 20 Y AL iva UN VALOR INICIAL DE 10. cin>> precio. gotoxy(20.12). } void bajo) { float rebajado. } Listado 4. NO HAY seudoferta(const float & .14). cout << PRECIO ?. gotoxy(20. gotoxy(20. pero el valor del descuento puede considerarse como un pocentaje fijo del precio para la mayoría de los artículos (por ejemplo en época de ofertas).. ////////////////////////////////////////////////////// // ARGPRED. void main(void) { float precio. int iva = 10). En el listado 4. // DEFINICION DE LA FUNCION main() void main(void) 42 . cout DESCUENTO". cout << "¿ CUAL ES EL seudoferta(precio).6 se presenta un programa solución para este caso.5.3. N$ " .h> #include <conio.25).CPP : EJEMPLO DEL MANEJO DE ARGUMENTOS // // CON VALORES PREDETERMINADOS // ////////////////////////////////////////////////////// #include <iostream. como se muestra en el listado 4. double desc(double . En la solución utilizaremos una función que recibe dos parámetros: el precio del artículo y el descuento correspondiente.

NL.h> #define NL cout << "\n" #define PULSE cout << "PULSE CUALQUIER TECLA PARA CONTINUAR.12).. En el listado 4.Diseño de una función recursiva. rebajado_2 = desc(precio. } 4. gotoxy(40. gotoxy(40.14). // EL porcentaje CAMBIA A 40.40). se presenta el listado 4. recursiva(). cout << "PRECIO REBAJADO 3="N$" " << rebajado_3. if(x) recursiva(). por lo que es indispensable incluir una condición de salida. cout << "PRECIO REBAJADO 2="N$" " << rebajado_2. gotoxy(20. // SE CONSERVA EL VALOR DEL iva. El cálculo del factorial de un número es un problema clásico en la 43 .h> #include <conio. cin>> precio. rebajado_3 = desc(precio. gotoxy(20.Funciones recursivas Se dice que una función es recursiva cuando puede invocarse a sí misma. getch(). cout << "PRECIO: N$ ". void main(void) { clrscr(). cin>> precio.. rebajado_2.7.10). AUNQUE SE CONSERVA EL VALOR // DE porcentaje. gotoxy(40. gotoxy(20. NL. cout << "PRECIO REBAJADO 1="N$" " << rebajado_1.7. PULSE. // SE CAMBIA EL VALOR // DE iva. cin>> precio. clrscr(). int i) { return(p * (1. int d." void recursiva(void). rebajado_3 .20. para que la función recursiva se invoque a si misma.7 podemos observar que. ya que de no hacerlo se agotará la memoria disponible en la pila.14). cout << "TECLEE UN NUMERO ENTERO.12).10). cout << "PRECIO: N$ ". ( 0="SALIR)" ". // SE ACEPTA EL porcentaje Y EL // iva PREDETERMINADOS.{ double precio.. rebajado_1. } // DEFINICION DE LA FUNCION desc() double desc(double p. cin>> x . Como un primer acercamiento al manejo de funciones recursivas en C++.7.0). En cada invocación se crean las variables locales.00)). } Listado 4. DEBE ESCRIBIRSE // DE NUEVO.00 (d-i)/100. rebajado_1 = desc(precio). cout << "PRECIO: N$ ".. #include <iostream. es necesario que el valor almacenado en x sea diferente de 0. } void recursiva(void) { int x.

2.h> #include <conio. long result. Cuando el valor de n es igual a 0 (invocación 5). cin>> num .8.2. cout << " es : " << result. #include <iostream. } long factorial(unsigned short int n) { if(n="=0)" return 1. gotoxy(20. do { gotoxy(20.11).2. En el listado 4.2. quedando sin resolver el resultado.Resultados de invocar a la función factorial() pasándole como parámetro el número 4 .8.3 y 4 el valor de n es diferente de 0.. result = factorial(num). si el número dado por el usuario es 4.aplicación de las funciones recursivas. clreol().Cálculo del factorial utilizando funciones recursivas.13). clrscr().8 se presenta un programa en C++ que calcula el factorial de un número dado.h> long factorial(unsigned short int). En el listado 4. } Listado 4. la función vuelve a invocarse a sí misma. else return n*(factorial(n-1)) . se crea en la pila una variable cuyo identificador es n y su valor cambiará como se muestra en la tabla 4. En cada invocación. cout << "El FACTORIAL del número: " . Numero de Valor de n invocación 1 4 2 3 3 2 4 1 5 0 Resultado 4*(factorial(3)) 3*(factorial(2)) 2*(factorial(1)) 1*(factorial(0)) 1 Tabla 4. la función retorna el valor 1 la la invocación 4. } while((num <0) || (num> 19 )). el proceso realizado por el programa se podría representar de la manera mostrada en la tabla 4.. void main() { unsigned short int num. por lo que el resultado en ésta se calcula así : 1 * (factorial(0)) = 1 * 1 = 1 44 . Como en las invocaciones 1.

Los arreglos consisten de un conjunto de elementos del mismo tipo almacenados en localidades contíguas de memoria. 5. la cual asigna a la variable result el valor recibido ( 24 ). Los elementos de un arreglo comparten el mismo nombre. el manejo de los elementos de un arreglo dado. El resultado en la invocación 1 es : 4 * (factorial(3)) = 4 * 6 = 24 Finalmente. describiremos la declaración de los arreglos. identificador es el nombre del arreglo expresión_constante es una expresión que al reducirse debe dar como resultado un valor entero positivo. La sintaxis para la declaración de un arreglo es la siguiente: tipo donde: tipo es el tipo de los elementos que componen el arreglo identificador [ <expresión_constante> ] . 45 . El resultado en la invocación 2 es : 3 * (factorial(2)) = 3 * 2 = 6 Posteriormente. que al compartir el mismo nombre pueden ser tratadas como una sola entidad. la invocación 3 retorna a la invocación 2 el valor 2.1. la invocación 1 retorna el valor 24 a la función invocadora main().Arreglos. así como lo relacionado con los arreglos que se utilizan para formar las cadenas de caracteres.Declaración de arreglos Los elementos de los arreglos son variables de algún tipo dado.La invocación 4 retorna a la invocación 3 el valor 1 y el resultado en la invocación 4 es : 2 * (factorial(1)) = 2 * 1 = 2 A su vez. pudiéndo distinguirse un elemento de otro a través de un subíndice. 5. la invocación 2 retorna el valor 6 a la invocación 1. En esta unidad...

Declara un arreglo bidimensional llamado matriz. 46 . .. Declara un arreglo unidimensional llamado valor. El número y tamaño de las dimensiones solo estará restringido por la disponibilidad de memoria RAM. DECLARACION char nombre[31]. En este caso x debe ser una constante entera.En el ejemplo 5. En esta sección se tratará lo relativo al acceso a los elementos individuales de un arreglo..2. la declaración de un arreglo multidimensional se distingue en que se agrega una pareja de corchetes para cada dimensión. compuesto por 120 elementos de tipo entero. por lo que la sintaxis. compuesto por x elementos de tipo entero largo sin signo. int trid[3][5][8]. double matriz[5][7]. Declara un arreglo tridimensional llamado trid. etc. int valor[20].Declaraciones de arreglos. compuesto por 20 elementos de tipo entero con signo. cte2. El espacio de memoria ocupado por el arreglo multidim es el mismo que el ocupado por: double unidim [15625 5. Como se observa en el ejemplo 5. unsigned long abc[x] RESULTADO Declara un arreglo unidimensional llamado nombre compuesto de 31 elementos de tipo carácter. Ejemplo 5. toma la siguiente forma: tipo identificador [ cte1 ][ cte2 ][ cte3 ] .. donde: cte1. en este caso. ya sea para asignarles valores específicos o para utilizar los valores almacenados. representan los subíndices para cada dimensión. Declara un arreglo unidimensional llamado abc. por lo que se puede tener una declaración como la siguiente: double multidim [5][5][5][5][5][5] . compuesto por 35 elementos de tipo entero..1.Manejo de arreglos En la sección anterior se ha tratado lo relacionado con la declaración de arreglos con elementos de diferentes tipos y con una o varias dimensiones.1 se muestra la declaración de arreglos.1.

5.1. . 47 .2.. .. los valores almacenados en cada uno de los elementos son desconocidos (se dice que el arreglo "tiene basura"). lo cual causa que el programa correspondiente arroje resultados inesperados. se declara un arreglo de 5 variables de tipo entero agrupadas con el nombre vector. se pueden asignar valores a cada uno de sus elementos. como se muestra a continuación: Por ejemplo. Para evitar los valores desconocidos.1.1. en C++. como se muestra enseguida: vector[0] vector[1] vector[2] vector[3] vector[4] = = = = = 100 101 102 103 104 . el primer subíndice siempre vale cero y el último tiene un valor menor en uno que el valor de la dimensión del arreglo. se recomienda asignar valores iniciales a cada uno de los elementos de los arreglos.1.Representación de un arreglo Como puede observarse en la figura 5. . y el arreglo vector luciría como en la figura 5. Figura 5. las cuales pueden representarse con la figura 5. . el primer subíndice tiene valor cero y el último tiene valor cuatro. supongamos la siguiente declaración: int vector[5]. Una vez declarado el arreglo. Lo anterior se debe a que. En este caso.2.Asignación de valores a los elementos de un arreglo Al declarar un arreglo dentro de una función.

pudimos haber asignado los valores por medio de un estatuto for de la siguiente forma: for( int x = 0 .. debe recordarse que el subíndice de cada una de ellas inicia con un valor 0. Cuando se manejan arreglos de varias dimensiones.El arreglo vector después de asignarle valores.h> #include <conio. caracter[x]) . x++) vector[x] = x + 100 . si queremos desplegar en pantalla los caracteres del código ASCII lo haríamos por medio del siguiente grupo de instrucciones: unsigned char caracter[256]. x++ ) printf("%c". gotoxy(y+1.h> void main(void) { int matriz[3][4].x+1). Todo lo escrito en este ejemplo es válido para arreglos con elementos de cualquier tipo. x < 5 .Figura 5. Esta forma es la más conveniente en caso de que la cantidad de elementos sea grande y que los valores a asignar sean iguales o las diferencia entre elementos consecutivos sea constante. #include <iostream. clrscr().1. x < 256 . cout matriz[x][y]. for(int x=0 . Por ejemplo.2. } } } 48 . y++) { matriz[x][y]=x+y+1 . En este caso particular. for( int x=0 . como se observa en el listado 5. x < 3 x++) { for(int y=0 y< 4 .

3. Obsérvese que el primer subíndice varía de 0 a 2 y el segundo varía de 0 a 3.. puede escribirse : 49 .Listado 5. se ha mostrado la forma de asignar valores a cada uno de los elementos de un arreglo una vez que se ha escrito su declaración. Aquí veremos la manera de asignarle valores iniciales a los elementos. 6. Figura 5.3. Por ejemplo. en la misma instrucción que contiene la declaración del arreglo.3 .Arreglo con dos dimensiones. 1.. En los párrafos anteriores. para declarar un arreglo de 10 enteros y al mismo tiempo asignarle a cada uno de sus elementos los valores 0.Representación del arreglo matriz . 7. 4. 9.1. El resultado de ejecutar el programa del listado 5. 5. 8. 2.1 es el siguiente: 1234 2345 3456 El arreglo matriz puede representarse con la figura 5.

.Cadenas de caracteres En C++ no existe un tipo predefinido para el manejo de cadenas de caracteres como en otros lenguajes. podemos asignar los siguientes valores a cada uno de sus elementos: cadena[0] cadena[1] cadena[2] cadena[3] cadena[4] cadena[5] cadena[6] cadena[7] = = = = = = = = 'A' .8. En este caso. como en muchas de las instrucciones de C++. 5.6.4. . Como puede verse.3. 'E' . con respecto a un arreglo de caracteres cualquiera. el arreglo cadena será reconocido por las funciones y objetos diseñados para manipular cadenas de caracteres.7. si se declara el arreglo: char cadena[8]. . . .1. aunque no se escribe el tamaño de la dimensión del arreglo digitos.. 'G' . 'R' . tiene el mismo efecto que escribir: int digitos[10]. . 'L' . la brevedad del código sacrifica la claridad.2.int digitos[] = { 0. '\0'. la primera forma es mucho más compacta. 'R' .5. Lo que distingue a una cadena de caracteres. sino que tienen que declararse como arreglos de caracteres. . Al contener el carácter nulo. es que la cadena de caracteres tiene como último carácter al carácter nulo \0. 'O' . Por ejemplo. digitos[0] digitos[1] digitos[2] digitos[3] digitos[4] digitos[5] digitos[6] digitos[7] digitos[8] digitos[9] = = = = = = = = = = 0 1 2 3 4 5 6 7 8 9 .9 }. Para manejar un 50 .3. aunque . . .

se inicia con el subíndice 0 para no desperdiciar el primer elemento del arreglo. nombres[0] = "HUGO" .'\0'. #include <iostream.2.h> void main() { unsigned short int calif[10]. En el listado 5.'\0'. cin >> calif[x].Manejo de un arreglo de cadenas de caracteres.. x++) { gotoxy(10. char nombre[10][21]. se puede utilizar la forma compacta mostrada en la sección anterior. cin >> nombre[x]. sólo que . 'P'.'O'. } } Listado 5. Esto también puede manejarse a nivel de caracteres. 5. Además..'O'. cout << "CALIFICACION [" << x << "] = " . es equivalente a: char nombres[3][5]. nombres[2] = "LUIS" . Por Ejemplo: char nombres[][5] = { "HUGO". "PACO". for( int x=0 .x+1). // Se declara un arreglo bidimensional // para 10 nombres de 20 caracteres por // nombre mas un caracter para el nulo. x < 10 .Asignación de Valores Iniciales a Cadenas Cuando se tiene un arreglo de cadenas de caracteres.x+1).2. se debe recordar que el subíndice del último elemento del arreglo es igual al tamaño de la dimensión menos 1. 51 . cout << "NOMBRE [" << x << "] = " . nombres[1] = "PACO" .4. gotoxy(45.'A'.2.'C'. "LUIS" } . como puede observarse en el listado 5. así : char nombres[][5] = { 'H'. en lugar de constantes numéricas manejaríamos constantes de cadena.'U'.arreglo de cadenas de caracteres se debe declarar como un arreglo bidimensional de elementos de tipo char. clrscr().h> #include <conio.'G'.

'\0' .3 y 5.x+10).'S'. 100 }. 'P'. } } Listado 5. 'O' . x< 3.'L'. 'G' . int calif[] = { 100.'C'.x++) { gotoxy(35.'\0'.'\0' }.x+10).x+10).'S'.. for( int x=0 . 'S' .h> #include <conio. 90.'\0' }. 'P' . 52 . int calif[] = { 100. for( int x=0 . 100 }."LUIS" }. 'A' .'\0'.Manejo de arreglos de cadenas. 'I' . 'L'."PACO".'U'. gotoxy(40. clrscr(). cout nombres[x]. 'L' . '\0' .'I'.'U'. 'U' . 'O' . 'U' . o así: char nombres[3][5].h> #include <conio. clrscr(). En los listados 5.'O'.'G'. '\0' .h> void main() { char nombres[][5] = { "HUGO".4 se muestran las dos primeras formas.'I'. nombres[0][0] nombres[0][1] nombres[0][2] nombres[0][3] nombres[0][4] nombres[1][0] nombres[1][1] nombres[1][2] nombres[1][3] nombres[1][4] nombres[2][0] nombres[2][1] nombres[2][2] nombres[2][3] nombres[2][4] = = = = = = = = = = = = = = = 'H' . #include <iostream.x++) { gotoxy(35. observándose que se obtiene el mismo resultado.h> void main() { char nombres[][5] = { 'H'.3.'A'.'U'.'O'. x < 3. 90. 'C' . #include <iostream. cout << calif[x].

al no especificar una de las dimensiones.4 es que. //Despliega cadena de car.. el listado 5. puts("¿ Cuál es tu nombre ? "). // Declara un arreglo de 31 caracteres char saludo1[] = "?? HOLA. #include <stdio.Manejo de arreglos bidimensionales de caracteres. pero sí cuenta con un grupo de funciones que se han acumulado durante la evolución del Lenguaje C. en su declaración.10). gotoxy(45.". y para desplegar una cadena en pantalla se usa la función puts(). En los listados 5.H.cout nombres[x]. Por ejemplo.10). puts(saludo1).. la cantidad de cadenas a manejar puede variarse con sólo agregarlas a la lista o eliminarlas de ella. gotoxy(40. gotoxy(20.h> // Para gets() y puts() // Para clrscr() y gotoxy() // Para strupr() y strlen() void main() { char nombre[31]. Los prototipos de ambas funciones se encuentran declarados en el archivo STDIO. Para leer una cadena de caracteres desde el teclado existe la función gets(). gotoxy(30. // Lee cadena de caracteres strupr(nombre). } 53 . cout << calif[x]. se muestra que no es necesario escribir el valor de la primera dimensión de los arreglos cuando.Funciones para el manejo de cadenas Como se estableció al principio de esta unidad. clrscr().5. gets(nombre). } } Listado 5.h> #include <conio. gotoxy(30+strlen(nombre).4. 5.3 y 5.4. // Convierte a mayúsculas gotoxy(20.h> #include <string.12).3 y 5.5 muestra un programa que sirve para leer y desplegar cadenas de caracteres utilizando las funciones gets() y puts(). // Longitud de la cadena puts(saludo2). se asignan valores constantes a los elementos.x+10).12). puts(nombre). //Constante de caracteres char saludo2[] = " !!". el lenguaje C++ no cuenta con algún tipo de dato específico para el manejo de cadenas de caracteres. La ventaja que tiene la forma mostrada en 5.12).

Busca la última aparición de un caracter en una cadena. en una cadena.. Macro que compara dos cadenas sin distinguir entre mayúsculas y minúsculas. cuyos prototipos se encuentran declarados en el archivo STRING. sin distinguir entre mayúsculas y minúsculas. Compara dos cadenas. un caracter dado. Convierte las mayúsculas de una cadena en minúsculas. Copia un un número de bytes dados. Compara parte de una cadena con parte de otra. Además de las funciones gets() y puts(). existe otro grupo de funciones para el manejo de cadenas de caracteres. Los prototipos de estas funciones se encuentran declarados en el archivo STRING.Se detiene cuando encuentra el terminador nulo.Listado 5. Retorna el apuntador al mensaje asociado con el valor del error. Busca segmentos que no contienen un subconjunto de un conjunto especificado de caracteres. de cualquier caracter de un conjunto dado.H En la tabla 5.1 se describen brevemente algunas de las funciones para el manejo de cadenas de caracteres en el C++ de Borland. Añade una cadena de caracteres a otra. Añade el contenido de una cadena al final de otra. desde una cadena hacia otra. sin distinguir entre mayúsculas y minúsculas. Compara dos cadenas sin diferenciar entre mayúsculas y minúsculas Determina la longitud de una cadena. Invierte el orden de los caracteres de una cadena. Compara parte de una cadena con parte de otra.5. FUNCION stpcpy strcat strchr strcmp strcmpi strcpy strcspn strdup _strerror strerror stricmp strlen strlwr strncat strncmp strncmpi strncpy strnicmp strnset strpbrk strrchr strrev strset strspn DESCRIPCION Copia una cadena de caracteres en otra. Compara parte de una cadena con parte de otra. 54 . en una cadena.5. Busca en una cadena el primer segmento que es un subconjunto de un conjunto de caracteres dado. Hace que los elementos de una cadena tengan un valor dado. Busca la primera aparición.H . Hace que un grupo de elementos de una cadena tengan un valor dado. Copia una cadena. Genera un mensaje de error definido por el programador. Busca. como strlen() y strupr() utilizadas en el programa del listado 5. Copia una cadena a una nueva localidad.Lectura y desplegado de cadenas de caracteres.

1). puts("¿ Cuál es tu nombre ? "). el acceso a los elementos de un arreglo tiene que ser controlado por el programador.. Convierte una cadena a un valor unsigned long. Convierte una cadena a un valor double ó long double.1). gotoxy(35. Convierte una cadena a un valor long.&nombre[x]). En el listado 5..nombre[x].h> // Para gets() y puts() // Para clrscr() y gotoxy() // Para strlen() void main() { char nombre[31].6.6 se presenta un ejemplo de acceso a los 5 bytes colocados abajo del terminador nulo de una cadena dada por el usuario. clrscr().1). clrscr(). gotoxy (10. donde el programador tiene la responsabilidad de controlar el acceso a los caracteres de la cadena.6.x+2).Colocación de los elementos de una cadena en memoria RAM. #include <stdio. } } Listado 5. 5.. gotoxy(10.Control de acceso a los elementos de un arreglo En C++. 55 . Lo mismo sucede cuando se manejan cadenas.nombre[x]. (x <strlen(nombre)+5) && (x<23). Tabla 5. x.strstr _strtime strtod strtol strtoul strupr Busca en una cadena la aparición de una subcadena dada. Convierte las minúsculas de una cadena a mayúsculas. x++) { gotoxy(10. ya que el lenguaje no restringe la posibilidad de accesar a posiciones de memoria que están más abajo de la última posición reservada para el arreglo. gets(nombre). printf("nombre[%2d] %c= %4d %9u". for( int x=0 . Convierte la hora actual a una cadena.h> #include <conio.Funciones para el manejo de cadenas de caracteres. tomando como límite el terminador nulo.h> #include <string.1. puts("ELEMENTO CARACTER DIRECCION").

56 .

Sign up to vote on this title
UsefulNot useful