sábado, 26 de febrero de 2011

Capitulo 3. Sentencias Selectivas

Fuente:
Programación en C++ / Principios y Aplicaciones (resumen)
Carlos Romero Shollande


1. Introducción

Las sentencias de control gobiernan el flujo de la ejecución del programa y hace que la computadora deje de comportarse como una simple calculadora de bolsillo que sólo realiza operaciones aritméticas
Un programa puede necesitar alterar la ejecución secuencial de su código, ya sea seleccionando alguna otra alternativa en función de una condición dada, o bien repetir un determinado número de veces un trozo de código, etc.
Las sentencias de control, se dividen en tres categorías:
- Sentencias selectivas (que serán vistas en este capitulo)
- Sentencias repetitivas.
- Sentencia incondicional

2. Operadores Relacionales y Lógicos

Tabla 1. Operadores relacionales

OPERADOR
ACCION
>=
<=
= =
!=
Mayor que
Mayor o igual que
Menor que
Menor o igual que
Igual que
Diferente que

Tabla 2. Operadores lógicos

OPERADOR
ACCION
&&
||
!
Y lógico (AND)
O lógico (OR)
No lógico (NOT)

Tabla 3. Operador condicional

OPERADOR
ACCION
?
Asigna a una variable un valor escogido entre dos

La elección mediante ? depende del valor booleano de una condición:

Condición ? Exp1: Exp2;
Si Condición es verdad
Entonces Exp1.
En caso contrario Exp2

2.1. Jerarquía de los Operadores Relacionales y Lógicos

Los operadores relacionales y lógicos tienen menor jerarquía que los aritméticos.

Tabla 4. Precedencia de operadores relacionales y lógicos:

ORDEN (Decreciente)
OPERADOR
OBSERVACIÓN
1
2
3
4
!
>   >=   <   <=
= =   !=
||
Más alto


Más bajo

2.2. Tablas de Verdad

Los operadores relacionales y lógicos se usan para soportar las operaciones básicas lógicas de AND, OR y NOT de acuerdo con la tabla de verdad que usa.

Tabla 5. Tabla de verdad y operadores lógicos:

P
Q
P&&Q
P || Q
!P
P ==Q
P<=Q
P!=Q
0
0
1
1
0
1
0
1
0
0
0
1
0
1
1
1
1
1
0
0
1
0
0
1
1
1
0
1
0
1
1
0

3. Sentencia Selectiva Simple

Sintaxis       :   if (condición) sentencias;
                         else sentencias;
Propósito    :   Ejecutar la sentencia o bloque que acompaña a if, si la condición es verdadera o distinta de cero (TRUE); o ejecutar la sentencia o bloque que acompaña a else si la condición es falsa o igual a cero (FALSE)
Ejemplo      :    if (x>y) cout<<x;
                       else cout<<y;

3.1. Sentencia If con Alternativa Única

Si la condición es verdadera, entonces las sentencias que acompañan a if serán ejecutadas.
En cualquier otro caso no se ejecutarán y se transferirá el control al paso siguiente del algoritmo.
En este caso la sentencia else no es utilizada. Ejemplo:
if (x%2==0) cout<<x;
En este ejemplo, si el valor de la variable “x” es par se reporta dicho valor, en caso contrario no se ejecuta ningún proceso.

Figura 1. Bloque lógico del if con alternativa única


3.2. Sentencia If con Alternativa Doble

Si la condición es verdadera, entonces se ejecutarán las sentencias1 que acompañan a if. En caso contrario, se ejecutarán las sentencias2 que acompañan a else.

Figura 2. Bloque lógico del if  con alternativa doble


Tener en cuenta que sólo el código asociado con if o el asociado con else se ejecutará, nunca ambos. Ejemplo:

if (x<=y || y>z) p = x + y;
else q = z - y;

Si x, y, z; hacen a la condición verdadera, se ejecutará la suma de x e y, siendo el resultado p. Si no, se realiza la diferencia de z e y; y el resultado será q

3.3. Sentencia If con Alternativa Múltiple

También se le conoce como escalonador if-else-if
if(condición) sentencia;
            else if(condición) sentencia;
                        else if(condición) sentencia;
                                   …………..
                                               else sentencia;

Las expresiones condicionales se evalúa de arriba a abajo
Tan pronto como encuentre una condición verdadera, ejecuta la sentencia asociada y salta el resto de la escalera.
Si no es verdad ninguna condición, se ejecuta el else final
Si fallan todas las pruebas, se realiza el último else
Si no hay else final y son falsas las otras, no se hace nada.

3.4. Sentencia If Anidada

Es una sentencia if que es el objeto de otro if o else
Es uno de los aspectos más confusos de la sentencia if, por la siguiente razón: ¿A que if se refiere el else?.
Existe una regla sencilla para resolver este problema:
“El if y el else deben estar dentro del mismo bloque de código y se deben usar llaves”. Ejemplo:
if(m>n)            {
            if(p>=q)           { p = p + m;  cout<<p; }
            else                  { q = q + n;  cout<<q;  }
            }
else                  { m = m + n;  cout<<m;           }

Ejemplo 1
Ingresar el año y reportar si este es bisiesto o no.
Análisis:
Un año es bisiesto cuando es múltiplo de 4, es decir que al dividirlo entre cuatro nos da un residuo igual a 0. Pero no es múltiplo de 100. Excepto los múltiplos de 400.
 
#include <iostream.h>        // AÑO BISIESTO
#include <conio.h>
main ()   {
      int a;
      clrscr();
      gotoxy(10,2); cout<<”Ingrese el año: ”;
      gotoxy(50,2); cin>>a;
      if((a%4==0) && (a%100!=0) || (a%400==0))   {
            gotoxy(10,6); cout<<” Año bisiesto”;
            }
      else   {
            gotoxy(10,6); cout<<” Año no bisiesto”;
            }
      getch();
      }

5. Sentencia Selectiva Múltiple 

Si en la sentencia switch no coincide ninguna alternativa; el control se dirige a la sentencia que acompaña al default
El default es opcional y si no está presente no hace nada.
El switch se usa para dirigir una selección de menú
La sentencia break se usa para terminar la secuencia que está asociada con cada constante
Si se omite break, la ejecución continuara en las sentencias del siguiente case hasta que se encuentre un break o el final del switch
La ejecución comienza en la etiqueta que coincide con la variable de control y continuará hasta que se encuentre una sentencia break o el final del switch.
Denominación :           Función switch()
Sintaxis           :           switch(variable)          {
                                   case constante1:          {          sentencias1;
                                                           break;  }
                                   case constante2:          {          sentencias2;
                                                           break;  }
                                   .....……......
                                   case constanteN:         {          sentenciasN;
                                                           break;  }
                                   default:           {          sentenciasN+1;
                                                           break;  }
                                   }

Propósito         :           Ordenar a la computadora que compruebe una variable sucesivamente frente a la lista de constantes enteras o de carácter. Después de ubicar una coincidencia, se ejecutará el bloque de sentencias que se asocian con la constante.
Ejemplo           :           switch(mes)     {
                                   case 1: { cout<<”ENERO \n”; break;  }
                                   case 2: { cout<<”FEBRERO \n”; break;         }
                                   case 3: { cout<<”MARZO \n”; break; }
                                   default:            { cout<<”Es otro mes \n”; break;        }
                                   }
Ejemplo 2 
Una empresa renta autos de tres clases: pequeños, medianos y grandes. La tarifa del alquiler por día es: $ 15/día en el auto pequeño, $ 20/día en el auto mediano y $ 30/día en el auto grande. Además la empresa cobra $ 0.20/km recorrido en auto pequeño, $ 0.30/km recorrido en auto mediano y $ 0.40/km recorrido en auto grande. Pedir en un menú el tipo de auto alquilado e ingresar el número de días alquilado y los kilómetros recorridos. De no ingresar correctamente el tipo de auto se imprimirá un mensaje diciendo que se realice un ingreso correcto. Luego imprimir el monto a pagar por el alquiler
 
#include <iostream.h>              // ALQUILER DE AUTOS
#include <conio.h>
main ()   {
      int x;                                  // Tipo de auto
      int T;                                  // Tarifa de alquiler de un auto por día
      int d;                                  // Número de días alquilados
      float R;                                // Tarifa de alquiler por kilómetro
      float C;                                // Costo total a pagar
      float k;                               // Número de kilómetros recorridos
      cout<<”Tipo de auto \n\n”;
      cout<<”1. Pequeño \n”;
      cout<<”2. Mediano \n”;
      cout<<”3. Grande \n\n”;
      cout<<”Elegir opción: ”;  cin >>x;
      switch(x)   {
            case 1:  {
                  T = 15;  R = 0.2;
                  break;  }
            case 2:  {
                  T = 20;  R = 0.3;
                  break;  }
            case 3:  {
                  T = 30;  R = 0.4;
                  break;  }
            default:  {
                  goto etiqueta;
                  break;  }
            }
      cout<<”\n Número de días alquilado: “; cin>>d;
      cout<<”Número de km. recorridos: “; cin>>k;
      C = T * d + R * k;
      cout<<”\n Total a pagar: “<<C;
      etiqueta:  cout<<”\n\n Fin del programa”;
      getch();
      }

jueves, 24 de febrero de 2011

Capitulo 2. Funciones Estándar

Fuente:
Programación en C++ / Principios y Aplicaciones (resumen)
Carlos Romero Shollande 

1. Introducción 

Sintaxis      :  double nomb_func (double lista_variables);
Propósito  :  Tomar argumentos double y devolver valores double. Son subrutinas de tipo estándar incluidas en el C++ 
Estas funciones se pueden clasificar como:
- Funciones aritméticas
- Funciones exponenciales y logarítmicas
- Funciones trigonométricas e hiperbólicas
- Funciones aleatorias 

1.1. Funciones Aritméticas 

Tabla 1. Funciones aritméticas.

FUNCION
DESCRIPCION
EJEMPLOS
ceil(x)

floor(x)

fabs(x)
pow(x, y)



sqrt(x)

Fmod(x, y)
Redondea x al entero más próximo hacia arriba
Redondea x al entero más próximo hacia abajo
Valor absoluto de un número flotante x
x elevado a la potencia y (xy)



Raíz cuadrada de x

Residuo de x/y como número de punto flotante
ceil(9.91) = 10.0
ceil(-9.91) = -9.0
floor(-1.02) = -2.0
floor(1.02) = 1.0
fabs(-5.34) = 5.34
pow(3, 4) = 81
     - Error si x < 0 e y £ 0
     - Error si x < 0 e y no entero
     - Desbordamiento >= error rango
sqrt (9.0) = 3.0
Error si x < 0
fmod (13.657, 2.333) = 1.992
Siendo el cociente = 5

Requieren de la directiva #include<math.h>

Tabla 2. Otras funciones aritméticas
 
FUNCION
DESCRIPCION
EJEMPLOS
Abs(x)
Labs(x)
Valor absoluto de un número entero
Valor absoluto de un número entero largo
abs(-4) = 4
labs(-44582) = 44582

Requieren de la directiva #include <stdlib.h>

1.2. Funciones Exponenciales y Logarítmicas 

Tabla 3. Funciones exponenciales y logarítmicas
 
FUNCION
DESCRIPCION
EJEMPLOS
exp(x)
log(x)

Log10(x)
Eleva el número neperiano e a la potencia x
Logaritmo natural de x

Logaritmo decimal de x
exp(2.0) = 7.38906
log(7.38906) = 2.0
Error cuando x < 0 (base e)
log10(100.0) = 2.0
Error cuando x < 0 (base 10)

Requieren de la directiva #include<math.h> 

1.3. Funciones Trigonométricas e Hiperbólicas

Tabla 4. Funciones trigonométricas e hiperbólicas

FUNCION
DESCRIPCION
OBSERVACIONES
sin(x)
cos(x)
tan(x)
asin(x)
acos(x)
atan(x)
sinh(x)
cosh(x)
tanh(x)
Seno de x
Coseno de x
Tangente de x
Arco seno de x
Arco coseno de x
Arco tangente de x
Seno hiperbólico de x
Coseno hiperbólico de x
Tangente hiperbólica de x
Angulo x en radianes
Angulo x en radianes
Angulo x en radianes
-1 < x < 1
-1 < x < 1

Angulo x en radianes
Angulo x en radianes
Angulo x en radianes

Requieren de la directiva #include<math.h>
Transformación de grados sexagesimales a radianes:

Gráfica 1. Sistemas de medición de los ángulos

 

Como tangente(pi/4) = 1.
Entonces   pi = 4* atan(1.0)

1.4. Funciones Aleatorias 

Tabla 5. Funciones aleatorias

FUNCION
DESCRIPCION
rand(void)


randomize(void)
srand(unsigned seed)
Genera una secuencia de números pseudo aleatorios.
Cada vez que se llama a rand() devuelve un entero al azar entre 0 y RAND_MAX (32767)
Selecciona aleatoriamente el generador de números aleatorios.
Establece el punto de arranque para la secuencia que genera rand().
Permite ejecutar múltiples programas que usen números aleatorios

Requieren de la directiva #include<stdlib.h>

Gráfica 2. Generación de Números Aleatorios

Para generar un número aleatorio (r) comprendido dentro de un rango predefinido se sugiere usar la fórmula:

r = rand()%(s-i+1)+1;
i :  límite inferior del rango
s :  límite superior del rango

2. Especificación de la Hora

Sintaxis      :   variable = time (argumento)
Propósito  :  Devolver la hora real del calendario del sistema en segundos. Si no tiene hora el sistema, la función devuelve -1.
Requiere de la directiva #include<time.h> y definir una variable de tipo time_t.
Ejemplo     :   time_t hora;
                      hora = time(NULL);

El argumento NULL significa nulo. Si se usa otro argumento, entonces la función asignará también la hora del calendario de dicho argumento.

Ejemplo: 
Ingresar la velocidad inicial (Vi) con que es lanzado un proyectil y el ángulo de inclinación del cañón con respecto a la horizontal (a). Calcular y reportar el alcance horizontal (x), la altura máxima (h) y los tiempos empleados para lograr la altura máxima (th) y el alcance horizontal (tx).











#include <iostream.h>  // ALTURA Y ALCANCE DE UN PROYECTIL
#include <conio.h> 
#include <math.h> 
main()  { 
int Vi; 
float a, x, h, tx, th, g=9.81; 
clrscr(); 
cout<<"Velocidad inicial :  "; cin>>Vi; 
cout<<"Angulo de inclinación del cañón  : "; cin>>a; 
a = 4 * atan(1.0) * a / 180; 
x = pow(Vi, 2) * sin(2 * a) / g;
h = pow(Vi * sin(a), 2) / (2 * g); 
th = Vi * sin(a) / g;
tx = 2 * Vi * sin(a) / g; 
cout<<"\n\nAltura máxima (m)  : "<<h<<"\n"; 
cout<<"\Alcance horizontal máximo (m)  : "<<x<<"\n"; 
cout<<"Tiempo para la altura máxima (seg)  : "<<th<<"\n"; 
cout<<"Tiempo para el alcance horizontal (seg)  : "<<tx<<"\n"; 
getch(); 
}