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

Se toma en cuenta la diferencia entre letras mayúsculas y minúsculas..2. y las palabras sin marca son las palabras reservadas del C estándar. son identificadores que tienen asignado un uso específico y no podrán ser utilizadas como identificadores creados por el usuario.7. Las palabras marcadas con + en la tabla 1. 5.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. las marcadas con @ son las palabras añadidas por Borland al C.Palabras reservadas Las palabras reservadas. 1.Palabras reservadas de Borland C++. Suma y suma son identificadores diferentes...Entrada/Salida 6 . como su nombre lo indica. 1.1. por lo que : SUMA..1 <= n <="32" 4.1 son las palabras reservadas específicas de C++..No puede utilizarse el mismo identificador para dos objetos que se encuentren dentro del mismo ámbito.6. La tabla 1.

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

295 float 32 7 dígitos 3.. -2.1 Los listados 1.4E+38 double 64 15 digitos 1.768 a 32.768 a 32.7E+308 long double 80 19 digitos 3.768 a 32. -32.4E-4932 a 3. tamaños y rangos en Borland C++ 3. Direcciones de memoria far pointer 16 .2 a 1.2. 0 a 65.1. -32.648 a 2.7E-308 a 1. Tipo Tamaño (bits) Precisión Rango de valores: char 8 .147'483.147'483. .4E+3932 void .767 int 16 .Comandos de formato.4E-38 a 3.535 long 32 .3. se presenta aquí la tabla 1.647 unsigned long 32 .3 que contiene los tipos de datos disponibles en el compilador de Borland C++ 3. 0 a 4. Direcciones de memoria Tabla 1.767 short int 16 . near pointer 16 . 0 a 255 enum 16 . A fin de poder mostrar algunos ejemplos de aplicación de la función printf().8 muestran ejemplos de utilización de formatos por medio de la función 8 .Tipos de datos. . -128 a 127 unsigned char 8 .767 unsigned int 16 . -32.294'967.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..

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

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

Es por esto que se han desarrollado las funciones gets() y puts()..h 1.7. <elem> . como en: gets(nombre). putc() despliega un caracter en la pantalla. 11 . El formato para la función scanf() es : scanf( <cadena_formato> .Las funciones gets() y puts() Las funciones scanf() y printf() sirven para varios formatos.2.3.h..7. ) .. Estas macros están definidas en el archivo stdio..1. 1.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. La función scanf() utiliza la mayoría de los comandos mostrados en la tabla 1. específicas para la entrada/salida de cadenas de caracteres. y la almacena en variables previamente declaradas. 1..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(). 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().La función scanf() Esta función toma la entrada.7. por lo cual son muy voluminosas. Por su parte. . Los significados de <cadena_formato> y <elem> son los mismos que en el caso de la función printf() .4.Funciones declaradas en conio.. <elem> .Las macros getc() y putc() La macro getc(c) toma un caracter desde el teclado y lo almacena en la variable c.1. normalmente del teclado.2.7.1.

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

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

(decimal 27) I. Si el carácter que sigue a la diagonal es alguno de los caracteres mostrados en la tabla 2.a). además de un valor que permanece fijo durante el tiempo de ejecución. que deben empezar con un 0 (cero).Hexadecimal. que pueden escribirse en formato: I. Los valores para las constantes.b)... que empiezan con 0X ó 0x (cero x) Ejemplo: const int mem = 0xFFFF . Aquí definiremos a las constantes utilizando el modificador const..Podemos definir a una constante como una localidad de memoria (objeto). con valores de 0 a 4. compuestos de uno o más caracteres encerrados entre comillas sencillas (apóstrofes). se visualizará el carácter tal cual. usando del formato mostrado a continuación: const <tipo> <identificador> = <valor> Ejemplo: const int iva = 10 . Ejemplo: const char inicial = 'A' . En la unidad 1 se estudió la manera de definir constantes por medio de la directiva #define .Enteros.Caracteres. Ejemplo: const int smin = 15300 . 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.b).Decimal. se clasifican en cuatro clases: • • • • • • • • • • • • I).295.. se obtendrá el efecto explicado en ella.Octal. pero si es cualquiera de los demás caracteres del Código ASCII. II).294'967. permitidos por Borland C++. I. la cual tiene un nombre y un tipo de dato asociados. Ejemplo: const int lim = 030 . 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 .1..

manzana. .075E12 IV)...1.\\ \' \" \? \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. Ejemplo: enum frutas { pera. 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. además de un valor que puede cambiarse durante el tiempo de ejecución. Ejemplos: 3.Enumeración. . y entonces : pera uva manzana fresa = 0 = 1 = 10 = 6 2.135 . uva. Borland C++ permite el uso de dos caracteres juntos como valores de caracteres. '\n\t' . son identificadores definidos en declaraciones de tipo enum. uva. cualquiera con punto decimal ó con formato exponencial. donde: pera. fresa } . uva . fresa = uva+5} .Punto flotante. manzana = 10 .Variables Una variable es un espacio de memoria que tiene un nombre y un tipo de dato asociados.4 . -3. 34e3 .2.0 . 15 .. Por ejemplo: 'AB' .. '\007\007' III).Secuencias de escape. 0. .

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

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

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

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

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

6.4. 2..Operadores entre bits 21 .2.5 % Módulo Z=Y%X Z=10 ++ Incremento X++ X=21 Decremento XX=19 Tabla 2.6.Operadores lógicos Los operadores lógicos se aplican sobre los enunciados que resultan de las operaciones relacionales.. 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.. Los operadores lógicos son: && || ! Y O NO ( Conjunción ) ( Disyunción ) ( Negación ) 2.Operadores aritméticos. y el resultado siempre será un valor de verdad.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.3.Operadores relacionales Los operadores relacionales se usan para comparar los valores que resultan de reducir expresiones.

Con estos operadores se puede realizar la comprobación.127 en binario 01010001 <-----. 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 operación realizada a mano es : 01111111 11010001 <-----. masc = 112 | 7 . suponiendo que se quiere cambiar el bit de paridad de 1 a 0 . Si tenemos la declaración: char indice = 81 . colocación ó desplazamiento de los bits actuales de una variable de los tipos int y char.1: Supongamos que se quiere cambiar el bit de paridad ( el de la extrema izquierda ) de uno a cero. En este caso.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. la instrucción en C++ se escribiría : indice & 127 . Ejemplo 2. Para esto puede utilizarse la operación de conjunción entre bits. quedando las instrucciones en la siguiente forma: char masc . y.6.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.indice operador> & <-----. La operación manual tomaría la siguiente forma: 22 . la operación a utilizar es la disyunción entre bits.6.

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

Instrucciones de selección.. 3... 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... Los operadores estudiados hasta aquí no son todos los que existen en el C++.Operadores de asignación. 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. 3.. es necesario utilizar algún operador no tratado en esta unidad.. asigna Dezplaz.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 control En esta unidad estudiaremos las instrucciones que sirven para controlar el flujo de ejecución de un programa en C++ . Su diagrama de flujo se presenta en la figura 3. posteriormente. sólo una salida. 24 . La sintaxis para las instrucciones estructurados en secuencia es la siguiente: instruccion_1 .2... asigna Conj.1.. instruccion_N ..Instrucciones de iteración. exclu. instruccion_2 . der. izq.1. 3../= %= <<= >>= &= ^= |= Divide asigna Residuo asigna Dezplaz. 3.1. Si. De acuerdo a las características de cada una. .3.Instrucciones de secuencia.3. en ese momento se estudiarán las características particulares de tal operador. e/bits asigna Disy. las clasificaremos en grupos de estructuras básicas de: 3..

2.2. En C++ se tienen las siguientes instruccións de selección: 3.La instrucción switch 3. 25 . else es opcional.-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.1..2. y en caso de no existir.. bloque_2 tampoco existirá.3.La instrucción if .La instrucción if .. y su sintaxis es : if( condición ) [else] [bloque_2] donde: bloque_1 y bloque_2 pueden estar formados por uno ó más instrucciones.1.else 3.2.2.

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

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

gotoxy(30.12).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.h> #include <conio.ELIMINACION".. break. gotoxy(30. switch(opcion) { case '1': clrscr().10).. gotoxy(30.8).3. case '0': clrscr().5).CREACION"..break. case '3': clrscr().14). #include <iostream. cout << "RUTINA DE MODIFICACION\n".. cout << "SU OPCION ? ". clrscr().. opcion= getche().. cout << "0. cout << "1. cout << "RUTINA DE ELIMINACION\n".\n". cout << "2. gotoxy(30. cout << "MENU DE OPCIONES". break. cout << "\n\n".h> void main() { char opcion. default:clrscr().. gotoxy(30. gotoxy(30. cout << "SALIDA AL SISTEMA OPERATIVO\n".18). case '2': clrscr(). cout << "RUTINA DE CREACION\n". } } 28 .MODIFICACION". cout << "OPCION INVALIDA. break.SALIDA". cout << "3..

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

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

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

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

6. cout << '. y++) { gotoxy(y. #include <iostream.h> int main() { clrscr(). El listado 3.El diagrama para la instrucción for se muestra en la figura 3. } Listado 3. x++) { for(int y="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().'.Utilización de la instrucción for 4.6 muestra el uso de la instrucción for. for(int x=1 ...Diseño de funciones Las funciones son el módulo básico para la construcción de programas en C++. } } return 0.6. if((x="=25)" && (y="=80))" getch(). y <="80" . x <= 25 .h> #include <conio.x).

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

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

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

. return 0.. //ARITME..OBJ Archivo que contiene el código objeto..double). saludo()...... Por ejemplo. b=16763. Los archivos pudieran tomar la forma mostrada a continuación: ARITME..... cout << "COSTO : $ ".. 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....2... double resta(double.... // Invocación a la función suma() // definida en ARITME...45... es recomendable utilizarlo.87. donde se definen las funciones aritméticas.HPP: CONTIENE LOS PROTOTIPOS DE LAS FUNCIONES double suma(double. 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..... sin tener que proporcionarle el código fuente... 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).... } Este es el criterio que se sigue al utilizar los archivos de cabecera que contiene el paquete compilador. cin>> costo. { float costo... precio. cuando se escribe la línea: #include <stdio.. //INVOCACION A LA cout << "PRECIO : $ " << precio..HPP" //Incluye el archivo que contiene //los prototipos de las funciones //aritméticas void main(void) { double result.CPP: PROGRAMA FUENTE ELABORADO POR // EL USUARIO #include <iostream.. Por ejemplo.double)... FUNCION saludo() FUNCION calcula() } Listado 4.Diseño de funciones sin uso de prototipos.. //INVOCACION A LA precio = calcula(costo).OBJ cout << result. //APLICA.b).DEFINICION DE LA FUNCION PRINCIPAL int main() clrscr()..... a=13500..h> 37 .. Aunque el prototipo no es obligatorio.... ..h> #include "ARITME. result = suma(a..

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

El nombre de la función está seguido por una secuencia $q . las letras minúsculas que le siguen designan cada tipo de argumento declarado.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..1. 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. se pueden predecir fácilmente los nombres ampliados de las funciones. La tabla 4. como se muestra a continuación: 39 . Utilizando la tabla 4.1.Letras para los tipos de argumentos en la creación de nombres ampliados.

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

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

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

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

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

el manejo de los elementos de un arreglo 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. que al compartir el mismo nombre pueden ser tratadas como una sola entidad. El resultado en la invocación 1 es : 4 * (factorial(3)) = 4 * 6 = 24 Finalmente.. la invocación 1 retorna el valor 24 a la función invocadora main(). describiremos la declaración de los arreglos. Los elementos de un arreglo comparten el mismo nombre. 45 .. 5. pudiéndo distinguirse un elemento de otro a través de un subíndice. la invocación 3 retorna a la invocación 2 el valor 2. 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. identificador es el nombre del arreglo expresión_constante es una expresión que al reducirse debe dar como resultado un valor entero positivo. En esta unidad. la invocación 2 retorna el valor 6 a la invocación 1. El resultado en la invocación 2 es : 3 * (factorial(2)) = 3 * 2 = 6 Posteriormente.Arreglos. la cual asigna a la variable result el valor recibido ( 24 ). 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> ] . Los arreglos consisten de un conjunto de elementos del mismo tipo almacenados en localidades contíguas de memoria. 5.1.

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

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

1.h> #include <conio. y++) { matriz[x][y]=x+y+1 . debe recordarse que el subíndice de cada una de ellas inicia con un valor 0.x+1). x < 256 . clrscr().2.. x < 5 . En este caso particular. for( int x=0 . caracter[x]) . #include <iostream. x < 3 x++) { for(int y=0 y< 4 .El arreglo vector después de asignarle valores. for(int x=0 . x++ ) printf("%c".Figura 5. Por ejemplo. x++) vector[x] = x + 100 . como se observa en el listado 5.h> void main(void) { int matriz[3][4]. cout matriz[x][y]. 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]. } } } 48 . Todo lo escrito en este ejemplo es válido para arreglos con elementos de cualquier tipo. Cuando se manejan arreglos de varias dimensiones. gotoxy(y+1. 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. pudimos haber asignado los valores por medio de un estatuto for de la siguiente forma: for( int x = 0 .

puede escribirse : 49 . Figura 5.3 .3.Representación del arreglo matriz . Por ejemplo. 4. 7.1. 9. 2. En los párrafos anteriores. en la misma instrucción que contiene la declaración del arreglo. 1. 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.Arreglo con dos dimensiones. 8.Listado 5. 5.. 6.1 es el siguiente: 1234 2345 3456 El arreglo matriz puede representarse con la figura 5.. Obsérvese que el primer subíndice varía de 0 a 2 y el segundo varía de 0 a 3. para declarar un arreglo de 10 enteros y al mismo tiempo asignarle a cada uno de sus elementos los valores 0. 3. El resultado de ejecutar el programa del listado 5. Aquí veremos la manera de asignarle valores iniciales a los elementos.

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

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

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

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

existe otro grupo de funciones para el manejo de cadenas de caracteres. Compara dos cadenas. como strlen() y strupr() utilizadas en el programa del listado 5. Copia un un número de bytes dados. Añade el contenido de una cadena al final de otra. Convierte las mayúsculas de una cadena en minúsculas. 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. Añade una cadena de caracteres a otra. sin distinguir entre mayúsculas y minúsculas.H En la tabla 5. Compara parte de una cadena con parte de otra. Macro que compara dos cadenas sin distinguir entre mayúsculas y minúsculas. 54 . Hace que un grupo de elementos de una cadena tengan un valor dado. Copia una cadena a una nueva localidad.Listado 5.Lectura y desplegado de cadenas de caracteres..5.H . Busca en una cadena el primer segmento que es un subconjunto de un conjunto de caracteres dado.1 se describen brevemente algunas de las funciones para el manejo de cadenas de caracteres en el C++ de Borland. Retorna el apuntador al mensaje asociado con el valor del error. en una cadena. Genera un mensaje de error definido por el programador. un caracter dado. Busca. Compara dos cadenas sin diferenciar entre mayúsculas y minúsculas Determina la longitud de una cadena. Hace que los elementos de una cadena tengan un valor dado. Busca la primera aparición. Los prototipos de estas funciones se encuentran declarados en el archivo STRING. en una cadena. cuyos prototipos se encuentran declarados en el archivo STRING.5.Se detiene cuando encuentra el terminador nulo. Compara parte de una cadena con parte de otra. de cualquier caracter de un conjunto dado. desde una cadena hacia otra. Copia una cadena. Además de las funciones gets() y puts(). Busca la última aparición de un caracter en una cadena. Invierte el orden de los caracteres de una cadena. sin distinguir entre mayúsculas y minúsculas. Busca segmentos que no contienen un subconjunto de un conjunto especificado de caracteres.

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

56 .

Sign up to vote on this title
UsefulNot useful