P. 1
Estructura de Un Programa en C

Estructura de Un Programa en C

|Views: 13|Likes:
Publicado porNbl D Asr

More info:

Published by: Nbl D Asr on Dec 29, 2011
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as DOC, PDF, TXT or read online from Scribd
See more
See less

11/17/2013

pdf

text

original

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

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

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

-2.2. -128 a 127 unsigned char 8 . se presenta aquí la tabla 1. -32. -32.1.768 a 32. 0 a 65. .768 a 32.535 long 32 ..8 muestran ejemplos de utilización de formatos por medio de la función 8 .2 a 1.7E-308 a 1. near pointer 16 .295 float 32 7 dígitos 3. 0 a 255 enum 16 .3. -32.147'483.3 que contiene los tipos de datos disponibles en el compilador de Borland C++ 3.4E+3932 void .1 Los listados 1..294'967. Direcciones de memoria far pointer 16 . Tipo Tamaño (bits) Precisión Rango de valores: char 8 .767 unsigned int 16 .767 short int 16 .7E+308 long double 80 19 digitos 3. Direcciones de memoria Tabla 1.4E-4932 a 3. .4E+38 double 64 15 digitos 1.647 unsigned long 32 .4E-38 a 3. tamaños y rangos en Borland C++ 3.767 int 16 .Comandos de formato.768 a 32.Tipos de datos. 0 a 4.147'483.648 a 2.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. A fin de poder mostrar algunos ejemplos de aplicación de la función printf().

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Utilizando la tabla 4.Letras para los tipos de argumentos en la creación de nombres ampliados.4. La tabla 4.. como se muestra a continuación: 39 . se pueden predecir fácilmente los nombres ampliados de las funciones.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. 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. 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.1.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

56 .

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->