Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad


iNFORMATICA APRENDER C++, Apuntes de Informática

LIBRO PARA APRENDER C++ CON ESQUEMAS

Tipo: Apuntes

2019/2020

Subido el 30/04/2020

ciara.me02
ciara.me02 🇪🇸

3.7

(11)

10 documentos

1 / 32

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
B.1. Elementos del lenguaje.
B.2. Tipos de datos.
B.3. Constantes.
B.4. Conversión de tipos.
B.5. Declaración de variables.
B.6. Operadores.
B.7. Entradas y salidas básicas.
B.8. Sentencias.
B.9. Sentencias condicionales: if.
B.10. Bucles: sentencias repetitivas.
B.11. Punteros (apuntadores).
B.12. Los operadores new y delete.
B.13. Array.
B.14. Enumeraciones, estructuras y uniones.
B.15. Cadenas.
B.16. Funciones.
B.17. Clases.
B.18. Herencia.
B.19. Sobrecarga de operadores.
B.20. Plantillas (templates).
B.21. Excepciones.
B.22. Espacio de nombres (Namespaces).
APÉNDICE B
GUÍA DE SINTAXIS ANSI/ISO
ESTÁNDAR C++
C++ es considerado un C más grande y potente. La sintaxis de C++ es una
extensión de C, al que se han añadido numerosas propiedades, fundamen-
talmente orientadas a objetos. C ANSI 1ya adoptó numerosas características
de C++, por lo que la emigración de C a C++ no suele ser difícil.
En este apéndice se muestran las reglas de sintaxis del estándar clásico de
C++ recogidas en al Annotated Reference Manual (ARM), de Stroustrup &
Ellis, así como las últimas propuestas incorporadas al nuevo borrador de C++
ANSI, que se incluyen en las versiones 3.0 (actual) y 4.0 (futura) de AT&T C++.
B.1. ELEMENTOS DEL LENGUAJE
Un programa en C++ es una secuencia de caracteres que se agrupan en
componentes léxicos (tokens) que comprenden el vocabulario básico del
lenguaje. Estos componentes de léxico son: palabras reservadas, identifica-
dores, constantes, constantes de cadena, operadores y signos de puntuación.
B.1.1. Caracteres
Los caracteres que se pueden utilizar para construir elementos del lenguaje
(componentes léxicos o tokens) son:
a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9
+ - * / = ( ) { } [ ] < > ´ ” ! @ =/ $ ^ & % - : . , ; ? \ |
caracteres espacio (blancos y tabulaciones).
B.1.2. Comentarios
C++ soporta dos tipos de comentarios. Las líneas de comentarios al estilo C
y C ANSI, tal como:
/* Comentario estilo C*/, se puede extender
/* hasta que aparece la marca de cierre */
// Este tipo de comentario termina al final de la línea
// Sólo es posible una línea de comentario
La versión /*...*/ se utiliza para comentarios que excedan una línea
de longitud, y la versión //... se utiliza sólo para comentarios de una línea.
Los comentarios no se anidan.
B.1.3. ldentificadores
Los identificadores (nombres de variables, constantes, etc.) deben comenzar
con una letra del alfabeto (mayúscula o minúscula) o con un carácter subra-
CONTENIDO
1Se utiliza indistintamente los términos ANSI C (nombre inglés) y C ANSI, traducción al
español muy usada en la vida profesionbal y académica.
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20

Vista previa parcial del texto

¡Descarga iNFORMATICA APRENDER C++ y más Apuntes en PDF de Informática solo en Docsity!

B.1. Elementos del lenguaje. B.2. Tipos de datos. B.3. Constantes. B.4. Conversión de tipos. B.5. Declaración de variables. B.6. Operadores. B.7. Entradas y salidas básicas. B.8. Sentencias. B.9. Sentencias condicionales: if. B.10. Bucles: sentencias repetitivas. B.11. Punteros (apuntadores).

B.12. Los operadores new y delete. B.13. Array. B.14. Enumeraciones, estructuras y uniones. B.15. Cadenas. B.16. Funciones. B.17. Clases. B.18. Herencia. B.19. Sobrecarga de operadores. B.20. Plantillas (templates). B.21. Excepciones. B.22. Espacio de nombres (Namespaces).

A P É N D I C E B

G U Í A D E S I N T A X I S A N S I / I S O

E S T Á N D A R C + +

C++ es considerado un C más grande y potente. La sintaxis de C++ es una

extensión de C, al que se han añadido numerosas propiedades, fundamen-

talmente orientadas a objetos. C ANSI 1 ya adoptó numerosas características

de C++, por lo que la emigración de C a C++ no suele ser difícil.

En este apéndice se muestran las reglas de sintaxis del estándar clásico de

C++ recogidas en al Annotated Reference Manual (ARM), de Stroustrup &

Ellis, así como las últimas propuestas incorporadas al nuevo borrador de C++

ANSI, que se incluyen en las versiones 3.0 (actual) y 4.0 (futura) de AT&T C++.

B.1. ELEMENTOS DEL LENGUAJE

Un programa en C++ es una secuencia de caracteres que se agrupan en

componentes léxicos (tokens) que comprenden el vocabulario básico del

lenguaje. Estos componentes de léxico son: palabras reservadas, identifica-

dores, constantes, constantes de cadena, operadores y signos de puntuación.

B.1.1. Caracteres

Los caracteres que se pueden utilizar para construir elementos del lenguaje

(componentes léxicos o tokens) son:

a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9

      • / = ( ) { } [ ] < > ´ ”! @ =/ $ ^ & % - :. , ;? \ |

caracteres espacio (blancos y tabulaciones).

B.1.2. Comentarios

C++ soporta dos tipos de comentarios. Las líneas de comentarios al estilo C

y C ANSI, tal como:

/* Comentario estilo C/, se puede extender / hasta que aparece la marca de cierre */ // Este tipo de comentario termina al final de la línea // Sólo es posible una línea de comentario

La versión /.../ se utiliza para comentarios que excedan una línea

de longitud, y la versión //... se utiliza sólo para comentarios de una línea.

Los comentarios no se anidan.

B.1.3. ldentificadores

Los identificadores (nombres de variables, constantes, etc.) deben comenzar

con una letra del alfabeto (mayúscula o minúscula) o con un carácter subra-

CONTENIDO

(^1) Se utiliza indistintamente los términos ANSI C (nombre inglés) y C ANSI, traducción al español muy usada en la vida profesionbal y académica.

yado y pueden tener uno o más caracteres. Los caracteres segundo y poste-

riores pueden ser letras, dígitos o un subrayado, no permitiéndose caracte-

res no alfanuméricos ni espacios.

test_prueba //legal X123 //legal multi_palabra //legal var25 //legal 15var //no legal

C++ es sensible a las mayúsculas. Las letras mayúsculas y minúsculas se

consideran diferentes.

Paga_mes es un identificador distinto a paga_mes

Buena práctica de programación aconseja utilizar identificadores sig-

nificativos que ayudan a documentar un programa.

nombre apellidos salario precio_neto Edad Longitud Altura Salario_Mes

B.1.4. Palabras reservadas

Las palabras reservadas o claves no se pueden utilizar como identificadores,

debido a su significado estricto en C++; tampoco se pueden redefinir. La

Tabla B.1 enumera las palabras reservadas de C++ según el ARM^2.

Los diferentes compiladores comerciales de C++ pueden incluir,

además, nuevas palabras reservadas. Estos son los casos de Borland, Micro-

soft y Symantec.

564 PROGRAMACIÓN EN C++. ALGORITMOS, ESTRUCTURAS Y OBJETOS

TABLA B.1. Palabras reservadas (Keywords) de ANSI/ISO C++

asm* default for new* sizeof typedef auto delete* friend* operator* static typename bool* do goto private* struct union break double if protected* switch unsigned case else inline* public* template* using catch* enum int register this* virtual* char explicit* long return throw* void class* extern mutable* short true* volatile* const false* namespace* signed try* while continue float

* Estas palabras no existen en C ANSI.

2 Siglas del libro de Margaret Ellis y Bjarne Stroustrup en el que se definen las reglas de

sintaxis del lenguaje C++ estándar, Annotated Reference Manual, Addlson-Wesley, 1992.

TABLA B.2. Palabras reservadas de Borland C++ 5 _ _asm _ _cdecl _ _cs _ _declspec _ _ds _ _es _ _except _ _export _ _far _ _fastcall _ _finally _ _huge _ _import _ _interrupt _ _loadds _ _near _ _pascal _ _rtti _ _saveregs _ _seg _ _ss _ _stdcall _ _thread _ _try _ asm _cdecl _cs _ds _es _export _far _fastcall _huge _import _interrupt _loadds _near _pascal _saveregs _seg ss stdcall asm auto bool break case catch cdecl char class const const_cast continue default delete do double dynamic_cast else enum explicit extern false far float for friend goto huge if inline int interrupt long mutable namespace near new operator pascal private protected public register reinterpret cast return short signed sizeof static static_cast struct switch template this throw true try typedef typeid typename union unsigned using virtual void volatile wchar t while

TABLA B.3. Palabras reservadas de Visual C++ 6 _asm _fastcall public signed _except new unsigned void _virtual_inheritance typedef using directive do throw class default _leave case goto _int8 struct _finally register sizeof auto operator using declaration volatile explicit typeid uuid double mutable const delete long true if _intl6 switch catch reinterpret_cast static template flota return wmain _based private _uuidof dynamic-cast extern typename dl1export man naked const-cast _int32 _multiple try inline _inheritance static-cast this _cdecl _inline while bool for short else false protected virtual enum namespace union dllimport -single-inheritance _try continue _int thread char _dec1spec _stdcall break friend int xalloc

B.3.1. Declaración de constantes con const

En C++, los identificadores de variables/constantes se pueden declarar cons-

tantes, significando que su valor se inicializa pero no se puede modificar.

Estas constantes se denominan simbólicas. Esta declaración se realiza con la

palabra reservada const.

const double PI = 3.1416; const char BLANCO = ' '; const double PI_EG = PI; const double DOBLE_PI = 2*PI;

El modificador de tipos const se utiliza en C++ también para propor-

cionar protección de sólo lectura para variables y parámetros de funciones.

Las funciones miembro de una clase que no modifican los miembros dato a

que acceden pueden ser declarados const. Este modificador evita también

que parámetros parados por referencia sean modificados:

void copy (const char* fuente, char* destino);

B.3.2. Declaración de constantes con define#

C++ soporta también el método tradicional de declaración de constantes,

aunque ahora está obsoleto. Para declarar una constante por este método se

debe realizar con la palabra reservada #define.

#define estudiantesPorClave 50 #define PI 3. #define hex 16

B.4. CONVERSIÓN DE TIPOS

Las conversiones explícitas se fuerzan mediante moldes (casts). La con-

versión forzosa de tipos de C tiene el formato clásico:

(tipo) expresión

C++ ha modificado la notación anterior por una notación funcional

como alternativa sintáctica:

nombre del tipo (expresión)

Las notaciones siguientes son equivalentes:

z = float(x); //notación de moldes en C++ z = (float)x; //notación de moldes en C

B.5. DECLARACIÓN DE VARIABLES

En C ANSI, todas las declaraciones de variables y funciones se deben hacer al

principio del programa o función. Si se necesitan declaraciones adicionales, el

programador debe volver al bloque de declaraciones al objeto de hacer los ajus-

tes o inserciones necesarios. Todas las declaraciones deben hacerse antes de

que se ejecute cualquier sentencia. Así, la declaración típica en C++

NombreTipo NombreVariable1, NombreVarible2, ...

proporciona declaraciones tales como:

int saldo, meses; double clipper, salario;

Al igual que en C, se pueden asignar valores a las variables en C++:

int mes = 4,dia, anyo = 1995; double salario = 45.675;

En C++, las declaraciones de variables se pueden situar en cualquier

parte de un programa. Esta característica hace que el programador declare

sus variables en la proximidad del lugar donde se utilizan las sentencias de su

programa. El siguiente programa es legal en C++ pero no es válido en C:

#include int main() { int i; for (i=0; i < 100; ++i) cout << i << endl;

double j; for (j = 1.7547; j < 25.4675; j+= .001) cout << i << endl; }

El programa anterior se podría rescribir, haciendo la declaración y la

definición dentro del mismo bucle:

int main() { for (int i=0; i<100; ++i) cout << i << endl;

for (double j - 1.7545; j<25.4675;j += .001) cout << i << endl; }

566 PROGRAMACIÓN EN C++. ALGORITMOS, ESTRUCTURAS Y OBJETOS

B.6. OPERADORES

C++ es un lenguaje muy rico en operadores. Se clasifican en los siguientes

grupos:

  • Aritméticos.
  • Relacionales y lógicos.
  • Asignación.
  • Acceso a datos y tamaño.
  • Manipulación de bits.
  • Varios.

Como consecuencia de la gran cantidad de operadores, se producen

también una gran cantidad de expresiones diferentes.

B.6.1. Operadores aritméticos

C++ proporciona diferentes operadores que relacionan operaciones aritmé-

ticas.

TABLA B.6. Operadores aritméticos en C++

Operador Nombre Propósito Ejemplo

+ Más unitario Valor positivo de x x = + y + 5

  • Negación Valor negativo de x X = - y;

+ Suma Suma x e y z = x + y;

  • Resta Resta y de x z = x - y ;

* Multiplicación Multiplica x por y z = x * y;

/ División Divide x por y z = x/y;

% Módulo Resto de x dividido por y z = x%y;

++ Incremento Incrementa x después de usar x++

-- Decremento Decrementa x antes de usar --x

Ejemplos

- i + w; //menos unitario más unitario a*b/c%d //multiplicación, división, módulo a+b a-b //suma y resta binaria a=5/2; //a toma el valor 2, si se considera a entero a=5/2; //a toma el valor 2.5, si a es real

Los operadores de incremento y decremento sirven para incrementar y

decrementar en uno los valores almacenados en una variable.

variable++ //postincremento ++variable //preincremento

variable-– //postdecremento -- variable //predecremento

++a; equivale a a = a +1;

--b; equivale a b = b -1;

Los formatos postfijos se conforman de modo diferente según la

expresión en que se aplica:

b = ++a: equivale a a = a+l; b = a;

b = a++; equivale a b = a; a = a+l;

int i, j, k = 5; k++; //k vale 6, igual efecto que ++k --k; //k vale ahora 5, igual efecto que k-– k = 5; i = 4*k++; //k es ahora 6 e i es 20 k = 5; j = 4 * ++k; //k es ahora 6 e i es 24

B.6.2. Operadores de asignación

El operador de asignación (=) hace que el valor situado a la derecha del

operador se adjudica a la variable situada a su izquierda. La asignación

suele ocurrir como parte de una expresión de asignación y las conversiones

se producen implícitamente.

z = b+5; //asigna (b+5) a variable z

C++ permite asignaciones múltiples en una sola sentencia. Así,

a = b+(c=10);

equivale a:

c=10; a=b+c;

Otros ejemplos de expresiones válidas y no válidas son:

//expresiones legales //expresiones no legales a=5 * (b+a); a+3 = b; double x = y; PI = 3; a=b=6; x++ = y;

C++ proporciona operadores de asignación que combinan operadores

de asignación y otros diferentes, produciendo operadores tales como +=,

/=, –=, *= y % =. C++ soporta otros tipos de operadores de asignación

para manipulación de bits.

GUÍA DE SINTAXIS ANSI/ISO ESTÁNDAR C++ 567

2. Operación lógica OR (||). Si expr1 toma un valor distinto de cero,

la expresión expr1 || expr2 se evaluará a 1, cualquiera que sea el

valor de expr2; en consecuencia, expr2 no se evaluará.

B.6.4. Operadores de manipulación de bits

C++ proporciona operadores de manipulación de bits, así como operadores

de asignación de manipulación de bits.

TABLA B.9. Operadores de manipulación de bits (bitwise)

Operador Significado Ejemplo

& AND bit a bit x & 128

| OR bit a bit j | 64

ˆ XOR bit a bit j ˆ 12

˜ NOT bit a bit ˜j

<< Desplazar a izquierda i << 3

>> Desplazar a derecha j >> 4

TABLA B.10. Operadores de asignación de manipulación de bits

Operador Formato largo Formato reducido

&= x = x & y; x & = y;

|= x = x | y ; x | = y;

ˆ= x = x ^ y; x ˆ = y ;

<<= x = x << y; x << = y; >>= x = x >> y; x >> = y;

Ejemplos

˜x Cambia los bits 1 a 0 y los bits 0 a 1

x & y Operación lógica AND (y) bit a bit de x e y

x | y Operación lógica OR (o) bit a bit de x e y

x << y x se desplaza a la izquierda (en y posiciones)

x >> y x se desplaza a la derecha (en y posiciones)

B.6.5. El operador sizeof

El operador sizeof proporciona el tamaño en bytes de un tipo de dato o

variable. sizeof toma el argumento correspondiente (tipo escalar, array, re-

cord, etc.). La sintaxis del operador es

sizeof (nombre_varíable | tipo_de_dato)

Ejemplos

int m, n[12]; sizeof(m) //proporciona 4, en máquinas de 32 bits sizeof(n) //proporciona 48 sizeof(15) //proporciona 4 tamanyo = sizeof(long) - sizeof(int);

B.6.6. Prioridad y asociatividad de operadores

Cuando se realizan expresiones en las que se mezclan operadores diferentes

es preciso establecer una precedencia (prioridad) de los operadores y la

dirección (o secuencia) de evaluación (orden de evaluación: izquierda-dere-

cha, derecha-izquierda), denominada asociatividad.

La Tabla B.11 muestra la precedencia y asociatividad de operadores.

GUÍA DE SINTAXIS ANSI/ISO ESTÁNDAR C++ 569

TABLA B.11. Precedencia y asociatividad de operadores

Operador Asociatividad Prioridad

::.->++-- Izquierda-Derecha 1

++ -- & (dirección) tipo)! - + + sizeof (tipo) Derecha-Izquierda 2

new delete* (indirección)

.* ->* Izquierda-Derecha 3

* / % Izquierda-Derecha 4

+ - Izquierda-Derecha 5

<< >> Izquierda-Derecha 6

< <= > >= Izquierda-Derecha 7

== != Izquierda-Derecha 8

& Izquierda- Derecha 9

ˆ Izquierda-Derecha 10

| Izquierda-Derecha 11

&& Izquierda-Derecha 12

|| Izquierda-Derecha 13

?: Derecha-Izquierda 14

= += -= *= /= %= >>= <<= &= /= ˆ= Derecha-Izquierda 15

(operador coma) Izquierda-Derecha 16

Ejemplo

a * b/c +d equivale a (a*b) / (c+d)

B.6.7. Sobrecarga de operadores

La mayoría de los operadores de C++ pueden ser sobrecargados o redefini-

dos para trabajar con nuevos tipos de datos. La Tabla B.12 lista los opera-

dores que pueden ser sobrecargados.

Si se desea visualizar el valor del objeto int llamado i, se escribe la

sentencia

cout << i;

El siguiente programa visualiza en pantalla una frase:

#include int main() { cout << “hola, mundo\n”; }

Las salidas en C++ se pueden conectar en cascada, con una facilidad de

escritura mayor que en C.

#include int main() { int i; i = 1099; cout << “El valor de i es” << i << “\n”; }

Otro programa que muestra la conexión en cascada es

#include int main() { int x = 45; double y = 495.125; char c = “y multiplicada por x=”; cout << c << yx << “\n”; }

B.7.2. Entrada

La entrada se maneja por la clase istream. Existe un objeto predefinido is-

tream, llamado cin, que se refiere al dispositivo de entrada estándar (el

teclado). El operador que se utiliza para obtener un valor del teclado es el

operador de extracción >>. Por ejemplo, si i era un objeto int, se escribirá

cin >> i;

que obtiene un número del teclado y lo almacena en la variable i.

570 PROGRAMACIÓN EN C++. ALGORITMOS, ESTRUCTURAS Y OBJETOS

TABLA B.12. Operadores que se pueden sobrecargar

      • / % ˆ & | ˜! = < > + = - = * = /= %= ˆ= &= |= << >> >>= <<= == != <= >= && || ++ -- , - >* - > () []

B.7. ENTRADAS Y SALIDAS BÁSICAS

Al contrario que muchos lenguajes, C++ no tiene facilidades incorporadas

para manejar entrada o salida. Estas operaciones se realizan mediante rutinas

de bibliotecas. Las clases que C + + utiliza para entrada y salida se conocen

como flujos. Un flujo es una secuencia de caracteres junto con una colección

de rutinas para insertar caracteres en flujos (a pantalla) y extraer caracteres

de un flujo (de teclado).

B.7.1. Salida

El flujo cout es el flujo de salida estándar que corresponde a stdout en

C. Este flujo se deriva de la clase ostream construida en iostream.

FIGURA B.1. Uso de flujos para salida de caracteres.

Unidad central

cout (^) Pantalla entrada binaria salida de caracteres

C++ permite asignaciones múltiples en una sentencia.

m = n +(p = 5); equivale a p = 5

m = n + p;

B.8.3. Sentencias compuestas

Una sentencia compuesta es una serie de sentencias encerradas entre llaves.

Las sentencias compuestas tienen el formato:

sentencia sentencia sentencia ... }

Las sentencias encerradas pueden ser cualquiera: declaraciones, expre-

siones, sentencias compuestas, etc. Un ejemplo es:

int i = 5; double x = 3.14, y = -4.25; int j = 4-i; x = 4.5*(x-y); }

El cuerpo de una función C++ es siempre una sentencia compuesta.

B.9. SENTENCIAS CONDICIONALES: if

El formato general de una sentencia if es:

if ( expresión) if ( expresión) { sentencia < secuencia de sentencias> }

Si expresión es verdadera (distinta de cero), entonces se ejecuta sen-

tencia o secuencia de sentencias ; en caso contrario se salta la sentencia.

Después que la sentencia if se ha ejecutado, el control pasa a la siguiente sen-

tencia.

Ejemplo 1

if (a < 0) negativos++;

Si la variable a es negativa, se incrementa la variable negativos.

Ejemplo 2

if (numeroDeDias < 0) numeroDeDias = 0;

if ((altura - 5) < 4){ area = 3.14 * radio * radio; volumen = area * altura; }

Ejemplo 3

if (temperatura >= 45) cout << “Estoy en Sonora:Hermosillo, en agosto”; cout << “Estoy en Veracruz” << temperatura << endl;

La frase “Estoy en Sonora:Hermosillo, en agosto” se visualiza

cuando temperatura es mayor o igual que 45. La sentencia siguiente se

ejecuta siempre.

La sentencia if_else tiene el formato siguiente:

  1. if (expresión) 2. if (expresión)"{ sentencia1; < secuencia de sentencias 1 > else else sentencia2; < secuencia de sentencias 2 >

Si expresión es distinto de cero, la sentencia1 se ejecuta y senten-

cia2 se salta; si expresión es cero, la sentencia1 se salta y sentencia

se ejecuta. Una vez que se ha ejecutado la sentencia if_else, el control

pasa a la siguiente sentencia.

Ejemplo 4

if (Numero == 0) cout << “No se calculará la media”; else media = total / Numero;

Ejemplo 5

if (cantidad > 10){ descuento = 0.2; precio = n * precio(1 - descuento); }

572 PROGRAMACIÓN EN C++. ALGORITMOS, ESTRUCTURAS Y OBJETOS

else { descuento = 0; precio = n * Precio; }

B.9.1. Sentencias if _else anidadas

C++ permite anidar sentencias if_else para crear una sentencia de alternati-

va múltiple:

if ( expresión 1 ) sentencia 1 ; | {sentencía compuesta} else if ( expresión 2 ) sentencia 2 ; | {sentencia compuesta} else if (expresion N) sentencia N; | {sentencia compuesta} [else sentencia N+1; | {sentencía compuesta}]

Ejemplo

if (a > 100) if (b <= 0) SumaP = 1; else SumaN = 1; else Numero = 1;

B.9.2. Sentencias de alternativa múltiple: switch

La sentencia switch ofrece una forma de realizar decisiones de alternativas

múltiples. El formato de switch es:

switch( expresion) { case constante 1 : sentencias break; case constante 2: sentencias . . .

break; case constante n: sentencias break; default: //opcional sentencias }

La sentencia switch requiere una expresión cuyo valor sea entero.

Este valor puede ser una constante, una variable, una llamada a función o

una expresión. El valor de constante ha de ser una constante. Al ejecutar

la sentencia se evalúa expresión, y si su valor coincide con una cons-

tante , se ejecutan las sentencias a continuación de ella; en caso contrario se

ejecutan las sentencias a continuación de default.

switch (Puntos) { case 10: nota ='A'; break; case 9: nota = 'B'; break; case 7,8: nota = 'C'; break; case 5,6: nota = 'D'; break; default: nota = 'F'; }

B.10. BUCLES: SENTENCIAS REPETITIVAS

Los bucles sirven para realizar tareas repetitivas. En C++ existen tres dife-

rentes tipos de sentencias repetitivas:

  • while.
  • do.
  • for.

B.10.1. Sentencia while

La sentencia while es un bucle condicional que se repite mientras la con-

dición es verdadera. El bucle while nunca puede iterar si la condición

comprobada es inicialmente falsa. La sintaxis de la sentencia while es:

GUÍA DE SINTAXIS ANSI/ISO ESTÁNDAR C++ 573

cout << “Entrar”; cin >> n; suma += n; }

B. 10.4. Sentencias break y continue

El flujo de control ordinario de un bucle se puede romper o interrumpir

mediante las sentencias break y continue.

La sentencia break produce una salida inmediata del bucle for en que

se encuentra situada:

for (i = 0; i < 100; ++i) { cin >> x; if (x < 0.0) cout << “salir del bucle” << endl; break; } cout << sqrt (x) << endl; }

La sentencia break también se utiliza para salir de la sentencia

switch.

La sentencia continue termina la iteración que se está realizando y

comenzará de nuevo la siguiente iteración:

for (i = 0; i < 100; ++i) cin >> x; if (x < 0.0) continue;

B.10.5. Sentencia nula

La sentencia nula se representa por un punto y coma, y no hace ninguna

acción.

Advertencia:

  • Una sentencia break puede ocurrir únicamente en el cuerpo de una

sentencia for, while, do o switch.

  • Una sentencia continue sólo puede ocurrir dentro del cuerpo de una

sentencia for, while o do.

char cad[80]=“Cazorla”; int i;

for(i=0; cad[i] !='\0'; i++) ;

B.10.6. Sentencia return

La sentencia return detiene la ejecución de la función actual y devuelve el

control a la función llamada. Su sintaxis es:

return expresion ;

donde el valor de expresión se devuelve como el valor de la función.

B.11. PUNTEROS (APUNTADORES)^3

Un puntero o apuntador es una referencia indirecta a un objeto de un tipo

específicado. En esencia, un puntero contiene la posición de memoria de un

tipo dado.

B.11.1. Declaración de punteros

Los punteros se declaran utilizando el operador unitario. En las sentencias

siguientes se declaran dos variables: n es un entero, y p es un puntero a un

entero.

int n; //n es un tipo de dato entero int *p; //p es un puntero a un entero

Una vez declarado un puntero, se puede fijar la dirección o posición de

memoria del tipo al que apunta.

p = &n; //p se fija a la dirección de n

Un puntero se declara escribiendo:

NombreTipo *NombreVariable

GUÍA DE SINTAXIS ANSI/ISO ESTÁNDAR C++ 575

(^3) El término puntero es el más utilizado en España, mientras que en Latinoamérica se suele utilizar apuntador.

p

Este elemento se puede llamar por: Este elemento se puede llamar por:

a[0], *p o bien p[0] a[6], *(p+6) o bien p[6]

Una vez que se ha declarado un puntero, p, el objeto al que apunta se escri-

be *p y se puede tratar como cualquier otra variable de tipo NombreTipo.

int *p, q, n; //dos punteros a int, y un int n = -25; //n se fija a - p = 105; //p a 105 q = n +p; //q a 80

C++ trata los punteros a tipos diferentes como tipos diferentes:

int *ip; double *dp;

Los punteros ip y dp son incompatibles, de modo que es un error escribir

dp = ip; //Error, no se pueden asignar punteros a tipos //diferentes

Se pueden, sin embargo, realizar asignaciones entre contenidos, ya que

se realizaría una conversión explícita de tipos.

*dp = *ip;

Existe un puntero especial ( nulo ) que se suele utilizar con frecuencia en

programas C++. El puntero NULL tiene un valor cero, que lo diferencia de

todas las direcciones válidas. El conocimiento nos permite comprobar si un

puntero p es el puntero NULL evaluando la expresión (p==0). Los punteros

NULL se utilizan sólo como señales de que ha sucedido algo. En otras pala-

bras, si p es un puntero NULL, es correcto referenciar *p.

B.11.2. Punteros a arrays

A los arrays se accede a través de los índices:

int lista[5]; lista[3] = 5;

A los arrays también se puede acceder a través de punteros:

int lista[5]; //array de 5 elementos int *ptr; //puntero a entero ptr = lista; //fija puntero al primer elemento del array ptr += 2; //suma 3 a ptr; ptr apunta al 4° elemento *ptr = 5; //establece el 4° elemento a 5

double a[10]; double *p = a; //p y a se refieren al mismo array

El nombre de un array se puede utilizar también como si fuera un punte-

ro al primer elemento del array.

576 PROGRAMACIÓN EN C++. ALGORITMOS, ESTRUCTURAS Y OBJETOS

Si nombre apunta al primer elemento del array, entonces nombre + 1

apunta al segundo elemento. El contenido de lo que se almacena en esa posi-

ción se obtiene por la expresión

*(nombre+1)

B.11.3. Punteros a estructuras

Los punteros a estructuras son similares y funcionan de igual forma que los

punteros a cualquier otro tipo de dato.

struct familia { char *marido; char *esposa; char *hijo; };

familia mackoy; //mackoy estructura de tipo familia familia *p; //p, un puntero a familia p = &mackoy; //p, contiene dirección de mackoy

Aunque las funciones no pueden modificar sus argumentos, si un array

se utiliza como un argumento de una función, la función puede modifi-

car el contenido del array.

punteros son: suma, resta y comparación. Así, si las sentencias siguientes se

ejecutan en secuencia:

char *p; //p contiene la dirección de un carácter char a[10]; // array de diez caracteres p = &a[0]; //p apunta al primer elemento del array p++; //p apunta al segundo elemento del array p++; //p apunta al tercer elemento del array p--; //p apunta al segundo elemento del array

Un ejemplo de comparación de punteros es el siguiente programa:

#include main (void) { int *ptr1, ptr2; int a[2] = {10,10}; ptr1 =a; cout << “ptr1 es” << “ptr1 << “ptr1 es” << ptr1 << endl; ptr2 = ptr1 + 1; cout << “ptr2 es” << ptr2 << “Ptr2 es” << *ptr2 << endl;

//comparar dos punteros if (ptr1 == ptr2) cout << “ptr1 no es igual a ptr2 \n”;

if (*ptr1 == *ptr2) cout << ptr1 es igual a *ptr2 \n”; else cout << ptr1 no es igual a *ptr2 \n”; }

B. 12. LOS OPERADORES new Y delete

C++ define un método para realizar asignación dinámica de memoria, dife-

rente del utilizado en C, mediante los operadores new y delete.

El operador new sustituye a la función malloc tradicional en C, y el

operador delete sustituye a la función free tradicional también en C; new

asigna memoria y devuelve un puntero al objeto últimamente creado. Su

sintaxis es:

new NombreTipo

y un ejemplo de su aplicación es:

int *ptr1; double *ptr2;

ptr1 = new int; //memoria asignada para el objeto ptr ptr2 = new double; //memoria ampliada para el objeto ptr *ptr1= 5; *ptr2= 6.55;

Dado que new devuelve un puntero, se puede utilizar ese puntero para

inicializar el puntero en una sola definición, tal como:

int* p = new int;

Si new no puede ocupar la cantidad de memoria solicitada, devuelve un

valor NULL. El operador delete libera la memoria asignada mediante new.

delete ptr1;

Un pequeño programa que muestra el uso combinado de new y delete es,

#include void main (void) { char *c;

c = new char[512]; cin >> c; cout << c << endl;

delete c; }

Los operadores new y delete se pueden utilizar para asignar memoria

a arrays, clases y otro tipo de datos.

int * i; i = new int[2][35]; //crear el array //asignar el array ... delete i; //destruir el array

Sintaxis de new y delete:

new nombre_tipo new int new char[100] new nombre_tipo inicializador new int(99) new char(‘C’) new nombre_tipo new (char*) delete expresión delete p delete[] expresión delete[]

578 PROGRAMACIÓN EN C++. ALGORITMOS, ESTRUCTURAS Y OBJETOS

B. 13. ARRAYS

Un array^4 ( matriz, tabla ) es una colección de elementos dados del mismo

tipo que se identifican por medio de un índice. Los elementos comienzan

con el índice 0.

Declaración de arrays

Una declaración de un array tiene el siguiente formato:

nombreTipo nombreVariable[n]

Algunos ejemplos de arrays unidimensionales:

int ListaNum[2]; //array de dos enteros char ListaNombres[10] ; //array de 10 caracteres

Arrays multidimensionales son:

nombretipo nombreVariable[nl] [n2] ... [nx];

El siguiente ejemplo declara un array de enteros 4 × 10 × 3

int multidim[4][10][3];

El ejemplo tabla declara un array de 2 × 3 elementos.

int tabla[2][3]; //array de enteros de 2x3 = 6 elementos

B.13.1. Definición de arrays

Los arrays se inicializan con este formato:

int a[31 = {5, 10, 15}; char cad[5] = {a', 'b', 'c', 'd', 'e'}; int tabla[2][3] = {{1,2,3}{3,4,5}};

Las tres siguientes definiciones son equivalentes:

char saludo[5]= “hola”; char saludo[] = “hola”; char saludo[5] = {'h', 'o', 'l', 'a', '\o'};

B.14. ENUMERACIONES, ESTRUCTURAS Y UNIONES

En C++, un nombre de una enumeración, estructura o unión es un nombre

de un tipo. Por consiguiente, la palabra reservada struct, union o enum

no son necesarias cuando se declara una variable.

El tipo de dato enumerado designa un grupo de constantes enteros con

nombres. La palabra reservada enum se utiliza para declarar un tipo de dato

enumerado o enumeración. La sintaxis es:

enum nombre { lista_simbolos };

donde nombre es el nombre de la variable declarada enumerada;

lista-símbolos es una lista de tipos enumerados, a los que se asigna valo-

res cuando se declara la variable enumerada y puede tener un valor de ini-

cialización. Se puede utilizar el nombre de una enumeración para declarar

una variable de ese tipo (variable de enumeración).

nombre var;

Considérese la siguiente sentencia:

enum color {Rojo, Azul, Verde, Amarillo};

Una variable de tipo enumeración color es:

color pantalla = Rojo; //Estilo C++

Una estructura es un tipo de dato compuesto que contiene una colec-

ción de elementos de tipos de datos diferentes combinados en una única

construcción del lenguaje. Cada elemento de la colección se llama miembro

y puede ser una variable de un tipo de dato diferente. Una estructura repre-

senta un nuevo tipo de dato en C++.

1. Los arrays se pueden pasar como argumentos a funciones.

2. Las funciones no pueden devolver arrays.

3. No está permitida la asignación entre arrays. Para asignar un array a

otro se debe escribir el código para realizar las asignaciones elemen-

to a elemento.

GUÍA DE SINTAXIS ANSI/ISO ESTÁNDAR C++ 579

(^4) En Latinoamérica, este término se traduce al español por la palabra arreglo.

Esta lectura del teclado lee una cadena hasta que se encuentra el primer

carácter blanco. Así, cuando se lee “Sierra Mágina. Jaén”, en cad sólo

se almacena Sierra. Para resolver el problema se utiliza la función gets

(), que lee una cadena completa leída del teclado. El programa anterior se

escribe así para leer toda la cadena introducida:

#include #include

main() { char cad[80];

cout << “Introduzca una cadena:”; gets(cad); cout << “Su cadena es:”; cout << cad;

return 0; }

B.16. FUNCIONES

Una función es una colección de declaraciones y sentencias que realizan una

tarea única. Cada función tiene cuatro componentes: 1) su nombre; 2) el tipo

de valor que devuelve cuando termina su tarea; 3) la información que toma

al realizar su tarea, y 5) la sentencia o sentencias que realizan su tarea. Cada

programa C++ tiene al menos una función: la función main.

B.16.1. Declaración de funciones

En C + + se debe declarar una función antes de utilizarla. La declaración de

la función indica al compilador el tipo de valor que devuelve la función y el

número y tipo de argumentos que toma. La declaración en C++ se denomi-

na prototipo:

tipoNombreFuncion (lista argumentos);

Ejemplos válidos son:

double Media(double x, double y); void Print(char* formato, ...); extern max(const int*, int); char LeerCaracter();

B.16.2. Definición de funciones

La definición de una función es el cuerpo de la función, que se ha declara-

do con anterioridad.

double Media(double x, double y) //Devuelve la media de x e y { return (x+y)/2.0; }

char LeerCaracter(); //Devuelve un carácter de la entrada estándar { char c; cin >> c; return c; }

B.16.3. Argumentos por omisión

Los parámetros formales de una función pueden tomar valores por omisión,

o argumentos cuyos valores se inicializan en la lista de argumentos forma-

les de la función.

int Potencia (int n, int k=2);

Potencia(256); //256 elevado al cuadrado

Los parámetros por omisión no necesitan especificarse cuando se llama

a la función. Los parámetros con valores por omisión deben estar al final de

la lista de parámetros:

void func1 (int i=3, int j); //ilegal void func2 (int i, int j=0, ínt k=0); //correcto void func3 (int i=2, int j, int k=0); //ilegal void ImprimirValores (int cuenta, double cantidad=0.0);

Llamadas a la función ImprimirValores son:

ImprimirValores (n,a); ImprimirValores (n); //equivalente a ImprimirValores (n, 0.0)

Otras declaraciones y llamadas a funciones son:

GUÍA DE SINTAXIS ANSI/ISO ESTÁNDAR C++ 581

double f1(int n, int m, int p=0); //legal double f2(int n, int m=1, int p=0); //legal double f3(int n=2, int m=1, int p=0); //legal double f4(int n, int m=1, int p); //ilegal double f5(int n=2, int m, int p=0); //ilegal

B.16.4. Funciones en línea (inline)

Si una declaración de función está precedida por la palabra reservada inli-

ne, el compilador sustituye cada llamada a la función con el código que

implementa la función.

inline int Max(int a, int b) { if (a>b) return a; return b; }

main () { int x = 5, y = 4; int z = Max(x,y); }

Los parámetros con valores por omisión deben entrar al final de la lista

de parámetros: las funciones f1, f2 y f3 son válidas, mientras que las

funciones f4 y f5 no son válidas.

Las funciones en línea (inline) evitan los tiempos suplementarios de las

llamadas múltiples a funciones. Las funciones declaradas en línea deben ser

simples, con sólo unas pocas sentencias de programa; sólo se pueden llamar

un número limitado de veces y no son recursivas.

inline int abs(int i); inline int min(int v1, int v2); int mcd(int v1, int v2);

Las funciones en línea deben ser definidas antes de ser llamadas:

#include int incrementar(int i);

inline incrementar(int i) { i++; return; }

main (void) { int i = 0; while (i < 5) { i = incrementar(i); cout << “i es: ”<< i << endl; } }

B.16.5. Sobrecarga de funciones

En C++, dos o más funciones distintas pueden tener el mismo nombre. Esta

propiedad se denomina sobrecarga. Un ejemplo es el siguiente:

int max (int, int); double max (double, double);

o bien este otro:

void sumar (char i); void sumar (float j);

Las funciones sobrecargadas se diferencian en el número y tipo de argu-

mentos, o en el tipo que devuelven las funciones, y sus cuerpos son dife-

rentes en cada una de ellas.

#include