Contenido

Anuncio
Programación de Computadores
4 Iteraciones y Decisiones
Prof. Javier Cañas
Universidad Técnica Federico Santa María
Departamento de Informática
Contenido
1 Introducción
2 Operadores Relacionales y Lógicos
3 Decisiones
4 Iteraciones
5 La Asignación como Operador
Javier Cañas 2000
2
1
1 Introducción
• En este capítulo usaremos el lenguaje C++ para
transformar los algoritmos estudiados en el Capítulo
2 en programas que funcionen en computadores
reales
• Profundizaremos dos aspectos claves de un
algoritmo: decisiones e iteraciones. A lo visto en
capítulos anteriores, agregaremos nuevas sentencias
y expresiones que facilitan la programación
• Se espera al final poder escribir programas correctos
en C++ que utilicen tipos de datos simples
Javier Cañas 2000
3
2 Operadores Relacionales y Lógicos
• Tanto las decisiones como iteraciones
involucran el uso de operadores relacionales
y lógicos
• Expresiones condicionales involucran
operadores relacionales y conectivos lógicos
• Es necesario tener gran claridad en el
manejo de estas expresiones para programar
la lógica correcta en un programa
Javier Cañas 2000
4
2
Operadores Relacionales: Repaso
Los Operadores Relacionales son:
>, <, ==, !=, >=, <=
Ejemplos: Si a=44; b=12;
False
True
False
False
True ¡Sólo 0 (cero) es falso!
(a == b)
(b <= 12)
(b != 12)
(0)
(-7)
Javier Cañas 2000
5
Operadores Lógicos: repaso
&&
||
!
AND
OR
NOT
Ejemplo de expresiones condicionales:
if( !(edad==18) && (sexo == ‘f’))
.........................................
Javier Cañas 2000
6
3
Precedencia de Operadores: repaso
! ++ -- * / %
+ < > <= >=
== !=
&&
||
? :
= += -= *=
/=
Javier Cañas 2000
%=
7
3 Decisiones
• C++ provee un poderoso conjunto de
operadores y sentencias que permiten dar un
mayor poder expresivo a los programas.
• Comenzaremos resolviendo un problema de
interpretación cuando se tienen muchos if
anidados
Javier Cañas 2000
8
4
La Construcción else if
• Existe problemas potenciales en el
anidamiento de if... else
• Ejemplo
if(a== b)
if ( b==c)
cout << “ son iguales”;
else
cout << “ b y c diferentes”
¿qué pasa si a!=b?
Javier Cañas 2000
9
La Construcción else if
• Regla: Un else se aparea con el último
if que no tiene su propio else
Indentando :
if ( a== b)
if (b== c)
cout << “son iguales”;
else
cout << “b y c diferentes”;
Javier Cañas 2000
10
5
Una forma más simple de interpretar es
con else if
Ejemplo:
if ( dir == ‘n’)
y-- ;
else if ( dir == ‘s’)
j++ ;
else if ( dir == ‘e’)
x++ ;
else if ( dir = ‘o’)
x-- ;
Javier Cañas 2000
11
El Switch
• El código anterior refleja una situación
que es muy frecuente en un programa:
dependiendo de una expresión se
pueden tomar muchas decisiones.
• La construcción if.......else se puede
generalizar mediante el switch
Javier Cañas 2000
12
6
El Switch
Un if sólo tiene dos opciones
Un switch tiene múltiples
opciones
Javier Cañas 2000
13
La sentencia switch
switch (n) // n puede ser int o
char
{ case 1 : sentencia; break;
case 2: sentencia; break;
................
default : sentencia;
}
break permite la salida del switch
Javier Cañas 2000
14
7
Ejemplo de switch
dir= getche( ) ; // ingrese carácter
switch (dir)
{ case ‘n’ : y--; break;
case ‘s’ : j++; break;
case ‘e’ : x++; break;
case ‘o’: x--; break;
case ‘x’ : cout << “\n salir” ;
break;
default : cout << “ \n try again”;
}
Javier Cañas 2000
15
break y continue
La sentencia break junto con la sentencia continue,
permite alterar el funcionamiento de un loop
break
continue
Javier Cañas 2000
16
8
El Operador Condicional
• Consideremos el siguiente segmento de código:
if ( x> 7)
y=y+30;
else
y=y*50;
• Como este tipo de código es frecuente, C++ posee
un operador llamado operador condicional que
permite simplificar estas situaciones.
• La anterior quedaría
y= x > 7? y+30: y*50;
Javier Cañas 2000
17
El Operador Condicional
Si la condición es
verdadera
Si la condición es
falsa
(condición) ? expresión 1 : expresión 2
Hay que tener en cuenta que este operador
no es una sentencia. Al ser operador puede
foramar parte de cualquier expresión válida
Javier Cañas 2000
18
9
Ejemplo
Ejemplo calcular el valor absoluto de un número:
int n;
cin>> n;
int valor_absoluto = n<0 ? -n : n;
Javier Cañas 2000
19
4 Iteraciones
• La posibilidad de realizar acciones repetitivas
es lo que en definitiva le da a un algoritmo la
posibilidad de resolver problemas complejos.
• Además del while y del do vistos en capítulos
anteriores, C y C++ proveen la sentencia for
que tiene una notación más compacta
• Repasaremos el while y do e incorporaremos
el for junto con ejemplos ilustrativos de uso
Javier Cañas 2000
20
10
El While
while (n! = 0)
sentencia;
Diagrama de flujo
while( v2 < 45 )
{
sentencia;
.......
sentencia;
} no hay “;”
F
test
V
Bloque
del loop
Javier Cañas 2000
21
Ejemplo
include <iostream.h>
void main ( )
{ int n = 99 ; // asegurar n! =0
while ( n! = 0)
cin >> n ;
}
Javier Cañas 2000
22
11
Ejercicio 1
• Usando while escribir un programa que
genere en la salida:
1
1
2
16
3
81
4
256
.................
Javier Cañas 2000
23
Solución Ejercicio 1
#include < iostream.h>
#include < iomanip.h>
void main ( )
{ int pow = 1 ; int numb =1
while ( pow < 9999) {
cout << setw (2) << numb ;
cout << setw (5) << pow << endl ;
++numb ; pow = numb * numb * numb * numb;}
}
Javier Cañas 2000
24
12
Ejercicio 2
• Contar el número de palabras y número
de caracteres de una frase
• Usar la función getche( ) : Devuelve
cada carácter ingresado sin esperar
retorno
Javier Cañas 2000
25
Solución Ejercicio 2
# include <iostream.h>
# include <conio.h>
// getche( )
void main ( )
{ int chcount =0 , wdcount =1;
char ch = ‘a’ ; //asegurar que no es ‘\r’
while (ch != ‘\r’ )
{ ch = getche ( );
if ( ch == ‘ ‘ ) wdcount++;
else chcount++; }
cout << “\n Palabras =” << wdcount <<endl
<< “ Letras =” << (chcount –1) << endl ;}
Javier Cañas 2000
26
13
El do
do
sentencia ;
while (ch != ‘n’);
Diagrama de flujo
do
{sentencia ;
.
.
sentencia;
}while (numb <96);
Cuerpo del
loop
Javier Cañas 2000
F
test
v
27
Ejemplo
#include < iostream.h>
void main ( )
{long dividendo, divisor; char ch;
do {cout << “Ingrese dividendo :” ;
cin >> dividendo ;
cout<<“Ingrese divisor:” ;cin>> divisor;
cout << “cuociente es” << dividendo
/divisor;
cout << “\n otro? (s/n) :” ;cin >>ch ;
} while (ch != ‘n’ ); }
Javier Cañas 2000
28
14
El for
• Muchos algoritmos requieren iterar un
número fijo y conocido de pasos. Por ejemplo
el cálculo de:
1000
∑
xi
i =1
• Si bien el cálculo se puede hacer con
while o do, resulta más cómodo tal como se
verá, utilizar la sentencia for
Javier Cañas 2000
29
...El for
• Presentaremos el for vía ejemplos:
a)
for(j=0; j <15; j++)
sentencia;
b) for (j=0; j <15; j++)
{ sentencia;
sentencia;
.............
} no hay “;”
Javier Cañas 2000
30
15
Diagrama de flujo del for
Inicio
F
Test
V
Bloque
del loop
Expr. de incremento
o decremento
Javier Cañas 2000
31
Ejercicio
Escribir un programa que genere la siguiente
salida
1
2
3
4
5
6
7
8
9
10
1
8
27
64
125
216
343
512
729
1000
Javier Cañas 2000
32
16
Solución
# include < iostream.h >
#include <iomanip.h >
void main ( )
{ int numb;
for ( numb = 1 ; numb < = 10 ; numb ++ )
{ cout << setw (4) << numb ; // 1ª columna
int cubo = numb * numb * numb ;
cout << setw (6) << cubo << endl ; }
}
int cubo sólo se conoce dentro del bloque {......}
Javier Cañas 2000
33
Observación 1: variables definidas en el for
for ( int j = 1 ; j < = 10 ; j ++ )
{
..........................
}
Se observa que se puede definir una nueva
variable dentro del for. Esto significa que es
visible a partir de este punto, dentro y fuera del
bloque
Javier Cañas 2000
34
17
Observación 2: múltiples inicializaciones
for (j = 1, k=100 ; j < = 10 ; j++, k-- )
{
se usan j y k dentro de este loop
}
En general puede existir una lista de variables,
pero la condición de fin del loop involucra sólo un
test
Javier Cañas 2000
35
5 La Asignación como un operador
• En C++, la asignación es un operador y por lo
tanto es posible de encontrar más de una vez
en una expresión
• Por ejemplo
X = Y = Z = 0 ;
es una expresión válida y se puede utilizar en
vez de:
X=0; Y=0; Z=0;
• Como operador, tiene menor precedencia que
los operadores relacionales
Javier Cañas 2000
36
18
Ejemplo de asignación como un operador
El código:
while (ch != ‘\r’ )
{ ch = getche( );
.......................................
Es posible compactar el código anterior
while (( ch =getche( ))!=‘\r’)
{loop hasta que se ingresa ENTER }
¿ Qué pasa: while (ch = getche ( ) ! = ‘r’)?
¿Cómo funcionan las precedencias?
Javier Cañas 2000
37
FIN
Iteraciones y Decisiones
19
Descargar