Вы находитесь на странице: 1из 136

GUIA PRACTICA C++

Ing. Felipe Loayza Beramendi

CAPITULO UNO

PROGRAMACIÓN DE COMPUTADORAS

1.1. CONSTRUCCIÓN COMPUTADORA

DE

UN

PROGRAMA

DE

Cualquier tarea que involucre el enfrentarse a un pro- blema - no necesariamente la construcción de un pro- grama de computadora -, involucra el tener una com- prensión total del mismo y planear cuidadosamente cada uno de los pasos que intervienen en su solución.

La aparición de la computadora se ha constituido como un potente medio por el cual podemos resolver muchos de nuestros problemas (cuando el problema lo permita), pero, ¿cómo nos ayuda la computadora a resolver estos problemas?. Para ello empleamos un conjunto de ins- trucciones que pueda “entender” la computadora, a este conjunto de instrucciones le llamamos programa de com- putadora.

Estos programas pueden desarrollarse en alguno o va- rios de los diferentes lenguajes de programación exis- tentes, también se pueden emplear una combinación de estos.

Obviamente debemos conocer las particularidades de ca- da lenguaje de programación y emplearlo adecuadamente. En nuestro caso emplearemos el Lenguaje de Programa- ción C++ aplicado con Técnicas de Programación Estruc-

turada, ambos serán analizados con más detalle en las secciones que siguen.

El desarrollo del Programa de Computadora implica el seguimiento de varias etapas, los cuales pasamos a describir:

1.1.1. ANÁLISIS DEL PROBLEMA

Aquí damos el primer paso para el desarrollo de un Programa de Computadora, en esta parte se describe detalladamente el problema, de- terminando lo siguiente:

Datos de entrada En el cual se especifica los datos propor- cionados por el problema en cuestión. Al- gunas veces se tendrán que seleccionar en- tre muchos datos, aquellos datos importan- tes para obtener lo que se requiere.

Datos de salida El programa que se elabora para solucionar el problema generará un resultado (lo que requerimos), ¿qué resultado?. Evidentemen- te, esto también lo encontramos al anali- zar el problema, de esta forma establece- mos los datos que se deben obtener al aplicar el programa.

1.1.2. PROCESO DE SOLUCIÓN

Luego del análisis estableceremos la relación existente entre los datos de entrada y los datos de salida.

Puesto que si el problema es factible de ser solucionado recurriendo a un programa de com- putadora, los datos de entrada deben susten- tar una relación con los datos de salida a través de un algoritmo que será la solución a nuestro problema. Un algoritmo es simplemente el conjunto de acciones que se deberán esta- blecer para solucionar nuestro problema. Este algoritmo - el Capítulo Dos trata en detalle acerca de los algoritmos - puede ser presen- tado de diversas maneras, una de sus formas

de presentación es a través de código en un lenguaje de programación.

1.1.3. REFINAMIENTO DEL PROGRAMA

En esta etapa sometemos al programa a una se- rie de pruebas para determinar que cambios se podrían realizar al programa para mejorar la funcionalidad del mismo, para este fin nos valemos de un grupo de datos de prueba que en muchas ocasiones nos permiten encontrar cier- tos detalles que habíamos dejado sueltos.

1.2. CARACTERÍSTICAS DE LOS PROGRAMAS

Para llegar a la solución de un problema podemos uti- lizar varios métodos de solución, o lo que es lo mis- mo, varios algoritmos. Para seleccionar el algoritmo correcto debemos tener en cuenta ciertas característi- cas inherentes a estos algoritmos, que pueden estar representados en la forma de un programa de computado- ra. He aquí algunas de las características que podemos mencionar para este programa de computadora.

1.2.1. CLARIDAD

Ha de ser fácil de leer y entender, en lo po- sible se debe emplear el algoritmo más sim- ple, de entre las múltiples opciones existen- tes.

Un modo de mejora en la claridad del progra- ma, es el de disponer comentarios en el pro- grama, esto permite adicionalmente; la faci- lidad en el mantenimiento, las modificaciones y actualizaciones cuando sea necesario.

1.2.2. EFICIENCIA

Se busca hasta donde se pueda, emplear la me- nor cantidad de acciones o instrucciones en el programa, aprovechando los recursos que pueda ofrecer el sistema y la computadora, debe ser fácilmente adaptado a otro lenguaje de programación.

1.2.3. MODULARIDAD Y ESTRUCTURACIÓN

Puede estar subdividido en bloques o módulos, cada módulo realiza una parte del trabajo to- tal. Los módulos deben usar las técnicas de la Programación Estructurada para facilitar la verificación, depuración y mantenimiento del programa.

1.3. OBJETOS DE UN PROGRAMA

Se consideran como objetos de un programa a aquellos elementos que son utilizados para almacenar y repre- sentar los datos ha emplearse en un programa, tienen las siguientes características:

Identificador: Es el nombre que identificara al ob- jeto. Ejemplo: suma, var1, pi, etc.

Tipo: Es el conjunto de valores que puede tomar, el C++ tiene varios tipos de datos, el tipo de dato determina el conjunto de valores posibles para el objeto.

Valor: Dentro del conjunto de valores que puede to- mar se le asigna uno de ellos en un instante. Ejem- plo: a = 5.

Los objetos los podemos dividir en Constantes y Varia- bles.

1.3.1. CONSTANTES

Estos objetos tienen valores fijos y que no pueden ser variados a lo largo de la ejecu- ción de un programa.

Se tiene aquellas que son predefinidas y de- finitivamente sus valores no pueden ser cam- biados. Por ejemplo: time significa la

hora en el que fue compilado el archivo fuen- te.

En el C++ también existen lo que se ha dado por llamar “variables constantes”, aunque realmente sean las constantes que define el propio programador.

1.3.2. VARIABLES

Son objetos cuyos valores tienen la posibili- dad de ser cambiados durante la ejecución del programa. Ejemplo: int a; declara una varia- ble “a” de tipo int.

CAPITULO DOS

2.1. DEFINICIONES

2.1.1. ALGORITMO

ALGORITMOS

El algoritmo tal como lo vimos inicialmente, es el conjunto de acciones que se deberán realizar para resolver un problema. Si este problema ha de ser resuelto por una computa- dora, entonces el algoritmo es el conjunto de instrucciones que deberán ser realizados por la computadora.

El algoritmo empleado debe indicar el orden de realización de cada instrucción, el número de instrucciones será finito. Se debe obtener los mismos resultados, cuando los datos de entrada son los mismos.

Para la construcción de los algoritmos em- plearemos; la Programación Modular y una Téc- nica de Programación Estructurada.

2.1.2. PROGRAMACIÓN MODULAR

Existe una “regla de oro” en la programación, “divide y vencerás”. La Programación Modular

es la aplicación de esta regla, divide el programa en módulos, en el caso del C++ estos módulos están representados en la forma de funciones, ya que el C++ es un lenguaje fun- cional, es decir solamente emplea funciones

en la construcción de un programa.

Estos módulos reducen la complejidad de un programa, al permitir que cada módulo pueda ser analizado y perfeccionado casi indepen- dientemente del resto de los módulos, no to- talmente independiente porque no se debe per- der la visión global del programa.

Los módulos son interdependientes entre sí; uno de ellos, el módulo principal, controla

y relaciona los demás módulos. El módulo

principal, también es conocido como programa principal; en el caso del C++ esta viene a ser la función principal o función main(). El resto de módulos se conocen como procedimien- tos o subprogramas; en el caso del C++ se de-

nominan simplemente funciones.

Un módulo es un conjunto de instrucciones or-

denadas, los cuales pueden ser referenciados empleando el nombre que se le asigna al módu-

lo.

Cabe mencionar que, si el programa no es muy complejo no será necesario crear más de un módulo, en este caso no se ha dividido el programa.

2.1.3. PROGRAMACIÓN ESTRUCTURADA

Ya sea que el programa cuente con uno o va- rios módulos, en nuestro caso del C++, con una o más funciones, tendremos que emplear la técnica de programación estructurada en el módulo o los módulos.

La Programación Estructurada, es una técnica

de

programación existen otras- que emplea en

el

diseño de los módulos: estructuras de

control, recursos abstractos y un diseño des- cendente.

Estructuras de control Son tres tipos de estructuras que al uti- lizarse individualmente o en forma combi-

nada pueden resolver cualquier problema de programación con un solo punto de entrada

y de salida.

Las estructuras son las siguientes:

Estructura secuencial, el cual ejecuta el conjunto de instrucciones sucesiva- mente una a continuación de otra, sin omitir ninguna.

Estructuras selectivas, son aquellas que seleccionan una alternativa puede ser una o varias instrucciones- a rea- lizar, la selección depende del valor de una condición. Estas a su vez se dividen en estructuras selectiva sim- ple, doble y múltiple.

Estructuras repetitivas, son aquéllas en le que una instrucción o conjunto de instrucciones se repiten una canti- dad de veces determinada por una con- dición. Tenemos las siguientes, es- tructura repetitiva mientras, hacer - mientras, desde hasta (para).

Recursos abstractos El conjunto de instrucciones a seguir es un recurso abstracto, pues es independien- te del tipo de computadora a emplear, así como también del lenguaje de programación. Estas instrucciones deben ser implementa- das con pocos o casi ningún cambio, en un lenguaje de programación específico para cualquier tipo de computadora.

Metodología Descendente de “Arriba hacia Aba- jo” Esta metodología conocida también como “top_down” coloca las instrucciones en una estructura jerárquica, teniendo que algu- nas de estas instrucciones se encuentren en niveles respecto a otros. Dos instruc- ciones de niveles inmediatos se relacionan

a través de sus entradas y salidas.

En cada nivel se detalla como se utilizan los datos que permitirá la resolución del problema planteado. Estos niveles muchas veces representan módulos de programas.

2.2. CONSTRUCCIÓN DE ALGORITMOS

Con el conocimiento acerca de los datos de entrada y salida, se puede iniciar la construcción del algorit- mo.

Para construir un algoritmo se emplea un diseño des- cendente, por lo tanto el algoritmo puede emplear mó- dulos de programa que serán fáciles de analizar.

Cada uno de estos módulos pueden modificados constan- temente de tal manera que se ajusten cada vez más a las necesidades de nuestro programa.

Luego es necesario representar el algoritmo a través de algunas herramientas que mencionaremos en la si- guiente sección.

2.3. REPRESENTACIÓN DE ALGORITMOS

El algoritmo puede ser representado de diversas mane- ras, para ello emplearemos algunas de las denominadas herramientas de programación: Diagrama de flujo, Dia- grama N-S, Pseudocódigo. La representación del algo- ritmo recurriendo al código de un Lenguaje de Progra- mación tal como el C++, hace que se tenga que conocer necesariamente la sintaxis y características de este, por ello en forma general e independientemente del lenguaje de programación, es mejor representarlo em- pleando algunas de estas herramientas. En este libro orientaremos el diseño del algoritmo para su represen- tación en el C++.

2.3.1. DIAGRAMA DE FLUJO

Es una técnica que sirve para representar un algoritmo a través de símbolos y representa el orden de la secuencia de los algoritmos a través de líneas de flujo, representadas como flechas.

Existen unos pocos símbolos denominados prin- cipales que permite representar un algoritmo en forma general, pero además se cuenta con

un conjunto de símbolos adicionales que se emplean para situaciones especificas.

2.3.2. DIAGRAMA N-S

El diagrama Nassi Schneiderman, para abre- viar diagrama N-S, cumple también la función de representar un algoritmo, para ello hace uso de cajas contiguas, dispuestas uno tras de otros. Igual que el anterior, permite re- presentar todas las instrucciones que deben ir en un programa.

2.3.3. PSEUDOCÓDIGO

Representa al algoritmo, en forma de palabras y frases del lenguaje natural, en nuestro ca- so el español. El Pseudocódigo a de estar su- jeto a ciertas reglas que mencionaremos opor- tunamente, de tal manera que permitan expre- sar nuestro algoritmo de manera fácil y fle- xible.

CAPITULO TRES

CARACTERISTICAS DEL C++

3.1. CARACTERÍSTICAS

El lenguaje de programación C++ se emplea para escri- bir sistemas de operativos, compiladores, programas ensambladores, programas de bases de datos, sistemas expertos, etc. Y sus características son:

Es de propósito general;

Es un lenguaje de alto nivel como: PASCAL, BASIC, etc;

Es un lenguaje estructurado, pues contiene las es- tructuras básicas de composición, selección y lazo o ciclo con entrada única;

Se le considera lenguaje de nivel medio, esto es, entre lenguaje ensamblador y de alto nivel, pues permite el manejo de datos a nivel de bits, bytes y direcciones;

Permite la programación modular: se pueden escribir programas independientes (módulos) constituyendo librerías de programas para ser utilizados posteriormente;

Es transportable: los programas escritos en este lenguaje pueden ser ejecutados bajo diferentes pla- taformas (Sistemas Operativos).

3.2. IDENTIFICADORES

Un identificador es el nombre que se da a un programa, variable, constantes, etiqueta, función, clase, es- tructura, etc. Su longitud significativa por defecto es de 32 caracteres y debe estar formado por:

El primer carácter debe ser una letra o el carácter subrayado (_),

Los siguientes caracteres al primero pueden ser le- tras, dígitos, o el carácter subrayado (no esta permitido los espacios),

El lenguaje C++ diferencia entre mayúsculas y mi- núsculas en los identificadores, es decir los iden- tificadores AREA y area son diferentes, y

No se deben usar como identificadores las palabras reservadas por el lenguaje (ejemplo: break, case, char, int, etc.)

3.3. PALABRAS RESERVADAS

Las palabras reservadas forman parte del lenguaje de programación C++ y entre algunas de las palabras re- servadas tenemos:

Asm

Auto

Break

case

cdecl

Char

Class

const

continue _cs

default

delete

Do

Double

_ds

else

enum

_es

Extern

_export

far

_fastcall float

for

Friend

Goto

huge

if

inline

Int

Interrupt _loadds

long

Near

new

operator

Pascal

Private

protected public

register Return

_saveregs _seg

short

Signed

sizeof

_ss

static

Struct

switch

template

this

typedef

union

unsigned

virtual

void

volatile

while

3.4.

ESTRUCTURA DE UN PROGRAMA

El Lenguaje de programación C++ esta formado por fun- ciones y estos a su vez están formados por bloques, la función main es la encargada de llamar a las otras funciones.

// Directivas y declaraciones main(){ //Directivas declaraciones //Sentencias

}

función_1(){

//Directivas declaraciones //Sentencias

}

//Más funciones

Las Directivas son orden de programa que no se tradu- cen a lenguaje de maquina porque es un mensaje para el compilador (o preprocesador), algunas directivas son:

#include, #pragma, #define, #undef, etc.

Las declaraciones son sentencias que especifican atri- butos (identificador, tipo de datos, alcance, tiempo de vida) de una variable o una función. La declaración de una función se conoce como prototipo.

3.5. COMENTARIOS

Los comentarios son ignorados por el compilador y se utilizan para autodocumentar los programas y C++ so- porta dos tipos:

3.5.1. COMENTARIO EN MÁS DE UNA LINEA

/* Comentario */

El compilador ignora todo lo que se encuentra entre /* y */.

3.5.2. COMENTARIO EN UNA SOLA LÍNEA

// Comentario

El compilador ignora todo lo que viene des- pués de // hasta el final de la línea.

3.6.

BLOQUES

Cualquier grupo de instrucciones puede formar un blo- que y ser tratado como una instrucción simple, para lo cual basta encerrarlo entre llaves.

{

//Sentencias

}

Se pueden anidar como se muestra a continuación

{//Comienzo de bloque {//Comienzo de sub-bloque

} //Fin de sub-bloque }//Fin de bloque

3.7. TIPOS DE DATOS FUNDAMENTALES

3.7.1. TIPO CHAR

Son datos de un byte de longitud. Las varia- bles de este tipo pueden tener signo (por de- fecto) o no tener signo, su rango es de -128 a 127 y de 0 a 255, respectivamente. Puede almacenar codigos ASCII (de: letras, digitos, signos de puntuacion, simbolos especiales, etc.

Este tipo de dato internamente es tratado co- mo un número entero.

3.7.2. TIPOS ENTEROS

Guardan números enteros positivos o negativos o cero, los tipos enteros son:

TIPO

LONGITUD

 

RANGO

Unsigned char

8

bits

0

a 255

Char

8

bits

-128 a 127

Enum

16

bits

-32,768 a 32,767

Unsigned int

16

bits

0

a 65,535

Short int

16

bits

-32,768 a 32,767

Int

16

bits

-32,768 a 32,767

Unsigned long

32

bits

0

a 4,294,967,295

Long

32

bits

-2,147,483,648 a 2,147,483,647

3.7.3. TIPOS DE PUNTO FLOTANTE

Guardan números positivos, negativos o cero con parte fraccionaria o punto decimal.

TIPO

LONGITUD

RANGO

Float

32

bits

3.4*10 -38 a 3.4*10 38 )

Double

64

bits

1.7*10 -308 ) a 1.7*10 308

Long double

80

bits

3.4*10 -4932 a 1.1*10 4932

3.7.4. TIPO VOID

Es un tipo de dato que indica vacío (nulo). Cuando una función no devuelve un valor la función es de tipo void.

3.8. MODIFICADORES DE TIPO

Los modificadores de tipo son: signed, unsigned, short, long. Alteran el rango del tipo. Todos los mo- dificadores son aplicables al tipo int.

Los modificadores signed, unsigned puede ser aplicado al tipo char.

Cuando el tipo es omitido entonces int es asumido. El modificador long puede ser aplicado al tipo double.

Ejemplos:

long x; /* long int */

unsigned char car; /* Caracter sin signo */

unsigned long int; /* Se puede omitir int, porque el tipo por defecto es int */

3.9. CONSTANTES

Son valores numéricos, caracteres o cadenas que no ocupa memoria fuera del código del programa.

3.9.1. CONSTANTES ENTERAS

Son constantes sin parte fraccionaria y puede estar en sistema de numeración octal, decimal o hexadecimal; por ejemplo en el sistema de- cimal: 34, 5678.

Constante hexadecimal Las constantes Hexadecimales y están pre- cedidas por 0X, utiliza los dígitos del

0

9

y las letras de A

F

(para represen-

tar

valores del

10

15);

por ejemplo:

0xFF, 0x12.

Constante octal Son constantes en el sistema de numeración

octal y están precedidos por

utiliza los dígitos del 0 011, 004.

(cero),

por ejemplo:

0

7;

3.9.2. CONSTANTE CARÁCTER (CHAR)

Es una constante que esta formado por un solo carácter encerrado entre comillas o una se- cuencia de escape; por ejemplo: '\n','A'.

Las secuencias de escape que se pueden utili- zar son:

S.ESC

CARACTER DE SALIDA

\a

alerta (beep)

\b

Retroceso

\f

salto de pagina (alimentación)

\n

salto de línea

\t

tabulador horizontal

\"

comillas dobles

\r

retorno de carro

\\

Backslash

\?

Signo de interrogación

\DDD

Código octal de un carácter

\xHHH

Código hexadecimal de un carácter

\0

carácter nulo

\'

comilla simple

\v

Tabulación vertical

3.9.3. CONSTANTE CADENA

La constante cadena es un conjunto de carac- teres y/o secuencias de escape que están en- cerrados entre comillas dobles. "A" es una cadena y 'A' es un carácter.

3.9.4. CONSTANTE DE PUNTO FLOTANTE

Son constantes numéricas con parte fracciona- ria; por ejemplo: 12.48, .24, -4.3E+38.

3.10. DEFINICIÓN DE CONSTANTES

Una constante no puede cambiar su valor cuando el pro- grama esta en ejecución. Se define utilizando:

3.10.1. LA DIRECTIVA #DEFINE

#define <identificador> <Valor>

Ejemplo:

#define NOTA_MAX 20 #define ENTER 0x13 #define titulo "TURBO C"

3.10.2. CONST

const <identificador>=<Valor>;

Ejemplo:

const NOTA_MAX=20;

3.11. DECLARACIÓN DE VARIABLES

Toda variable para ser usada por un programa debe ser antes declarada y el formato a utilizar es:

[<almacenamiento>] <tipo> <identificador> [<=valor>];

< almacenamiento>: auto, static, register, extern. Si se omite asume auto.

<identificador>: Indica los nombres de las variables a definir y están separados por comas.

Ejemplos:

int contador=0; float sueldo, descuento, igv=0.18;

3.12. EXPRESIONES

Son valores, constantes, variables, llamada a una fun- ción o una combinaciones de los anteriores. Cuando se mezclan variables de diferentes tipos en una expre-

sión, C++ las convierte a un mismo tipo. C++ converti- rá todos los operandos al tipo más grande según:

Todos los tipos char, short int se convierten a int. Todos los tipos float a double.

Para todo par de operandos, lo siguiente ocu- rre en secuencia:

a) Si uno de los operandos es un long double el otro se convierte a long double.

b) Si uno de los operandos es double el otro se convierte a double.

c) Si uno de los operandos es long el otro se convierte a long.

d) Si uno de los operandos es unsigned el otro se convierte a unsigned.

EJEMPLO

char ch;

int i;

float f;

double d;

r=(ch / int
r=(ch
/
int

int

i)

+

(f * d) double
(f
*
d)
double

double

-

(f

+

i);

double double

int i) + (f * d) double double - (f + i); double double double double

double

double
double
double

double

double
double
double
double
double
double
double
double

double

En la conversión, el tipo char ch es convertido a int y el float f es convertido a double. Luego según los operandos se van modificando los tipos hasta obtener double.

3.13. CONVERSIÓN DE TIPOS

Para forzar el tipo de una expresión utilice:

(tipo) <expresión>

Ejemplo:

float res;

int num=13;

i=(float) num/2; /* i toma el valor de 6.5 */

/* Primero num se cambia al tipo float y lue- go efectua la operacion */

CAPITULO CUATRO

OPERADORES BÁSICOS

4.1. OPERADORES ARITMÉTICOS

Los operandos de mayor precedencia se ejecutan antes que los de menor precedencia. Por ejemplo:

4+5*214

Los operandos con igual precedencia se ejecutan de iz- quierda a derecha. Por ejemplo:

5*4/2/25

OPERADOR

DESCRIPCION

EJEMPLO

OBSERV.

PRECEDENCIA

(

)

Agrupación

(3+5)

 

1

-

Menos unitario

-3

 

2

+

Más unitario

+3

 

2

++

Incremento

a++

a=a+1

2

--

Decremento

a--

a=a-1

2

*

Multiplicación

4*3

 

3

/

División

4/3

 

3

%

Modulo

4%3

 

3

+

Suma

4+3

 

5

-

Resta

4-3

 

5

Cuando el operador de división se aplica a un operando de tipo entero el resultado es de tipo entero, ejemplo 3/2 es igual a 1. Para obtener la parte fraccionaria

es necesario que uno de los operandos sea de tipo flo- tante, ejemplo 3/2.0 ó 3.0/2 es igual a 1.5.

El operador modulo es equivalente a decir el residuo de dividir el primer operando entre el segundo, ejem- plo 5%2 es igual a 1. Sólo es aplicado a datos de tipo entero.

El operador ++ o -- puede ir delante o después del operando. Cuando va delante del operando primero in- crementa o decrementa y luego utiliza el nuevo valor del operando. Cuando va después del operando primero utiliza el valor del operando y luego lo incrementa o decrementa.

Ejemplo del uso de ++ antes del operando:

a=3;

x=++a+3;

“a” toma el valor de 4, a este nuevo valor se le suma 3, por lo tanto x=7. La línea es equivalente a:

x    a 3;

a a 1;

  x a 3;

Ejemplo del uso de ++ después del operando:

a=3;

y=a+++2; //

“y” toma el valor del resultado de a (utili- zando su valor 3) + 2 igual a 5, luego “a” toma el valor de 4. Su equivalencia es:

y a    2;

y a 2;

 

a a 1;

4.2. OPERADOR DE ASIGNACIÓN

Estos operadores son utilizados para asignar un valor a una variable y pueden ser:

4.2.1. IGUAL (=)

Variable = <Valor>;

El valor puede ser una constante, una varia- ble o una expresión.

Ejemplos:

saldo = 567.89; car = ‘A’; edad = 20;

4.2.2. ASIGNACIÓN MÚLTIPLE

Permite asignar un valor o expresión a más de una variable.

variable_1=variable_2=…=variable_N=expresión;

Ejemplo:

x=y=3*2;

4.2.3. ASIGNACIÓN RELATIVA

variable <operador> = Expresión

El operador puede ser cualquier operador aritmético y es equivalente a:

variable = variable operador expresión;

OPERADOR

EJEMPLO

OBSERVACIONES

+=

x+=5;

x=x+5;

-=

x-=5;

x=x-5;

*=

x*=5;

x=x*5;

/=

x/=5;

x=x/5;

%=

x%=5;

x=x%5;

Ejemplo:

x //Equivalente a x=x+5;

y //Equivalente a y=y+3;

z = 2; //Equivalente a z=z*2;

+= 5;

-= 3;

4.3.

OPERADORES DE RELACIÓN

Los operadores relacionales dan como resultado verda- dero o falso. En "C++" todo numero diferente de cero es verdadero, y cero es equivalente a falso.

OPERADOR

DESCRIPCION

EJEMPLO

PRECEDENCIA

>

mayor que

4>12

1

>=

mayor o igual que

4>=12

1

<

menor que

4<12

1

<=

menor o igual que

4<=12

1

==

igual que

4==12

2

!=

diferente de

4!=12

2

4.4. OPERADORES LÓGICOS

Los operadores lógicos dan como resultado verdadero o falso. Recuerde que en "C++" todo numero diferente de cero es verdadero y cero es falso.

OPERADOR

DESCRIPCION

EJEMPLO

PRECEDENCIA

!

No lógico

!(4>12)

1

&&

y

lógico

(4>12)&&(8>12)

2

||

o

lógico

(4>12)||(8>12)

3

El resultado de los operadores lógicos se resume en la siguiente tabla:

p

q

!p

!q

p&&q

p||q

1

1

0

0

1

1

1

0

0

1

0

1

0

1

1

0

0

1

0

0

1

1

0

0

CAPITULO CINCO

SALIDA / ENTRADA ESTÁNDAR

5.1. SALIDA/ENTRADA ESTÁNDAR EN C++

5.1.1. SALIDA CON cout

El flujo de salida se representa por el iden- tificador cout, que es en realidad un objeto. El operador << se denomina operador de inser- ción o de “poner en”. Dirige el contenido de la variable situada a su derecha al objeto situado a su izquierda. Su formato es:

cout << expr_1<< expr_2<<

<< expr_n;

Ejemplo (1): Permite usar el cout.

//Permite usar el cout #include <iostream.h> int main()

{

cout<< "primer programa"; return 0;

}

Ejemplo (2): Programa que suma dos números //programa que suma dos números #include <iostream.h> int

Ejemplo (2): Programa que suma dos números

//programa que suma dos números #include <iostream.h>

int main() { int x=1,y=3,suma;

suma=x+y; cout<< "\n la suma de "<< x ; cout<< " mas " <<y << " es " << suma; cout<< "\n";

return 0;

}

<< suma; cout<< "\n"; return 0; } 5.1.2. ENTRADA CON CIN El C++ permite la entrada

5.1.2. ENTRADA CON CIN

El C++ permite la entrada de datos a través del flujo de entrada cin. El objeto cin es un objeto predefinido en C++ que corresponde al flujo de entrada estándar. Este flujo repre- senta datos que proceden del teclado. El ope- rador >> se denomina también de extracción o de lectura de. Toma el valor del objeto flujo de su izquierda y lo sitúa a en la variable situada a su derecha. Su formato es:

cin >>variable_1>>variable_2>>…>>variable_n;

Ejemplo (3):

Programa que suma dos números leídos del teclado.

/* Programa que suma dos números leídos del te- clado */

#include <iostream.h> #include <conio.h>

int main()

{

int x,y,suma;

cout << "Ingrese dos numeros : "; cin >> x >> y; suma=x+y; cout<< "\n la suma de "<< x ; cout<< " mas " <<y << " es " << suma; cout<< "\n"; return 0;

}

suma; cout<< "\n"; return 0; } Ejemplo (4) : Programa que convierte de Farenheit a Celsius.

Ejemplo (4):

Programa que convierte de Farenheit a Celsius.

/* Programa que convierte de Farenheit a Cel- sius */ #include <iostream.h>

int main()

{ int f,c;

cout << "Ingrese temperatura farenheit : "; cin >> f;

c=(f-32)*5/9;

cout<< "Su equivalente en celsius c<<"\n"; return 0;

}

es

"<<

c<<"\n"; return 0; } es "<< TECNICAS DE PROGRAMACIÓN ESTRUCTURADA: Aplicaciones en C++

CAPITULO SEIS

SENTENCIAS DE CONTROL

Las sentencias de control son una parte imprescindible dentro de un lenguaje de programación. Son aquellas que determinan la secuencia de las sentencias a ejecutar.

6.1. SENTENCIA if

Exprla secuencia de las sentencias a ejecutar. 6.1. SENTENCIA if SI Sentencia N0 Si la expresión

SI

Sentencia
Sentencia

N0

Si la expresión es diferente de CERO ejecuta la sen- tencia y continua con la sentencia que sigue a if.

if (expresión) sentencia;

Ejemplo (5): El siguiente programa determina el nú-

mero mayor de dos números ingresados por el teclado.

#include <iostream.h> void main()

{

float num1,num2,mayor;

cout <<"Ingrese primer numero : "; cin >> num1; cout <<"Ingrese segundo numero : "; cin >> num2;

mayor=num1;

if(num2>num1)

mayor=num2;

cout <<"El mayor es : "<<mayor<<"\n";

}

Explicación

Después del ingreso de los dos números se asume que el mayor es num1, pero la condición de la sentencia if evalúa si num2 es mayor que num1 y si la condición es verdadera el mayor es num2.

que num1 y si la condición es ve rdadera el mayor es num2. Ejemplo (6): El

Ejemplo (6):

El siguiente programa determina el va- lor absoluto de un número.

#include <iostream.h> void main()

{

float num;

cout <<"Ingrese el numero : "; cin >> num;

if(num<0)

num=-num;

cout

<<"El

"<<num<<"\n";

}

valor

absoluto

es

:

Explicación:

El numero ingresado se evalúa para determinar si es negativo, un numero es negativo si es me- nor que cero. Si es negativo se le cambia de signo para obtener su valor absoluto.

se le cambia de signo para obtener su valor absoluto. Ejemplo (7): Programa que imprime en
se le cambia de signo para obtener su valor absoluto. Ejemplo (7): Programa que imprime en

Ejemplo (7):

Programa que imprime en orden ascenden- te tres números ingresados.

#include <iostream.h> void main()

{

int a,b,c,t;

cout<<"ingrese tres numeros enteros : "; cin >> a >> b >> c; if (a>b)

{ t=a; a=b; b=t;}

if (b>c)

{ t=b; b=c; c=t;} if (a>b)

{ t=a; a=b; b=t;}

cout <<a<<"\t"<<b<<"\t"<<c<<"\n";

}

Explicación

Los números ingresados son a, b y c. Utilizando el algoritmo de la burbuja para tres números, que consiste:

En comparar si el primer numero es mayor que el segundo numero, si el segundo numero es mayor que el tercer numero, y finalmente, si el pri- mer numero es mayor que el segundo numero. Si se cumple la condición se intercambian sus va- lores. Al final a, b y c contienen los valores ordenados ascendentemente de los números ingre- sados.

Para intercambiar los valores de num1 y num2 se utiliza el siguiente algoritmo:

t=num1;

num1=num2;

num2=t;

Usando la variable t (temporal) se consigue que no se pierda el valor de num1. Si los números son: num1=10 y num2=5; la prueba de escritorio es:

//t toma el valor de num1 (10)

t=10;

//num1 toma el valor de num2 (5)

num1=5;

//num2 toma el de t (10)

num2=10;

Al finalizar la ejecución de las tres senten- cias se tiene: num1=5 y num=10; lo que nos con- firma que el algoritmo ha intercambiado sus va- lores originales. Note que en el programa las tres sentencias que realizan el intercambio están encerrado entre llaves formando un bloque de sentencias.

encerrado entre llaves formando un bloque de sentencias. La figura siguiente describe la sentencia if else:

La figura siguiente describe la sentencia if

else:

SI Expr NO Sentencia_1 Sentencia_2
SI
Expr
NO
Sentencia_1
Sentencia_2

Si la expresión es diferente de CERO ejecuta la sen- tencia_1, sino ejecuta la sentencia_2. En ambos casos continua con el flujo del programa.

if (expresión) sentencia_1; else sentencia_2;

Ejemplo (8): Programa que determine el salario sema-

nal a pagar a un trabajador. Por traba- jar más de 40 horas durante la semana se hace acreedor a una pago extraordi- nario que consiste: en pagar por cada hora extra 50% más que una hora normal. En este programa se ingresan: el número de horas trabajadas y el pago por hora normal.

#include <iostream.h> void main()

{

int horas; float pago,p_h;

cout<<"Numero de horas trabajadas:"; cin>>horas; cout<<"Pago por hora normal:"; cin>>p_h;

if(horas>40)

pago=(horas-40)*1.5*p_h+40*p_h;

else

pago=horas*p_h;

cout<<"\n\nPago semanal:"<<pago<<"\n";

}

Explicación

La sentencia if evalúa si el trabajador tiene mas de 40 horas (horas>40) para determinar si tiene horas extras. Si tiene horas extras cal- cula su pago debido a las horas extras ((horas- 40)*1.5*p_h) y su pago normal por las 40 horas (40*p_h). Si no tiene horas extras para calcu- lar su pago se multiplica simplemente el número de horas trabajas por pago por hora (ho- ras*p_h).

número de horas trabajas por pago por hora (ho- ras*p_h). TECNICAS DE PROGRAMACIÓN ESTRUCTURADA: Aplicaciones en
Ejemplo (9): Programa que determina si un año es bi- siesto. Un año es bisiesto

Ejemplo (9): Programa que determina si un año es bi-

siesto. Un año es bisiesto si es múlti- plo de 4. Los años múltiplos de 100 no son bisiestos salvo que lo sean también de 400; por ejemplo: 1984 y 2000 son bisiestos, pero 1980 no es bisiesto.

#include <iostream.h> void main()

{

int anno,sw=0;

cout<<"Año : "; cin>>anno;

if(anno % 4==0)

{

sw=1;

if(anno%100==0 && anno%400!=0)

}

sw=0;

if(sw) cout <<"Año bisiesto \n"; else cout<<"Año no bisiesto \n";

}

Explicación:

En el programa sw=0 significa que el año no es bisiesto y sw=1 significa año bisiesto.

Se asume que el año es no bisiesto (sw=0) y si es múltiplo de cuatro (anno % 4==0) sw cambia a

1, lo que significa que el año es bisiesto. Los años múltiplos de 100 también son múltiplos de cuatro, pero no son bisiestos. Por eso razon, cuando los años son múltiplos de 100 y no lo

an-

son de cuatrocientos (anno%100==0

no%400!=0) sw cambia a 0, lo significa que no es bisiesto.

&&

sw cambia a 0, lo significa que no es bisiesto. && TECNICAS DE PROGRAMACIÓN ESTRUCTURADA: Aplicaciones

Ejemplo (10) : Programa que calcula el perímetro de un

triángulo si se ingresan las medidas sus tres lados a, b y c. Para que los tres lados del triángulo cierren se de- be cumplir: a<b+c, b<a+c y c<a+b.

#include <iostream.h> void main()

{

float a,b,c,p;

cout <<"Ingrese los lados : "; cin >> a >> b >> c;

if(a<b+c && b<a+c && c<a+b)

{

p=a+b+c; cout << "Perimetro= " << p<<"\n";

}

else cout<< "No forman un triangulo \n";

}

Explicación:

Antes de calcular el perímetro se evalúa si los tres lados forman el triángulo.

se evalúa si los tres lados forman el triángulo. La figura siguiente muestra el uso de
se evalúa si los tres lados forman el triángulo. La figura siguiente muestra el uso de

La figura siguiente muestra el uso de la sentencia el- se if.

expr==const_1 SI NO Sentencia_1 expr==const_2 SI NO Sentencia_2 expr==const_3 SI Sentencia_3 expr==const_N SI
expr==const_1
SI
NO
Sentencia_1
expr==const_2
SI
NO
Sentencia_2
expr==const_3
SI
Sentencia_3
expr==const_N
SI
Sentencia_N
NO
Sentencia_x

if (expresión_1) sentencia_1; else if (expresión_2) sentencia_2; else if (expresión_3) sentencia_3;

else if (expresión_n) sentencia_n; [else sentencia_x;]

Ejemplo (11): La comisión sobre las ventas totales de

un empleado es como sigue:

Si ventas < 50.00 unidades monetarias (u.m.) entonces no hay comisión.

Si esta entre 50.00 u.m. y 500.00 u.m. in- cluidos, entonces la comisión es 10% de las ventas.

Si las Ventas > 500.00, entonces la comisión es 50.00 u.m. más el 8% de las ventas superiores a 500.00.

El programa calcula la comisión cuando se in- gresa las ventas.

#include <iostream.h> void main()

{

double ventas,comision;

cout<<"Ventas totales : "; cin>>ventas;

if(ventas<50)

comision=0;

else if(ventas<=500)

comision=ventas*0.10;

else

comision=50+(ventas-500)*0.08;

cout<<"Comision: " << comision<<"\n";

}

" << comision<<"\n"; } Ejemplo (12): Programa que calcula el monto a pagar por el

Ejemplo (12): Programa que calcula el monto a pagar por el consumo de energía eléctrica, si durante su ejecución se ingresa el con- sumo y el tipo de tarifa. Las tarifas son:

TIPO DE

COSTO

TARIFA

(U.M./Kw-h)

 

1 2.30

 

2 8.25

 

3 6.42

 

4 5.80

 

5 9.65

#include <iostream.h> void main()

{

double consumo,tarifa,monto; int tipo;

cout<<"Consumo (kw-h): "; cin>>consumo; cout<<"Tipo de tarifa(1 al 5): "; cin>>tipo; if (tipo==1) tarifa=2.30; else if (tipo==2) tarifa=8.25; else if (tipo==3) tarifa=6.42; else if (tipo==4) tarifa=5.80; else if (tipo==5) tarifa=9.65; else tarifa=0;

if(tarifa)

{

monto=consumo*tarifa; cout<<"\nMonto a pagar: "<<monto<<"\n";

}

else cout<<"\nLa tarifa no existe"<<"\n";

}

Explicación:

En el programa según el tipo de tarifa se de- termina la tarifa correspondiente y al multi- plicar el tipo de tarifa por el consumo se ob- tiene el monto a pagar. Además, si el tipo de tarifa es diferente de 1 a 5 se le asigna a la variable tarifa cero, lo que significa que la tarifa no existe, sólo si la tarifa existe se calcula e imprime el monto a pagar, caso con- trario se imprime “La tarifa no existe”.

caso con- trario se imprime “La tarifa no existe”. TECNICAS DE PROGRAMACIÓN ESTRUCTURADA: Aplicaciones en C++

6.2. SENTENCIA switch

Expr Constante_1 Constante_2 Constante_n default Sentencia_1 Sentencia_2 Sentencia_n Sentencia_x
Expr
Constante_1
Constante_2
Constante_n
default
Sentencia_1
Sentencia_2
Sentencia_n
Sentencia_x

El switch es una forma sencilla de evitar largos, te- diosos y confusos anidamientos de else-if, esta sen- tencia proporciona una estructura lógica y clara para bifurcación múltiple.

switch(expresión){ case constante_1 : sentencia_1; break; case constante_2 : sentencia_2; break; case constante_3 : sentencia_3; break;

.

.

case constante_n : sentencia_n; break; [default : sentencia_x;]

}

La sentencia switch evalúa el valor de la expresión y según ese valor determina el flujo del programa. Si el valor de la expresión es igual a la constante_1 ejecu- ta la sentencia_1, si el valor es igual a la constan- te_2 ejecuta la sentencia_2, así sucesivamente.

Si el valor de la expresión es diferente a las cons- tantes indicadas en la sentencia switch ejecuta la sentencia_x correspondiente a default.

Si al final de cada case no se incluye break esto oca- sionaría que todas las sentencias que están debajo de la constante que tome el valor de la expresión se eje- cuten hasta encontrar un break o el final de switch; por ejemplo: si la expresión es igual a la constante_2 se ejecutarían la sentencia_2, la sentencia_3, así su- cesivamente hasta encontrar un break o el final de la sentencia switch.

Ejemplo ( 13): La comisión sobre las ventas totales de un empleado es como sigue:

Si ventas < 50.00 unidades monetarias (u.m.) entonces no hay comisión.

Si esta entre 50.00 u.m. y 500.00 u.m. in- cluidos, entonces la comisión es 10% de las ventas.

Si las Ventas > 500.00, entonces la comisión es 50.00 u.m. más el 8% de las ventas superiores a 500.00.

El programa calcula la comisión cuando se in- gresan las ventas.

#include <iostream.h> void main()

{

 

double consumo,tarifa,monto; int tipo;

cout<<"Consumo:"; cin>>consumo; cout<< "Tipo de tarifa(1 al 5):"; cin>>tipo; switch(tipo)

{

case 1:tarifa=2.30;break; case 2:tarifa=8.25;break; case 3:tarifa=6.42;break; case 4:tarifa=5.80;break; case 5:tarifa=9.65;break;

default:tarifa=0;

}

if(tarifa)

{

monto=consumo*tarifa; cout<<"\nMonto a pagar:"<<monto<<"\n";

}

else cout<<"\nTarifa incorrecta\n";

}

6.3. SENTENCIAS REPETITIVAS O BUCLES

una sentencia repetitiva o bucle permite ejecutar re- petidamente una sentencia o un bloque de sentencias mientras se cumple una determinada condición, pero si el bucle se ejecuta indefinidamente se forma un bucle infinito. Un bucle infinito se forma generalmente por un error lógico de programación.

Las sentencias repetitivas en C++ son: while, do while y for.

6.4. SENTENCIA while

Expr SI N0 Sentencia
Expr
SI
N0
Sentencia

Primero evalúa la expresión (expr), si la condición es verdadera (diferente de cero) entonces la sentencia es ejecutada, caso contrario pasa el control a la senten- cia que sigue a la sentencia while.

Después de la ejecución de la sentencia la condición nuevamente es evaluada y se procede como en el caso anterior.

Para que la sentencia se ejecute por lo menos una vez la condición por lo menos una vez debe ser verdadera.

while (expresión) sentencia;

Ejemplo (14): Programa que imprime los n números con- secutivos.

#include <iostream.h> void main()

{

int n,i;

cout<<"Ingrese el valor de n: "; cin >> n;

i=0;

while (n>i)

{

i++;

cout<<i<<"\n";

}

}

Explicación:

Para comprender el funcionamiento del programa es conveniente hacer la prueba de escritorio, para lo cual hacemos n=3.

Limpiar la pantalla

Ingresar el valor de n=3

Hacer i=0

La condición de while n>i, ó 3>0 se cumple por lo:

Hacer i=1

Imprimir el valor de i=1 y un cambio de línea

La condición de while n>i, ó 3>1 se cumple por lo:

Hacer i=2

Imprimir el valor de i=2 y un cambio de línea

La condición de while n>i, ó 3>2 se cumple por lo:

Hacer i=3

Imprimir el valor de i=3 y un cambio de línea

La condición de while n>i, ó 3>3 no se cum- ple

Se espera la pulsación de una tecla

Fin del programa

Se espera la pulsación de una tecla  Fin del programa Ejemplo (15) : Programa que

Ejemplo (15): Programa que imprime los divisores de

un numero natural

#include <iostream.h>

void main(){

int n,i;

cout<<"Ingrese un numero entero : "; cin >> n;

i=1;

while (n/2>=i)

{

if (n % i==0) cout<<i<<"\n"; i++;

}

}

Explicación:

Para determinar los divisores de n: se divide n entre los números consecutivos de 1 hasta aproximadamente la mitad de n. Si al dividir n entre uno de los números consecutivos el resi- duo es cero significa que este numero consecu- tivo es divisor de n. Es decir por cada numero consecutivo se debe determinar si es divisor de

n.

En el programa en la variable i se generan los

la sentencia

if(n%i==0) se determina si i es divisor, la condición determina si n entre i tiene residuo

cero.

números consecutivos

y

con

si n entre i tiene residuo cero. números consecutivos y con Ejemplo (16) : Programa que

Ejemplo (16): Programa que determina si un numero na-

tural es primo. Un numero es primo si sólo es divisible por la unidad y por si mismo.

#include <iostream.h> void main()

{

int n,d;

cout <<"Numero natural : "; cin >> n;

d=2;

while(d*d<n && n%d!=0) d++; if (d*d>n) cout<< "Es primo \n"; else cout<< "No es primo \n";

}

Ejemplo (17): Programa que imprime los factores pri - mos de un número natural. #include

Ejemplo (17): Programa que imprime los factores pri-

mos de un número natural.

#include <iostream.h>

void main()

{

int n,d=2;

cout<<"Ingrese un numero entero : "; cin >> n; while (n>=d)

{

while (n%d!=0) d++; cout<<d<<"\n"; n/=d;

}

}

d++; cout<<d<<"\n"; n/=d; } } Ejemplo (18) : Programa que imprime la cantidad de nú-

Ejemplo (18): Programa que imprime la cantidad de nú-

meros primos indicados comenzando de 1. El valor de n es ingresado.

#include <iostream.h> void main()

{

int n,d,i,cant;

cout<<"Cantidad de primos: "; cin>>cant;

n=i=0;

while (cant>i)

{

n++;

d=2;

while(d*d<n && n % d !=0)

d++;

if (d*d>n)

{

cout<< n << "\n"; i++;

}

}

}

cout<< n << "\n"; i++; } } } 6.5. SENTENCIA do while Sentencia SI Expr NO

6.5. SENTENCIA do while

Sentencia SI Expr NO
Sentencia
SI
Expr
NO

La sentencia se ejecuta mientras la expresión sea ver- dadera (diferente de cero). La expresión es evaluada después que se ejecuta la sentencia. La diferencia fundamental entre while y do while es que la segunda se ejecuta por lo menos una vez, sea cual sea el re- sultado de expresión.

do sentencia; while(expr);

Ejemplo (19): Programa que obtiene el producto de dos

números enteros positivos mediante su- mas.

#include <iostream.h> void main()

{

 

int n1,n2,acum=0;

cout<<"Primer entero positivo:";

cin>>n1;

cout<<"Segundo entero positivo:";

cin>>n2;

do

{

acum=acum+n2;

 

n1=n1-1;

 

}while(n1);

cout<<"Producto="<<acum<<"\n";

}

} Ejemplo (20): Programa que calcula el Máximo Común Divisor

Ejemplo (20): Programa que calcula el Máximo Común Divisor (MCD) de dos números naturales utilizando el algoritmo de euclides.

El algoritmo consiste: los números a dividir se ubican en la parte central, el cociente se ubi- ca en la parte superior y el residuo en la par- te inferior. Se dividen los dos números si el residuo es diferente de cero, el divisor pasa a ser el dividendo y el residuo viene a ser el divisor, se continua con este proceso hasta que el residuo sea cero. El máximo común divisor es igual al último divisor, por ejemplo:

MCD(60,36)=12

1

1

2

   

60

36

24

12

0

24

12

0

   

#include <iostream.h> void main()

{

int n1,n2,mcd,res;

cout<<"Ingrese 2 numeros enteros: ";

cin>>n1>>n2;

do

{

res=n1%n2;

n1=n2;

n2=res;

}while(n2);

mcd=n1;

cout<< "El MCD es "<<mcd<<"\n";

}

"El MCD es "<<mcd<<"\n"; } 6.6. SENTENCIA for Expr_1 Expr_2 SI Sentencia N0 Expr_3

6.6. SENTENCIA for

Expr_1 Expr_2 SI Sentencia N0 Expr_3
Expr_1
Expr_2
SI
Sentencia
N0
Expr_3

La sentencia for se ejecuta repetidamente hasta que el valor de la expr_2 sea falso (CERO). Generalmente la exp_1 es el valor inicial del bucle, y es evaluado an- tes de la primera ejecución de la sentencia. La expr_3 es comúnmente el contador del bucle y es ejecutado después de la ejecución de la sentencia. Tanto expr_1, expr_2 y expr_3 pueden contener más de una expresión separados por comas.

for(expr_1;expr_2;expr_3) sentencia;

No es imprescindible indicar todas las expresiones de- ntro del paréntesis del for, pudiendose dejar en blan- co algunas de ellas, por ejemplo:

for (;expr_2;expr_3) sentencia; ó for (expr_1; ; ) sentencia; ó for ( ; ; ) sentencia;

La sintaxis de las dos últimas sentencias producen bu- cles infinitos.

Ejemplo (21): Programa que calcula la suma de los n

términos de:

s 1 2 3

2

3

4

#include <iostream.h> void main()

{

int i,n;

double s;

cout<<"Cantidad de terminos: "; cin>>n;

s=0;

for(i=1;i<=n;i++)

s=s+i/(i+1.0);

cout<<"Suma ="<<s<<"\n";

}

="<<s<<"\n"; } Ejemplo (22) : Programa que calcula la suma de: s  1

Ejemplo (22): Programa que calcula la suma de:

s 11 1 1

2

3

4

1

n

#include <iostream.h> void main()

{

int n,i;

double s;

cout<<"Cantidad de terminos: "; cin>>n;

s=0;

for(i=1;i<=n;i++)

s=s+1.0/i;

cout<<"Suma="<<s<<"\n";

}

} Ejemplo (23) : Programa que calcula la suma de los n

Ejemplo (23): Programa que calcula la suma de los n

términos de:

s 11 1 1

2

3

4

#include <iostream.h> void main()

{

 

int n,i;

float s,t;

cout<<"Cantidad de terminos: "; cin>>n;

s=0;

t=-1.0;

for(i=1;i<=n;i++)

{

t=-t;

s=s+t/i;

}

cout<< "Suma ="<<s<<"\n";

}

"Suma ="<<s<<"\n"; } Ejemplo (24) : Programa que calcula la suma de:   1

Ejemplo (24): Programa que calcula la suma de:

 

1

1

1

1

s 1A 12A

 

1

3A

1n* A

#include <iostream.h> void main()

{

 

int n,i;

float s,t,a;

cout<<"Cantidad de terminos: "; cin>>n; cout<<"Valor de A: "; cin>>a;

s=0;

for(i=1;i<=n;i++)

{

t=1/(1+i*a);

s=s+t;

}

cout<< "Suma = "<<s<<"\n";

}

"Suma = "<<s<<"\n"; } Ejemplo (25) : Programa que imprime los términos de la

Ejemplo (25): Programa que imprime los términos de la

serie de fibbonacci menores que n.

Los términos de la serie de fibbonacci se ob-

tienen sumando los dos términos que le antece-

den así: 1, 2, 3, 5, 8, 13,

y 2 son los números iniciales y partir de ellos se calculan los demás términos.

Los términos 1

#include <iostream.h> void main()

{

 

long int n,p,s,fib;

cout<<"Limite : "; cin>>n;

fib=1;

for(p=0,s=1;n>=fib;)

{

cout<<fib<<"\t";

p=s;

s=fib;

fib=p+s;

}

cout<<"\n";

}

6.7. SENTENCIA break for(expr1;expr2;expr3){ sentencia_1; sentencia_2; break; sentencia_n; } sentencia_siguiente; La

6.7. SENTENCIA break

for(expr1;expr2;expr3){

sentencia_1; sentencia_2; break; sentencia_n; }
sentencia_1;
sentencia_2;
break;
sentencia_n;
}

sentencia_siguiente;

La sentencia break es usada dentro de un bloque while o do … while o for o switch, y fuerza la finalización de la sentencia donde es usada.

Ejemplo (26): Programa que lee un número de punto

flotante y lo imprime redondeado a dos decimales. El usuario decide si quiere continuar.

#include <iostream.h> void main()

{

float num;

char resp;

while(1)

{

cout<<"Numero : "; cin>>num; num=(long (num*100+0.5))/100.0; cout<<"Numero Redondeado:"<<num; cout<<"\nContinuar (S/N)? "; cin>>resp; if ((resp=='N') || (resp=='n')) break;

}

}

6.8. SENTENCIA continue for(expr1 ;expr2 ;expr3){ sentencia_1; sentencia_2; continue; sentencia_n; } sentencia_siguiente;

6.8. SENTENCIA continue

6.8. SENTENCIA continue for(expr1 ;expr2 ;expr3){ sentencia_1; sentencia_2; continue; sentencia_n; } sentencia_siguiente;
6.8. SENTENCIA continue for(expr1 ;expr2 ;expr3){ sentencia_1; sentencia_2; continue; sentencia_n; } sentencia_siguiente;

for(expr1 ;expr2 ;expr3){

6.8. SENTENCIA continue for(expr1 ;expr2 ;expr3){ sentencia_1; sentencia_2; continue; sentencia_n; } sentencia_siguiente;

sentencia_1;

sentencia_2;

continue;

sentencia_n;

} sentencia_siguiente;

La sentencia continue es usada dentro de un bloque While o do while o for, y fuerza el flujo del programa al inicio de la sentencia donde es usada.

Ejemplo (27): Programa que imprime los números pares

comprendidos de 1 a 20.

#include <iostream.h> void main()

{

int i;

for( i=1 ; i <=20 ; i++ )

{

if (i % 2) continue; cout<<i<<"\n";

}

}

6.9. SENTENCIA goto La sentencia goto transfiere el flujo del programa a una sentencia precedida

6.9. SENTENCIA goto

La sentencia goto transfiere el flujo del programa a una sentencia precedida por una etiqueta seguida de dos puntos (:) dentro de un mismo bloque.

goto etiqueta;

un

identificador. Esta sentencia esta en desuso en la programación estructurada.

La etiqueta tiene las mismas restricciones

que

Ejemplo (28): Programa que suma los números ingresa-

dos, el ingreso termina cuando el in- greso es cero.

#include <iostream.h> void main()

{

int n,s=0;

inicio:

cout<<"Ingrese un numero : "; cin>>n; s+=n; if(n) goto inicio; cout<<"La suma es: "<<s<<"\n";

}

Explicación:

Si n!=0 (verdadero) vuelve a ejecutar la sen- tencia a la etiqueta inicio.

6.10. PROGRAMAS DE APLICACIÓN Ejemplo (29) : Programa que lee 3 números y los impri

6.10. PROGRAMAS DE APLICACIÓN

Ejemplo (29): Programa que lee 3 números y los impri-

ma en orden descendente.

#include <iostream.h> void main()

{

 

int a,b,c;

cout<<"Ingrese 3 numeros enteros:"; cin>>a>>b>>c; if (a>b) if (a>c) if (b>c) cout<<a<<"\t"<<b<<"\t"<<c; else cout<<a<<"\t"<<c<<"\t"<<b; else cout<<c<<"\t"<<a<<"\t"<<b; else if (b>c) if (a>c) cout<<b<<"\t"<<a<<"\t"<<c; else cout<<b<<"\t"<<c<<"\t"<<a; else cout<<c<<"\t"<<b<<"\t"<<a;

cout<<"\n";

}

cout<<"\n"; } TECNICAS DE PROGRAMACIÓN ESTRUCTURADA: Aplicaciones en C++

Ejemplo (30): Programa que resuelve una ecuación de

segundo grado de la forma:

ax 2 bx c 0

La discriminante es:

d b 2 4ac

Si la discriminante es mayor o igual que cero (d>=0) tiene raíces reales, caso contrario tie- ne raíces complejas. Las raíces se obtienen con:

x 

 b  b 2 4ac 2a
 b 
b 2 4ac
2a

#include <iostream.h> #include <math.h> void main()

{

 

double a,b,c,r,r1,r2,d;

cout<<"Ingrese a, b y c: "; cin>>a>>b>>c;

d=b*b-4*a*c;

r=sqrt(abs(d)); if (d>=0){

r1=(-b+r)/(2*a);

r2=(-b-r)/(2*a);

cout<<"r1="<<r1<<"\n";

cout<<"r2="<<r2<<"\n";

}

else {

cout<<"r1="<<-b/(2*a)<<"+"

<<r/(2*a)<<"i\n";

cout<<"r1="<<-b/(2*a)<<"-"

<<r/(2*a)<<"i\n";

}

}

<<r/(2*a)<<"i\n"; } } TECNICAS DE PROGRAMACIÓN ESTRUCTURADA: Aplicaciones en C++
<<r/(2*a)<<"i\n"; } } TECNICAS DE PROGRAMACIÓN ESTRUCTURADA: Aplicaciones en C++

Ejemplo (31): Programa que permita jugar a las adivi-

nanzas. El usuario tiene que elegir un entero de un solo dígito. El programa tiene que pedir si el numero es par o impar (0 o 1), y el resto cuando el nu- mero se divide entre 5. A partir de esa información se debe determinar el núme- ro.

#include <iostream.h> void main()

{

 

int numa,par,res;

cout<<"Piense en un numero de\n"; cout<<"una sola cifra y pulse\n"; cout<<"una tecla para continuar\n";

cout<<"Ingrese:\n"; cout<<"0 si el numero es par\n"; cout<<"1 si el numero es impar\n"; cin>>par; cout<<"Ingrese el residuo de\n"; cout<<" dividir el numero\n"; cout<<"pensado entre 5:\n"; cin>>res;

if(par==0)

{

if(res % 2)

numa=res+5;

else

numa=res;

}

else

{

if(res % 2) numa=res; else

numa=res+5;

}

cout<<"El numero pensado es:"<<numa<<"\n";

}

pensado es:"<<numa<<"\n"; } TECNICAS DE PROGRAMACIÓN ESTRUCTURADA: Aplicaciones en C++

Ejemplo (32): Programa donde se ingresan el sueldo de un trabajador, su categoría (A,B,C) y su año de ingreso. Luego calcula su nuevo sueldo, según:

Categoría "A": 15% para los que ingresaron antes de 1980 y 12% para el resto.

Categoría "B": 20% para los que ingresaron antes de 1980 y 17% para el resto.

Categoría "C": 25% para los que ingresaron antes de 1980 y 22% para el resto.

#include <iostream.h> void main()

{

 

int anno; double sueldo; char cat;

cout<<"Ingrese Sueldo:"; cin>>sueldo; cout<<"Ingrese Año:"; cin>>anno; cout<<"Ingrese Categoria:"; cin>>cat; switch(cat)

{

case 'A':

case 'a':

if(anno<1980)

sueldo=1.15*sueldo;

else

sueldo=1.12*sueldo;

break; case 'B':

case 'b':

if(anno<1980)

sueldo=1.20*sueldo;

else

sueldo=1.17*sueldo;

break; case 'C':

case 'c':

if(anno<1980)

sueldo=1.25*sueldo;

else

sueldo=1.22*sueldo;

break;

}

cout<<"Nuevo sueldo: "<<sueldo<<"\n";

}

Ejemplo (33): Un profesor a establecido la siguiente calificación entre sus alumnos:  Notas de

Ejemplo (33): Un profesor a establecido la siguiente calificación entre sus alumnos:

Notas de 14 a 20 BUENO

Notas de 07 a 13 REGULAR

Notas 00 a 06 DESAPROBADO

ALGORITMO: Si se divide la nota entre 7 se de- duce: Nota de 00 a 06 cociente 0, Nota de 07 a 13 cociente 1, Nota de 14 a 20 cociente 2.

#include <iostream.h> void main()

{

 

int nota,cociente; cout<<"Ingrese nota de 0 a 20 :"; cin>>nota; /*Si la nota es positiva realiza calificacion */ if (nota>=0)

{

/* divide la nota entre 7 */ cociente=nota / 7; switch(cociente)

{

 

case 0:

cout<<"DESAPROBRADO"; break; case 1:

cout<<"REGULAR"; break; case 2:

cout<<"BUENO";

break;

default:

cout<<"NOTA INCORRECTA";

 

}

}

cout<<"\n";

}

CAPITULO SIETE

SUBPROGRAMAS

7.1. SUBPROGRAMAS O SUBRUTINAS

Un subprograma es un conjunto de sentencias cuya eje- cución se invoca mediante su nombre. En la mayoría de los lenguajes de programación se dividen en: procedi- mientos y funciones, pero en el lenguaje C++ sólo esta permitido las funciones. Al conjunto de subprogramas que vienen definidos en las librerías del compilador, se les conoce como subprogramas del sistema. Los pro- gramadores pueden crear sus propios subprogramas según sean sus necesidades, a estos se les conoce como sub- programas definidos por el usuario. Este capítulo, trata principalmente sobre las técnicas utilizadas en la construcción de funciones y sobre las funciones de- finidas por el usuario.

7.2. ¿CUÁNDO UTILIZAR UN SUBPROGRAMA?

Existen dos razones importantes porque se deben utili- zar estas funciones, ellas son:

a)

En un programa, una parte del mismo se repite varias veces o varias partes tie- nen sentencias muy similares. Si este es el caso las parte repetidas o similares se reemplazan por una llamada al subpro-

grama y se crea un subprograma con las sentencias repetidas o similares.

b)

En un programa, una parte se encarga de un trabajo especifico. Esto se consigue aplicando las técnicas Diseño descendente y programación modular, que se tratan más adelante.

7.3. DISEÑO DESCENDENTE (TOP DOWN)

Problema Subproblema 1 Subproblema 2 Subproblema 3 Subproblema Subproblema 2.1 2.2
Problema
Subproblema 1
Subproblema 2
Subproblema 3
Subproblema
Subproblema
2.1
2.2

El diseño descendente, también es conocido como diseño TOP DOWN, consiste en dividir un problema 1 en subpro- blemas y estos en otros subproblemas que sean fáciles de solucionar. Una vez resuelto cada parte se integran para obtener la solución de todo el problema. En este método se analiza de las características generales a características especificas (descomposición jerárqui- ca). A cada nivel o paso de refinamiento se le conoce como stepwise. El diseño descendente es utilizado en la solución de problemas de gran complejidad.

Para descomponer el problema, para cada subprograma se debe contestar: ¿Qué hace? y ¿Cómo lo hace?. Los nive- les de descomposición dependen de la complejidad del problema. Se recomienda parar la descomposición cuando el subproblema se refiere a la solución de algo espe- cifico o es fácil de solucionar, el programador con- forme se va familiarizando con el problema encontrará la descomposición optima.

7.3.1. EJEMPLO

Elaborar el diseño descendente para calcular el sueldo a pagar a un trabajador de la Em- presa "Horizonte", si el trabajador percibe las siguientes bonificaciones:

1 En este caso la solución del problema será mediante la elaboración del problema. TECNICAS DE PROGRAMACIÓN ESTRUCTURADA: Aplicaciones en C++

58

a) Por cada hora extra se le paga 25% más que una hora normal.

b) Bonificación por movilidad (movil) igual a 1000.

c) Bonificación suplementaria (b_sup) igual al 3% del sueldo básico (sueldo).

d) La bonificación total (bonif) es la suma de todas las bonificaciones que percibe.

Asimismo, el trabajador esta sujeto a los si- guientes descuentos:

e) Las tardanzas y faltas se descuentan con respecto a remuneración computable. La remuneración computable es igual al suel- do básico mas la suma de todas las boni- ficaciones excepto la bonificación por horas extras.

f) El total de descuentos (descuentos) se obtiene sumando todos los descuentos.

ALGORITMO GENERAL

I. Ingreso de datos

II. Cálculo el sueldo a pagar

III. Imprime boleta de pago.

PRIMER REFINAMIENTO

I. Ingreso de datos

I.1. Ingreso del nombre del trabaja-

(nombre) y sueldo básico

dor

(sueldo).

I.2.

Ingreso de días de faltas (di- as_falta) y minutos de tardan- zas (minutos).

I.3. Ingreso (h_extras).

de

horas

extras

II. Cálculo el sueldo a pagar

II.1. Cálculo de bonificaciones (bo- nif)

II.2. Cálculo de descuentos (descuen- tos)

II.3. s_neto=sueldo+bonif+descuentos

III. Imprimir boleta de pago.

SEGUNDO REFINAMIENTO

II.1. CALCULO DE BONIFICACIONES:

II.1.1. Pago

por

(p_h_extras):

horas

extras

1.25*h_extras*sueldo/30/8

Para incrementar 25% a X, es suficiente multiplicar a la

cantidad

porque

100% de X + 25% de X es 125% de X que a su vez es igual a

1.25*X.

por

1.25

El pago por una hora normal

resultado de

sueldo/30/8, donde sueldo es el sueldo básico. Note que el sueldo básico corresponde al mes y esta dividido entre

es

igual

al

30 días que tiene el mes y este resultado es dividido entre 8 que es la cantidad

se trabaja

de horas que durante un día.

II.1.2. movil=10000

II.1.3. b_sup=0.03*sueldo

II.1.4. bonif=movil+b_sup+p_h_extras

II.1.5. Remuneración (r_computable):

sueldo+movil+b_sup

computable

II.2. CALCULO DE DESCUENTOS:

II.2.1. r_minima=sueldo+bonif

II.2.2. faltas=r_computable/30* di- as_falta.

Para obtener el descuento por falta: la remuneración computable se divide entre la cantidad de días que tie- ne el mes, note que el mes comercial tiene 30 días.

II.2.3. tardanzas=r_computable/ 30/8/60*minutos. Para obte- ner el descuento por la tar- danza: la remuneración com- putable se divide secuen- cialmente entre la cantidad de días que tiene el mes, entre la cantidad de horas trabajadas por día y entre la cantidadde minutos que tiene una hora.

II.2.4. descuentos=faltas+tardanzas

Aquí paramos la descomposición del problema.

7.4. PROGRAMACIÓN MODULAR

La programación modular se toma muchas veces como com- plemento del diseño descendente. La programación modu- lar consiste en dividir un programa en módulos inde- pendientes, buscando un sólo punto de entrada y uno de salida. Como complemento del diseño descendente pro- porciona módulos funcionales (todos los elementos con- tribuyen a una sola tarea) y están organizados en ni- veles de jerarquía.

7.4.1. MODULO

Es una parte de un programa (subprograma) que cumple con una función especifica, para un usuario un modulo debe ser como una caja ne- gra donde ingrese datos y obtiene resultados, sin importarle cuales fueron las tareas que hizo el módulo para lograr su propósito.

Un módulo en el Lenguaje de Programación Pas- cal o en Foxpro puede ser un procedimiento o

una función y en Lenguaje C++ es una función. En resumen, un módulo puede ser un subprogra- ma.

7.4.2. CRITERIOS A CONSIDERAR EN PROGRAMACIÓN MODULAR

a) Debe tener una sola entrada y una sola salida.

b) Debe realizar un trabajo especifico.

c) Debe tener la máxima independencia y la máxima cohesión (todo lo suficiente para realizar su trabajo).

d) Debe estar separados las funciones de en- trada y/o salida de las de calculo.

7.4.3. FASES DE LA PROGRAMACIÓN MODULAR

a) Dividir el problema utilizando el diseño descendente (TOP-DOWN).

b) Analizar los parámetros a ser enviados y ha ser devueltos.

c) Diseñar el módulo.

d) Montaje en el sistema en forma ascendente (BOTTOM-UP).

7.5. DEFINICIÓN DE FUNCIONES

Se compone de la cabecera de la función (prototipo de una función) seguido por el cuerpo de la función. Cuyo formato es:

<Tipo> Nombre_f (t1 p1, t2 p2,…,tk pk)

{

<cuerpo de la función>

}

Donde:

<tipo>

Es el tipo de valor que ha de

devolver la función. Si la fun-

ción

entonces el tipo es void.

no retorna ningún valor

Nombre_f

t1, t2, …, tk

p1, p2,

,

pk

Es el nombre de la función.

Son los tipos de datos de los parámetros.

Son los parámetros. Un paráme- tro es una variable utilizado para enviar y/o recibir datos.

Si la función devuelve un valor debe utilizarse la sentencia return cuyo formato es:

return (expresión)

return puede situarse en cualquier punto del cuerpo de la función y provoca la salida inmediata de la función retornando el valor evaluado en la expresión. Si se omite la expresión, return retorna a la función que lo llamo y no devuelve ningún valor.

7.5.1. DECLARACIÓN DE PROTOTIPOS

El prototipo de una función tiene por finali- dad indicar al compilador el tipo de valor que devuelve, así como el número y tipo de sus parámetros. En C++ por cada función defi- nida por el usuario es necesario declarar su prototipo. Uno de sus formatos es:

<Tipo> Nombre_f (t1 p1, t2 p2,…,tk pk);

o

<Tipo> Nombre_f (t1,t2,…,tk);

Donde:

<tipo>

Es el tipo de valor que ha de devolver la fun- ción. Si la función no

retorna

ningún

valor

entonces

el

tipo

es

void.

Nombre_f

Es el nombre de la fun- ción.

t1, t2, …, tk

Son los tipos de datos de los parámetros.

p1, p2,

, pk Son los parámetros.

OBSERVACIONES:

a)

Si en la definición o el prototipo de una función se omite el tipo de dato que re- torna entonces por defecto el compilador asume el tipo int.

b)

Si la función no retorna un valor se de- fine como tipo retornado al tipo void y la función no necesita usar la sentencia return.

c)

Si no se usa la sentencia return la fun- ción se ejecuta todo el cuerpo de la fun- ción y retorna a la siguiente línea de donde fue llamado.

7.5.2. LLAMADA A UNA FUNCIÓN:

En cualquier lugar del programa se puede lla- mar a la función, incluso puede llamarse a si mismo. Para llamar a una función se utiliza el siguiente formato:

Nombre_f(E1, E2,…, Ek)

Donde:

E1, E2, …,Ek Son expresiones que proporcio- nan los valores a los paráme- tros, en el orden indicado.

La lista de parámetros debe estar de acuerdo al tipo y cantidad de parámetros definidos en la función. El primer parámetro de la lista corresponde al primer parámetro de la defini- ción, el segundo parámetro de la lista al se- gundo parámetro de la definición, así sucesi- vamente.

Ejemplo (34): Programa que imprime los números primos

que existen desde 2 hasta 70.

#include <iostream.h>

//declaracion de prototipos int primo(int n);

void main()

{

//función principal

int n;

for(n=2;n<=70;n++)

if (primo(n)) cout<<n<<" es primo \n";

}

int primo(int n)

{

int r,d=2,flag=1/*se supone que es primo*/;

while (1)

{

if (n==2) break; r=n%d;//halla el resto de n entre d

if(r==0)

{

flag=0;

break;

}

if ((n-1)==d)

break;

d++;

}

if (flag) return 1; else return 0;

}

break; d++; } if (flag) return 1; else return 0; } Ejemplo (35): Programa que utiliza

Ejemplo (35): Programa que utiliza a la función hipo-

tenusa para calcular la hipotenusa de un triángulo rectángulo si se propor- cionan como parámetros los catetos.

#include <iostream.h>

#include <math.h>

float hipotenusa(float ,float );

void main()

{

float x,y,h;

cout<<"ingrese los 2 catetos ";cin>>x>>y; h= hipotenusa(x,y); cout<<" hipotenusa= "<<h<<"\n";

}

float hipotenusa(float a,float b)

{