Instrucciones

Site: Facultad de Ingeniería U.Na.M.
Course: Computación ET-344
Book: Instrucciones
Printed by: Guest user
Date: Wednesday, 3 July 2024, 6:16 AM

1. Introducción

El elemento que nos está faltando para poder comenzar a escribir nuestros propios programas son las sentencias o instrucciones.
Un programa contiene las acciones o instrucciones que resolverán el problema. Las instrucciones describen la secuencia de pasos con el que se quiere solucionar el problema planteado.
Existen instrucciones de diversos tipos que nos permitirán enfrentarnos a todas las situaciones posibles en programación.

Los tipos de sentencias son:

  • Bloques
  • Expresiones
    • Llamadas a función
    • Asignación
    • Nula
  • Bucles
    • while
    • do while (este NO existe en Python)
    • for
  • Selección
    • if...else
    • switch  (este NO existe en Python)
      • Etiquetas
        • case
        • default
  • Saltos
    • break
    • continue
    • goto (NO se usa en nuestro curso, paradigma de  programación Estructurada)
    • return

2. Bloques

Una sentencia compuesta o un bloque, es un conjunto de sentencias, que puede estar vacía, encerrada entre llaves "{}".
Sintácticamente, un bloque se considera como una única sentencia.
También se usa en la definición de cuerpo de funciones.
Los bloques pueden estar anidados hasta cualquier profundidad.

Veamos un ejemplo.

En este caso main es una función. Vemos que el cuerpo de la función (que es donde está el código fuente ) es el bloque de color verde. También hay otro bloque interno de color rojo. En este caso si sacamos las llaves de las líneas 7 y 11 el programa funcionaría de la misma forma, en algunos casos los bloques permiten facilitar la interpretación del código y en otros casos tiene otras características como veremos en ámbitos de variables.

3. Bucles

Un bucle es la estructura de control que permite la repetición de una serie determinada de sentencias. Es importante tener en cuenta cuántas veces se repite el bucle y cuál es el cuerpo del bucle.

Dependiendo de la cantidad de veces que se reitera el bucle o iteración  (conocida o desconocida) esto permite sugerir el uso de una sentencia FOR o WHILE.
El cuerpo del bucle , limitado por llaves {} , lo constituyen la serie de sentencias que pueden ser de cualquier tipo (secuencial, de decisión o repetitivo) las cuales serán repetidas n veces, pudiendo ser n conocido o desconocido. Cuando n es desconocido, el número de veces que debe repetirse el cuerpo del bucle estará condicionado por una expresión lógica.
Un bucle no es más que una serie de instrucciones que se repiten.

A la hora de utilizar un bucle, sea del tipo que sea, debemos ir con cuidado y pensar cuando debe acabar ya que si no tuviéramos en cuenta esto podríamos entrar en un bucle sin fin, iríamos repitiendo las mismas líneas teniendo que abortar la aplicación, para poder finalizar la ejecución del programa.
Por esto, es de suma importancia que pensemos, antes de hacer nada, en qué momento, cómo, dónde y por qué debe acabar el bucle.

3.1. Bucle "while"

Es la sentencia de bucle más sencilla, y sin embargo es tremendamente potente.

Sintaxis:

while (<condición>) <sentencia/s>;

La sentencia o el grupo de sentencias es ejecutado repetidamente mientras la condición sea verdadera, ("while" en inglés significa "mientras").
Si no se especifica condición se asume que es "true", y el bucle se ejecutará indefinidamente.
Si la primera vez que se evalúa la condición resulta falsa, la/s sentencia/s no se ejecutarán ninguna vez.

Por ejemplo:

while (x < 100) x = x + 1; 

Se incrementará el valor de x mientras x sea menor que 100. Ver que el bucle de iteración es una línea!!, por eso podemos evitar las {}.

Este ejemplo puede escribirse, usando el C++ con propiedad y elegancia, de un modo más compacto:

while (x++ < 100); // tener presente orden de evaluación y precedencia

Aquí vemos el uso de una sentencia nula, observa que el bucle simplemente se repite, y la sentencia ejecutada es ";", es decir, nada.

Veamos un ejemplo:

 Figura 1

Esto visto con un Diagrama de Flujo sería:

 Figura 2

Observaciones.

  • La evaluación se hace ANTES de ingresar el bloque de iteración.
  • Si la evaluación es falsa se finaliza.
  • Podría ser que NUNCA se ejecute el Bloque de iteración si la evaluación resulta FALSA en la primer evaluación.
  • Podría pasar que NUNCA se finalice en bucle,  si la condición que modifica la expresión No se realiza correctamente. ( "se cuelga el programa")

 Que pasa ....

  • Si la línea 6 de la Figura 1 fuera:   while (x>0);  
  • Si la línea 5 de la Figura 1 fuera :  float x=0;
  • Si la línea 6 de la Figura 1 fuera:   while (1) 

3.2. Bucle "do while"

Hago luego evalúo.

Esta sentencia va un paso más allá que el "while". Esta NO existe en Python.

Sintaxis:

do <sentencia> while(<condición>);  //una sentencia
do {  //varias líneas => bloque
sentencia 1..
sentencia 2..
....
}while(<condición>);

La/s sentencia/s es ejecutada repetidamente mientras la condición resulte verdadera.

Si no se especifica condición se asume que es "true", y el bucle se ejecutará indefinidamente.
A diferencia del bucle "while", la evaluación se realiza después de ejecutar la sentencia, de modo que siempre se ejecutará al menos una vez.

Por ejemplo:

do
x = x + 1;
while (x < 100);

ó
do{
x = x + 1;
}while (x < 100);

Se incrementará el valor de x hasta que x valga 100, por que en 100 la evaluación de la expresión del do/while resulta FALSA.

Veamos otro ejemplo:

 Figura 1

Esto visto como un Diagrama de Flujo sería:

 Figura 2

 Se pide al alumno razonar sobre...

  1. Que línea se sacó respecto de while ? Justificar la respuesta.
  2. Que pasa si en la línea 10 de la Figura 1 se escribe:  }while(>0)   
  3. Que pasa si en la línea 10 de la Figura 1 se escribe: }while(1);
  4. Que pasa si en la línea 10 de la Figura 1 se escribe: }while(0);
  5. Que pasa si en la línea 10 de la Figura 1 se escribe: }while(2);

3.3. Bucle "for"

El bucle "for", es el más elaborado.

Sintaxis:

for ([<inicialización>]; [<condición>]; [<incremento>]) 
<sentencia/s>;

La/s sentencia/s es ejecutada repetidamente hasta que la evaluación de la condición resulte falsa.
Antes de la primera iteración se ejecutará la iniciación del bucle, que puede ser una expresión o una declaración.
En este apartado se iniciarán las variables usadas en el bucle. Estas variables pueden ser declaradas en este punto, pero en ese caso tendrán validez sólo dentro del bucle "for".
Después de cada iteración se ejecutará el incremento de las variables del bucle.

Todas las expresiones son opcionales, si no se especifica la condición se asume que es verdadera.

Por ejemplo:

for (int i = 0; i < 100; i = i + 1); //ver que se declara e inicializa i dentro del for!!

Como las expresiones son opcionales, podemos simular bucles "while":

for(;i < 100;) i = i +1;//ver que NO se inicializa i!!
for(;i++ < 100;);  //ver que no tiene condición de incremento!

O bucles infinitos:

for(;;); // esto NO se debe usar , SOLO para casos muy especiales.

Veamos otros ejemplos:

Este código acumula 10 valores ingresados por el teclado.

 Se pide al alumno razonar sobre...

¿Que pasa si la línea 5 de la figura 1 se reemplaza por: int i=10;?

¿Que pasa si se reemplaza la línea 7 por : for(int i=0;i<10;i++) ? Justificar la respuesta.

¿Que pasa si se modifican/reemplazan las líneas 5, 6 y 7 por estas dos líneas:

 float x, acumulador=0;
for(int i=5;i<10;i++)

3.4. Sentencia break

La sentencia break en C++ es una herramienta fundamental para controlar el flujo de ejecución de tu programa. Permite salir de un bucle while, do-while o for de forma anticipada, sin necesidad de esperar a que se cumpla la condición de salida natural del bucle.



3.5. Sentencia continue

La sentencia continue en C++ es una herramienta fundamental para controlar el flujo de ejecución de tu programa. Permite ir a la siguiente iteración de un bucle while, do-while o for sin ejecutar el resto del código dentro del bucle.


4. Sentencias de Selección

Las sentencias de selección permiten controlar el flujo del programa, seleccionando distintas sentencias en función de diferentes valores.

4.1. Sentencia "if...else"

Implementa la ejecución condicional de una sentencia.

Sintaxis:

if (<condición>) <sentencia1>;
if (<condición>) <sentencia1>; else <sentencia2>;

Si la condición es "true" se ejecutará la sentencia1, si es "false" se ejecutará la sentencia2.
El "else" es opcional, y no pueden insertarse sentencias entre la sentencia1 y el "else".

Se pueden declarar variables dentro de la condición.

Por ejemplo:

if (int val = func(arg))... 

En este caso, la variable "val" sólo estará accesible dentro del ámbito de la sentencia "if" y, si existe, del "else".

4.2. Sentencia if else if else if...

Se pueden agregar entre un if y un else sentencias : else if.

Estas deben evaluar una expresión de la misma manera que el if.

Si la condición a evaluar es FALSE, continúa con el próximo else if o else.. lo que continue.


Vemos como sería el diagrama de flujo:

Co
Conclusión:
cada vez que un if o else if resulta falso, continúa con el próximo, si es verdadero salta TODO lo restantes if, else if, else del bloque.

4.3. Sentencia "switch"

Cuando se usa la sentencia switch el control se transfiere al punto etiquetado con el "case" cuya expresión constante coincida con el valor de la variable del "switch".
A partir de ese punto todas las sentencias serán ejecutadas hasta el final del "switch", es decir hasta llegar al "}". Esto es así porque las etiquetas sólo marcan los puntos de entrada después de una ruptura de la secuencia de ejecución, pero no marcan las salidas.
Esta característica nos permite ejecutar las mismas sentencias para varias etiquetas distintas, y se puede eludir usando la sentencia de ruptura "break" al final de las sentencias incluidas en cada "case".
Si no se satisface ningún "case", el control parará a la siguiente sentencia después de la etiqueta "default". Esta etiqueta es opcional y si no aparece se abandonará el "switch".
No te preocupes, con un ejemplo se aclarará.

Sintaxis:

switch (<variable>) {
   case <expresión_constante>: [<sentencias>] [break;]
   . . .
   [default : [<sentencia>]]
}

Por ejemplo:

switch(letra) {
   case 'a':
   case 'e':
   case 'i':
   case 'o':
case 'u':
      EsVocal = true;
      break;
   default:
      EsVocal = false;
}

En este ejemplo letra es una variable de tipo "char" y EsVocal de tipo "bool". Si el valor de entrada en el "switch" corresponde a una vocal, EsVocal saldrá con un valor verdadero, en caso contrario, saldrá con un valor falso.
El ejemplo ilustra el uso del "break", si letra es 'a', se cumple el primer "case", y la ejecución continúa en la siguiente sentencia, ignorando el resto de los "case" hasta el "break". 

Otro ejemplo:

Menor1 = Menor2 = Menor3 = Mayor3 = false;
switch (numero){
   case 0:
      Menor1 = true;
   case 1:
      Menor2 = true;
   case 2:
      Menor3 = true;
      break;
   default:
      Mayor3 = true;
}

Veamos qué pasa en este ejemplo si número vale 1.
Directamente se reanuda la ejecución en "case 1:", con lo cual Menor2 tomará el valor "true", lo mismo pasará con Menor3.
Después aparece el "break" y se abandona el "switch".

4.4. Etiquetas "case" y "default"

Estas etiquetas se circunscriben al ámbito de la sentencia "switch", y se verá su uso cuando estudiemos ese apartado.

Sintaxis:

switch(<variable>){
   case <expresión_constante>: [<sentencias>][break;]
   . . .
   [default: [<sentencias>]]
}

5. Sentencias de salto

Las sentencias de salto permiten romper la ejecución secuencial de un programa.

5.1. Sentencia de ruptura "break"

El uso de esta sentencia dentro de un bucle pasa el control a la primera sentencia después de la sentencia de bucle.
Un ejemplo de aplicación es dentro de la sentencia "switch".

Recordemos que en Python el break es de uso frecuente con el while True, o la forma de implementar el do-while.. pero en C++ al existir el do-while el uso se limita a algunas situaciones mas puntuales como el switch.

Sintaxis:

break 

Ejemplo:

#include <iostream>
using namespace std;

int main(int argc, char *argv[]) {
	int y = 0;
	int x = 0;
	while (x < 1000) {
		if (y == 1000) break;
		y++;
	}
	x = 1;
	return 0;
}


En este ejemplo el bucle no terminaría nunca si no fuera por la línea del "break", ya que x no cambia. Después del "break" el programa continuaría en la línea 11, "x = 1".

5.2. Sentencia “continue"

El uso de la sentencia continue dentro de un bucle permite pasar el control al final de la sentencia de bucle, justo al punto donde se evalúa la condición para la permanencia en el bucle. 

Sintaxis:

continue

Ejemplo:


#include <iostream>
using namespace std;

int main(int argc, char *argv[]) {
	int x = 0,y = 0;
	while (x < 1000){
		x++;
		if (y >= 100) continue;
		y++;
	}
	return 0;
}


En este ejemplo la línea "y++" sólo se ejecutaría mientras "y" sea menor que 100, en cualquier otro caso el control pasa a la línea "}", con lo que el bucle volvería a evaluarse.

5.3. Sentencia de retorno "return"

La sentencia return sale de la función donde se encuentra y devuelve el control a la rutina que la llamó, opcionalmente con un valor de retorno.

Sintaxis:

return [<expresión>];

Ejemplo:

int Paridad(int x){
if (x % 2) return 1;
return 0;
}

Este ejemplo ilustra la implementación de una función que calcula la paridad de un parámetro. Si el resto de dividir el parámetro entre 2 es distinto de cero, implica que el parámetro es impar, y la función retorna con valor 1. El resto de la función no se ejecuta. Si por el contrario el resto de dividir el parámetro entre 2 es cero, el parámetro será un número par y la función retornará con valor cero.

6. Comentarios

Los comentarios ayudan a seguir el funcionamiento del programa durante la depuración o en la actualización del programa, además de documentarlo.
No se trata propiamente de un tipo de sentencias, pero me parece que es el lugar adecuado para introducir este concepto.
En C pueden introducirse comentarios en cualquier parte del programa, Los comentarios en C se delimitan entre /* y */, cualquier cosa que escribamos en su interior será ignorada por el compilador, sólo está prohibido su uso en el interior de palabras reservadas o en el interior de identificadores.

Por ejemplo:

main(/*Sin argumentos*/void)  está permitido
ma/*función*/in(void)  es ilegal

La función de los comentarios es aclarar y documentar, no entorpecer el código.
En C++ se ha incluido otro tipo de comentarios, que empiezan con //. Estos comentarios no tienen marca de final, sino que terminan cuando termina la línea.

Por ejemplo:

void main (void) // Esto es un comentario
{
}

Las llaves { } no forman parte del comentario.

7. Ejercicios con Condicionales.

  1. Declarar A y B como constantes.

    Ingresar x y determinar  si pertenece  al intervalo [A,B]

  2. Ingresar A y B por teclado.

    Ingresar x y determinar  si pertenece  al intervalo [A,B]

  3. Ingresar una letra por teclado y decir si corresponde a :

    A,B,C,F ó f ( algo como un menú)

    Realizar el ejercicio con dos variantes, usando

    • if-else
    • AND y OR
  4. Definir como constantes MAX y MIN con valores de 50 y 25 respectivamente. MAX y MIN se conocen como constantes simbólicas
    • Ingresar una temperatura temp por teclado y decir :
    • hace calor ( cuando es igual o superior a 50 temp>=50)
    • esta templado cuando es mayor o igual a 25 y menor que 50.(25 <=temp , temp<50)
    • hace frio si es menor a 25 (temp<25) 

    ¿Que pasa si en lugar de usar MAX y MIN se ponen 50 y 25? Tiene beneficios?

    ¿Que pasa si el templado incluye a 50 y el calor también? calor :[50,infinito] , templado: [25,50]

  5. Ingresar una letra por teclado y decir si es mayùscula o minúscula o si es un dígito usando if-else. 

    Sugerencia: Mirar valores decimales de los caracteres de  la tabla ASCII

  6. Escribir un programa que defina en un string un texto que sería una contraseña. Luego por teclado se pide al usuario que ingrese una contraseña e imprima por pantalla si la contraseña introducida por el usuario coincide con la guardada en la variable sin tener en cuenta mayúsculas y minúsculas.


    Recomendación: mirar los valores decimales de ASCII

  7. Escribir un programa que pregunte al usuario su edad y muestre por pantalla si es mayor de edad o no. Recuerde que se considera mayor de edad una persona cuando tiene más de 18 años.

  8. Solicitar el ingreso de un nro., el programa deberá  indicar si el número ingresado es múltiplo de 7.
  9. Escriba un programa que pregunte primero si se quiere calcular el área de un triángulo rectángulo o la de un círculo. Si se contesta que se quiere calcular el área de un triángulo (escribiendo T o t), el programa tiene que pedir entonces la base y la altura y mostrar el área. Si se contesta que se quiere calcular el área de un círculo (escribiendo C o c), el programa tiene que pedir entonces el radio y mostrar el área.

    Se recuerda que el área de un triángulo es base por altura dividido por 2 y que el área de un círculo es Pi (aproximadamente 3,141592) por el radio al cuadrado.

    Nota: Utilice como valor de pi el valor 3.141592.

  10. Escriba un programa que pida dos números y que muestre cuál es el menor y cuál el mayor o que escriba que son iguales.

  11. Pedir por pantalla el ingreso de dos números x e y. Luego indicar si x es divisible por y. Mostrar error si el divisor es cero utilizando.

    x (dividendo) /y (divisor)

  12. Escriba un programa que pida tres números y que muestre por pantalla:

    si son los tres iguales

    si hay dos iguales

    si son los tres distintos.

  13. Escriba un programa que pida un año y que escriba si es bisiesto o no.

    Se recuerda que los años bisiestos son múltiplos de 4, pero los múltiplos de 100 no lo son, aunque los múltiplos de 400 sí.

    A continuación se muestran años bisiestos para que se pueda probar el código.

    1904     1908     1912     1916     1920     1924     1928     1932     1936     1940     1944     1948
    1952     1956     1960     1964     1968     1972     1976     1980     1984     1988     1992     1996

  14. Escribir un programa en C++ que permita resolver una ecuación de primer grado. Se debe pedir a y b , donde f(x) =a·x+b. Observar que se deben analizar los posibles valores de a y b para poder encontrar la solución.

  15. Se tiene una escala de calificaciones que se desea modificar por otra escala.

    Los valores [0,10], deben ser mapeados a una escala con 5 rangos.

    [0,4] => R  (de Reprobado)

    (4,6) => D  (de Desaprobado)

    [6,7) =>A (de Aprobado)

    [7,8) =>B (de Bueno)

    [8,10] =>E (de Excelente)

  16. Se pide hacer un programa en C++  que permita ingresar un dígito (número) y luego mostrar la palabra que describe el dígito. Si ingreso 3, debería mostrar por pantalla Tres. 

  17. Crear un menú que pida el ingreso de:


    / )Dividir

    * )Multiplicar

    - )Restar

    + ) Sumar.

    Luego de la selección se pedirá el ingreso dos números, a y b y mostrará el resultado de la operación elegida utilizando a y b.

  18. Ingresar un número C y determinar si pertenece al intervalo cerrado [A,B] con A y B ingresados por teclado.

    Mostrar por pantalla si pertenece o no al intervalo. Tener presente que no necesariamente el primer nro. ingresado va a ser menor que el segundo.

  19. Se leen dos valores enteros A, B. Si A es mayor que B se realiza la suma de ambos, caso contrario, se hace el producto y se muestra el resultado en pantalla ademas de la operación realizada (“suma” ó “producto”).

  20. Diseñe un programa que:

    -  Permita la carga por teclado de los lados de un rectángulo y el radio de un círculo.

    -  Determine el área de cada figura.

    -  Muestre en pantalla el área mayor y a qué figura pertenece.

  21. Diseñe un algoritmo que permita ingresar dos valores X e Y . Determinar que porcentaje es X de Y si Y>X , que porcentaje es Y de X si X>Y. Si ambos son iguales deberá mostrar un cartel por pantalla indicando que ambos son iguales.


8. Ejercicios Repetitivas y Condicionales

  1. Sumar los números ingresados por el usuario mientras sean distintos de 0.
  2. presentar la serie de fibonacci hasta el término n ingresado por el usuario
  3. presentar la serie de fibonacci mientras que el valor del término actual sea menor a un valor ingresado por el usuario
  4. crear un menú que imprime hola si el usuario elije "h", chau si se elije "c", buen día si elije "b". Si elije el número 0 se sale.
  5. Escribir un programa que permita ingresar el monto de las ventas realizadas por N empleados. N es un valor positivo ingresado desde teclado que indica la cantidad de vendedores. Si N es negativo el programa finaliza y si N es positivo se deberán ingresar las N ventas.Al finalizar la carga se deberá indicar el monto de venta mayor y en qué posición se produjo.
  6. Modificar el programa anterior para que funcione con un ciclo While.
  7. Escribir un programa que permita ingresar el límite inferior y superior de

    un intervalo. Si el límite inferior es mayor que el superior, deberá intercambiarlos. A continuación, se van introduciendo números hasta que se ingrese el 0. El programa deberá ir mostrando los números ingresados que están fuera del intervalo, y en qué posición se ingresó el cero.

  8. Escribir un programa que permita ingresar el límite inferior y superior de

    un intervalo. Si el límite inferior es mayor que el superior, deberá intercambiarlos. A continuación, se van introduciendo números hasta que se ingrese el 0. Al finalizar el programa deberá mostrar cuantos números de los ingresados están fuera del intervalo, y en qué posición se ingresó el cero.

    En que cambia la consigna de este ejercicio y el anterior?
  9. Escribir un programa que permita

    - ingresar un número N (entero positivo, si se ingresa otra cosa, se deberá mostrar un mensaje indicando un error)

    - ingresar un número X (real positivo que debe estar entre 0 y π , si se ingresa otra cosa, se deberá mostrar un mensaje indicando un error)

    - luego calcular y mostrar la aproximación al Seno del ángulo X como Sen (X)  =  (𝑥 - 𝑥3 / 3 ! + x5 / 5 ! - x7 / 7 ! + )

    NOTA: N expresa la cantidad de términos a considerar en la serie de Taylor, utilizada para aproximar el Seno de X. Verificar que... a mayor N se obtiene una mejor aproximación.

  10. Realizar un programa que permita adivinar un número. Para ello se solicitara el ingreso por teclado del numero a adivinar (entero). Luego se irán solicitando mas números y se deberá ir averiguando si el número a adivinar es mayor o menor que el introducido (ir mostrando carteles indicativos). El programa termina cuando se acierta el número.
  11. Escribir un programa que pida al usuario un número entero positivo y muestre por pantalla todos los números impares desde 1 hasta ese número separados por comas.
  12. Escribir un programa que lea 10 números enteros y luego muestre cuántos valores ingresados fueron múltiplos de 3 y cuántos de 5. Tener en cuenta que hay números que son múltiplos de 3 y de 5 a la vez.
  13. Escribir un programa que solicite un número entero positivo, si se ingresa otra cosa, se deberá mostrar un mensaje indicando un error.
    A partir del entero válido, por pantalla se mostrará su factorial, considerar el caso del 0 (cero).
    NOTA: si el ingreso es erróneo se mostrará un mensaje con 2 opciones; "Volver a intentarlo" o "Salir".

  14. Realizar un programa que permita hacer distintos calculos basicos, de la misma manera que una calculadora.
    Presentar un menu como el siguiente:
        1- Sumar dos numeros
        2- Restar dos numeros
        3- Multiplicar dos numeros
        4- Dividir dos numeros
        5- Salir
        
    Tanto la opcion elegida como el par de números a computar deben ser introducidos por teclado.
    Observaciones: Tener en cuenta que no existe la división por cero (x/0 no existe), si el usuario llegara a ingresar cero
    para el divisor, se deberá mostrar por pantalla el mensaje "Error, denominador incorrecto" y se deberá pedir el reingreso de
    dicho valor.