sábado, 13 de agosto de 2011

ESTRUCTURA REPETITIVA: MIENTRAS QUE (while)

Antes unos conceptos previos:
ESTRUCTURA DE CONTROL REPETITIVAS
1.       Hacer mientras que______(while)
2.       Hacer hasta que_________(do_while)
3.       Desde o para____________(for)

 Bucle
El buque es un conjunto de instrucciones que se repiten.
 Interacción
Es cada una de las veces que se ejecuta el bucle.
 Contador
Un contador es una variable cuyo valor incrementa o decrementa en una cantidad fija se utiliza en los siguientes casos.
Ø  Para contabilizar el número de veces que se desea una operación o grupo de operaciones.
Ø  Un contador toma un valor inicial antes de empezar sus funciones y se debe codificar en el siguiente formato:
  cont=cont +1
 cont=cont -1

Donde: cont es el nombre de tu variable contador.
Acumulador
Un acumulador se encarga de almacenar en una variable el resultado de una o varias operaciones matemáticas que se encuentran dentro de una sentencia repetitiva, para obtener un total acumulado.
Un acumulador se debe inicializar a cero (0) en caso de suma y en uno (1) en caso de producto y se codifica bajo el siguiente formato:
acum=acum+variable
acum=acum*variable
Donde: acum es el nombre de tu variable acumulador.

ESTRUCTURA REPETITIVA: MIENTRAS QUE (while)
La estructura mientras que (while) es aquella en la que el número de repeticiones de bucle no se conoce por anticipado, y el cuerpo del buque se repite mientras se cumple una determinada condición. 
Ø  Condición es una expresión booleana (puede ver verdadera o falsa)  que se evalua al principio del bucle y antes de cada iteración de las sentencias.
Ø  Si la condición es verdadera, se ejecuta el bloque de sentencias y se vuelve al principio del bucle.
Ø  Si la condición es falsa, no se ejecuta el bloque de sentencias y se continúa con la siguiente sentencia del programa.



Una representacion grafica seria como sigue:

Pseudocódigo
Código C++
Mientras (condicon)  Hacer
     grupo de sentencias
FinMientras
while(condicion){
      grupo_de_sentecias
}



Explicación
·         Después de la sentencia: sentencia_n se entra a evaluar la condición  que esta junto a while, si es falsa se pasa el control del programa a la sentencia: sentencia_m (fuera de las llaves como indica la línea de color rojo) para continuar con las otras sentencias… Por lo tanto no se ingresaría ni una sola ves al grupo de sentencias dentro de las llaves del while.

·         En caso de que la condición junto a while sea verdadera se pasa el control del programa  al grupo de sentencias que se encuentran dentro de las llaves (como indica la línea de color verde)para luego regresar (como indica la línea azul) a evaluar la condición esto se repite mientras la condición sea verdadera por lo tanto en el grupo de sentencias que esta dentro de la llaves de:  while se debe de modificar la condición para que en alguna vez la condición evaluada sea falso y salga del bucle para continuar con la sentencia_ m y las otras que continúan.

·         Por eso se dice que el bucle while se ejecuta cero o mas veces.

·         Si la condición nunca llega a ser falsa, tenemos un bucle infinito.

·         La condición se denomina invariante del bucle.
Ejemplos.
E1.
Desarrolle un algoritmo que le permita realizar la escritura de los primeros 100 números naturales.
Análisis. Para poder escribir los primeros 100 números primeo hay que generar dichos valores, Una forma de generar los valores es con la estructuras repetitivas. Declaramos una variable que se inicie con un valor: 1 (int cont=1;) que seria el primer valor a escribir y finaliza en 100 que seria el último número a escribir necesitando un incremento de uno en uno en la variable (se usara un contador).
Inicia: cont=1
Finaliza: cont=100
Incrementa cont en uno o sea : cont =cont+1 
(Código compilado en devC++) copie y péguelo en su compilador para comprovar  
#include<iostream.h>

int main(){
int cont=1;
cout<<"Los primeros 100 numeros naturales"<<endl;
while(cont<=100){
    cout<<cont<<endl;
    cont=cont+1;
};
cout<<"Aqui ya salio del bucle"<<endl;
system("pause");
return 0;
}

E2.
Desarrolle un algoritmo que le permita realizar la suma a los primeros N número impares.

Análisis. Al igual que en el ejercicio anterior es necesario apoyarse en una estructura de tipo cíclica a fin de poder dar solución al problema, la idea es desarrollar la estructura para N veces, una variable que lleve la cuenta para generara los numero impares buscando la relación entre la cuenta y el número como tal (se usara un contador, y un acumulador).
(Código compilado en devC++) copie y péguelo en su compilador para comprovar  

#include<iostream.h>

int main(){
int n,num,cont=1,acum=0;
cout<<"Ingrese un numero : ";
cin>>n;
while(cont<=n){
    num=2*cont-1;
    cout<<num<<endl;         
    acum=acum+num;
    cont=cont+1;
}
cout<<"La suma de los "<<n<<"  Primeros numeros impares es : "<<acum<<endl;

system("pause");
return 0;
}

Nota. El problema se puede resolver de muchas formas por ejemplo solo bastaba con elevar al cuadrado en numero ingresado, la forma como se resolvió es para mostrar como es que funciona la estructura repetitiva while

E3.
Desarrolle un algoritmo que calcule el promedio de los primeros N números naturales.

Análisis. Para dar solución al ejercicio se procede a la siguiente forma: Se debe generar una estructura repetitiva que se encargue de contar el número de términos a sumar, en el caso del ejercicio será N.   La variable que se encarga de contar los términos sirve además como generadora de los términos a sumar. Se acumularan dichos números generados y al final se promedia dicha sumatoria entre el numero de términos sumados.

(Código compilado en devC++) copie y péguelo en su compilador para comprovar  
#include<iostream.h>

int main(){

int n,cont,suma;
suma=0;
cont=1;

float promedio;
cout<<"Ingrese la cantidad de numeros : ";
cin>>n;
while(cont<=n){
    suma=suma+cont;
    cont++; 
};

promedio=(1.0)*suma/n;
cout<<"El promedio de los numeros es : "<<promedio<<endl;
system("pause");
return 0;
}  

Nota. A la división por (1.0) para que salgan los decimales, cont++ equivale a cont=cont+1

E4.
Desarrolle un algoritmo que le permita leer un valor entero positivo N y calcule su factorial.

(Código compilado en devC++) copie y péguelo en su compilador para comprovar  

#include<iostream.h>

int main(){
int n,factorial=1,i=1;
cout<<"Ingrese un numero : ";
cin>>n;
while(i<=n){
    factorial=factorial*i;
    i++;
};

cout<<"El factorial es : "<<factorial<<endl;

system("pause");
return 0;
}


E5.
Desarrolle un algoritmo que le permita leer un valor entero positivo N y decir si es primo o no.

(Código compilado en devC++) copie y péguelo en su compilador para comprovar  
#include<iostream.h>
int main(){

int n,j=2,s=0;
cout<<"Ingrese un numero : ";
cin>>n;
while(j<=n/2){
    if(n%j==0){
        s++;
    }
    j++;
};
Eso es todo por este tema cualquier cosa comenten....

viernes, 12 de agosto de 2011

ESTRUCTURA CONDICIONAL MULTIPLE

Esta instrucción se utiliza para seleccionar una alternativa dentro de multiples opciones disponibles.
El contenido de la variable selector debe ser ordinal, es decir debe ser de tipo int o char o sus variantes de int: long int, short int, no esta permitido datos de tipo float.
Es decir si la variable selector es exactamente igual a la constante J, entonces se ejecutara la sentencia J(s), luego de encontrar la instrucción break, hara que el control del programa salga fuera del switch.
Si no cumple la condición anterior pasara a evaluar el siguiente caso y así sucesivamente. Si ninguno de los casos se cumple ejecuta las sentencias default.

Pseudocódigo
C++
Según sea(Valor)
      Caso <condicion1>
                Sentencia1(s)
                Salto
      Caso <condicion2>
                Sentencia2(s)
                Salto
      Caso <condicion3>
                Sentencia3(s)
                Salto
      Caso <condicion4>
                Sentencia4(s)
                Salto
      Default
                SentenciaD(s)
                Salto
FinSegunsea   
switch (valor)
{
  Case : <condicion1>
        Sentencia1(s);
        break;
  Case : <condicion2>
        Sentencia2(s);
        break;
  Case : <condicion3>
        Sentencia3(s);
        break;
  Case : <condicion4>
        Sentencia4(s);
        break;
  default:
        SentenciaD(s);
       break;
}

Ejemplos.
E1.
Escribir un algoritmo que pida el colegio de Procedencia que puede ser A, B, C y el modo de educación tipo Nacional (N), y Particular (P). Según el siguiente cuadro hallar el monto a pagar.


Nacional
Particular
A
50
25
B
40
29
C
30
15

(compilado en  dev C++)
#include<iostream.h>

int main(){
char c,p;
int monto;
cout<<"Colegio de procedencia : A / B / C : ";
cin>>c;
cout<<"Ingrese el modo de educación : N / P : ";
cin>>p;

switch(c){
    case 'A':
         if(p=='N')
             monto=50;
         if(p=='P')
             monto=25;
         break;
    case 'B':
         if(p=='N')
             monto=40;
         if(p=='P')
             monto=29;
         break;
    case 'C':
         if(p=='N')
             monto=30;
         if(p=='P')
             monto=15;
         break;
    default:
            monto=0;
         break; 
}
if(monto!=0)
    cout<<"El importe a pagar es  "<<monto<<endl;
else
     cout<<"Asegurese de haber ingresado bien los datos"<<endl;

system("pause");
return 0;
}

Explicación

Se pide el ingreso del colegio y el modo de educación tener en cuenta que una misma letra en mayúscula y en minúscula son diferentes en C++ por lo tanto si se ingresan como colegio: a (en minúscula) no será reconocido.

En el switch(c) se evalúa el colegio de procedencia por ser un dato de tipo char no hay ningún problema (lo mismo con enteros), después se busca en donde coincide el dato; por ejemplo si fuera: B la letra ingresada entra a ejecutar todo en código que esta debajo de case ‘B’  (o al costado depende de cómo esta escrita el código)  hasta encontrar el break que hace que salga de switch (sale del corchete del switch), en caso de no encontrar ninguna coincidencia con los casos en el código entra a ejecutar el código debajo del default (el uso del default es opcional) hasta encontrar el break que hace salir del switch y se continua con las demás senteccias; en el caso de que no se ponga un default y no se encuentre ninguna coincidencia solo saldrá del switch.

E2.
Escribir un programa que dado el tipo de enfermedad (0, 1, 2, 3) y el numero de años del paciente, calcule el costo para la medicina, se sabe que para cualquier paciente que tenga 14 y 22 años el costo para la cura se incrementa en un 10%, además para la enfermedad tipo 0, la medicina esta S/. 25.00 para el tipo 1 la medicina esta S/.16, para el tipo 2 la medicina esta S/.20 y para el tipo 3 la medicina esta S/.32

#include<iostream.h>

int main(){
int tipoe,anios;
float costo=0;

cout<<"Ingrese tipo de enfermedad : 0 / 1 / 2 / 3  : ";
cin>>tipoe;
cout<<"Años del paciente : ";
cin>>anios;


switch(tipoe){
    case 0 :if(anios>=14&&anios<=22)
                costo=25+25*(10/100.); 
            else
                costo=25;
            break;
    case 1 :if(anios>=14&&anios<=22)
                costo=16+16*(10/100.);
            else
                costo=16;
            break;
    case 2 :if(anios>=14&&anios<=22)
                costo=20+20*(10/100.);
            else
                costo=20;
            break;
    case 3 :if(anios>=14&&anios<=22)
                costo=32+32*(10/100.);
            else
                costo=32;
            break;                                   
}

/*si el costo el diferente de cero quiere decir
que entro en algun caso*/

if(costo!=0)
    cout<<"El costo a pagar segun esa enfermedad es : "<<costo<<endl;
else
    cout<<"Error se ingreso los datos incorrectamente "<<endl;

system("pause");
return 0;
}

Explicación

El condicional if(anios>=14&&anios<=22)  evalúa si los años esta en el intervalo de 14 a 22, si los años están dentro de ese intervalo entonces el costo se incrementara en un 10% mas de lo normal ejemplo: costo=20+20*(10/100.)  el punto al final del 100 es para que la división salga con decimales si esta los tiene.

Eso es todo en este tema no se olviden de comentar…J

jueves, 11 de agosto de 2011

ESTRUCTURAS SELECTIVAS

Se usan para la toma de decisiones dentro de un programa y lo podemos clasificar:
1.       Simple   → (Si_entonces)
2.       Doble    → (Si_entonces_sino)
3.       Anidada o cascada  →(Si_anidada)
4.       Multiple                     → ( Si_múltiple)

ESTRUCTURA SELECTIVA SIMPLE
Permite ejecutar una acción o grupo de acciones solo si se cumple una determinada condición, es decir, donde la condición “C” es un grupo de condiciones a evaluarse. El bloque “A” representa la operación o conjunto de operaciones a realizar si la condición “C” es verdadera.
Pseudocodigo
En C++
Si(C)
      A
Finsi
if(C)
{
     A
}

También se puede decir que se evalúa la condición “C” si es verdadero (true) se ejecuta todas las sentencias que están dentro de las llaves (en C++), hasta el Finsi (en pseudocódigo) para luego continuar con la siguiente línea de código que esta después.
En caso que la condición “C” sea falsa (false) no se ejecutara las sentencias dentro de las llaves (en C++), hasta el Finsi (en pseudocódigo), y el control pasa a la siguiente instrucción de programa (en orden descendente).


Pseudocódigo
En C++
Inicio               
Escribir(“Ingrese un número”)
Leer(numero)           
Si(numero mod 3 = 0)
       Escribir(“El numero es múltiplo de tres”)        
Finsi    
Escribir(“El numero ingresado es”, numero)
Fin
#include<iostream.h>
int main()
{
int numero;
cout<<”Ingrese un número ”;
cin>>numero;
if(numero%3==0)
{
    cout<<”El numero es multiplo de tres<<endl;
}            
cout<<”El numero ingresado es”<<numero<<endl;  
}
system(“pause”);
return 0;
}


Obs. El resultado de: a%b es el residuo de dividir a entre b

Ø Si ingresamos el número: 6 nos saldrá en pantalla:   El numero es múltiplo de tres
                                                                                               El numero ingresado es 6
Ø Si ingresamos el número: 13 nos saldrá en pantalla: El numero ingresado es 13

Explicación

Pedimos el número, lo leemos, ahora evaluamos la condición: si (el residuo de el número entre tres es cero) se ejecuta todas las sentencias que están dentro de los corchetes (en C++), hasta el Finsi (en pseudocódigo), en el ejemplo solo tenemos una sentencia pero se pueden poner mas por ejemplo se pudo poner:

    
if(numero%3==0)
{
      cout<<”El numero es múltiplo de tres”<<endl;
      cout<<”El doble del numero es ”<<numero*2<<endl;
}            
cout<<”El numero ingresado es”<<numero<<endl;

En el caso de que haya una sola sentencia a ejecutarse cuando la condición a evaluar sea verdadera como en el ejemplo anterior se pueden omitir los corchetes, en caso de que haya más de dos sentencias el uso de corchetes es obligatoria.
Por lo tanto seria también correcto. 

if(numero%3==0)
       cout<<”El numero es múltiplo de tres”<<endl;

cout<<”El numero ingresado es”<<numero<<endl;



ESTRUCTURA SELECTIVA DOBLE

Permite seleccionar una ruta de dos posibles, en base a la verdad (V) o falsedad (F) de la condición.


Pseudocódigo
En C++

Si(Condicion)
            a1
            a2
            a3
              .
              .
              .
           an
Sino
           b1
           b1
           b1
            .
            .
            .
           bn
Finsi                   
if(condicion)
{
    a1;
    a2;
    a3;
     .
     .
     .
    an;
}
else
{
    b1;
    b2 ;
    b3;
     .
     .
     .
    bn;
}

Si (if) la condición es verdadera, se ejecutan las sentencias: {a1, a2, a3, …, an} , sino (else) se ejecutaran las sentencias: {b1, b2, b3, …, bn}
Si la sentencia solo tiene una línea no es necesario poner llaves.
  

 SENTENCIAS ANIDADAS

Una estructura de decisión puede estar  anidada dentro de otra estructura de decisión, hay que tener en cuenta que el anidamiento sea total.

Se debe mantener el concepto que una estructura de decisión debe tener una sola entrada y una sola salida tanto para la estructura que anida como para la estructura anidada.


           Pseudocódigo
En C++

Si(Condicion1)
         Si(Codicion2)
                 Ejecuta bloque de acciones 1
         Sino
                 Ejecuta bloque de acciones 2
         Finsi
Sino
         Ejecuta bloque de acciones 3
Finsi
                  
if(Condicion1)
{
   if(Condicion2)
   {
      Ejecuta bloque de acciones1
   }
   else
   {
      Ejecuta bloque de acciones2
   }   
}
else
{
   Ejecuta bloque de acciones3
}


Para entenderlo mejor citare unos ejemplos.
Ejemplos.

Si se quiere saber si el numero ingresado en mayor que cero el código de nuestro programa seria así
(compilado en  dev C++)

E1.
(compilado en  dev C++)
#include<iostream.h>

int main(){
int num;
cout<<"Ingrese un numero : ";
cin>>num;   
if(num>0){
    cout<<"El numero es mayor que cero"<<endl;    
}
else{
    cout<<"El numero no es mayor que cero"<<endl;
}
system("pause");
return 0;
}


Ø Si ingresamos el número: 3 nos saldrá en pantalla: El numero es mayor que cero
Ø Si ingresamos el número: -45 nos saldrá en pantalla: El numero no es mayor que cero

Si además de que el número sea mayor que cero queremos saber si el número es múltiplo de tres el código será:

E2.
#include<iostream.h>

int main(){
int num;
cout<<"Ingrese un numero : ";
cin>>num;   
if(num>0){
    cout<<"El numero es mayor que cero"<<endl;
    if(num%3==0){
        cout<<"El numero es múltiplo de tres "<<endl;
    }
    else{
        cout<<"El numero no es multiplo de tres "<<endl;
    }    
}
else{
    cout<<"El numero no es mayor que cero"<<endl;
}
system("pause");
return 0;
}

Obs. Recordar que a%b nos da el residuo de la división de a entre b y que el operador == es igualdad y = es de asignación.

Ø  Si ingresamos el número: 50 saldrá en pantalla: El numero es mayor que cero
                       El numero no es multiplo de tres

Ø  Si ingresamos el número: 21 saldrá en pantalla: El numero es mayor que cero
                       El numero es multiplo de tres

Ø  Si ingresamos el número: -6 saldrá en pantalla:  El numero no es mayor que cero

Veamos el caso en la que se ingrese el número -6 no sale que es múltiplo de tres sólo nos sale: El numero no es mayor que cero y no se evalúa la  condición si es múltiplo de tres, esto sucede porque tenemos antes una condición que actúa como un filtro que es: Si ( if ) el numero ingresado es mayor que cero ( if(num>0) ) entra al bloque encerrado entre llaves y ahí recién se evalúa si este numero es múltiplo de tres, si lo es se manda a pantalla: El numero es múltiplo de tres en caso contrario : El numero no  es múltiplo de tres; en caso de que el numero no sea mayor de cero entrara al bloque else (sino) de la primera condición y nos muestra por la pantalla: El numero no es mayor que cero.

Una forma de resolver esto seria:

E3.
#include<iostream.h>

int main(){
int num;
cout<<"Ingrese un numero : ";
cin>>num;   
if(num>0){
    cout<<"El numero es mayor que cero"<<endl;
    if(num%3==0){
        cout<<"El numero es multiplode tres "<<endl;
    }
    else{
        cout<<"El numero no es multiplo de tres "<<endl;
    }    
}
else{
    cout<<"El numero no es mayor que cero"<<endl;
    if(num%3==0){
        cout<<"El numero es multiplode tres "<<endl;
    }
    else{
        cout<<"El numero no es multiplo de tres "<<endl;
    }    
}
system("pause");
return 0;
}

Ø Si ingresamos el número: -6 saldrá en pantalla:   El numero no es mayor que cero
                                                                              El numero es multiplo de tres

Ø Si ingresamos el número: -56 saldrá en pantalla: El numero no es mayor que cero
                                                                              El numero no es multiplo de tres

Ø Si ingresamos el número: 32 saldrá en pantalla:  El numero es mayor que cero
                                                                             El numero no es multiplo de tres

Ø Si ingresamos el número: 30 saldrá en pantalla:  El numero es mayor que cero
                                                                             El numero es multiplo de tres


Mas ejemplos…

Obs. En devC++ podemos poner comentarios que son ignorados por el programa y sirven para explicar algunas partes del programa o alguna otra descripción, de una sola línea  ponemos “//” antes del comentario y para un comentario de varias líneas  /*” antes del comentario  y  */” al final.

Ejemplo.
·        //comentario de una sola línea
·       /*comentario de una o varias líneas*/

E4.
Desarrolle un programa que dado dos ángulos averiguar si son complementarios (dos ángulos son complementarios si suman 90)

(Código compilado en devC++)
#include<iostream.h>

int main(){
//declaramos tres variables(comentario de una línea)
int angulo1;
int angulo2;
int sum;
/*Pedimos los ángulos y los guardamos en las variables angulo1 y angulo2(esto es un comentario de varias líneas) */

cout<<"Ingrese primer angulo :";
cin>>angulo1;
cout<<"Ingrese segundo angulo :";
cin>>angulo2;

//le asignamos a la variable sum la suma de los angulos

sum=angulo1+angulo2;
if(sum==90)
    cout<<"Los angulos son complementarios "<<endl;
else
    cout<<"Los angulos NO son complementarios "<<endl;

system("pause");
return 0;
}

Se puede observar en este ejemplo que después del condicional if no se puso corchetes es porque hay una sola sentencia, al igual que después en else.

E5.
Desarrollaremos un algoritmo que leídos dos números A y B indicar si uno de los dos divide al otro exactamente.

Un número dividirá al otro exactamente si el residuo de dividir los números es cero.

(Código compilado en devC++)
#include<iostream.h>

int main(){
//declaramos las variables
int A,B;
cout<<"Ingrese primer numero :";
cin>>A;
cout<<"Ingrese segundo numero :";
cin>>B;
if(A%B==0){
   cout<<B<<"divide a "<<A<<"Exactamente"<<endl; 
}
else{
    if(B%A==0){
        cout<<A<<" divide a "<<B<<"Exactamente"<<endl; 
    }
    else{
        cout<<"Ninguno divide al otro exactamente "<<endl;
    }
}

system("pause");
return 0;
}   
                                                                                 
                                                                                       
E6.
Desarrolle un algoritmo que permita leer tres números y almacenarlo en las variables A, B, C respectivamente. El algoritmo debe indicar quien es el mayor. Para este caso se asume que los tres valores leídos por el teclado son valores distintos.
(Código compilado en devC++)
#include<iostream.h>

int main(){
int A,B,C;
cout<<"Ingrese primer numero : ";
cin>>A;
cout<<"Ingrese segundo numero : ";
cin>>B;
cout<<"Ingrese tercer numero : ";
cin>>C;

if(A>B&&A>C){
    cout<<"A = "<<A<<"  es el mayor"<<endl;
}
else{
    if(B>A&&B>C){
        cout<<"B = "<<B<<"  es el mayor"<<endl;
    }
    else{
        cout<<"C = "<<C<<"  es el mayor"<<endl;
    }   
}
system("pause");
return 0;
}

E7.
Este problema es muy parecido al anterior solo que en ves de hallar el mayor debemos hallar el menor numero de tres ingresados (diferentes).

(Código compilado en devC++)
#include<iostream.h>

int main(){
int A,B,C;
cout<<"Ingrese primer numero : ";
cin>>A;
cout<<"Ingrese segundo numero : ";
cin>>B;
cout<<"Ingrese tercer numero : ";
cin>>C;

if(A<B){
    if(A<C){
        cout<<"A= "<<A<<" es el menor"<<endl;
    }
    else{
        cout<<"C="<<C<<" es el menor"<<endl;  
    }
}
else{
    if(B<C){
        cout<<"B="<<B<<" es el menor"<<endl;  
    }
    else{
        cout<<"C="<<C<<" es el menor"<<endl;  
    }
}
system("pause");
return 0;
}

Bueno eso es todo para este tema si no te quedo claro algo comentarlo y yo te estaré correspondiendo a la brevedad posible…

CONDICIONAL MÚLTIPLES EN EL SIGUIENTE BLOG…