Programacion En C++

  • Uploaded by: trino
  • 0
  • 0
  • February 2021
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Programacion En C++ as PDF for free.

More details

  • Words: 26,829
  • Pages: 80
Loading documents preview...
Programación con C++ Nivel 1

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial, por medios impresos o digitales, sin autorización del Autor.

CENEAC Producciones, C.A. Universidad Central de Venezuela, Facultad de Ciencias, Edif. III, Av. Los Ilustres, Los Chaguaramos, Caracas, Venezuela Tlf. (58 212) 605-13-14 693-47-38 (telfax) correo [email protected] www.ceneac.com.ve

CENEAC - Programación con C++ Nivel 1.

ÍNDICE 1. Creación de Algoritmos en Pseudocódigo 1.1. Conceptos básicos y características … 1 1.2. Definición de los elementos presentes en un algoritmo … 3  Datos, Tipos de datos, Variables … 3  Secuenciamiento de Acciones … 7  Acciones Básicas (Asignación, Lectura y Escritura) … 9  Estructuras de Control Condicional (Si y Selección ) … 10  Estructuras de Control Iterativas (Ciclos: Para, Repetir y Mientras) … 12  Procedimientos (Acciones, Funciones y Pase de parámetros) … 17

2. Creación de Programas en C++ 2.1. Introducción al lenguaje, origen y principales características … 24 2.2. Elementos de un programa … 26 2.3. Identificadores y Palabras reservadas … 28 2.4. Tipos de datos básicos … 28 2.5. Variables, Constantes, Operadores básicas, Expresiones y Prioridad de Operadores… 30 2.6. Operaciones básicas Entrada (Lectura) y Salida (Escritura) … 35 2.7. Conversión de Tipos y Modificadores de formato … 36 2.8. Estructuras de Control Condicional:  if (Si) … 39  switch (En caso de) … 41 2.9. Estructuras e Control Iterativo (Ciclos):  for (Para) … 43  while (Mientras) … 44  do-while (Hacer … mientras o Repetir) … 45 2.10. Funciones, Procedimientos, Prototipos y Macros … 47

3. Estructuras de Datos en C++ 3.1. Arreglos Unidimensionales … 52 3.2. Arreglos Multidimensionales … 56 3.3. Registros … 58

4. Instalación de un Editor y Compilador de C++ … 64

5. Anexo 1:

Principales Instrucciones y su traducción de Pseudocódigo a C++ Principales funciones predefinidas Biblioteca Estándar de C++ y Principales Librerías … 65

6. Ejercicios de creación de Algoritmos y Programación con C++

… 72

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

CENEAC - Programación con C++ Nivel 1.

T E MA 1 .

CREACIÓN DE ALGORITMOS EN PSEUDOCÓDIGO 1.1 Conceptos Básicos A partir de los años 80, la masificación en el uso de los computadores se ha convertido en una realidad, de tal forma que hoy en día son una herramienta indispensable en casi todas las actividades del quehacer humano. A pesar de las diversas áreas en las que el computador juega un papel preponderante y del desarrollo tecnológico, que ha llevado de los grandes computadores (main frames) a los microcomputadores actuales, las componentes básicas de un computador siguen siendo: el hardware y el software. El hardware de un computador es el conjunto de componentes físicas que lo forman, siendo las tres componentes principales del hardware: La memoria principal o memoria RAM (Random Access Memory)

• La Unidad Central de Proceso o CPU

Los Dispositivos Periféricos. La memoria principal o memoria RAM es la componente encargada del almacenamiento tanto de los programas como de los datos a ser procesados. El rendimiento de una memoria se mide en términos de su capacidad (tamaño medido en MB o GB) y de la velocidad con que los datos son almacenados y recuperados. La Unidad Central de Proceso o CPU es la componente encargada de realizar los cálculos y transformaciones sobre los datos, para obtener los resultados; así como también de “gobernar” las diferentes componentes del computador. El CPU está formado por dos componentes principales: Unidad de Control, parte encargada de “gobernar” a las distintas componentes del computador. Unidad Aritmético-Lógica o ULA, componente encargada de realizar los cálculos y transformaciones sobre los datos. El rendimiento del CPU se mide en términos de su velocidad (medida en MHz o GHz) para efectuar los cálculos. Los Dispositivos Periféricos tienen como función principal permitir la comunicación entre el usuario y el computador, ya sea para la captura de datos o presentación de resultados. Estos dispositivos pueden clasificarse, de acuerdo a su utilización, en tres categorías: Dispositivos de Entrada: Son aquellos dispositivos que sólo permiten la comunicación Usuario  Computador. Por ejemplo: el teclado, el ratón, el micrófono, los controles para juegos (joystick), el escáner, las pantalla táctiles, etc. Dispositivos de Salida: Son aquellos dispositivos que sólo permiten la comunicación Computador  Usuario. Por ejemplo: la impresora (salida permanente), el monitor (salida no permanente), las cornetas, etc. Dispositivos de Entrada/Salida: También llamados memorias auxiliares o secundarias, son aquellos dispositivos que permiten la comunicación Usuario  Computador; además, estos dispositivos le proporcionan al computador un medio de almacenamiento de información adicional, desde el cual es posible leer o escribir información. Ejemplos de estos dispositivos son: la unidad de disquete, la unidad de CD, DVD, disco duro (fijos y USB), pendrive, tarjetas flash, etc. El software de un computador es el conjunto de programas (sistemas) que permiten la utilización de los recursos del computador y comprende: Programas para el control del computador (Sistemas Operativos, Interpretadores, Compiladores,...) Programas de aplicación para la resolución de una amplia gama de problemas mediante el computador (Sistemas Administrativos, Bases de Datos, Editores de Texto, Editores Gráficos, Editores de Páginas Web,...) Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

1

CENEAC - Programación con C++ Nivel 1.

La disciplina dentro de la computación dedicada a la resolución de problemas mediante el computador es la Programación, cuyo producto final son los Programas, los cuales tienen como finalidad dar órdenes a una máquina (computador), a fin de obtener resultados. Para la elaboración de un programa, el programador debe atacar dos aspectos fundamentales: Organizar los datos en la memoria del computador (Estructuración de los Datos). Definir el proceso de tratamiento de esos datos (Estructuración de los Programas). Abstracción Mecanismo intelectual principal en la actividad de la programación, el cual durante la etapa de análisis del problema permite la separación de los aspectos relevantes de los irrelevantes en el contexto estudiado. Análisis Descendente Método de análisis que consiste en la aplicación sucesiva de la capacidad de abstracción sobre un problema determinado, lo cual permite la descomposición del problema en subproblemas, tales que, la composición de sus soluciones constituyen una solución al problema original. A su vez, para la obtención de la solución de cada subproblema se puede aplicar nuevamente este método. De esta forma, la solución del problema se presenta por etapas, conocidas como Niveles de Abstracción. Estado Es el conjunto de valores que poseen los objetos de un algoritmo en un momento dado. Instrucciones o Acciones Es un suceso que dura un tiempo finito y produce un resultado o efecto perfectamente definido y previsto. Toda acción opera sobre algún objeto y es posible reconocer el efecto de tal acción por los cambios de estado presentados por el objeto. Por lo tanto, una acción está perfectamente determinada por sus estado inicial (antes de realizar la acción) y final (después de realizar la acción). Algoritmo Es una secuencia finita de pasos (instrucciones), expresados en un lenguaje natural o pseudo-formal, que resuelven un problema dado. Programa Es un algoritmo expresado o traducido a un Lenguaje de Programación con el objetivo de dar órdenes a un dispositivo o máquina. Máquina o Dispositivo Es un mecanismo capaz de realizar acciones según un patrón determinado (programa) el cual es descrito mediante un repertorio finito de acciones elementales propio de cada máquina. Resolución de problemas de programación Así, la principal razón para que las personas aprendan lenguajes y técnicas de programación es utilizar al computador como una herramienta para resolver problemas a través de la creación y ejecución de programas. La resolución de un problema exige al menos la realización de las siguientes actividades: 1. Análisis del problema 2. Diseño del algoritmo 3. Traducción del algoritmo para obtener el programa 4. Ejecución y validación del programa.

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

2

CENEAC - Programación con C++ Nivel 1.

1.2 Definición de los Elementos presentes en un Algoritmo Para expresar la solución de un problema a través de un algoritmo, es necesario definir primero el lenguaje con el cual se escribirá el algoritmo. El uso de lenguaje natural (por ejemplo, castellano) para estos fines presenta una serie de inconvenientes, tales como ambigüedad (diferentes interpretaciones a una misma oración) e imprecisión (dificultad para expresar ideas). Estos inconvenientes conducen a la necesidad de definir los elementos presentes en un algoritmo a través de la definición de una Notación Algorítmica (o Lenguaje Pseudo-formal) en la cual dichos inconvenientes se minimicen o eventualmente eliminen. Además, la Notación Algorítmica a definir y utilizar debe:  Ser fácil de leer y entender  Reflejar de una manera directa el análisis que produjo la solución del problema  Ser poderosa, esto es, que con pocos elementos se puedan expresar muchas cosas. A continuación, serán presentados los diferentes elementos que conforman un algoritmo a través de la definición de la Notación Algorítmica que utilizaremos para escribir los algoritmos. La presentación de estos elementos se hará a través de ejemplos tipo. Generalmente, los problemas están especificados en términos de un conjunto de informaciones iniciales (datos) y del cálculo que se desea efectuar para obtener los resultados (requerimientos). Por lo tanto, para la definición de una Notación Algorítmica, para expresar la solución de dichos problemas, es necesario especificar los diferentes Tipos de Datos (conjuntos de valores que pueden tomar la información y las operaciones que pueden aplicarse sobre ellos). Así como también, las diferentes maneras en que se pueden expresar dichos valores (constantes, variables y expresiones).

1.2.1. Tipos de Datos Un tipo de dato es el conjunto de valores que puede tomar la información y las operaciones que se pueden realizar sobre esos valores. Los tipos de datos se clasifican en: 

Tipos de datos no estructurados: son aquellos cuyos valores no pueden dividirse en componentes.



Tipos de datos estructurados (Estructuras de Datos): son aquellos cuyos valores están formados por componentes y por lo tanto pueden descomponerse en términos de los valores que los constituyen.

En principio sólo consideraremos los Tipos de Datos no estructurados, dejando para la parte final la manipulación de los Tipos de Datos Estructurados.

Tipos de Datos no Estructurados Los distintos tipos de datos se representan en diferentes formas en el computador, siendo esta representación un conjunto o secuencia de bits (dígitos 0 o 1). Los lenguajes de programación de alto nivel permiten al programador hacer abstracción de la manera como los datos son representados. Los tipos de datos no estructurados con los que se trabajará se pueden clasificar en:  Numéricos (entero, real)  Lógicos o Booleanos  Caracteres (carácter, string o cadena)

Tipo de dato Entero El tipo entero es un subconjunto finito de los números enteros (números que no tienen parte decimal), pudiendo ser positivos o negativos. Los siguientes son ejemplos de valores de tipo entero: 5 -15 1340 -325 0 12000

Tipo de dato Real El tipo real es un subconjunto finito de los números reales. Los números reales están formados por una parte entera y una parte decimal, pudiendo ser positivos o negativos. Los siguientes son ejemplos de valores de tipo real: 5.0 -15.25 1340.3 -325.1245 0.007 Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

3

CENEAC - Programación con C++ Nivel 1.

Tipo de dato Lógico El tipo lógico, también denominado booleano, es aquel conformado por dos valores: verdadero y falso. Este tipo de dato se utiliza para representar las alternativas (si/no) a determinadas condiciones.

Tipo de dato Carácter El tipo carácter, esta conformado por el conjunto finito y ordenado de caracteres que el computador reconoce, pudiendo ser diferentes de un computador a otro. Los siguientes son ejemplos de valores del tipo carácter: 

Caracteres alfabéticos (A, B, C, ....., Y, Z) (a, b, c, ......, y, z).



Caracteres numéricos (1, 2, 3, ....., 9, 0).



Caracteres especiales (+ , - , * , / , ; , . , < , > , = , $ , @ , % , ....... )

Tipo de dato String (cadena) El tipo string, es una sucesión de caracteres delimitados por comillas. La longitud de la cadena de caracteres es el número de ellos comprendidos entre las comillas. Los siguientes son ejemplos de valores del tipo string: "Luis Rivas"

"A, B, C"

""

" "

"8 de octubre de 2.015"

"Sr. Pastor"

1.2.2. Constantes, Variables y Expresiones Existen tres maneras de denotar a los valores de los distintos tipos de datos, estas son:  Constantes:

denotación de un valor particular del conjunto.

 Variables:

denotación de un valor genérico del conjunto.

 Expresiones

denotación de valores a partir operaciones entre constantes y variables.

Constantes Son valores que no cambian durante la ejecución del algoritmo (programa). Ejemplos de constantes según su tipo de dato: Tipo Ejemplos Entero Real Lógico Carácter String

0

345

-124

200

32456 -9799

0.1

12.25

-3.25

350.0

-123.3 1234.5643

"$"

"7"

verdadero

falso

"A"

"1"

"Casa"

"X"

"18 de julio"

"US$ 300.7"

Variables Una variable es un objeto cuyo valor puede cambiar durante el desarrollo del algoritmo o la ejecución del programa. Cada variable tendrá entonces asociado un tipo de dato, pudiendo sólo tomar valores de ese tipo.

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

4

CENEAC - Programación con C++ Nivel 1.

Los nombres de las variables, a veces conocidos como identificadores, pueden constar de varios caracteres alfanuméricos (letras y números) de los cuales el primero debe ser una letra. Ejemplos de nombres válidos de variables: A3, Nombre, Contador, Total. Los nombres elegidos para las variables del algoritmo (programa) deben ser significativos y tener relación con el objeto que representan, para así facilitar la lectura del mismo.

Expresiones Las expresiones son combinaciones de constantes, variables, operadores y paréntesis. Cada expresión al ser evaluada toma un valor que se determina aplicando los operadores a los valores de las constantes y variables implicadas en la expresión. Dependiendo del valor resultante de evaluar la expresión se tiene el tipo de la expresión. Así, encontramos expresiones aritméticas (resultado entero o real), expresiones lógicas (resultado lógico) y expresiones de tipo carácter (resultado carácter o string).

Expresiones Aritméticas A continuación se presentan los diferentes operadores aritméticos que se pueden utilizar para la construcción de expresiones aritméticas, indicando el tipo de operando que admiten y el tipo del resultado de la expresión. Operador

Significado

Tipo de Operandos

Tipo de Resultado

**

Exponenciación

Entero o real

Entero o real

div

División entera

Entero

Entero

mod

Resto de la división entera

Entero

Entero

/

División real

Entero o Real

Real

*

Multiplicación

Entero o real

Entero o real

-

Resta

Entero o real

Entero o real

+

Suma

Entero o real

Entero o real

Los siguientes ejemplos muestran resultados de expresiones aritméticas, compruébelos: Expresión

Resultado

Expresión

Resultado

10.5 / 3.0

3.5

10 div 3

3

1/4

0.25

18 div 2

9

2.0 / 4.0

0.5

30 div 30

1

6/1

6.0

6 div 8

0

Reglas de Prioridad Cuando las expresiones tienen dos o más operandos, se requieren reglas que permitan evitar ambigüedades al momento de realizar la evaluación de la expresión. Estas se denominan Reglas de prioridad o de precedencia y son: Las operaciones que están encerradas entre paréntesis se evalúan primero. Si existen diferentes paréntesis anidados (unos dentro de otros), las expresiones más internas se evalúan primero. Las operaciones aritméticas se realizan de acuerdo al siguiente orden de prioridad. 

Exponencial ( ** )

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

5

CENEAC - Programación con C++ Nivel 1.



División real ( / ), División entera ( div ), Resto de la división entera ( mod ) y Multiplicación ( * )



Suma ( + ) y Resta ( - )

En caso de coincidir varios operadores de igual prioridad en una expresión o subexpresión encerrada entre paréntesis, el orden de prioridad será de izquierda a derecha.

Expresiones Lógicas Una expresión lógica es aquella que al ser evaluada puede tomar sólo uno de estos dos valores: verdadero o falso. Las expresiones lógicas se forman combinando constantes lógicas, variables lógicas y otras expresiones lógicas, utilizando los operadores lógicos no, y, o, y los operadores relacionales (de relación o comparación) =, <, >, <=, >=, <>. Operadores Lógicos Operador no y o

Significado Negación Conjunción Disyunción

Ejemplo de Expresión no P PyQ PoQ

Operadores Relacionales Operador

Significado Menor que Mayor que Igual Menor o igual Mayor o igual Diferente

< > = <= >= <>

Ejemplo de Expresión A<3 P>Q P=1 A <= P P >= Q P <> Q

Los siguientes ejemplos muestran resultados de expresiones lógicas, compruébelos. Expresión (1 > 0) y (3 = 3) 5 >= 7 (A > 0) y (A < 0) 5<0

Resultado verdadero falso falso falso

Expresión (0 < 5) o (0 > 5) P o (no P) P y (no P) 5=0

Resultado verdadero verdadero falso falso

Prioridad de los operadores (Aritméticos y Lógicos) Operador **, no /, *, div, mod, y

Prioridad Más alta (primera operación ejecutada) 

+, -, o <, >, =, <=, >=, <>

Más baja (última operación ejecutada)

Al igual que en las expresiones aritméticas, los paréntesis se pueden utilizar y tendrán prioridad sobre cualquier operación. Además, en caso de coincidir varios operadores de igual prioridad en una expresión o subexpresión encerrada entre paréntesis, el orden de prioridad será de izquierda a derecha. Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

6

CENEAC - Programación con C++ Nivel 1.

Expresiones String Una expresión de tipo string es aquella que al ser evaluada produce un valor de tipo string. Las expresiones string se forman combinando constantes, variables y otras expresiones de tipo string lógicas, utilizando los operadores del tipo string: concatenar y subcadena. En el caso de concatenar se utilizan diversos operadores, los comunes: || + & Operadores String Operador

Significado

Ejemplo de Expresión

|| + &

Concatenación

"Pedro y " || "Pablo"

substr(string,inicio,tamaño)

Subcadena

substr("Pedro",1,2)

Los siguientes ejemplos muestran resultados de expresiones String Expresión

Resultado

"Pedro y " + " Pablo"

"Pedro y Pablo"

substr("Pedro",1,2)

"Pe"

substr("Casa roja",6,4)

"roja"

1.2.3. Secuenciamiento de Acciones Las formas de composición de acciones son los mecanismos mediante los cuales se construirán nuevas acciones a partir de acciones ya creadas. A continuación se presentan las formas de composición de acciones más usuales, así como también ejemplos de sus usos. Las siguientes convenciones serán usadas en la presentación: 

Las letras mayúsculas A, B, C, … representarán acciones cualesquiera.



Las letras griegas , , , … representaran expresiones lógicas (predicados).

Secuenciamiento La forma de composición de acciones más natural es el secuenciamiento, el cual simplemente consiste en la presentación de un conjunto de acciones en un cierto orden. Permite indicar el orden en que se desea se ejecuten una serie de acciones. Notación Sean A, B, C acciones cualesquiera. El secuenciamiento de ellas en el orden A, B, C se expresa de la siguiente forma: A B (orden textual) C o bien A ; C ; B; (orden dado mediante el operador de secuenciamiento “ ; “) EJEMPLO 1: Intercambio de dos valores Enunciado Dadas dos variables n1 y n2 que identifican a dos valores enteros cualesquiera, intercambiar su valor. Análisis Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

7

CENEAC - Programación con C++ Nivel 1.

Para la solución del problema es necesario evitar la pérdida del valor de una de las dos variables, pérdida que se deriva de una utilización directa de la asignación, por eso se utilizará una tercera variable aux. De las versiones que se presentan, la primera resuelve el problema con la ayuda de una variable auxiliar (solución por memorización) y la segunda lo resuelve mediante acumulaciones basadas en las propiedades de los operadores + y – (solución por cálculo). Solución de la Primera Versión

Solución de la Segunda Versión

Escribir(“Suministre los 2 números de entrada.”);

Escribir(“Suministre los 2 números de entrada.”);

Leer(n1);

Leer(n1);

Leer(n2);

Leer(n2);

EI = { n1 = x, n2 = y, x, y  ENTEROS }

EI = { n1 = x, n2 = y, x, y  ENTEROS }

aux = n1; //se guarda en aux para no perder n1

n1 = n1 + n2;

n1 = n2;

n2 = n1 – n2;

n2 = aux;

n1 = n1 – n2;

EF = { n1= y, n2 = x, x, y  ENTEROS }

EF = { n1 = y, n2 = x, x, y  ENTEROS }

Escribir(“Resultado luego del intercambio: ”);

Escribir(“Resultado luego del intercambio: ”);

Escribir(n1);

Escribir(n1);

Escribir(n2);

Escribir(B);

Léxico

Léxico

Entero n1, n2: Nominan a los valores a intercambiar

Entero n1, n2: Nominan a los valores a intercambiar

Entero aux:

Variable auxiliar para el proceso

Ejemplo 2: Equivalencia de una cantidad en segundos a días, horas, minutos y segundos Enunciado Dadas un valor entero y positivo S, que representa una cantidad en segundos, se quiere hallar su equivalente en días, horas, minutos y segundos sobrantes. Análisis La solución consiste hacer divisiones sucesivas sobre el número de segundos inicial para hallar las equivalencias. Solución Escribir(“Suministre la cantidad inicial de segundos.”);

Leer(S);

MIN = S div 60 ;

SEG = S mod 60; // div y mod son operadores y palabras reservadas

HOR = MIN div 60 ;

MIN = MIN mod 60;

DIA = HOR div 24 ;

HOR = HOR mod 24;

Escribir(“El equivalente de segundos en días, horas, minutos y segundos es: ”); Escribir(DIA + “ ” + MIN + “ ” + SEG);

Léxico Entero S: Variable que nomina al valor en segundos dado. Entero SEG, MIN, HOR, DIA: Variables para almacenar la cantidad de segundos, minutos, horas y días respectivamente calculadas a partir del valor dado.

1.2.4. Acciones Básicas Se definirán tres acciones básicas: asignación, entrada simple (lectura) y salida simple (escritura), a partir de las cuales, mediante las formas de composición de acciones, se crearan acciones más complejas que permitirán expresar la solución de cualquier tipo de problema. Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

8

CENEAC - Programación con C++ Nivel 1.

Asignación ( = ) Esta acción es la base para la construcción de las soluciones de los problemas; ya que permite modificar el estado de los objetos que conforman el algoritmo y de esta forma obtener los resultados requeridos. Ejemplos. Sean A y P variables de tipo entero, PI variable de tipo real, C variable de tipo lógico y S variable de tipo string. A

= -3

(a la variable A se le asigna u otorga el valor -3)

PI = 3,1415 P

= -9 * A

C

= (PI = 8,1)

P

= P+1

S

= "Perro Nro. " + P

El operador = se conoce como operador de asignación (también se utiliza “”) y tiene como efecto el cambio de estado (cambio de valor), de la variable que aparece a la izquierda de él. Cabe estacar que el operador = también puede ser utilizado para realizar comparaciones entre expresiones y verificar sin sus valores son iguales.

Para los ejemplos anteriores, el efecto de cada acción de asignación es: Acción

Efecto de la asignación

A

A toma el valor 3 (o el valor 3 se le asigna a la variable A)

= -3

PI = 3,1415

PI toma el valor 3,1415 (a PI se le asigna el valor 3,1415)

P

= -9 * A

P se le asigna el resultado de -9 por el valor de A (-3), es decir, se la asigna 27

C

= (PI = 8,1)

C se le asigna el resultado de comparar si el valor de PI es igual a 8,1 pero como son distintos, a C se le asigna Falso

P

= P+1

P toma su valor más 1, es decir, a P se le asigna 28

S = "Perro Nro. " + P

S se le asigna la concatenación o de la cadena "Perro Nro." con el valor de P, S toma entonces como valor la cadena “Perro Nro. 28”

Entrada Simple ( Leer ) La entrada simple o lectura permite nominar información que se encuentra almacenada en un dispositivo de entrada. Ejemplos: Sean A y B dos variables de tipo entero Leer(A)

Leer(B)

La operación Leer indica que de algún dispositivo de entrada externo, del cual se hace abstracción, se está copiando un valor sobre la variable que aparece entre paréntesis. Esta acción tiene como efecto el cambio de valor (o cambio de estado) de la variable entre paréntesis.

Nota: ¿Por qué subrayar algunas palabras? Es común observar en los algoritmos que algunas de las instrucciones se destacan, bien sea con negritas o subrayándolas. Esto se hace con el objetivo de destacarlas como palabras reservadas o instrucciones que tienen un significado especial en el pseudocódigo. Se destacan porque tienen un uso especial, y por lo tanto, esas palabras no se pueden usar como nombres o identificadores de constantes, variables o procedimientos.

Salida Simple ( Escribir ) Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

9

CENEAC - Programación con C++ Nivel 1.

La salida simple o escritura es la acción que se utiliza para mostrar los valores almacenados en las variables, se utiliza frecuentemente para mostrar los resultados obtenidos por el algoritmo o programa. Ejemplos: Sea A variable de tipo entero A = 5 * 20

Escribir(A)

Escribir(A + 1)

La operación Escribir indica que a través de algún dispositivo de salida externo, del cual se hace abstracción, se está escribiendo o mostrando el valor que aparece entre paréntesis.

Intradocumentación o comentarios ( // ) Esta acción permite agregar al algoritmo comentarios sobre la utilidad de sus instrucciones. La intradocumentación del código es una buena práctica algorítmica y de programación ya que ayuda al mejor entendimiento de la lógica utilizada en la solución que el algoritmo plantea a un problema dado. Uno de los operadores utilizados para agregar comentarios en pseudocógigo es //, mientras que otros lenguajes se usan: (* *) /* */ ‘ # /

1.3. Estructuras de Control Condicional (Si y Selección) Las estructuras condicionales son formas de composición de acciones que se utiliza en problemas donde las acciones a realizar dependen del resultado de evaluar ciertas condiciones.

1.3.1. Condicional simple Se utiliza cuando solo se necesita considerar el caso en que la condición evaluada es verdadera, y no es relevante el caso en que esta condición no se cumpla, es decir, al evaluarse se tenga un valor falso para ella. Notación Sea  un predicado (expresión lógica) que condiciona la ejecución de una acción A cualquiera, el condicionamiento de la acción A al predicado  se expresa: Si



entonces

A; FinSi;

En este análisis, la acción A sólo se ejecutará si el predicado  al ser evaluado es verdadero.

Ejemplo 3: Ordenamiento de dos valores Enunciado Dadas dos variables a y b que identifican a dos valores enteros respectivamente, se quiere modificar eventualmente esas identificaciones de tal manera que a nomine al valor más grande y b al más pequeño. Análisis Debemos intercambiar los valores de las variables, lo cual nos lleva a un problema cuya solución es conocida: intercambio de dos valores. El centro de la solución está en la respuesta a la pregunta ¿Cuándo debemos intercambiar? Solución Escribir(“Suministre los valores de los dos números a comparar.”); Leer(a, b); //solicitud y lectura de valores Si a < b entonces // a es menor que b, por lo tanto hay que intercambiar sus valores c = a ; a = b ; b = c; // reutilizamos las instrucciones para intercambiar valores Finsi; Escribir(“El valor máximo es: ” + A + “ y el mínimo es; ” + B );

Léxico Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

10

CENEAC - Programación con C++ Nivel 1.

entero a, b: variables para los valores a ordenar como máximo y mínimo. entero c:

variable auxiliar para no perder uno de los dos valores de entrada.

1.3.2. Condicional doble El condicional doble es una forma de composición de acciones que se utiliza en problemas donde las acciones a realizar dependen de si el resultado de evaluar ciertas condiciones es verdadero o falso. Notación Sean A y B acciones cualesquiera y sea  un predicado (expresión lógica) que condiciona la ejecución de las acciones A y B en forma excluyente; esto es si  es verdadero se ejecutará la acción A y si  es falso se ejecutará la acción B. Este tipo de condicionamiento se expresa de la siguiente forma: Si

 entonces A; sino B; Finsi; En este análisis, sólo se ejecutará una de las dos acciones, dependiendo del resultado de evaluar 

Ejemplo 4: Máximo de dos valores Enunciado Dadas dos variables a y b que identifican a dos valores enteros e1 y e2 respectivamente, se quiere determinar cual de los dos valores es el mayor. Análisis La solución se basa en la determinación de una partición del dominio de los datos, que refleje los casos posibles asociados al problema. Solución Escribir(“Suministre los valores de los dos números a comparar.”); Leer(a, b); Si a > b entonces Escribir(“El mayor valor es: ” + a); // el mayor valor lo tiene la variable a Sino Si a < b entonces Escribir(“El mayor valor es: ” + b); // el mayor valor lo tiene la variable b Sino Escribir(“Ambos valores son iguales”) FinSi; FinSi;

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

11

CENEAC - Programación con C++ Nivel 1.

1.4. Estructuras de Control Iterativas (Ciclos: Para, Repetir y Mientras) Para aquellos problemas en los cuales es necesario repetir un conjunto de acciones un número (conocido o no) de veces, se definen las formas iterativas de composición de acciones, también llamadas estructuras de control iterativas. Existen varias estructuras de control iterativas, siendo las tres más comunes: el para (for), el repetir (repeat) y el mientras (while).

1.4.1. Ciclo Para (For) Esta estructura de control iterativa, se utiliza en aquellos problemas donde se conoce el número de veces que se desea ejecutar un conjunto de acciones. Notación Sea N un número entero y positivo que indica cuantas veces se desea ejecutar las acciones A, B y C, siendo A, B, C acciones cualesquiera. La repetición de las acciones A, B, C utilizando la estructura de control iterativa Para se expresa: Para

I = 1 hasta N inc 1 hacer

ó

Para

I = N hasta 1 dec 1 hacer

A;

A;

B;

B;

C; FinPara;

C; FinPara;

Donde: I se denomina variable de control y es incrementada (inc) o decrementada (dec) automáticamente en el valor indicado. N es el número de veces que se desea repetir las acciones. Notas: 

A las acciones comprendidas entre los delimitadores Para y FinPara se les denomina cuerpo de la iteración o instrucciones del ciclo.



En el ciclo Para la variable de control no debe ser modificada en el cuerpo de la iteración.



Cuando el incremento es en 1, se puede omitir la instrucción “inc 1” en el encabezado del Para.

Ejemplo 8: Cálculo de la nota promedio, nota máxima y nota mínima de una serie de N notas Enunciado Dada una serie de N notas se desea calcular el promedio de las mismas, así como también la máxima y la mínima nota. Análisis La solución se basa en el tratamiento secuencial de cada una de las N notas; esto es, en la definición de las acciones a realizar sobre una nota (acumularla, compararla para determinar máximo y mínimo) y la aplicación de estas mismas acciones sobre el resto las notas.

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

12

CENEAC - Programación con C++ Nivel 1.

Solución Algoritmo Principal // Calcula el promedio, máximo y mínimo de un conjunto de N notas suministradas. Se asume que N > 0 Real Nota, Max, Min, Suma, Prom; // declaración de las variables del algoritmo Entero i, N; // i es la variable índice del ciclo Para y N la cantidad de notas a procesar Escribir(“Suministre la cantidad de notas a procesar.”); Leer(N); Max

= 0 ; Min = 20;

// inicializamos las variables con sus mayores valores opuestos

Suma = 0; // se inicializa la variable acumuladora en 0 Para i = 1 hasta N en 1 hacer Escribir(“Suministre la nota ” + i ); Leer(Nota); Suma = Suma + Nota; Si Nota < Min entonces Min = Nota; FinSi; si Nota > Max entonces Max = Nota; FinSi; FinPara; PROM = SUMA / N; Escribir(“La nota promedio es: ” + Prom); Escribir(“La nota máxima es: ” + Max); Escribir(“La nota mínima es: ” + Min);

FinAlgoritmo Principal;

Léxico del Algoritmo Principal entero N: Nomina al número de notas a procesar. real Nota: Nomina a cada una de las notas. real Suma: Almacena la suma de las notas a procesar. real Prom: Nomina a la nota promedio real Max: Nomina a la nota máxima. real Min: Nomina a la nota mínima. Observación En el estado inicial se asume que el valor de N es mayor que cero y en términos de esa suposición se trabaja. ¿Qué resultados daría el algoritmo si, por error, al introducir el valor de N se introduce un valor negativo o cero?

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

13

CENEAC - Programación con C++ Nivel 1.

1.4.2. Ciclo Repetir (Repeat) Esta estructura de control iterativa, se utiliza en aquellos problemas donde no se conoce el número de veces que se desea ejecutar un conjunto de acciones, pero las mismas se ejecutan 1 o más veces. Notación Sea  un predicado que caracteriza la terminación de un proceso iterativo y sean A y B acciones cualesquiera. La repetición de las acciones A y B utilizando la estructura de control iterativa Repetir se expresa: Repetir A; B; hasta ;

Esta composición es equivalente al siguiente secuenciamiento de acciones: A ; B  ; (A ; B  ; (A ; B  ; (A ; B  ; .............. )))     test test test test donde el test de terminación se efectúa después de cada ejecución de las acciones A y B. Así, con el repetir las acciones del cuerpo de la iteración se ejecutan una o más veces. Ejemplo 9: Cálculo de interés sobre un capital. Enunciado Dado un valor real C, que representa una cantidad en Bolívares y un valor R que representa un porcentaje de interés anual, se desea calcular al cabo de cuantos años se duplicará el capital. Análisis La solución se basa en el cálculo y acumulación de los intereses generados por el capital inicial año por año, hasta alcanzar la meta propuesta. Solución: Algoritmo Principal // Calcula la cantidad de años necesarios para duplicar un capital inicial C Real CI, I, C;

Entero Años; // declaración de variables

Escribir(“Introduzca el capital inicial”); Leer(CI); //solicitud y lectura de los valores de entrada Escribir(“Introduzca el % de Interés”); Leer(I); C

= CI ; Años = 0; // inicializamos convenientemente las variables C y Años

Repetir C = C + C * I / 100;

Años  Años + 1;

hasta C >= 2 * CI; Escribir(“Para duplicar el capital se necesitan: ” + Años);

FinAlgoritmo Principal;

Léxico del Algoritmo Principal Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

14

CENEAC - Programación con C++ Nivel 1.

real CI: Nomina al capital inicial. real I: Nomina a la tasa de interés anual. real C: Almacena el capital acumulado a lo largo de los años. entero Años: Nomina al número de años necesarios para duplicar el capital Observación En el estado inicial se asume que el valor del Capital Inicial (CI) y el valor de la tasa de interés (I) son mayores que cero y en términos de esa suposición se trabaja. ¿Cómo generalizaría Ud. el algoritmo para que funcione independientemente de los valores de entrada dados?

1.4.3. Ciclo Mientras (While) Esta estructura de control iterativa, se utiliza en aquellos problemas donde no se conoce el número de veces que se desea ejecutar un conjunto de acciones, pero las mismas se ejecutan 0 o más veces. Notación Sea  un predicado que caracteriza el comienzo o continuación (negación de la condición de terminación) de un proceso iterativo y sean A y B acciones cualesquiera. La repetición de las acciones A y B utilizando la estructura de control iterativa Mientras se expresa: Mientras  hacer A; B; Fmientras;

Esta composición es equivalente al siguiente secuenciamiento de acciones:  (A ; B  ; (A ; B  ; (A ; B ................. )))    test test test donde el test de comienzo o continuación se efectúa antes de cada ejecución de las acciones A y B. Así, con el mientras las acciones del cuerpo de la iteración se ejecutan cero o más veces. Ejemplo 10: Cálculo del salario de una serie de trabajadores por hora. Enunciado Se desea calcular lo que devengarán una serie de trabajadores por el trabajo realizado en una obra, para esto se definió la siguiente tarifa horaria: las horas trabajadas en horario normal se pagan a razón de Bs. 20 y las horas extras a razón de Bs. 25, mientras no excedan de 10 horas. Si las horas extras exceden de 10 horas, el exceso se paga a razón de Bs. 23,5 la hora. Además, se conoce que los datos de cada trabajador, que se introducirán, son: nombre del trabajador, horas normales trabajadas y horas extras trabajadas. La introducción de los datos terminará cuando se introduzca "*" como nombre del trabajador.

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

15

CENEAC - Programación con C++ Nivel 1.

Análisis La solución se basa en el procesamiento y cálculo del salario devengado por cada trabajador de acuerdo a las tarifas definidas, la solución se obtiene al aplicar los cálculos de un trabajador a todos los trabajadores a través de la estructura iterativa mientras. Solución: Algoritmo Principal; // Calcula el salario de un trabajador en función de las horas normales y horas extras trabajadas String Nombre;

// declaración de variables

Real HN, HE, S, PagoHN, PagoHE, pagoHE2; //inicializamos estas variables con el monto pagado al trabajador PagoHN = 20; PagoHE = 25; pagoHE2 = 23,5; Escribir(“Introduzca nombre del trabajador o * para terminar”);

Leer(Nombre);

Mientras NOMBRE <> "*" hacer Escribir(“Introduzca número de horas trabajadas en horario normal”); Leer(HN); Escribir(“Introduzca número de horas extras trabajadas”); Leer(HE); S = HN * PagoHN; Si HE > 10 entonces S = S + 10 * PagoHE + (HE - 10) * PagoHE2; sino S = S + HE * PagoHE; Fsi; // se muestra el salario del trabajador actual Escribir(“El trabajador ”+ Nombre + “ devengará un salario de Bs. ” + S); // se solicita el nombre del siguiente trabajador Escribir(“Introduzca nombre del siguiente trabajador o * para terminar”); Leer(Nombre); FinMientras;

FinAlgoritmo Principal;

Léxico del Algoritmo Principal string Nombre: Nomina al nombre de cada trabajador. real HN,HE: Nomina a las horas normales y extras trabajadas por cada trabajador. real S: Almacena la cantidad de Bolívares devengada por cada trabajador. Observación El fin del proceso iterativo, en este caso viene dado por una marca especial “*” en la secuencia de datos de entrada. Esta marca o valor de parada la define el trabajador según las características del problema.

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

16

CENEAC - Programación con C++ Nivel 1.

1.5. Procedimientos 1.5.1. Procedimientos Nominados (Acciones y Funciones) La nominación de acciones es un mecanismo que permite asociarle un nombre a un conjunto de acciones, para luego referirse al conjunto mediante ese nombre. Dependiendo de ciertas características propias de la Acción Nominada, esta puede ser un Procedimiento o una Función. Este mecanismo de asociarle un nombre a un conjunto de acciones, puede utilizarse como: 

Simplificación en la escritura del algoritmo, al "factorizar" un conjunto de acciones que se repiten.



Una forma de abstracción, al dar un nombre a una acción que se especifica y posteriormente se desarrolla (análisis descendente).

La especificación de una Acción Nominada (procedimiento o función) es una caracterización del efecto de la acción independientemente de su desarrollo. Por lo tanto toda Acción Nominada tiene un sola especificación (¿Qué hace la acción?) y una o más realizaciones (¿Cómo lo hace?) Notación de Procedimientos Definición de Procedimientos La definición de un procedimiento consta de dos partes: 1. El encabezado del procedimiento (primera línea) 2. El cuerpo del procedimiento (líneas restantes) Ejemplo de definición de procedimientos Con A, B, C y D acciones cualesquiera y  un predicado (expresión lógica) Procedimiento NOMBRE ( lista de parámetros formales ) // comentario con el objetivo o especificación de la función A; C; B; FinProcedimiento NOMBRE;

Uso de procedimientos Para ejecutar el Procedimiento antes definido, basta colocar su nombre seguido de una lista de parámetros actuales sobre los que se aplicará el conjunto de acciones agrupadas en el procedimiento. Ejemplo de uso de procedimientos B; C; Si



entonces D;

sino NOMBRE (lista de parámetros actuales); Finsi; A;

Notación de Funciones Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

17

CENEAC - Programación con C++ Nivel 1.

Definición de Funciones La definición de una función también consta de dos partes: 1. El encabezado de la función (1era. línea) 2. El cuerpo de l función (líneas restantes) Ejemplo de definición de funciones Con A, B, C y D acciones cualesquiera Función NOMBRE ( lista de parámetros formales ) : tipodedatodelretorno // comentario con el objetivo o especificación de la función A; C; Retornar(valor_resultado_que_retorna); FinFunción NOMBRE;

Uso de funciones Para ejecutar una función, basta colocar su nombre seguido de una lista de parámetros actuales sobre los que se aplicará la función a la derecha de un operador de asignación. Las funciones retornan un solo valor. Ejemplo de uso de funciones B; D; Variable = NOMBRE (lista de parámetros actuales); A;

Tanto para el caso de los procedimientos como en el de las funciones, se tiene que: 

Lista de parámetros formales es una serie de 0 ó más variables que se utilizaran dentro del cuerpo de la Acción Nominada (procedimiento o función).



Lista de parámetros actuales es una serie de 0 ó más constantes, variables y/o expresiones sobre las cuales se desea aplicar la Acción Nominada (procedimiento o función). Estos deben especificarse en cada llamada a la Acción Nominada y contienen los valores que sustituirán a los parámetros formales, es decir, los valores sobre los cuales se desea aplicar la Acción Nominada; pudiendo cambiar de una llamada a otra.



Debe existir una correspondencia uno a uno tanto en el tipo como en el número de parámetros actuales y formales, la cual en general se establece de acuerdo al orden de colocación de los mismos.



Dependiendo del tipo de sustitución deseada, se definen diversas maneras de realizar el Paso de Parámetros, siendo las dos más utilizadas las denominadas: Paso de parámetros por valor y Paso de parámetros por referencia.

1.5.2. Paso de Parámetros por Valor Bajo este esquema, el parámetro actual se evalúa y el valor resultante de la evaluación sustituye al correspondiente parámetro formal; de tal forma que, independientemente de los cambios que sufra el parámetro formal, durante la ejecución de la Acción Nominada, el valor del parámetro actual correspondiente no se modificará.

1.5.3. Paso de Parámetros por Referencia

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

18

CENEAC - Programación con C++ Nivel 1.

Bajo este esquema, el parámetro actual se evalúa y el valor resultante de la evaluación sustituye al correspondiente parámetro formal; de tal forma que, cualquier cambio que sufra el parámetro formal, durante la ejecución de la Acción Nominada, afectará el valor del parámetro actual correspondiente. Así, el parámetro actual puede cambiar su valor una vez ejecutada la Acción Nominada. Para distinguir las dos clases de Paso de Parámetros, se postulan las siguientes reglas: 1. El Paso de Parámetros por Valor es la forma más frecuente de sustitución y por ende se tomará por defecto. 2. El Paso de Parámetros por Referencia se indica colocando var antes de parámetro formal correspondiente. Para ilustrar los conceptos relacionados con los tipos de Paso de Parámetros, se presenta el siguiente ejemplo. Ejemplo 5: Diferencia entre el Paso de Parámetros por Valor y por Referencia Sea el siguiente procedimiento: Procedimiento EJEMPLO (var Entero X , Entero Y) // Ejemplo para mostrar el efecto de los dos tipos de paso de parámetros X

= X + 5;

Y

= Y + 5;

FinProcedimiento EJEMPLO;

y sea el siguiente fragmento de algoritmo que llamo o utiliza al procedimiento Ejemplo: Entero A, B; // declaración de las variables y del tipo de dato de sus valores A = 10; B = 10; EJEMPLO( A , B ) // al regresar del procedimiento EJEMPLO A = 15 y B = 10 Escribir(“los valores de A y B luego de llama a EJEMPLO son: ” + A + “ - ” + B);

Una vez realizada la llamada al procedimiento EJEMPLO, los valores que se imprimen son 15 y 10 respectivamente, los cuales corresponden a los valores que almacenan los parámetros actuales A y B. Note que el valor del parámetro A cambió (por haber sido pasado por referencia) mientras que el valor del parámetro B no cambió (por haber sido pasado por valor). Ejemplo 6: Cálculo de las raíces de una ecuación de 2do. grado Enunciado Dados tres valores reales a, b y c correspondientes a los coeficientes de la ecuación de 2do. grado ax 2 + bx + c, se quiere calcular las raíces de dicha ecuación, ya sean reales o imaginarias. Análisis La solución del problema consiste en primero verificar que los valores dados efectivamente representen los coeficientes de una ecuación de 2do. grado, esto es el valor a debe ser diferente de cero. Una vez realizada esta verificación se debe determinar las condiciones bajo las cuales se tienen soluciones reales o imaginarias y en un primer nivel de abstracción, se especificaran dos procedimientos llamados: SolucionesReales y SolucionesImaginarias, que calculan las soluciones reales o imaginarias respectivamente. El segundo nivel de abstracción consiste en el desarrollo de los procedimientos antes descritos.

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

19

CENEAC - Programación con C++ Nivel 1.

Solución: Algoritmo Principal // algoritmo que llama a los procedimientos SolucionesReales y SolucionesImaginarias para calcular las raíces de // una ecuación de segundo grado Real a, b, c, d, r1, r2, i1, i2; // declaración de las variables del algoritmo Escribir(“Suministre los valores de los coeficientes a, b y c de la ecuación.”); Si

a=0

Leer(a, b, c);

entonces

Escribir(“Datos de Entrada Inválidos”); sino d = B ** 2 – 4 * A * C; si

d >= 0 entonces SolucionesReales( a , b , d , r1 , r2 ); Escribir(“Las raíces reales de la ecuación son r1= ” + r1 + ” y r2= ” + r2);

sino SolucionesReales( a , b , d , r1 , i1 , r2 , i2 ); Escribir(“Las raíces reales de la ecuación son r1= ” + r1 + ” , r2= ” + r2 + “ y raíces imaginarias son i1= ” + i1 + ” , i2= ” + i2); FinSi; FinSi;

Léxico del Algoritmo Principal real a, b, c: Variables que nominan a los valores de entrada. real d : Variable para almacenar el valor del discriminante de la ecuación. real r1, r2, i1, i2: Variables que nominan a las raíces de la ecuación. procedimiento SolucionesReales(a,b,d,r1,r2): Calcula las raíces reales de una ecuación de 2º procedimiento solucionesImaginarias(a,b,d,r1,i1,r2,i2): Calcula la raíces reales y las imaginarias de una ecuación de 2º Observe que en el algoritmo anterior se utilizan dos procedimientos sin haberlos desarrollado, sólo los invocamos o llamamos en el cuerpo de instrucciones del algoritmo, esto permite solucionar el problema en un primer nivel de abstracción. La solución definitiva y completa se obtendrá cuando se desarrollen los siguientes procedimientos. Definición del Procedimiento SolucionesReales(a,b,d,r1,r2) Procedimiento SolucionesReales (Real A, B, D, Var Real X1, X2) // Calcula las raíces reales de una ecuación de 2do. grado Real R, P; // declaramos variables propias o locales del procedimiento SolucionesReales R

= D ** (1/2) / (2 * A);

P

= -B / (2 * A);

X1 = P + R;

X2 = P – R;

FinProcedimiento SolucionesReales;

Léxico del Procedimiento SolucionesReales real A, B, D: Parámetros formales pasados por valor, contienen a los valores de entrada al procedimiento Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

20

CENEAC - Programación con C++ Nivel 1.

real X1, X2: Parámetros formales pasados por referencia, contienen a los valores de las raíces reales de la ecuación de 2do. grado. real P, R: Variables auxiliares para el cálculo. Definición del Procedimiento SolucionesImaginarias(a, b, d, r1, i1, r2, i2) Procedimiento SolucionesImaginarias (Real a, b, d, Var Real r1, i1, r2, i2) // Calcula las raíces reales y las imaginarias de una ecuación de 2do. grado R

= -D ** (1/2) / (2 * A);

P

= -B / (2 * A);

R1 = P ; I1  R; R2 = P ; I2  -R; FinProcedimiento SolucionesImaginarias;

Léxico del Procedimiento SOLUCIONES_ IMAGINARIAS real A,B,D: Parámetros formales pasados por valor, contienen a los valores de entrada al procedimiento real R1, I1, R2, I2:Parámetros formales pasados por referencia, contienen a los valores de las raíces imaginarias de la ecuación de 2do. grado. real P,R: Variables auxiliares para el cálculo. Ejemplo 7: Cálculo de una función matemática Enunciado Dados dos valores reales a y b, se quiere construir un algoritmo para evaluar la siguiente función matemática: y = 8x3 + 3x

si x > 1

y = -3x + 1

si x  1

sobre cada uno de los valores de entrada, así como también sobre la suma de ambos. Análisis La solución se basa en la definición de una función que implemente la función matemática dada y que se aplique a cada uno de los valores de entrada así como también a la suma de ambos. La función se debe realizar de tal forma que permita calcular el valor resultante de la evaluación de la función matemática dada. Este valor será retornado al algoritmo en el nombre de la función. Solución: Algoritmo Principal // invoca o llama a una función matemática Real A, B, FA, FB, FAB; // declaración de las variables del algoritmo Escribir(“Suministre los valores de entrada A y B a evaluar.”); FA

= FUNCMAT(A);

FB

= FUNCMAT(B);

Leer(A, B);

FAB = FUNCMAT(A+B); Escribir(“El valor de la función para A es: ” + FA); Escribir(“El valor de la función para B es: ” + FB); Escribir(“El valor de la función para A + B es: ” + FAB);

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

21

CENEAC - Programación con C++ Nivel 1.

Léxico del Algoritmo Principal real A, B: Variables que nominan a los valores de entrada. real FA, FB, FAB: Variables que nominan los resultados de evaluar la función en los valores indicados. función FUNCMAT (X): Evalúa la función matemática dada. Definición de la Función FUNCMAT(X) Función FUNCMAT (Real X): Real // Evalúa la función matemática según el valor de X Real Y; // variable local de FUNCMAT utilizada para guardar el resultado de la evaluación de cada función Si X > 1 entonces Y

= 8 * X ** 3 + 3 * X;

Y

= -(3 * X) + 1;

sino Fsi; Retornar(Y); FinFunción FUNCMAT;

Léxico de la Función FUNCMAT real X: Parámetro formal pasado por valor, contiene el valor sobre el cual se desea evaluar la función matemática dada real Y: Variable auxiliar para el cálculo.

1.5.4. Alcance: Variables Locales y Variables Globales Las variables utilizadas en el algoritmo principal y en los procedimientos se clasifican en variables locales y variables globales. Una variables local es aquella que está declarada y definida dentro de un procedimiento o función (subprograma), así esta variable será considerada como diferente de otras variables con el mismo nombre declaradas en el algoritmo principal o en otros procedimientos y funciones. La variable tendrá validez en el subprograma en que está definida. Cuando otro subprograma utiliza el mismo nombre se refiere a una posición de memoria diferente y por ende a otra variable. Una variable global es aquella que está declarada en el algoritmo principal, del que dependen todos los subprogramas. El uso de variables locales tiene muchas ventajas, siendo una de las más importantes la de que los subprogramas se hacen independientes, estableciéndose la comunicación entre el algoritmo principal y los subprogramas a través de los parámetros únicamente. Esto conlleva a que para utilizar un subprograma (procedimiento o función) sólo se necesita saber lo que hace y no como lo hace. Esta característica hace posible dividir grandes proyectos en partes independientes más pequeñas y de esta forma varios programadores podrán contribuir a encontrar la solución trabajando independientemente. En un algoritmo simple con un subprograma, cada variable es o bien local al procedimiento o global al algoritmo completo. Sin embargo, si el algoritmo incluye subprogramas que a su vez contiene a otros subprogramas -subprogramas anidadosentonces la noción de global y local cambia a una forma más general. El alcance de un identificador (constante, variables o subprograma) es la parte de algoritmo donde se conoce el identificador, esto es: si están definidas localmente a un subprograma su alcance se confina a cualquier subprograma que esté dentro del subprograma donde están definidas, a menos que la variable sea redefinida. En la siguiente figura, se ilustra el concepto de alcance. Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

22

CENEAC - Programación con C++ Nivel 1.

Identificadores (*) Son accesibles

A

definidos en:

B C

D E F

G

desde:

A

A,B,C,D,E,F,G

B

B,C

C D

C D,E,F,G

E

E,F,G

F

F

G

G

Excepto que sean redefinidos dentro del procedimiento (*) Identificadores: variables, constantes, acciones y funciones.

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

23

CENEAC - Programación con C++ Nivel 1.

TEMA 2. CREACIÓN DE PROGRAMAS EN C++ 2.1.

Introducción al Lenguaje, origen y principales características

La historia del lenguaje de programación C++ comienza a principios de los años 70, con un programador de nombre Dennis Ritchie que trabajaba en los laboratorios de AT&T Bell. Trabajando con un lenguaje llamado BCPL inventado por Martin Richards (que luego influyó para crear el B de Ken Thompson), Ritchie deseaba un lenguaje que le permitiese manejar el hardware de la misma manera que el ensamblador pero con algo de programación estructurada como los lenguajes de alto nivel. Fue entonces que creó el C que primeramente corría en computadoras PDP-7 y PDP-11 con el sistema operativo UNIX. Pero los verdaderos alcances de lo que sería éste, se verían poco tiempo después cuando Ritchie volvió a escribir el compilador C de UNIX en el mismo C, y luego Ken Thompson (diseñador del sistema) escribió UNIX completamente en C y ya no en ensamblador. Al momento de que AT&T cedió (a un precio bastante bajo) el sistema operativo a varias universidades, el auge de C comenzaba. Cuando fueron comerciales las computadoras personales, empezaron a diseñarse varias versiones de compiladores C, éste se convirtió en el lenguaje favorito para crear aplicaciones. En 1983, el Instituto Americano de Normalización (ANSI) se dio a la tarea de estandarizar el lenguaje C, aunque esta tarea tardó 6 años en completarse, y además con la ayuda de la Organización Internacional de Normalización (ISO), en el año de 1989 definió el C Estándar. A partir de éste, se dio pie para evolucionar el lenguaje de programación C. Fue en los mismos laboratorios de AT&T Bell, que Bjarnes Stroutstrup diseñó y desarrolló C++ buscando un lenguaje con las opciones de programación orientada a objetos. Bjarne Stroustrup crea una versión experimental denominada "C with Classes" hacia 1979, con la intención de proporcionar una herramienta de desarrollo para el kernel Unix en ambientes distribuidos. En particular, Stroustrup consideraba que ciertas características del lenguaje Simula (notablemente su orientación a objetos) eran útiles en desarrollos de software complejos. Es así como decide extender el lenguaje C. El nombre C++ fue propuesto por Rick Mascitti en el año 1983, cuando el lenguaje fue utilizado por primera vez fuera de un laboratorio científico. Antes se había usado el nombre "C con clases". La expresión "C++" significa "incremento de C" y se refiere a que C++ es una extensión de C. En 1985 Stroustrup publica la primera edición del libro "The C++ Programming Language" que sirvió de estándar informal y texto de referencia. Posteriormente el lenguaje fue estandarizado (ISO C++) y paralelamente son publicadas la segunda y tercera ediciones de "The C++ Programming Language" de modo tal que reflejan estos cambios. Desde sus inicios, C++ intentó ser un lenguaje que incluye completamente al lenguaje C (quizá el 99% del código escrito en C es válido en C++) pero al mismo tiempo incorpora muchas características sofisticadas no incluidas en aquél, tales como: Programación Orientada a Objetos, manejo de excepciones, sobrecarga de operadores, plantillas. La base del lenguaje fue creada por programadores y para programadores, a diferencia de otros lenguajes como Basic o Cobol que fueron creados para que los usuarios resolvieran pequeños problemas de sus computadores y el segundo para que los no programadores pudiesen entender partes del programa. Es un lenguaje de nivel medio porque combina la programación estructurada de los lenguajes de alto nivel con la flexibilidad del ensamblador. A continuación se clasifican según su nivel algunos de los lenguajes de programación más conocidos:1 

Alto nivel: Ada, Modula-2, Pascal, Cobol, Fortran, Basic



Nivel medio: Java, C++, C, Forth, Macroensamblador



Nivel bajo: Ensamblador

Muchos compiladores de C++ están orientados hacia el desarrollo para entornos gráficos como Windows y Linux. El sistema operativo Windows en sus versiones 98 y XP, por ejemplo, está escrito casi completamente en C, incluso cuando la compañía Microsoft creó el compilador Visual C++. 1

Fuente: Herbert Schildt. C Manual de Referencia.

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

24

CENEAC - Programación con C++ Nivel 1.

C++ es un superconjunto de C, cualquier compilador de C++ debe ser capaz de compilar un programa en C. De hecho la mayoría admite tanto código en C como en C++ en un archivo. Cuando se compila código C en un compilador C++ este debe cumplir con los estándares definidos en 1989, cualquier palabra definida en el estándar de 1999 no funcionará. La evolución de C++ continúa. Es un lenguaje influenciado por C y Simula y a su vez ha influido en los lenguajes Ada, C#, Java, PHP, D, Perl. Entre las implementaciones más usadas de este lenguaje destacan GNU Compiler Collection, Microsoft Visual C++, Borland C++ Builder, Dev-C ++, C++ Free. Ha sido estandarizado y actualizado a través de las versiones ISO C++, ANSI C++ 1998 y ANSI C++ 2003. Entre los lenguajes asociados a C destacan: 

C++ Builder: Creado por la empresa Inprise, reconocida por la calidad de sus herramientas de desarrollo. Por ejemplo, llevan la firma Borland, quien ha desarrollado Borland C++, Intrabuilder, JBuilder, Delphi, C++ Builder. C++ Builder surgió de la fusión de dos tecnologías: Borland C++ que soporta el lenguaje C++ estándar con todas sus novedades, y el entorno RAD de Delphi.



Visual C++: En el año de 1992, la compañía Microsoft introduce C/C++ 7.0 y la biblioteca de clases MFC, los cuales tenían la finalidad de que el desarrollo de aplicaciones para Windows, escritas en C, fuera más fácil. Sin embargo, no resultó como esperaban, así que un año más tarde fue creado Visual C++ 1.0, que parecía más amigable a los desarrolladores, porque tenía una versión mejorada de las clases MFC. Con Visual C++ se introdujo una tecnología de desarrollo a base de asistentes. En general es un entorno de desarrollo diseñado para crear aplicaciones gráficas orientadas a objetos.



C#: Este lenguaje es una evolución de C y C++. Creado por Microsoft y presentado como Visual C# en el conjunto de Visual Studio .NET. Está diseñado para crear una amplia gama de aplicaciones empresariales. La biblioteca para programar en este lenguaje es .NET Framework. El lenguaje es simple, moderno, y está orientado a objetos. El código de C# se compila como código administrado, lo que significa que se beneficia de los servicios de Common Language Runtime. Estos servicios incluyen la interoperabilidad entre lenguajes, la recolección de elementos no utilizados, mayor seguridad y mejor compatibilidad entre las versiones.



Java: El lenguaje de programación Java fue creado a partir de C++, como una plataforma para desarrollo de sistemas de información para Internet y para aparatos electrodomésticos. Poco tiempo después de su liberación (en 1995), se empiezan a ver las capacidades de este lenguaje. Pronto deja de ser un lenguaje que sólo se usaba en Internet, y empiezan a crearse programas completos con él. El lenguaje es orientado a objetos y multiplataforma, esto quiere decir que el código se puede transportar a diferentes sistemas operativos y ejecutarse en ellos por medio de la maquina virtual de Java. Al igual que con C++ existen varios compiladores para este lenguaje como lo son JBuilder y Visual J++ (ahora evolucionado a J#).

Entre las principales ventajas de C++ destacan: 

Lenguaje de programación orientado a objetos.



Lenguaje muy didáctico, facilita el aprendizaje posterior de C#, Java, Visual Basic, Javascript, PHP, entre otros.



Muy potente en lo que se refiere a creación de sistemas complejos, un lenguaje muy robusto, permite elaborar desde aplicaciones sencillas hasta sistemas operativos.



Actualmente, puede compilar y ejecutar código de C, ya que incluye librerías para realizar esta labor.



Existe un amplio grupo de apoyo para programadores y desarrolladores, ya que es un lenguaje muy empleado, hay mucho contenido didáctico en tutoriales en línea y libros, existe una gran fuente de códigos ya desarrollados en C++ que pueden ser reutilizados.

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

25

CENEAC - Programación con C++ Nivel 1.

2.2.

Elementos de un programa

A continuación mostramos un ejemplo de la estructura básica de un programa en C++: Ejemplo 1. Estructura básica de un programa #include using namespace std; int main () { // mostramos un mensaje por salida estándar cout << "primer programa en C++"; return 0; }

declaración de librerías espacio de nombres estándar de C++ inicio del bloque de código de la función principal comentario secuencia de instrucciones valor de retorno de la función llaves de cierre del bloque de código

Análisis de la estructura del programa: using namespace std;

El espacio de nombres estándar (namespace std) evita que los programadores utilicen los mismos nombres de funciones y acciones ya incluídas en C++

#include

Se refiere a la biblioteca de funciones que vamos a utilizar en el programa. Para llamar a una biblioteca en particular se utiliza #include es la biblioteca que permite el uso de las instrucciones de lectura y escritura estándar cout y cin. iostream

#include es el equivalente a la unión de las instrucciones using namespace std; y #include pero está aceptado en el estándar actual de

programación en C++. int main () {

Todo programa en C++ comienza con una función main() y sólo puede haber una. En C++ el main() siempre regresa un entero, es por eso se antepone int a la palabra main. Los paréntesis que le siguen pueden contener los parámetros de la función o estar vacíos. La llave que se abre significa que se iniciará un bloque de instrucciones.

// texto del comentario

// se utiliza para escribir comentarios de una sóla línea /* */

se utiliza para comentarios de varias líneas

es una instrucción de la biblioteca iostream, se utiliza para mostrar un mensaje por la salida estándar que suele ser la pantalla o la línea de comandos. \n indica salto de línea, es equivalente a endl;

cout << "primer programa en C++\n";

cout

return 0;

Valor de retorno de la función y llave de cierre del bloque de código.

}

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

26

CENEAC - Programación con C++ Nivel 1.

En forma más completa, la estructura general de un programa en C++ incluye: // Documentación del programa: identificación de su autor, fecha, versión y una breve descripción /*--------------------------------------------------------- */ | Autor:

|

| Fecha:

Versión: 1.0

|---------------------------------------------------------

| |

| Descripción del Programa:

|

|

|

| ---------------------------------------------------------- */ // Declaración de librerías de C++ incluídas, declaración del uso del espacio de nombres #include using namespace std; // Zona de Declaración de Constantes // Zona de Declaración de Tipos // Zona de Cabeceras de Procedimientos y Funciones // Programa Principal int main() { // Zona de Declaración de Variables del Programa principal // Zona de instrucciones // Zona de impresión de resultados ( cout << "resultados del programa:

\n"; )

system("Pause");

// Hace una pausa cuando el programa es ejecutado, permitiendo ver los resultados

return 0;

// Valor de retorno

}

// Implementación de Procedimientos y Funciones

…. // declaración e instrucciones de los Procedimientos y Funciones

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

27

CENEAC - Programación con C++ Nivel 1.

2.3.

Identificadores y Palabras reservadas en C++

C++ es sensible al uso de mayúsculas y minúsculas, por lo tanto si el nombre de un programa, variable o constante empieza con una letra en mayúsculas/minúsculas, debemos de asegurarnos que durante el resto del código nos refiramos a ella exactamente como la escribimos la primera vez. Los nombres de las variables no pueden usar signos de puntuación, sólo caracteres “A-Z”, “a-z”, “_“, “0-9”, aunque no deben comenzar con un número (0-9). No se deben de repetir nombres de variables en el mismo contexto. También hay restricciones respecto a las palabras reservadas, la cuales no pueden utilizarse como nombres de variables, funciones u otros elementos definidos por el programador. Las principales palabras reservadas se muestran a continuación. Tabla 1. Palabras Reservadas en C++

and bitor class default else false if namespace or register sizeof template typedef using while

2.4.

and_eq bool compl. delete enum float inline new or_eq reinterpret_cast static this typeid virtual xor

asm break const do explicit for int not private return static_cast throw typename void xor_eq

auto case match const_cast double export friend long not_eq protected short struct true union volatile

bitand char continue dynamic_cast extern goto mutable operator public signed switch try unsigned wchar_t

Tipos de datos básicos en C++

Los tipos de datos básicos o atómicos son los tipos de datos más sencillos, a partir de los cuales se pueden construir otros más complejos. La tabla ilustra estos tipos con sus intervalos de valores posibles y el número de bytes que ocupan. Tabla 2. Tipos de datos básicos en C++

Tipo

Tamaño en bytes

Intervalo

short

2

-32768 a 32767

unsigned short

2

0 a 65535

long

4

-2147483648 a 2147483647

unsigned long

4

0 a 4294967295

int

dependiendo del compilador utilizado podría ser 2 o 4

-32768 a 32767

continua … Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

28

CENEAC - Programación con C++ Nivel 1.

Tipo

Tamaño en bytes

Intervalo

unsigned int

2o4

0 a 65535

float

4

1.17549535e-38 a 3.402823466e+38 con 8 cifras decimales

double

8

2.2250738585072014e-308 a 1.7976931348623158e+308 con 16 cifras decimales

long double

10

char

1

-128 a 127

unsigned char

1

0 a 255

bool

1

Valor lógico o booleano que puede ser true (verdadero) o false (falso) Nota: en algunas implementaciones de C++ no se dispone del tipo bool, en su lugar se usan variables tipo int, usando 0 para indicar falso y 1 para indicar verdadero.

La biblioteca indica las constantes definidas para los intervalos que pueden almacenar algunos tipos de datos. El siguiente ejemplo es un programa que nos muestra los límites de los principales tipos.

Ejemplo 2. Límites de los tipos de datos básicos usando la librería limits #include #include using namespace std; int main( ){ // intervalos o límites de algunos tipos de datos cout << "Muestra los valores minimos y maximos de alguno de los tipos de datos \n"; cout << "\n int minimo: " << INT_MIN << " int maximo: " << INT_MAX; cout << "\n char minimo: " << CHAR_MIN << " char maximo: " << CHAR_MAX; cout << "\n tamaño en bits: " << CHAR_BIT; cout << "\n long minimo: " << LONG_MIN << " long maximo: " << LONG_MAX; cout<<"\n short minimo: " << SHRT_MIN << " short maximo: " << SHRT_MAX << "\n\n"; system("Pause");

// Pausa que permite ver los resultados

return 0; }

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

29

CENEAC - Programación con C++ Nivel 1.

2.5.

Variables, Constantes, Operaciones básicas, Expresiones y Prioridad de Operadores

VARIABLES Y CONSTANTES Una variable es una posición de memoria con nombre, que se usa para mantener un valor que puede ser modificado por el programa. Una constante es una variable cuyo valor no puede ser modificado. Las variables son declaradas, usadas y liberadas. Una declaración se encuentra ligada a un tipo de dato, a un nombre y a un valor. La sintaxis general de la declaración de una variable es:

tipo nombre [=valor];

La sintaxis general de la declaración de una constante es:

const tipo nombre = valor;

Ejemplos: int miNum = 5; declara una variable de tipo entero llamada “miNum” a la cual se le asigna el valor 5 const float pi=3.141592; const char inicial=’A’;

declara una constante de tipo real llamada “pi” a la cual se le asigna 3.141592

declara una constante de tipo carácter llamada “inicial” a la cual se le asigna A

Los corchetes significan que la inicialización es opcional. Existe un tipo de constante, llamado constante declarada o simbólica, la cual se definen asociando un nombre a un valor a través de la sintáxis #define nombre_constante valor, por ejemplo, #define PI 3.141592 Las variables se pueden declarar en tres sitios básicos: dentro de las funciones (ya sea la función main u otras creadas por el programador), las cuales son llamadas variables locales; en la definición de parámetros de una función, como se verá más adelante; y fuera de todas las funciones, la cuales son llamadas variables globales. En C++ una variable puede ser declarada e inicializada en cualquier lugar del programa, sin embargo, se recomienda y es una buena práctica declararlas al inicio del programa. Siempre deben ser declaradas antes de usarlas.

Ejemplo 3. Declaración y uso de variables

Ejemplo 4. Declaración y uso de constantes

#include

#include

using namespace std;

using namespace std;

int variable_global=10;

int main()

int main()

{ // calcula el área de un círculo

{ // declaración y uso de variables int variable_local=20;

// declaraciones

cout << "El valor de la variable global es: "\

const float pi=3.141592;

<< variable_global << " \n"; cout << "El valor de la variable local es: "\

int radio=5; float area;

<< variable_local << " \n"; // calculos variable_local = variable_global;

area=pi*radio*radio;

cout << "Ahora el valor de la variable local es: "\ << variable_local;

// resultados cout << "el area del circulo de radio "\

cout << "\n \n"; system("Pause");

<
return 0; }

cout << "\n \n"; system("Pause"); return 0; }

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

30

CENEAC - Programación con C++ Nivel 1.

Una variable global puede ser modificada en cualquier parte del programa, mientras que una variable local sólo puede ser modificada y utilizada dentro de la función en la que se ha declarado. Por supuesto, antes de utilizar una variable y hacer operaciones con ella, hay que declararla. Por lo general, siempre se trata de utilizar lo menos posible la declaración de variables globales. El siguiente ejemplo muestra que se pueden declarar variables en cualquier parte del programa, siempre y cuando se declaren antes de usarlas. Una vez que tenemos la variable declarada, podemos asignarla valores e introducirla en expresiones o como parámetro de funciones. OPERACIONES BÁSICAS Y EXPRESIONES Los programas de computación se apoyan principalmente en el uso de expresiones que combinan el uso de distintas variables y operadores a fin de resolver cálculos matemáticos o comparaciones. En C++ los operadores más usados son los de asignación, arirméticos, lógicos, relacionales, condicionales. A continuación se muestran tablas resumen de estos operadores y ejemplos de su uso. Tabla 3. Operadores Abreviados de Asignación en C++

Operador

Uso

Descripción

=

a=b

Asigna el valor de b a la variable a

*=

a *= b

Multiplica a por b y asigna el resultado a la variable a

/=

a /= b

Divide a entre b y asigna el resultado a la variable a

%=

a %= b

Divide a entre b y el resto de la división se lo asigna a la variable a

+=

a += b

Suma a con b y asigna el resultado a la variable a

-=

a -= b

Resta b de a y asigna el resultado a la variable a

Tabla 4. Equivalencia de operadores Abreviados de Asignación

Operador

Sentencia abreviada

Sentencia no abreviada

*=

a *= b

a=a*b

/=

a /= b

a =a / b

%=

a %= b

a=a%b

+=

a += b

a=a+b

-=

a -= b

a=a-b

Tabla 5. Operadores Aritméticos

Operador

Tipos enteros

Tipos reales

Ejemplo

+

Suma

Suma

9+3

-

Resta

Resta

7-3

*

Producto

Producto

11 * 10

/

División entera: cociente (div)

División en coma flotante

8/3

%

División entera: resto (mod)

División en coma flotante

12 % 4

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

31

CENEAC - Programación con C++ Nivel 1. Tabla 6. Operadores de incrementación (++) y decrementación (--)

Incremetación

Decrementación

++n

--n

Equivalente a:

Equivalente a:

n +=1

n -=1

n =n + 1

n =n - 1

Tabla 7. Operadores Relacionales en C++

Operador

Significado

Ejemplo

==

Igual a

a=b

!=

No igual a

a != b

>

Mayor que

a>b

<

Menor que

a
>=

Mayor o igual que

a >= b

<=

Menor o igual que

a <= b

En C++ los operadores aritméticos y relacionales no son de uso exclusivo de los tipos de datos numéricos. Un dato tipo char también es modificable mediante operadores arirméticos y puede ser comparado con otro carácter usando operadores relacionales. Esto se debe a que en C++, cuando se guarda un dato en una variable de tipo char, realmente lo que se está guardando es el código numérico ASCII correspondiente al carácter. Por ejemplo, para la declaración char letra = ‘A’ realmente se está almacenando el valor 65 en la variable letra, para ‘a’ se estaría almacenando el valor 97 en la variable. Los operadores relacionales sirven para comprobar una condición y se usan normalmente en sentencia de selección (if) y de iteración (for, while). Los operadores relacionales de la tabla 7 se pueden usar con variables de los tipos básicos: char, int, float, double, entre otras. Además de los operadores aritméticos y relacionales, se tienen los operadores lógicos o booleanos. Se utilizan en las expresiones para devolver un valor verdadero (cualquier entero distinto de 0, generalmente 1) o un valor falso (0, cero). Los operadores lógicos en C++ son not (!), and (&&) y or (||). El operador lógico de negación ! (not, no) produce falso si su operando es verdadero y viceversa. El operador lógico && (and, y) produce verdadero sólo si ambos operandos son verdaderos (distintos de 0); si cualquiera de los operadores es falso, produce falso. El operador lógico || (or, o) produce verdadero si cualquiera de lo operandos es verdadero (distinto de 0) y produce falso sólo si ambos son falsos (igual a cero). Tabla 8. Operadores Lógicos en C++

Operador

Operación lógica

Ejemplo

! (negación)

No lógico

!(a >= b)

&& (y)

oper1 && oper2

a < b && b < 10

|| (o)

oper1 || oper2

a = b || b != c

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

32

CENEAC - Programación con C++ Nivel 1.

Los paréntesis se usan para indicar explícitamente el orden y prioridad en que debe ser evaluada una expresión. Al igual que en las operaciones tradicionales, los paréntesis sirven para agrupar o asociar expresiones e indicar en una prioridad especial para ser evaluadas. Si los paréntesis están anidados se evalúan en primer lugar los más internos. C++ también dispone del operador condicional, (? : ;) el cual es un operador ternario que devuelve un resultado cuyo valor depende de la condición probada. Al ser un operador ternario requiere tres operandos: expresión_condicional ? expresión_verdadera : expresión_falsa;

Se utiliza para reemplazar y abreviar el uso del condicional si - sino (if - else). Se evalúa la expresión_condicional, si su resultado es verdadedo (distinto de cero) se ejecuta la expresión verdadera, si el resultado de la evaluación es falso (cero), se ejecuta la expresión falsa. Tabla 9. Operador Condicional (precio > 150) ? descuento = 0.05 : descuento = 0.10 Si precio es mayor que 150

Si precio no es mayor que 150

descuento = 5%

descuento = 10%

Ejemplo 5. Uso de operadores aritméticos

Ejemplo 6. Uso de operadores relacionales

#include

#include

using namespace std;

using namespace std;

int main( ){

int main () {

// muestra el uso de operadores aritméticos

/* uso de operadores relacionales y lógicos */ int a = 2, b = 5, c = 4;

int a=5, b=10, c=20, r=2;

char letra1 = 'e', letra2 = 'f';

cout << "antes de las operaciones: \n";

cout << "Operadores sobre variables numericas \n";

cout << " a=" <
<< " c=" <
<< " y c: " << c << "\n \n"; cout << "comparando por desigualdad a y b, "\

a = c % r; // se calcula c mod r, resto de 20/15 c += b;

"resultado: " << (a == b) << " (0 es falso) \n\n"; a += 2;

a = a * 2; cout << "Operadores sobre variables caracter \n"; cout << "despues de las operaciones: \n";

cout << "Valores, letra1: " << letra1 \

cout << " a=" <

<< " c=" <
cout << "comparando ambas letras " \

return 0;

"resultado: " << (letra1 == letra2) << " (1 es verdadero) \n\n";

}

cout << "\n \n"; system("Pause"); return 0; }

PRIORIDAD DE LOS OPERADORES Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

33

CENEAC - Programación con C++ Nivel 1.

La prioridad o precedencia de operadores determina el orden en el que se aplican los operadores a un valor. C++ agrupa a los operadores en 16 grupos. Los operadores del grupo 1 tienen mayor prioridad que los del grupo 2, y así sucesivamente. Al aplicar la prioridad se debe considerar:  Si dos operadores se aplican al mismo operando, el operador con mayor prioridad se aplica primero.  Todos los operadores del mismo grupo tienen igual prioridad y asociatividad.  La asociatividad izquierda-derecha (I-D) significa aplicar el operador más a la izquierda primero.  La asociatividad derecha-izquierda (D-I) significa aplicar el operador más a la derecha primero.  Los paréntesis tiene la máxima prioridad. Tabla 10. Grupos de Prioridad de Operadores en C++

Grupo Operadores 1

:: x - rel="nofollow"> [] ()

2 3

++ -- ~ ! - + & * sizeof .* ->*

4

* / %

5

+ -

6

<< >>

7

< <= > >=

8

== !=

9

&

10

^

11

|

12

&&

13

||

14

?: (expresión condicional)

15

= *= /= %= += -= <<= >>= &= ||= ^= , (operador coma)

16

Asociat. I-D D-I I-D I-D I-D I-D I-D I-D I-D I-D I-D I-D I-D D-I D-I I-D

Tabla 1. Principales Operadores (continuación)

Símbolo + & * sizeof new delete / % + << >> < <= >

Tabla 11. Principales Operadores

Símbolo :: ++ -() [] -> . ++ -! ~

Significado Resolución de alcance incremento sufijo decremento sufijo llamada a función elemento de tabla acceso a miembro desde un puntero acceso a miembro incremento prefijo decremento prefijo negación lógica complemento a uno continúa 

>= == != & ^ | && || = *= /= %= += -= <<= >>= &= ^= |= ?: trhow ,

Significado cambio de signo (operador unario) identidad (operador unario) dirección seguir un puntero tamaño en bytes reserva de memoria liberación de memoria división resto de la división entera suma resta desplazamiento de bits a la izquierda desplazamiento de bits a la derecha menor que menor o igual mayor que mayor o igual igual desigual conjunción (Y) de bits O exclusivo de bits O inclusivo de bits conjunción (Y) lógica disyunción (O) lógica asignación simple asignaciones compuestas

expresión condicional lanzamiento de excepción separador de expresiones

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

34

CENEAC - Programación con C++ Nivel 1.

2.6.

Operaciones Básicas de Entrada (Lectura) y Salida (Escritura)

En C++ las operaciones básicas para los flujos de entrada (cin>>) y salida (cout<<) forman parte de la librería , razón por la cual, la mayoría de los programas incluyen una llamada a esta librería en su encabezado. Estas dos instrucciones de E/S nos permiten leer valores suministrados por el usuario (cin>>) y mandar mensajes a la pantalla (cout<<). Cuando usamos la instrucción: cout<<”Mensaje a la pantalla”<<endl; Estamos enviando una cadena de caracteres (“Mensaje a la pantalla”) al dispositivo de salida estándar (la pantalla). Luego, el manipulador de flujo endl da el efecto de la secuencia de escape o salto de línea ‘\n’. La instrucción cout<< puede imprimir tanto números enteros como flotantes sin necesidad de decirle específicamente el tipo de datos del que se trata. Las cadenas de caracteres a imprimir deben de estar entre comillas dobles. A continuación tenemos un ejemplo con el uso de las operaciones estándar de entrada y salida:

Ejemplo 7. Lectura y Escritura de datos con cin>> y cout<< #include using namespace std; int main(){ // lectura y escritura estándar int n1; float n2; cout<< "Por favor, suministre un valor entero" <<endl; cin>> n1; cout<< "suministre ahora un valor real (recuerde usar . para la parte decimal)" <<endl; cin>> n2; cout<< "2 + " <
En resumen, cin es el flujo de entrada asociado al teclado, cout es el flujo de salida estándar asociado a la pantalla. En el caso de que se presenten errores, se utiliza cerr, que es el flujo de error estándar asociado a la pantalla. Los operadores << y >> son operadores de inserción y extracción de flujo respectivamente. Estos operadores son muy eficaces porque no es necesario especificar formatos para presentación o lectura, ellos los presentan en función al tipo de datos de la variable.

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

35

CENEAC - Programación con C++ Nivel 1.

2.7.

Conversion de tipos y Modificadores de formato

Conversión Implícita. En C++, y otros lenguajes, las variables de los tipos de datos básicos pueden ser mezclados libremente en asignaciones y expresiones. Las conversiones de un tipo de dato a otro se ejecutan automáticamente, proceso llamado conversión implícita de datos. Los operandos de tipo más bajo se convierten a los de tipo más alto, por ejemplo, en la suma de un entero (int) y un real (float), el entero es transformado automáticamente a real. Las reglas que se aplican para realizar la conversión implícita de datos son: (promoción integral de tipos) 

Cualquier operando de tipo char, short o enumerado se convierte al tipo int.



Si los operandos tienen diferentes tipos, la siguiente lista determina a que tipo se convertirá el resultado: int → unsigned int → long → unsigned long → float → double → long double

El tipo que viene primero en la lista se convierte al que viene segundo y así sucesivamente. También se aplica conversión de tipos en las asignaciones, cuando la variable receptora es de distinto tipo que el resultado de la expresión de la derecha. En el caso de las asignaciones, cuando la conversión no implica pérdida de precisión porque se pasa de un tipo menor a uno mayor se hala de promoción de tipos. Cuando hay pérdida de precisión, las conversiones se conocen como democión de tipos. El compilador normalmente emite un aviso o warning, cuando se hace una democión implícita, es decir cuando hay una democión automática. Conversión Explícita. En este lenguaje se fuerza la conversión de tipos mediante el proceso de casting (o “moldeo”). El casting admite en C++ dos formatos: (<nombre de tipo>)

// estilo C, por ejemplo, total = (int)10 + (int)5.78;

<nombre de tipo>()

// estilo C++, por ejemplo, total = int(10) + int (5.78);

El operador de conversión explícita o cast tiene la misma prioridad que los operadores unitarios (- + !), es decir, pertenecen al grupo de la segunda prioridad más alta.

Ejemplo 8. Ejemplo de conversión implícita y explícita de datos #include using namespace std; int main(){ // uso de la conversión de datos char a='Z'; int n1; float n2, n3; cout<< "Por favor, suministre un valor entero" <<endl; cin>>n1; cout<< "suministre un valor real" <<endl;

cin>>n2;

n3 = n1 + n2 + a; cout<< "convertido a int n3 = n1+n2+a es igual a: " <
Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

36

CENEAC - Programación con C++ Nivel 1.

Modificadores o Manipuladores de Formatos. Otra de las herramientas para la especificación de formatos son los manipuladores de flujos, así como el manipulador de flujo “endl” da una secuencia de escape, los manipuladores o convertidores de base dec, oct y hex, hacen que la variable a la que le anteceden sea presentada en formato decimal, octal o hexadecimal respectivamente. Estos manipuladores de flujo no son exclusivos de la salida, también funcionan con la entrada de datos, por defecto, la entrada desde el teclado se lee en decimal y también la presentación de datos se hace en decimal, así que si se sabe que el usuario dará a la máquina un dato en hexadecimal, sería buena idea anticiparlo y poner el formato en que será leído.

Ejemplo 9. Ejemplo de conversión de bases numéricas #include using namespace std; int main(){ // uso de la conversión de base decimal, hexadecimal y octal int numero; cout<<"suministre un numero: "; cin>> numero; cout<<"numero suministrado transformado a base octal es: "<> hex >>numero; cout<<"el leido vale: "<
En cuanto a la precisión, al imprimir en pantalla un número de tipo flotante, no importa cuantas cifras significativas tenga (mientras esté dentro de los límites de almacenamiento de flotantes), sólo aparecerán 6 números después del punto, y la ultima cifra será redondeada en caso de pasar los 6 dígitos. Es decir, que si queremos mandar a la pantalla el número 1.23456789, en su lugar aparecerá 1.234568. Cuando se quieren resultados más exactos, nos es muy útil la librería que contiene el manipulador setprecision() con el que podemos determinar la precisión con la que queremos que aparezcan esos datos en la pantalla. Existe también la función miembro precision(), que puede resultar un poco más cómoda en algunos casos porque el efecto de precisión funciona para todas las instrucciones cout que le sigan. A ambas se le pasa como parámetro el número de cifras significativas deseadas. Para cambiar la presentación de los datos en la pantalla, por ejemplo, dejar algunos espacios de margen en la pantalla y para indicar la alineación del mensaje de dalida se utilizan las siguientes funciones: 

setw



setfill

que se encarga de hacer aparecer el texto alineado determinados espacios a la derecha, si el numero de espacios solicitados para su alineación es menor que el numero de caracteres que se imprimirán, no tendrá un efecto. se ocupa del carácter de relleno, el carácter por defecto es el espacio en blanco, pero nosotros podemos especificar el que queramos.

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

37

CENEAC - Programación con C++ Nivel 1.

A continuación se muestra un ejemplo de modificación de precisión y formato de relleno de la salida por pantalla:

Ejemplo 10. Ejemplo de cambio de precisión y formato de relleno #include #include using namespace std; int main(){ // modificacion de precision y formato de relleno float num = 1.23456789; cout<
La instrucción setw muestra el texto alineado 5 espacios y en esos espacios se rellenan con el carácter ‘%’. Es necesario el manipulador setw para cada operación de salida en pantalla, mientras que setfill funciona para todas las que se incluyan.

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

38

CENEAC - Programación con C++ Nivel 1.

2.8.

Estructuras de Control Condicional (If, Switch)

Hasta el momento hemos creado programas que se ejecutan de modo secuencia, es decir, una instrucción después de la otra, en el mismo orden en que están escritas en el programa y ejecutándose una sola vez cada instrucción. Esta forma de programar es conveniente para programas sencillos, sin embargo, no nos permite trabajar con problemas donde hay que verificar varias condiciones posibles o donde hay que repetir un grupo de instrucciones varias veces. Las estructuras de control si permiten hacer estos procedimientos, ya que controlan el flujo o secuencia de ejecución del programa. Se dividen en tres grandes grupos: secuencia (secueciamiento), selección (condicional) y repetición (ciclos). A continuación se describen las dos estructuras de control condicional más usadas: If y Switch. If (Si) Se trata de una estructura de selección, que verifica una condición y si se cumple (es verdadero) ejecuta varias instrucciones más.

Ejemplo 11. Uso de la estructura de control If (si) #include using namespace std; int main(){ // verifica si se presenta error de división por cero float divid, divis, res; cout<<"Suministre el dividendo"<<endl; cin >> divid; cout<<"Suministre el divisor"<<endl;

cin >> divis; <<endl;

if (divis == 0) cout <<endl <<"\n Error, el divisor suministrado 0, no puede realizarse la division" <<endl; else { res = divid / divis; cout<<"El resultado de la division es: " <
Igualmente el bloque de instrucciones a ejecutar se estructura dentro de llaves, aunque tampoco es necesario cuando se trata de una sola instrucción. En ocasiones se necesita construir bloques de instrucciones if y else más complejos, es decir anidamientos para verificar si se cumplen varias condiciones, por ejemplos, descartar primero se una persona es mayor o no de edad, y luego para cada caso ejecutar unas instrucciones para las mujeres mayores de edad, las mujeres menores de edad, los hombres mayores de edad y otras para los hombres menores de edad. Este tipo de verificaciones se pueden realizar utilizando If anidado. A continuación mostramos un ejemplo de programa para esta verificación:

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

39

CENEAC - Programación con C++ Nivel 1. Ejemplo 12. Uso de la estructura de control If anidado #include #include using namespace std; int main(){ // uso del if anidado char sexo; int edad; cout <<"Indique la edad de la persona" <<endl; cin >>edad; cout <<"Indique el sexo de la persona (F o M)" <<endl; cin >>sexo; sexo = toupper(sexo); if (edad>=18) if (sexo=='F') cout <<"Mujer mayor de edad" <<endl; // una sola instrucción, no requiere { } else cout <<"Hombre mayor de edad" <<endl; else if (sexo=='F') cout <<"Mujer menor de edad" <<endl; else cout <<"Hombre menor de edad" <<endl; cout <<"\nLos valores suministrados son edad: " <<edad <<" y sexo: " <<sexo <<endl; system("Pause"); return 0; }

A continuación recordamos el uso del operador condicional, el cual simplifica la estructura del if:.

Ejemplo 13. Uso de la operador condicional ( ? : ) para instrucciones condicionales cortas #include using namespace std; int main(){ // uso del operador condicional float nota; cout <<"Indica la calificacion de la materia (incluyendo decimales)" <<endl;

cin >>nota;

cout<< "\nTu definitiva es:" <<nota <<endl; nota = (float(int(nota+0.5))); // redondeamos la nota cout<< "\nTu definitiva redondeada es: " <<nota <<endl; cout<< (int(nota)>=10 ? "\nAprobaste, felicitaciones!" : "\n Reprobaste, tienes que esforzarte mas\n"); system("Pause"); return 0; }

Switch (En caso de) Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

40

CENEAC - Programación con C++ Nivel 1.

Muchas veces nos metemos en aprietos cuando necesitamos tener el control sobre muchas opciones que pudiese tomar el usuario, porque resulta muy complicado pensar en varios if/else anidados, para esos casos tenemos otra herramienta muy cómoda, la estructura de selección múltiple switch. La forma general es: switch (parámetro a evaluar o comparar){ case a : //cuando el parámetro tiene un valor a acciones a ejecutar; case b: //cuando el parámetro tiene un valor b acciones a ejecutar default: acciones a ejecutar en el caso por defecto }

Ejemplo 14. Uso de la estructura switch (En caso de) #include using namespace std; int main(){ int op; // se muestran las opciones al usuario cout<<"

Elija una opcion de la lista"<<endl;

cout<<"

1: sumar notas" <<endl;

cout<<"

2: multiplicar valores" <<endl;

cout<<"

3: promediar precios" <<endl;

// el usuario indica la opcion de su preferecia cin >>op; // se determina que opcion selecciono el usuario switch(op){ case 1: cout<<"se selecciono sumar (1)"<<endl; break; case 2: cout<<" se selecciono multiplicar (2) "<<endl; break; case 3: cout<<" se selecciono promediar (3) "<<endl; break; default: cout<<"no se indico una opcion valida"<<endl; break; } // continua … cout <<endl; cout <<"\n\nHemos salido del switch con la opcion " <
Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

41

CENEAC - Programación con C++ Nivel 1.

system("Pause"); return 0; }

Notemos que “op” es una variable de tipo entero, asi que case 1, se refiere a que la variable “op” tiene un valor de 1. Si se tratase de una variable de tipo carácter, entonces debería de escribirse case ‘1’. Encontramos una nueva instrucción, break. Esta se encarga de alterar el flujo de control. Cuando se encuentra un break, inmediatamente se salta el resto de la estructura. No es exclusiva de la estructura switch, también se puede colocar en bloques de los ciclos iterativos if, for, while o do … while.

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

42

CENEAC - Programación con C++ Nivel 1.

2.9.

Estructuras de Control Iterativo (Ciclos)

Estas estructuras de control o sentencias repetitivas controlan el número de veces que una instrucción o grupo de instrucciones se ejecutan. C++ soporta tres tipos de estructuras de control: for, while y do …while. For (Para) El ciclo for es al que más se recurre cuando se requiere realizar operaciones secuenciales, en donde se conoce el número de iteraciones o la condición a comprobar. La forma general de esta sentencia es: for (asignación inicial ; condición ; instrucción ) { bloque de instrucciones del ciclo; }

Si se trata de una sóla instrucción a ejecutar no es necesario encerrarla entre llaves, incluso puede colocarse esta instrucción dentro del paréntesis del for, separado por una coma. for (asignación inicial ; condicion ; instrucción1)

Si se trata de instrucciones muy cortas se puede utilizar: for (asignación inicial ; condicion ; instrucción1 , instrucción 2)

A continuación mostramos ejemplos del uso del ciclo for para instrucciones cortas:

Ejemplo 15. Uso de la estructura de control Para (for) con instrucciones cortas #include using namespace std; int main() { int i, fin=10, s=0; for (i=0; i0; i--) s += i; cout<<"\nel resultado del segundo for es: " <<s <<endl; system("Pause"); return 0; }

Ejemplo del uso del ciclo for para el cálculo de una sumatoria de valores enteros:

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

43

CENEAC - Programación con C++ Nivel 1. Ejemplo 16. Uso de la estructura de control Para (for) #include using namespace std; int main() { int i, n, temp, suma=0; cout <<"Indique cuantos numeros quiere sumar: "; cin >>n; for (i=0; i>temp; suma += temp; } cout <<"\nLa suma de los " <
While (Mientras) La sentencia de control while se encarga de repetir un bloque de código mientras se cumpla una condición. El bloque de código se debe de encontrar entre llaves, excepto si es una sola línea. La forma general de esta instrucción es la siguiente: while (condición a cumplir) { acciones a ejecutar; }

Un ejemplo de éste lo podemos ver en el cálculo del promedio de varios números, sean notas, precios, temperaturas, distancias, medidas, edades, entre otros valores. No siempre se conoce cuantos valores se van a totalizar, por lo tanto, en algunos programas tendremos que permitir al usuario decidir cuantos valores va a introducir. En estos casos se utiliza un valor de parada o bandera, por ejemplo, que el usuario suministre el valor “-1” para indicar que ha terminado de suministrar los datos a procesar. El ciclo deberá entonces comprombar si el usuario a suministrado o no el valor “-1” a fin de detener las iteraciones. A continuación un ejemplo del cálculo del promedio de precios:

Ejemplo 17. Uso de la estructura de control while (Mientras) #include using namespace std; int main(){ // ejemplo del uso del while para totalizar varios precios int precio=0, total=0, ite=0; float promPrecios=0; while(precio != -1){

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

44

CENEAC - Programación con C++ Nivel 1. cout<<"\nIndique el precio " <>precio; total += precio; ++ite; } // termina el while cout<<"\nAl salir del while ite es: " <
Ejemplo 18. Estructura del while con una sola instrucción #include using namespace std; int main(){ // ejemplos del uso de while con una sola instruccion int x=0, y=0; cout <<"inicialmente x es: " <<x <<", y es: " <
x = x + 2;

cout <<"al terminar el while, el valor de x es: " <<x <<endl; while (y++ < 5) cout <<"dentro del while, el valor de y es: " <
Do … while (Hacer … Mientras o Repetir) Cuando necesitamos que un ciclo se ejecute por lo menos una vez, es necesaria esta sentencia. La forma general es: do{ acciones a ejecutar en el ciclo; } while (condicion a cumplir);

Pongamos como ejemplo el mismo de la estructura switch, el menú de opciones. Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

45

CENEAC - Programación con C++ Nivel 1.

Necesitamos que por lo menos una vez lea la opción que elige, y en caso de que elija una no disponible, en lugar de aparecer el mensaje “es una opción no válida” y termine el programa, espere a que el usuario escoja una de la lista. El programa de ejemplo:

Ejemplo 19. Uso de la estructura de control do … while (Hacer … Mientras o Repetir) #include using namespace std; int main(){ int op; do{ //comienza el ciclo repetir cout<<"elije una opcion de la lista"<<endl; cout<<" \n 1: sumar notas" <<endl; cout<<" \n 2: multiplicar valores" <<endl; cout<<" \n 3: promediar precios" <<endl; cout <<"\n opcion: "; cin >> op; cout << (op<1 || op>3 ? "\n\n opcion invalida, suministrela de nuevo\n\n" : "\n" ); } while (op<1 || op>3); cout<<"\n Tenemos una opcion valida, opcion es: " <
Nota: ¿Qué ocurre con este ejercicio si al suministrar la opción indicas una letra o símbolo no numérico? ¿Cómo podemos solucionar este error?

Ejemplo 20. Estructura del do … while con una sola instrucción #include using namespace std; int main(){ int x; do {x = x + 1; cout <<x <<" - ";} while (x < 12); cout <<"\n\n"; system("Pause"); return 0; }

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

46

CENEAC - Programación con C++ Nivel 1.

2.10.

Funciones, Procedimientos, Prototipos y Macros

Cuando tratamos de resolver un problema, resulta muy útil utilizar la filosofía de “divide y vencerás”. Esta estrategia consiste en dividir el problema en partes más sencillas de solucionar. Cuando realizamos un programa, por ejemplo, en el que se repetirán varias instrucciones pero con distintos valores que definan los resultados, podemos construir el programa a base de funciones. Una función es un bloque de instrucciones a las que se les asigna un nombre. Así, cada que se necesita ejecutar esa serie de instrucciones, se invoca la función en lugar se reescribir todas sus instrucciones. FUNCIONES Una función es una parte de un programa (subrutina) con un nombre, que puede ser invocada (llamada a ejecución) desde otras partes el programa tantas veces como se desee. Es un bloque de código que puede ser ejecutado como una unidad funcional y que retorna como resultado de su ejecución un valor. Su sintaxis general en C++ es: especificador_de_tipo nombre_de_función( [lista_de_parámetros] ) { declaración de variables locales; instrucciones de la función; … return valor_a_retornar; }

Donde: El especificador_de_tipo indica el tipo del valor que la función devolverá mediante el uso de return. El valor puede ser de cualquier tipo válido. Si no se específica un valor, se asume que la función devolverá un resultado entero. No se tienen siempre que incluir parámetros en una función, es decir, la lista de parámetros puede estar vacia u opcional. Las funciones terminan y regresan automáticamente al procedimiento que las llamó cuando se encuentra la última llave }, o bien, se puede forzar el regreso antes de terminar el código de la función usando la sentencia return(esto no es una buena práctica de programación). La instrucción return se usa para devolver un valor. PROCEDIMIENTOS Las funciones void simulan lo que en otros lenguajes se conocen como procedimientos. Se usan cuando no se requiere regresar un valor. Se muestra un ejemplo que imprime los cuadrados de ciertos números. Su sintaxis general en C++ es: void nombre_de_función( [lista_de_parámetros] ) { declaración de variables locales; instrucciones del procedimiento; }

PROTOTIPOS El prototipo de una función se refiere a la información contenida en la declaración de una función. Una función debe de estar definida o al menos declarada antes de hacer uso de ella. Cuando se declara una función debe de especificarse el tipo de dato que va a devolver, el nombre de la función, y los parámetros. La siguiente declaración: int suma(int a, int b); especifica una función que devuelve un tipo de dato entero, tiene por nombre suma, y al invocarla, recibe dos parámetros de tipo entero. Esta declaración debe de escribirse antes de la función main, y su definición puede escribirse después de ésta. Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

47

CENEAC - Programación con C++ Nivel 1.

A continuación se muestran ejemplos de funciones y acciones: Ejemplo 21. Funciones

Ejemplo 22. Procedimientos

#include

#include

using namespace std;

using namespace std;

float encontprom(int num1, int num2) {

void cuadrados() {

float promedio; //variables locales

int contador; // variables locales

promedio = (num1 + num2) / 2.0;

for( contador=1; contador<10; contador++)

return(promedio);

cout << (contador*contador);

}

}

main() {

main() {

int a=7, b=10; float resultado;

cuadrados(); // invocación

resultado = encontprom(a, b); // invocacion

cout << "\n \n"; system("Pause");

cout <<"Promedio=" <
return 0; }

cout << "\n \n"; system("Pause"); return 0; }

A continuación se muestra un ejemplo de uso de prototipos: Ejemplo 23. Definición de funciones usando Prototipos y pase de parámetros #include using namespace std; //prototipo o declaración de la función suma int suma(int x, int y); int main(){ // funcion principal int num1, num2; cout <<"Por favor indique los 2 numeros a sumar " <<endl;

cin >>num1 >>num2;

cout <<"\n\n\nen el main el resultado para la suma es: " <<suma(num1, num2) <<endl; cout <<"\n\n"; system("Pause"); return 0; } // definición del código de la función suma int suma(int a, int b){ //suma 2 valores enteros cout <<"\n\n\hemos entrado a la función suma" <<endl; return (a+b); // a diferencia del main, suma retorna el resultado de la operación, no un cero }

Observamos que primeramente declaramos la función suma para usarla en el bloque main, y al final del código la definimos. Tambien se puede escribir la función completa antes del main. Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor. 48

CENEAC - Programación con C++ Nivel 1.

La función main también tiene un prototipo, y por lo tanto también puede recibir datos aunque no es común usarlo, por ejemplo, int main ( int argc, char *argv[], char *envp[] ) El parámetro argc es un entero que contiene el número de argumentos pasados a la función desde la línea de comandos. Es decir, almacena el número de argumentos en la tabla argv. El parámetro argv es una tabla de cadenas de caracteres (se verá más adelante), cada cadena de caracteres contiene un argumento pasado en la linea de comandos, la primera cadena contiene el nombre con el que fue invocado y las siguientes son los demás argumentos. El parámetro envp es una tabla de cadenas, que pasa información sobre una variable de entorno del sistema operativo. PASO DE PARÁMETROS Cuando hablamos de argumentos, nos referimos a los valores que aparecen en la llamada a la función. En el ejemplo anterior los argumentos fueron “dato1” y “dato2”. Y los parámetros son “a” y “b”, los que reciben los datos. El prototipo de la función puede tener los nombres de los parámetros distintos a los de la definición, lo cual no afecta el comportamiento del programa. Lo que no puede cambiar es el tipo de datos que va a recibir, ni el orden de los parámetros. VALORES DE RETORNO Una función puede regresar cualquier tipo de valor excepto tablas u otras funciones. Esta limitación podría resolverse utilizando estructuras o punteros, pero se verá más adelante. MACROS Una macro es una parte del código que puede parecer y actuar como una función, se define después de las librerías mediante un #define. Se denominan instrucciones de preproceso, porque se ejecutan al comienzo de la compilación. Aunque de utilidad, no se de abusar de definir muchas de ellas, porque podrían entorpecer el código y hacer lento el programa.

Ejemplo 24. Definición de funciones usando Macros y pase de parámetros #include using namespace std; // definición de una macro que determina el mayor de dos valores #define mayor(a,b) (a>b)? a: b int main(){ // funcion principal int n1, n2; cout<<"Suministre 2 numeros distintos"<<endl; cin>> n1; cin>> n2; cout<<"\n

el mayor de esos numeros es: " <<(mayor(n1,n2)) <<endl;

// llamada a la macro

cout <<"\n\n"; system("Pause"); return 0; }

Tabla 12. Funciones y Procedimientos en C++

Pseudocódigo

C / C++

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

49

CENEAC - Programación con C++ Nivel 1. Funciones

Función IdFunc (<par_formales>) : <TipoDatodelRetorno>

<TipoFunc> IdFunc (<par_formales>) {

{

return (valor);

<sentencias>;

}

<sentencias>;

Retornar(valor); }

Procedimientos

Parámetros

Reglas de ámbito

Acción IdProc (<par_formales>) {

void IdProc (<par_formales>) {

<sentencias>;

<sentencias>;

}

}

Valor: (...,<TipoDato> id_param, ...)

Valor: (..., const <Tipo> id_param, ...)

Referencia: (..., Var <TipoDato> id_param, ...)

Referencia: (..., <Tipo> &id_param, ..)

1) Regla de ámbito: es la parte del algoritmo donde se puede utilizar el identificador y va desde el punto donde se declara hasta el final del cuerpo del algoritmo en que se declara, incluyendo los subalgoritmos anidados.

Las mismas que para el pseudolenguaje, pero sin la posibilidad de anidar subalgoritmos en C++, donde no está permitido.

2) Regla de ocultación: La visibilidad de un identificador coincide con su ámbito, exceptuando los ámbitos de los identificadores con el mismo nombre declarados en subalgoritmos anidados.

En C/C++, todos los subprogramas son externos, no se permiten anidamientos y el principal (main()) es otro subprograma.

Cuando en un algoritmo anidado se vuelve a declarar un identificador con el mismo nombre (redeclaración), el identificador inicial ya no tiene alcance dentro del algoritmo anidado.

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

50

CENEAC - Programación con C++ Nivel 1.

TEMA 3. ESTRUCTURAS DE DATOS EN C++ (ARREGLOS, CADENAS Y REGISTROS) 3.1. ARREGLOS UNIDIMENSIONALES 3.1.1. Declaración La forma de declarar un arreglo de cualquier tipo de datos es la siguiente: tipo nombre [tamaño] ; Por ejemplo, podemos declarar un arreglo de enteros con 12 elementos. int MiArreglo [12] ;

El compilador se encargará de asignar la memoria requerida para almacenar determinados valores. Cuando se declara un arreglo de caracteres se trata entonces de una cadena. char nombre[20] ;

3.1.2. Asignación de Valores Al momento de declarar un arreglo de cualquier tipo, podemos inicializarlo con los valores que queramos. Para inicializar un arreglo de enteros: int MiArreglo[5] ={2,34,78,1,9};

Así, estos valores estarán almacenados en cada elemento del arreglo. Es muy importante hacer notar que el primer elemento de un arreglo es el elemento 0, entonces, MiArreglo[0] contendrá el número 2, el segundo ( MiArreglo[1] ) contendrá el número 34 y así sucesivamente hasta MiArreglo[4] que es el último elemento del arreglo. Si un arreglo cuenta con menos inicalizadores que elementos entonces el resto se inicializará a 0. Y en caso de que se trate de una cadena de caracteres podemos hacerlo de 2 formas: char MiCadena[13]= “hola a todos”;

o bien, declarar cada elemento char MiArreglo[5]={'h','o','l','a','\0'};

Cuando se inicializa una cadena por el primer método, automáticamente se coloca un carácter de terminación de cadena (el carácter \0), en cambio, de la segunda forma debemos de ponerlo nosotros. También se puede excluir el tamaño del arreglo, el compilador lo determinará en la compilación. Para acceder a cada elemento del arreglo debemos especificar su posición (la primera es la posición 0). En tiempo de ejecución podemos asignar valores a cada elemento cuidando siempre de no sobrepasar el tamaño del arreglo, si sobrepasamos ese tamaño se escribirán datos en un área de la memoria que no está asignada para ese arreglo, puede escribir datos en un área en donde se almacenaba otra variable del programa o un componente del sistema, esto ocasionaría resultados no deseados. A continuación se muestra un ejemplo del uso de arreglos. Ejemplo 25. Uso de arreglos unidimensionales o vectores #include #include // para presentación con formato #include <stdlib.h> #include

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

51

CENEAC - Programación con C++ Nivel 1. int main(){ const int tam_max=20; int aleatorios[tam_max]; int i, suma=0; float promedio; srand((unsigned)time(NULL)); for(i=0;i
Ya anteriormente habíamos hecho un ejercicio que calculaba el promedio de una serie de números introducidos por el usuario, en este caso el programa guarda los números generados por la máquina en un arreglo para luego calcular el promedio. Para asignar cada valor aleatorio generado, se utiliza un ciclo para (for) con un contador “i” que va de 0 hasta el tamaño máximo que pudiera tener el arreglo. El tamaño del arreglo fue declarado como una constante al principio de la función principal, esto ayudará en caso de que se quiera aumentar el tamaño del arreglo, así no tendremos que modificar cada parte de nuestro código en la que se refiera al tamaño, bastará con cambiar el valor de la constante. Dentro del ciclo se genera un número aleatorio con la función rand(), usamos el operador para obtener el resto de la división entera, así nos dará un número menor de 128. Previamente se utilizó la función srand() para establecer una semilla para generar los números aleatorios, esa semilla la tomamos llamando al reloj del sistema con la función time(). Al mismo tiempo imprimimos el número que fue generado. Posteriormente, se hace de nuevo un ciclo para acceder a los valores almacenados y sumarlos en una variable, aunque esto se pudo haber hecho dentro del ciclo anterior servirá para mostrar las formas de asignación y consulta de valores. Además del uso del incremento después de la asignación. Finalmente se calcula el promedio. En el caso de las cadenas de caracteres también podemos acceder sus elementos de la misma manera, para la asignar valores es mejor usar las funciones para la lectura de caracteres, tales como getline(), porque nos permite tener un control de los caracteres que se introducirán y también introduce el carácter de terminación de cadena, cosa que no es posible con cin rel="nofollow">> directamente y además de que puede escribir en sectores de memoria no adecuados. El siguiente programa es una muestra del uso de arreglos de caracteres.

Ejemplo 26. Uso de arreglos de caracteres

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

52

CENEAC - Programación con C++ Nivel 1. #include int main(){ const int tam_cad=20; char cadena[tam_cad]; cin.getline(cadena,tam_cad,'\n'); for(int i=0;(i
Este programa almacena una cadena introducida por el usuario, para luego modificar cada carácter por medio de un ciclo hasta que encuentre el carácter de terminación (\0) o llegue al límite de caracteres. A continuación se muestra una segunda versión suponiendo que la cadena que introduce el usuario es un mensaje que debe ser secreto, en lugar de sumar 5 a cada carácter podemos sumarle el número que quiera el usuario, un valor clave. El programa anterior adaptado queda de la siguiente forma.

Ejemplo 27. Uso de arreglos de caracteres para guardar un mensaje en clave #include int main(){ const int tam_cad=20; char cadena[tam_cad]; int clave; cout<<"introduce el texto a cifrar"<<endl; cin.getline(cadena,tam_cad,'\n'); cout<<"ahora dame tu clave (no mas de 3 digitos)"<<endl; cin>>clave; for(int i=0;(i
La manipulación de cadenas es uno de los temas más extensos en cuestiones de programación y de los más importantes. Desde las acciones más básicas como la concatenación de cadenas, la ordenación y búsqueda en arreglos, hasta los complicados algoritmos de criptografía o la búsqueda a velocidades increíbles. Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

53

CENEAC - Programación con C++ Nivel 1.

3.1.3. Arreglos pasados como parámetros Así como en ejemplos anteriores pasamos una variable a una función, también se puede pasar como argumento un arreglo. Para pasarlo es necesario hacer una llamada como la siguiente: MiFuncion (arreglo);

Y el prototipo de la función debe de ser de la siguiente forma: tipoRetorno MiFuncion (tipoArreglo nombre [ ] );

No se requiere incluir el tamaño del arreglo dentro de los corchetes, si se escribiera el compilador lo ignora. Cuando pasamos como argumento a una función una variable de tipo int, float, char, etc., estamos pasando el valor de esta variable a otra variable (podría decirse una copia) que se define en la función, esta forma de pasar argumentos se denomina “por valor”. Cualquier modificación de valor a esta variable no tendrá efecto en la variable “original” que pasó su valor a la función. Esta última variable, al ser local, será destruida cuando termine de ejecutarse la función que la contiene. En el caso del paso de arreglos, este no se hace por valor, sino que se hace un paso por referencia simulado. Cuando se declara un arreglo, el nombre de éste es una variable que apunta al primer elemento del arreglo, es decir que contiene su dirección en memoria. Cuando pasamos esta dirección a una función, cualquier modificación que se haga dentro de esa función de nuestro arreglo tendrá efectos en la variable original. El siguiente programa da un ejemplo: Ejemplo 28. Pase por parámetros de arreglos #include void modifica(int arreglo[], int tamano); //prototipos de las acciones o funciones int main(){ const int tam_arr=5; int MiArreglo[tam_arr]={5,10,15,20,25}; int i; modifica(MiArreglo, tam_arr); for(i=0;i
cin.get();

system("Pause"); return 0; } void modifica(int arreglo[], int tam_arr){ for(int i=0;i
Se ha declarado e inicializado un arreglo de enteros de 5 elementos. Posteriormente se llama a la función modifica, la cual multiplica cada elemento del arreglo por dos, estos cambios de valor en los elementos del arreglo tienen efecto en “MiArreglo” aunque el nombre del parámetro de la función modifica sea diferente. También se puede pasar a una función el valor de un elemento del arreglo, sólo se pasará el valor del elemento, no se puede modificar el elemento original. FuncionInvocada ( array [elemento] );

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

54

CENEAC - Programación con C++ Nivel 1.

En ocasiones puede resultar poco conveniente que alguna de las funciones que reciben un arreglo tenga derecho a modificarlo, a veces puede que cambie sus valores sin que nosotros nos percatemos inmediatamente. Para eso podemos incluir el calificador const dentro del prototipo y definición de la función, de esta manera no podrá modificarse nada de este arreglo. tipoRetorno nombreFuncion (const tipoArreglo nombre [ ] );

3.2. Arreglos Multidimensionales Como sabemos, se pueden crear arreglos de cualquier tipo de datos, ahora veremos que también se pueden crear arreglos de arreglos. La forma de declararlos es con múltiples subíndices, cuantos se quieran tener, nosotros trabajaremos a lo más con dobles subíndices. tipoArreglo nombre [subíndice1] [subíndice2] ;

La forma en que queda estructurado un arreglo de dos dimensiones es más o menos como se muestra en la figura. Arreglo Arreglo[0] Arreglo[0][0] Arreglo[0][1] Arreglo[0][2] Arreglo[1] Arreglo[1][0] Arreglo[1][1] Arreglo[1][2] Arreglo[2] Arreglo[2][0] Arreglo[2][1] Arreglo[2][2] Arreglo[3] Arreglo[3][0] Arreglo[3][1] Arreglo[3][2]

El nombre del arreglo tiene la dirección del primer elemento (Arreglo[0]), y éste a su vez tiene la dirección del otro arreglo (Arreglo[0][0]), así para cada elemento de arreglo( 0, 1, 2, 3). Cuando se inicializa un arreglo multidimensional se inicializa entre llaves cada arreglo o bien, por medio de elemento seguidos: Arreglo1 [2] [3] = {1, 2, 3, 4, 5, 6}; Arreglo2 [2] [3] = {{2, 4, 6}, {8, 10, 12}};

Al mandar un arreglo de dos dimensiones, debemos de especificar en el prototipo y definición de la función el subíndice2 de nuestro arreglo. El siguiente ejemplo mostrará varios aspectos de ellos.

Ejemplo 29. Uso de arreglos multidimensionales, en especial, matrices #include #include #include <stdlib.h> #include const int vendedores=5, meses=4; void inicializa(int ventas[][meses]); //prototipos de las acciones o funciones void calculaTotal(const int ventas[][meses]); int main(){ int ventas[vendedores][meses];

int i;

//Las siguientes instrucciones solo presentan un // encabezado para la tabla cout<<"ventas:"<<setw(23); for(i=1;i<=meses;++i) cout<<" mes"<
Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

55

CENEAC - Programación con C++ Nivel 1.

//fin de encabezado inicializa(ventas); calculaTotal(ventas); cout<<endl<<endl<<"presiona enter para terminar"<<endl;

cin.get();

system("Pause"); return 0;

} void inicializa(int ventas[][meses]){ int i,j; //contadores srand((unsigned)time(NULL)); for(i=0;i
cout<<setw(7)<
} cout<<endl; } } void calculaTotal(const int ventas[][meses]){ int suma=0,total=0, i, j; cout<<endl<<endl; for(i=0;i
Notemos primero cómo el prototipo de las funciones “inicializa” y “calculaTotal” debe incluir el segundo subíndice del arreglo. La función “calculaTotal” muestra un ejemplo del uso del calificador const para evitar que en esta función se modifique algún valor del arreglo. La función “inicializa” llena el arreglo con valores aleatorios menores a 50, se utilizan dos contadores para dos ciclos for, “i” para el primer subíndice, “j” para el segundo. El ciclo recorre la primera “fila” (viendo el arreglo como una tabla de valores) usando el contador i y a cada celda, con ayuda de “j”, asigna valores, así cuando “j” llega al límite de celdas (meses) se aumenta una unidad el contador “i” para continuar con la otra fila y recorrerla de nuevo. La función “calculaTotal” tiene una forma muy similar, pero en ésta no se modificarán valores, sino que se hará la suma de los elementos de cada fila para presentarlos en pantalla. Una variable “total” se encarga de ir sumando los productos vendidos cada que se cambia de fila en la tabla, para después, al término de los ciclos presentar el total de artículos vendidos en esos meses. Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor. 56

CENEAC - Programación con C++ Nivel 1.

Puede aumentarse el número de filas y columnas de la tabla modificando los valores de las constantes “vendedores” y “meses” respectivamente, definidas al comienzo del programa.

3.3. ESTRUCTURAS TIPO REGISTRO: Unión, Enumeración y Estructura En muchos lenguajes, se le permite al programador definir sus propios tipos de datos a partir de los tipos atómicos. En C y C++ pasa lo mismo, y además existen de antemano los tipos union, enumeración y estructura. Estos tipos definidos forman parte del estandar de C, y por consiguientede C++, en éste último existe también el tipo class. Para los objetivos de este trabajo excluiremos el tipo class (clase), pero a lo largo de capítulo mencionaremos en varias ocasiones este concepto para tener una idea de lo que se trata.

3.3.1. Enumeraciones En ocasiones habremos de declarar constantes enteras una tras otra con valores consecutivos, por ejemplo: const int a=0,b=1,c=2,d=3;

para evitar este tipo de declaraciones una tras otra, existe el tipo enumerativo. La declaración anterior se puede hacer de una mejor forma: enum {a,b,c,d};

Una enumeración puede ser global o local. Además de que puede tener un nombre que los identifique, podemos indicar desde donde empieza la numeración. enum meses { enero=1, febrero, marzo, abril, mayo, junio, julio, agosto, septiembre, octubre, noviembre, diciembre};

Los valores que se le asignarán empiezan por 1 a enero, 2 a febrero y así sucesivamente. Si se le asignase un 5 a marzo, entonces abril tendría un 6 y así continuaría la numeración. Después de hacer esta enumeración, se puede hacer una nueva variable a partir del enumerado llamado meses. El siguiente ejemplo mostrará el uso del tipo Enumerado:

Ejemplo 30. Uso del tipo de dato estructurado Enumerado #include enum colores{rojo,amarillo,verde}; int main(){ int i=0,contador=0; //unos contadores colores semaforo; cout<<"este programa mostrara el tipo enumerativo," <<" por medio de un semaforo de crucero" <<" simulado"<<endl; while(contador<3){

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

57

CENEAC - Programación con C++ Nivel 1.

semaforo=verde; cout<<"semaforo en verde, el peaton no pasa"<<endl; cout<<"el peaton pide el paso con un boton" <<"(presione enter)"<<endl; cin.get(); semaforo=amarillo; cout<<"semaforo en amarillo, precaucion"<<endl; for(i=0;i<500000000;i++); semaforo=rojo; cout<<"semaforo en rojo, ALTO, pasa el peaton"<<endl; for(i=0;i<500000000;i++); contador++; } system("Pause"); return 0;

} Debemos tomar en cuenta que al declarar un tipo de variable en base a una enumeración, en este caso una variable semaforo de tipo colores, sólo se podrá asignar valores declarados dentro de esta, para el ejemplo anterior sólo puede tomar valores rojo amarillo o verde.

3.3.2. Uniones El tipo de datos union puede contener datos de tipos y tamaños diferentes, esta variable almacenará cualquier tipo de dato en una única localidad en memoria. Por ejemplo: union edificio{ int habitaciones; int despachos; char empresa[10]; };

declara un nuevo tipo de dato llamado “edificio”, para usar una variable de tipo edificio bastará con hacer una declaración como: edificio casa;

la variable casa tendrá el suficiente espacio en memoria para almacenar una cadena (el tipo de dato de mayor longitud dentro de la union). Es responsabilidad del programador extraer adecuadamente el tipo de dato deseado. La forma en que está estructurada en la memoria nuestra variable es como la que sigue: Byte1 Byte2 Byte3 Byte4 Byte5 Byte6 Byte7 Byte8 Byte9 Byte10

Cuando se almacena un entero y posteriormente una cadena, ésta última se escribe sobre el espacio de memoria asignado al entero, y por lo tanto, el contenido se pierde. Practique con el siguiente programa.

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

58

CENEAC - Programación con C++ Nivel 1. Ejemplo 31. Uso del tipo de dato estructurado Unión #include #include union edificio{ int habitaciones; int despachos; char empresa[10]; }; int main(){ edificio casa, agencia, gobierno; cout<<"cuantas habitaciones tiene tu casa?"<<endl; cin>>casa.habitaciones; cout<<"escribe el nombre de la agencia en la que trabajas"<<endl; cin.ignore(); cin.getline(agencia.empresa,10); cout<<"cuantos despachos tiene la oficina de gobierno de tu localidad?"<<endl; cin>>gobierno.despachos; cout<<"cuantos despachos tiene el edificio de la agencia <>agencia.despachos; cout<<"edificio"<<setw(25)<<"habitaciones/despachos" <<endl; cout<<"casa"<<setw(18)<
} Para accesar a los miembros de una variable de tipo union es necesario utilizar el operador punto (.), seguido de la variable a extraer. En este ejemplo hemos extraído un entero de la variable “casa” por medio de casa.habitaciones, si se hace una extracción como casa.empresa no sabemos exactamente que es lo que aparecerá porque pueden existir otros datos en esa área de la memoria asignada a esta cadena; y si se hiciese lo contrario, asignar una cadena y luego extraer un entero, seguramente no obtendremos lo que deseamos. Como con cualquier otro tipo de datos, podemos realizar operaciones con el contenido de los miembros de la union, operaciones básicas, envío como argumentos, conversiones, etc. El uso de las variables de tipo union no es muy común, alguien seguramente habrá querido extraer un tipo entero, luego asignar una cadena y posteriormente utilizar de nuevo ese entero. Que útil seria que dentro de una sola variable podamos tener oportunidad de extraer tanto un tipo como otro sin perder los datos, ¿se imagina poder regresar mediante la instrucción return más de un dato?

3.3.3. Estructuras Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

59

CENEAC - Programación con C++ Nivel 1.

Las estructuras son colecciones de elementos, los cuales pueden ser de diferente tipo, y a diferencia de las uniones, en éstas no se comparte la misma área de memoria para los elementos. La forma de declarar una estructura es más o menos como sigue: struct nombre_estructura{ tipo nombre_elemento1; tipo nombre_elemento2; };

Es entonces cuando podemos declarar una variable del tipo de la estructura, funcionando el nombre de la estructura como un nuevo tipo de datos, de esta manera, la nueva variable tendrá cada uno de los elementos declarados en ella. nombre_estructura nueva_variable; Para acceder a cada uno de sus elementos usamos el operador punto (.), seguido del nombre del nombre del elemento, de la misma forma que con las uniones. Una estructura puede ser declarada de forma global o local, pero es más común hacerlo fuera de toda función. Debemos hacer notar que las estructuras no se pueden inicializar en su declaración. Aunque las estructuras son una buena manera de mandar bloques de datos a una función, y es posible regresar estructuras (por la instrucción return), el coste es alto, el programa se hace lento, gasta CPU y memoria. Para ello, y gracias a que se trata como un nuevo tipo de variable, es posible hacer un paso por referencia, así evitaríamos que se hiciese una copia de toda la estructura, y sólo se pasara la dirección. La forma de hacer un paso por referencia es igual que con cualquier otro tipo de variables, sin embargo, al accesar a sus miembros debemos de hacerlo por medio del operador flecha (- rel="nofollow">). A continuación se muestra un ejemplo del uso de estructuras. Ejemplo 32. Uso de Estructuras #include #include<math.h> struct proyectil{ float VelocidadInicial, angulo; float PosX, PosY; }; float calculaCaida(proyectil p); // prototipo de llamada a la función

int main(){ proyectil misil; misil.PosX=misil.PosY=0; float distancia; cout<<"Este programa calculará la distancia, en línea recta, en la que caerá un proyectil"<<endl; cout<<"escribe la velocidad inicial para lanzarlo: "; cin>>misil.VelocidadInicial; cout<<"escribe ahora el angulo de lanzamiento: "; cin>>misil.angulo; distancia=calculaCaida(misil);

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

60

CENEAC - Programación con C++ Nivel 1.

cout<<"la distancia a la que caerá el proyectil es: " <
} float calculaCaida(proyectil p){ int t=1; //tiempo const float grav=9.81; //gravedad p.angulo/=57.2957; //transformamos a radianes do{ p.PosX=(p.VelocidadInicial*cos(p.angulo)*t); p.PosY=(p.VelocidadInicial*sin(p.angulo)*t)/(0.5*grav*t*t); ++t; }while(p.PosY>0); return(p.PosX); }

En C++ se puede simplemente incluir un carácter más en nuestro código para utilizarlo como referencia, en nuestra función (y la declaración por supuesto) incluimos un '&': float calculaCaida(proyectil& p){ … Lo cual bastará para que se trate como una referencia sin necesidad de usar el operador flecha. Las estructuras también pueden tener por miembros a funciones, en cuyo caso se invoca de la misma forma en la que se accesa a una variable. Le sugiero animarse a usarlas, intente hacer ejercicios con ellas. Sin embargo, para esos casos es mejor y más útil utilizar otro tipo de datos definido en C++, se trata de las clases (class), para los fines de este trabajo las clases quedan fuera, debido a que se requiere describir y practicar bastante con la programación orientada a objetos. El lector debe de tener en cuenta su existencia, para que en un futuro, si se está interesado, se adentre más en el mundo de la programación, en una de mejor nivel, con mejores técnicas, y por ende con más capacidades. Aquí muestro un programa en donde se observa la utilización de funciones como miembros de una estructura, y también un ejemplo de las referencias C++.

Ejemplo 33. Uso de funciones como miembros de una Estructura #include #include const int NumMaterias=11; struct alumno { int boleta, semestre; int calificaciones[NumMaterias];

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

61

CENEAC - Programación con C++ Nivel 1.

void constancia(alumno & a){ cout<<"constancia impresa"<<endl; cout<<"alumno con boleta: "<
void inicia(alumno & a){ for(int i=0;i
int main(){ alumno a1; a1.inicia(a1); cout<<"Creando el alumno Alan"<<endl; a1.boleta=2005630170;

a1.semestre=5;

a1.constancia(a1);

system("Pause"); return 0; }

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

62

CENEAC - Programación con C++ Nivel 1.

INSTALACIÓN DE UN EDITOR Y COMPILADOR DE C++

Para obtener mayor información sobre un editor de código y compilador de C++ sugerimos visitar: Descargar un compilador de C++ 

http://www.bloodshed.net/dev/devcpp.html



http://www.entrebits.com/software/borland-cplus-plus-compiler

Instalación y Configuración de Dev C++ 

https://www.unirioja.es/cu/jjolarte/temp/Fund/InstalacionDev-C++.pdf



http://www.bloodshed.net/dev/doc/index.html

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

63

CENEAC - Programación con C++ Nivel 1.

ANEXO 1:

PRINCIPALES INSTRUCCIONES Y SU TRADUCCIÓN DE PSEUDOCÓDIGO A C++ PRINCIPALES FUNCIONES PREDEFINIDAS EN C++ BIBLIOTECA ESTÁNDAR DE C++ Y PRINCIPALES LIBRERÍAS

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

64

CENEAC - Programación con C++ Nivel 1. Tabla 13. Declaración de Variables

Tipo

Declaración C++

Limite Inferior

Limite Superior

Entero Entero Corto Entero Largo Entero sin Signo Entero con Signo Real Real Doble Real Largo Caracter Caracter sin signo Caracter con signo Palabra Valor Nulo Arreglo Texto ante Apuntador

Int A; Short Int A; Long Int A; Unsigned Int A; Signed Int A; Float A; Double A; Long DoubleA; Char A; Unsigned Char A; Signed Char A; Char[ ] A; Void Int A[N] Text A; A; *A

-32768 -128 2E -6 0 -65000 -3.4E37 -1.7E -304 3.4E -4932 -128

32767 127 2E 6 65535 65000 3.4E 38 1.7E 308 1.1E 4932 127

0

0

Tabla 14. Estructuras Condicionales y de Iteración

Pseudocódigo

C++

Si Condicion = 1 Entonces

If(Condicion = = 1) { Sentencia; } Else { Sentencia; }

Sino FinSi; Selección Opcion = 1: Sentencia1; Opcion = 2: Sentencia2; … Sino: Sentencia3; FinSelección; Para Contador=1 hasta Contador<=N en Incremento Hacer … FinPara; Mientras Condicion = 1 hacer … FinMientras; Repetir … Hasta Condicion = 1;

Switch(Opcion) { 1: Sentencia1; break; 2: Sentencia2; break; Default: Sentencia3; break; } for(Contador = 1;Contador <= N;Contador++) { Sentencia; } While(Condicion= =1) { Sentencia; } Do{ Sentencia; }(Condicion = = 1);

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

65

CENEAC - Programación con C++ Nivel 1. Tabla 15. Procedimientos y Funciones

Procedimientos

Funciones

Void Nombre(VariableInt) { Sentencia; }

Float Nombre (Variable Int) { VarReal = Variable; Sentencia; return (VarReal); }

void main(void) { Nombre(Variable); //invocación }

void main(void) { A = Nombre (X); //invocación }

Tabla 16. Funciones de VALOR NUMÉRICO

Función

Descripción

int abs(int x); double fabs(double x); long double fabsl(long double @E(x)); long int labs(long int x); double ceil(double x); double floor(double x); long double ceill(long double (x)); long double floorl(long double (x)); int _rotl(unsigned val, int count); int _rotr(unsigned val, int count); long _lrotr(unsigned long val, int count); long _lrotl(unsigned long val, int count); max min

Obtiene el absoluto valor de un entero Calcula el absoluto valor de un real Calcula el absoluto valor de un real Calcula el absoluto valor de un long Redondear hacia arriba Redondear hacia abajo Redondear hacia arriba Redondear hacia abajo Rota un entero valor a la izquierda Rota un entero valor a la derecha Rota un long valor a la derecha Rota un long valor a la izquierda Devuelve el alto de dos valores Devuelve el bajo de dos valores TLOSS

Tabla 17. Funciones de POTENCIA

Función

Descripción

double pow(double x, double y); double pow10(int p); long double pow(long double (x), long double (y)); long double pow10l(int (p)); double exp(double x); long double exp(long double (x)); double sqrt(double x); long double sqrtl(long double @E(x));

Función Potenciación, x a la y (x**y) Función Potenciación, 10 a el p(10**p) Función Potenciación, x a la y (x**y) Función Potenciación, 10 a el p (10**p) Calcula Potenciación e a la x Calcula Potenciación e a la x Calcula raíz cuadrada Calcula raíz cuadrada

Tabla 18. Funciones de LOGARITMOS

Función

Descripción

double log(double x); double log10(double x); long double logl(long double (x)); long double log10l(long double (x)); double hypot(double x,double y); long double hypotl(long double (x),long double (y));

Función logaritmo natural Función logaritmo comun Función logaritmo natural Función logaritmo comun Calcula hipotenusa de derecha triangulo Calcula hipotenusa de derecha triangulo

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

66

CENEAC - Programación con C++ Nivel 1. Tabla 19. Funciones TRIGONOMÉTRICAS

Función

Descripción

double cos(double x); double sin(double x); double tan(double x); long double sinl(long double x); long double tanl(long double x); long double coshl(long double (x)); double cosh(double x); double sinh(double x); double tanh(double x); long double cosl(long double x); long double sinhl(long double (x)); long double tanhl(long double (x)); double acos(double x); double asin(double x); double atan(double x); double atan2(double y, double x); long double acosl(long double (x)); long double asinl(long double (x)); long double atanl(long double (x));

Función Función Función Función Función Función Función Función Función Función Función Función Función Función Función Función Función Función Función

Coseno Seno Tangente Seno Tangente Coseno hiperbolico Coseno hiperbolico Seno hiperbolico Tangente hiperbolico Coseno Seno hiperbolico Tangente hiperbolico inversa de Coseno inversa de Seno inversa de Tangente inversa de Tangente2 inversa de Coseno inversa de Seno inversa de Tangente

Tabla 20. Funciones NÚMEROS COMPLEJOS

Función

Descripción

complex cos(complex z); complex sin(complex z); complex tan(complex x); complex cosh(complex z); complex sinh(complex z); complex tanh(complex x); complex acos(complex z); complex asin(complex z); complex atan(complex x); double abs(complex x); double cabs(struct complex z); long double cabsl(struct _complexl (z)); complex pow(complex x, complex y); complex pow(complex x, double y); complex pow(double x, double y); complex log(complex x); complex log10(complex x); complex exp(complex z); double imag(complex x); complex sqrt(complex x); double conj(complex z); double arg(complex z); double real(complex x); complex complex(double real,double imag); complex polar(double mag, double angulo); double poly(double x, int degree, double coeffs[]); struct complex {double x, y;};

Función Coseno Función Seno Función Tangente Función Coseno hiperbolico Función Seno hiperbolico Función Tangente hiperbolico Función Inversa de Coseno Función Inversa de Seno Función Inversa de Tangente Obtiene el valor absoluto de un entero Calcula el valor absoluto de un numero complex Calcula el valor absoluto de un numero complex Función Potenciación, x to the y (x**y) Función Potenciación, x to the y (x**y) Función Potenciación, x to the y (x**y) Función logaritmo natural Función logaritmo comun Calcula e a la zth potenciación (z is a núm. complex) Devuelve la imaginaria parte de un número complex Calcula raíz cuadrada Conjuga de un numero complex Obtiene el ángulo de un número en el plano complex Devuelve parte real de número complex Crea numeros complex Calcula numero complex Calcula numero complex Crea numeros complex

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

67

CENEAC - Programación con C++ Nivel 1.

Principales Librerías de C++ más información en: http://www.c.conclase.com/curso/index.php?cap=902f#inicio 

iostream: Biblioteca de flujo de entrada y salida

En esta biblioteca se definen algunas de las funciones aplicables a los "streams" o flujos de datos. Principales funciones:





cin, canal de entrada estándar



cout, canal de salida estándar

stdio.h: Biblioteca C de entrada y salida estándar

Contiene las funciones de entrada y salida, por la pantalla, por teclado y por archivos (ficheros). "stdio" puede y suele leerse como estándar Input/Output. De hecho la pantalla y el teclado son considerados como archivos, aunque de un tipo algo peculiar. La pantalla es un archivo sólo de escritura llamado stdout, o salida estándar y el teclado sólo de lectura llamado stdin, o entrada estándar. Se trata de una biblioteca ANSI C, por lo que está heredada de C, y ha perdido la mayor parte de su utilidad al ser desplazada por "iostream". Pero aún puede ser muy útil, es usada por muchos programadores y se encuentre incluída en muchos de los programas disponibles en C y C++. Principales funciones: 

getchar(), lee un carácter desde stdin



putchar(), envía un carácter a la salida stdout



gets(),



puts(),

lee una cadena de caracteres terminada con un retorno de línea desde la entrada estándar y la almacena en s envía la cadena s terminada con nulo a la salida estándar stdout y le añade el carácter de retorno

de línea.  

printf(), escribe una cadena con formato a la salida estándar.

stdlib.h:

Biblioteca de rutinas de conversión estándar

En esta biblioteca se incluyen rutinas de conversión entre tipos. Sus funciones permiten convertir cadenas de caracteres a números, números a cadenas de caracteres, números con decimales a números enteros, etc. Principales funciones: 

atoi(), convierte una cadena de caracteres a un entero. Puede leerse como conversión "ASCII to Integer".



system(), ejecuta un comando del sistema o un programa externo almacenado en disco.

Esta función es muy útil para detener el programa antes de que termine su ejecución y poder observar los resultados del programa. Es usual añadir una llamada a la función system para ejecutar el comando del sistema "pause", que detiene la ejecución hasta que se pulse una tecla ( system("pause"); ) 

abs(), devuelve el valor absoluto de un entero.



rand(),



srand(), inicializa el generador de números aleatorios.

generador de números aleatorios.

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

68

CENEAC - Programación con C++ Nivel 1.



ctype.h:

Biblioteca de tratamiento de caracteres

En esta biblioteca contiene funciones y macros de tratamiento y clasificación de caracteres. Principales funciones: 

toupper(), convierte un carácter a mayúscula.



tolower(), convierte un carácter a minúscula.



Macros is(),

sirven para verificar si un carácter concreto pertenece a un conjunto definido. Estos conjuntos son: alfanumérico, alfabético, ascii, control, dígito, gráfico, minúsculas, imprimible, puntuación, espacio, mayúsculas y dígitos hexadecimales. Cada una de las macros devolverá un valor distinto de cero si el argumento c pertenece al conjunto. Todas las macros responden a la misma sintaxis: Tabla 21. Funciones para VERIFICACION DE TIPOS DE DATOS



Función

Valores

isalnum

(A - Z o a - z) o (0 - 9)

isalpha

(A - Z o a - z)

isascii

0 - 127 (0x00-0x7F)

iscntrl

(0x7F o 0x00-0x1F)

isdigit

(0 - 9)

isgraph

Imprimibles menos ' '

islower

(a - z)

isprint

Imprimibles incluido ' '

ispunct

Signos de puntuación

isspace

espacio, tab, retorno de línea, cambio de línea, tab vertical, salto de página (0x09 a 0x0D, 0x20).

isupper

(A-Z)

isxdigit

(0 to 9, A to F, a to f)

string.h: Biblioteca de manipulación de cadenas

En esta biblioteca se incluyen rutinas de manipulación de cadenas de caracteres y de memoria. Principales funciones: 

strlen(),

calcula la longitud de una cadena.



strcpy(),

copia una cadena en otra.



strcmp(), compara dos cadenas.



strcat(),



strncpy(),



strncmp(),



strncat(),



strtok(),

añade o concatena una cadena a otra. copia un determinado número de caracteres de una cadena en otra. compara dos porciones de cadenas.

añade o concatena una porción de una cadena a otra.

busca dentro de una cadena conjuntos de caracteres o símbolos (tokens) separados por delimitadores.

Uso de la Biblioteca Estándar de C++ Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

69

CENEAC - Programación con C++ Nivel 1.

Seguramente en el compilador que ha estado utilizando, sea Visual C++, Dev C++ o cualquier otro que no sea muy viejo, es decir anterior al año de 1998, le ha estado marcando algunos “Warnings” a la hora de compilar su código fuente, trate de corregirlos. Uno de ellos que quizá no sepa a que se refiere es: …#warning This file includes at least one deprecated or antiquated header... To disable this warning use Wno-deprecated.

Este warning está presente en el compilador GCC, y aparece debido a los archivos de cabecera que hemos empleado hasta este momento. En el estándar de C++ las bibliotecas dejan de utilizar el “.h”, es decir que en lugar de utilizar , ahora tendrá que escribirse , en vez de será . A pesar que esto tiene varias ventajas, que tal vez no vea en este momento, se tendría que colocar “std” antes de cada llamada a una función de la biblioteca, debido a que toda la biblioteca estándar de C++ está definida en el espacio de nombres llamado std. Con esto, tendríamos que hacer una llamada a escribir en pantalla con la instrucción std::cout. Para evitar esto, y por consiguiente hacer menos extenso el código a escribir, podemos emplear la directriz using, indicando al compilador el espacio de nombres donde está referenciado. Por ejemplo, el siguiente programa es la nueva versión de uno de nuestros primeros programas escritos. #include using namespace std; int main(){ cout<< “adios a todos” <<endl; return 0; }

A continuación se presentan las principales librerías de la biblioteca estándar de C, clasificadas de acuerdo a su funcionalidad. La c al inicio del nombre de la librería, por ejemplo , indica su compatibilidad con lenguaje C. En C++ pueden ser usadas agregar esta c inicial. ENTRADA/SALIDA  E/S de la biblioteca de C  Funciones de clasificación de caracteres  E/S de caracteres extendidos  Flujos para trabajo con ficheros en disco  Manipuladores  Tipos y funciones básicos de E/S  Declaraciones adelantadas de utilidades de E/S  Objetos y operaciones sobre flujos estándar de E/S  Objetos y operaciones sobre flujos de entrada  Objetos y operaciones sobre flujos de salida  <sstream> Flujos para trabajar con cadenas de caracteres  <streambuf> Búferes de flujos CADENAS  Examinar y convertir caracteres  Funciones de cadena estilo C  Funciones de cadena estilo C  Funciones de cadena de caracteres extendidos estilo C  Clasificación de caracteres extendidos  <string> Clases para manipular cadenas de caracteres Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

70

CENEAC - Programación con C++ Nivel 1.

CONTENEDORES  Matriz de bits  <deque> Cola de dos extremos de elementos de tipo T  <list> Lista doblemente enlazada de elementos de tipo T  <map> Matriz asociativa de elementos de tipo T  Cola de elementos de tipo T  <set> Conjunto de elementos de tipo T (contenedor asociativo)  <stack> Pila de elementos de tipo T  Matriz de elementos de tipo T ITERADORES  Soporte para iteradores ALGORITMOS  Algoritmos generales (buscar, ordenar, contar, etc.)  bsearch y qsort NÚMEROS  Funciones matemáticas  Operaciones con números complejos  Números aleatorios estilo C  Algoritmos numéricos generalizados  Operaciones con matrices numéricas SOPORTE DEL LENGUAJE  Limites numéricos en coma flotante de estilo C  Limites numéricos estilo C  Salvar y restaurar el estado de la pila  Establecimiento de manejadores para condiciones excepcionales (también conocidos como señales)  Lista de parámetros de función de longitud variable  Soporte de la biblioteca al lenguaje C  Definición de funciones, variables y tipos comunes  Manipulación de la hora y fecha  <exception> Tratamiento de excepciones  Limites numéricos  Gestión de memoria dinámica>  Identificadores de tipos durante la ejecución

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

71

CENEAC - Programación con C++ Nivel 1.

EJERCICIOS DE CREACIÓN DE ALGORITMOS Y PROGRAMACIÓN CON C++

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

72

CENEAC - Programación con C++ Nivel 1.

Ejercicios de Algoritmos y Programas Construya algoritmos en pseudocódigo que resuelvan cada uno de los problemas planteados a continuación y prográmelos luego en C++ para verificar su correcto funcionamiento. Instrucciones básicas 1. Intercambiar los valores de dos variales reales. 2. Solicitar tres valores enteros e indicar cual es el mayor. 3. Indicar si un número entero dado por el usuario es par o impar, utilizando el operador condicional ( ? : ) 4. Calcular el área de un rectángulo, para una base (b) y una altura (h) suministrada por el usuario (área = b*h). 5. Calcular el precio de un producto luego de aplicarle un descuento del 5% y un IVA del 12%. 6. Dado un valor entero y positivo S, que representa una cantidad en segundos, se quiere hallar su equivalente en días, horas, minutos y segundos restantes. 7. Solicitar tres caracteres y mostrarlos en orden ascendente. 8. Calcular el resultado de cada una de las siguientes fórmulas: R1

R3

R2

Condicionales 9. Dados dos números enteros n1 y n2, indicar si n1 es múltiplo de n2.

(usar Si simple)

10. Calcular las posibles raíces reales para una ecuación de segundo grado: ax2 + bx + c = 0, para coeficientes a, b y c suministrados por el usuario. (usar Si anidado) 11. Dados dos valores reales a y b, construir un algoritmo que evalúe la siguiente función matemática: res = 8x3 + 3x, si x > 1

res = -3x + 1, si x  1

(usar Si doble)

12. Dados 5 caracteres suministrados por el usuario, indicar cual es el mayor de ellos.

(usar Si simple)

13. Solicitar un carácter al usuario y verificar si se corresponde con una vocal y cual de ellas.

(usar Selección)

Ciclos 14. Calcular el valor de n! (factorial) para un valor n suministrado por el usuario.

(usar ciclo Para)

15. Calcular la suma de los dígitos pares y de los dígitos impares de un número entero N.

(usar ciclo Mientras)

16. Leer un número, verificar que sea de 3 dígitos y sumar sus dígitos.

(usar ciclo Hacer mientras)

17. Invierta los caracteres de una cadena o string suministrado por el usuario

(usar ciclo Para)

18. Calcular el resultado de multiplicar dos números enteros mediante sumas sucesivas.

(usar ciclo Hacer mientras)

19. Calcular el promedio de notas de un grupo de alumnos, cuántos aprobaron y cuántos reprobaron. Considere que las notas son válidas si están entre 0 y 20 puntos. Se sabe que la materia tiene al menos 1 alumno, pero no se sabe cuántos alumnos en total hay, por esta razón se debe preguntar al usuario en cada repetición del ciclo si ya terminó de suministrar las notas. (usar ciclo Hacer mientras) 20. Recorrer una cadena y contar la cantidad de vocales y consonantes que tiene, indicar luego la frecuencia de las vocales y de las consonantes sobre el total de caracteres de la cadena. (usar ciclo Mientras) 21. Solicitar N temperaturas en grados Farenheit, transfórmarlas a grados Celsius e indicar su promedio. Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

73

CENEAC - Programación con C++ Nivel 1.

(usar ciclo Hacer mientras) 22. Traducir la siguiente expresión matemática y calcular su resultado para valores n, k y x suministrados por el usuario. Debe realizar las validaciones necesarias sobre los valores de n y x. (usar ciclo Para)

n

n / x  *  ik  nx 2 ik

Procedimientos (Acciones, Funciones y Pase de parámetros) 23. Escribir una función que solicite las notas de N evaluciones de un alumno, calcule su Promedio e informe este resultado a una función principal, en donde será usado para indicar si M estudiantes aprobaron o no la materia y con que nota promedio. 24. Escribir un procedimiento llamado intercambiar, que intercambie los valores de dos variables reales num1 y num2. Luego utilícela en una función principal que solicita los datos de entrada al usuario e informa los resultados. 25. Escribir una función que calcule el área de una circunferencia (areaCircunferencia), otra que calcule el área de un rectángulo (areaRectangulo) y luego úsela ambas en una función principal para verificar si el área de una circunferencia puede ser contenida en el área de un rectángulo. Los valores correspondientes al radio (circunferencia), la base y la altura (rectángulo) serán suministrados por el usuario. 26. Escribir un procedimiento llamado calcularSueldo, que determine si a un empleado le toca cobrar a través de depósito bancario o de cheque. Al empleado le depositan su sueldo mensual si gana semanalmente más de 500,00 Bs, en caso contrario le emiten un cheque semanal por 150,00 Bs. El procedimiento deberá indicar el tipo de pago y el monto mensual cobrado. Desde la acción principal se solicitaran los datos de identificación del empleado, el sueldo diario y los días trabajados en el mes, a fin de llamar al procedimiento que calcula el sueldo mensual. 27. Escribir una función contarApariciones que indique cuantas veces aparece un carácter dado en una cadena. Utilícela en una función principal que solicita al usuario la cadena de entrada y el carácter a buscar, llama a la función contarApariciones e informa el resultado. 28. Escribir un procedimiento llamado verificarCumpleaños, el cual debe comparar la fecha de nacimiento de una persona con la fecha actual e indicar si ya cumplió años, los va a cumplir o los está cumpliendo ese día. Este procedimiento también debe indicar la edad de la persona. Al procedimiento se le pasa por parámetros desde la función principal tres valores enteros, correspondientes al día, mes y año de nacimiento de la persona.

Ejercicios de Algoritmos y Programas sobre Estructuras de Datos Ejercicios de Arreglos (Vectores y Matrices) 1. Inicializar un arreglo con los montos en BsF de las ventas mensuales para 2012 de 5 productos. Calcular e informar luego el promedio de ventas por mes, por producto, máximo y mínimo monto. 2. Dada una matriz de M x N elementos enteros, se quiere: 2.1. Calcular la suma de los cuadrados de sus elementos. 2.2. Obtener la posición (fila y columna) de todo elemento de la matriz que sea múltiplo de un entero H. 2.3. Dados I y J, intercambiar la fila I con la fila J. 2.4. Dado un arreglo A con P elementos, indicar la posición de los elementos de A que aparecen en la matriz (sólo la primera aparición), debe indicar también la posición en la matriz. 3. Dada una matriz cuadrada de M filas con valores reales, elabora un algoritmo que compare la suma de los valores de la diagonal principal y secundaria, indicando cual es la menor. 4. Dado un arreglo con 1000 números enteros con valores entre -100 y 100, crea un algoritmo que indique cuál es el número (o los números) que más se repite(n). Utilice un su solución un arreglo auxiliar de contadores. Por ejemplo, si el arreglo contiene: -2, 4, 1, -2, 3, 1, la salida sería: -2 1. 5. Adaptar el algoritmo de Búsqueda Secuencial para indicar cuántas veces se encuentra una nota X dada por el usuario, dentro de un arreglo unidimensional llamado Notas con 48 valores de tipo real.

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

74

CENEAC - Programación con C++ Nivel 1. 6. Dado un arreglo que almacena información de N productos (código, descripción y precio), adapte el algoritmo de Búsqueda Binaria para indicar el precio de un producto con un código C dado. Asuma que no hay productos repetidos en el arreglo.

Utilizar Acentos y Caracteres especiales en C++ Letras con acento en C/C++ Hay dos maneras de mostrar letras con acentos en C/C++. Tenemos por ejemplo la palabra árbol, que podemos mostrarla de las dos siguientes formas: printf(”%crbol”,160); printf(”\xA0rbol”); Ambas formas de mostrar letras con acentos se dan a continuación: Para mostrar letras con acentos en C / C++ usamos lo siguiente: á –> printf(”%c”,160); ú –> printf(”%c”,163);

é –> printf(”%c”,130);

í –> printf(”%c”,161);

ó –> printf(”%c”,162);

Cada uno de los números que aparecen a la derecha del printf es el código ASCII de cada letra acentuada También podemos imprimir las letras con acentos sin usar printf con parámetros: á –> printf(”\xA0″); é –> printf(”\x82″); í –> printf(”\xA1″); ó –> printf(”\xA2″); ú –> printf(”\xA3″);

Los números y letras que aparecen después de \x es el código ASCII de las letras en hexadecimal

Letras ñ y Ñ en C/C++ Hay dos maneras de mostrar letras ñ y Ñ en C/C++. Tenemos por ejemplo la palabra España, que podemos mostrarla de las dos siguientes formas: printf(”Espa%ca”,164); printf(”Espa\xA4a”); Para mostrar las letras ñ y Ñ en C / C++ usamos lo siguiente: ñ –> printf(”%c”,164);

Ñ –> printf(”%c”,165);

Cada uno de los números que aparecen a la derecha del printf es el código ASCII de cada letra acentuada También podemos imprimir las letras ñ y Ñ sin usar parámetros en el printf: ñ –> printf(”\xA4″);

Ñ –> printf(”\xA5″);

Los números y letras que aparecen después de \x es el código ASCII de las letras ñ y Ñ en hexadecimal.

Signo de interrogación y exclamación en C/C++ Primero prueba que estas dos formas de mostrar los símbolos funcionan: printf(”\n%cEsto funciona? %cSi!”,168,173); printf(”\n\xA8 Esto funciona ? \xAD Si !”);

Para mostrar los signos ¿ y ¡ en C / C++ (los símbolos ? y ! no dan problema alguno) usamos lo siguiente: ¿ –> printf(”%c”,168); ¡ –> printf(”%c”,173);

Cada uno de los números que aparecen a la derecha del printf es el código ASCII de cada símbolo También podemos imprimir los símbolos sin usar parámetros en el printf: ¿ –> printf(”\xA8″); ¡ –> printf(”\xAD”);

Los números y letras que aparecen después de \x es el código ASCII de los signos ¿ y ¡ en hexadecimal Fuente: http://www.isfesl.es/juan/PLE/Castellano%20en%20C.pdf

Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

75

CENEAC - Programación con C++ Nivel 1.

Ejemplos Adicionales Ejemplo 1. Comparación de caracteres #include using namespace std; int main() { // indica si un caracter dado por el usuario es una vocal o no char c; //solicitamos datos de entrada cout <<"Suministre el caracter a verificar "; cin >>c; // mejorar para que valide may y min correctamente // valide que la cadena tiene un solo caracter strlen // se determina si es una vocal if ( (c == 'a') || (c == 'e') ||(c == 'i') ||(c == 'o') ||(c == 'u') ) cout <<"\nEl caracter es la vocal " <
Ejercicio 17. Copiar una cadena sin usar funciones especiales #include <string.h> using namespace std;

int main() { // solicita una cadena, muestra sus caracteres y la invierte char cad[]="", cadres[]=""; int i, tam;

cout <<"Suministre la cadena a procesar "; cin >>cad; tam = strlen(cad); // verificamos si la cadena es vacía

if (tam == 0) cout <<"La cadena suministrada es vacía "; else {

cout <<"El tamaño de la cadena es " <
// mostrar cada elemento de la cadena

for (i=0; i
Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

76

CENEAC - Programación con C++ Nivel 1. cout <<"\n El caracter " <
cout <<"\n luego de copiar la cadena original es \" " <
system("Pause");

return 0; }

Ejercicio 20. Recorrer cadena y calcular frecuencia de vocals y consonantes #include #include <string.h> using namespace std; int main() { // recorre una cadena y determina la frecuencia de vocales y consonantes char cad[]="";

char c;

int tam, i=0, cantv=0, cantc=0; //cantidad de vocales y de consonantes cout <<"Suministre la cadena a verificar "; cin >>cad; tam = strlen(cad); //determinamos cuantos caracteres tiene la cadena, su tamano while (i
Material elaborado por CENEAC Producciones, C.A. Prohibida su reproducción total o parcial sin autorización del Autor.

77

Related Documents

Programacion En C++
February 2021 1
Programacion C
February 2021 1
Programacion En Mql4
February 2021 1
Programacion
February 2021 1

More Documents from ""

Programacion En C++
February 2021 1
Php Mysql Nivel 1
March 2021 0