Ejercicios resueltos laboratorio 5 - Diseño y codificación de algoritmos condicionales

Asignatura: Fundamentos de Informática
Especialidad: Electrónica - UPV/EHU
Curso académico: 2013-2014
Profesor: Ismael Etxeberria Agiriano

Resolución DdF 05-001

Es un ejercicio típico de lectura-cálculo-escritura.

Para calcular el valor absoluto de un número en la misma variable bastará con mirar si la variable contiene un valor negativo y si es así cambiarle el signo.

Hay un caso neutro que es cuando el número es cero. Podríamos optar por cambiarle de signo ya que no tendría ningún efecto pero estaríamos haciendo una operación innecesaria por lo que la alternativa es peor.

El diagrama de flujo puede ser:

Resolución codificación teórica 05-001-t.c

La codificación correspondiente a este diagrama de flujo puede ser:


/* 05-001-t.c
 * Programa que lee un número entero y calcula su valor absoluto
 * en la misma variable, mostrándolo a continuación en pantalla.
 */
#include <stdio.h>

void main (void)
{
  int n;

  printf ("Introduce un número: ");
  scanf ("%d", &n);

  if (n < 0) {
    n = -n;
  }

  printf ("Valor absoluto: %d\n", n);
}

Resolución codificación laboratorio 05-001.c

El cuerpo de la instrucción condicional consta de una sola instrucción por lo que las llaves no serán necesarias. Si añadimos los artificios para poder verificar el programa en el laboratorio nos queda de la siguiente manera:


/* 05-001.c
 * Programa que lee un número entero y calcula su valor absoluto
 * en la misma variable, mostrándolo a continuación en pantalla.
 */
#include <stdio.h>
#include <stdlib.h>

int main (void)
{
  int n;

  printf ("Introduce un número: ");
  scanf ("%d", &n);

  if (n < 0)
    n = -n;

  printf ("Valor absoluto: %d\n", n);

  system ("pause");
  return 0;
}

Resolución DdF 05-002

Es un ejercicio es similar al anterior. También tiene una estructura de lectura-cálculo-escritura.

Necesitamos declarar una segunda variable para guardar el valor absoluto calculado. La ventaja de este método es que conservamos el valor original y el valor absoluto.

Para calcular el valor absoluto de un número en una variable suplementaria bastará con copiar su valor cuando es positiva o nula y copiar el valor cambiado de signo si contiene un valor negativo.

El diagrama de flujo puede ser:

Resolución codificación teórica 05-002-t.c

La codificación correspondiente a este diagrama de flujo puede ser:


/* 05-002-t.c
 * Programa que lee un número entero y calcula su valor absoluto
 * en una variable suplementaria,
 * mostrando a continuación ambos valores en pantalla.
 */
#include <stdio.h>

void main (void)
{
  int a, n;

  printf ("Introduce un número: ");
  scanf ("%d", &n);

  if (n < 0) {
    a = -n;
  }
  else {
    a = n;
  }

  printf ("Valor absoluto de %d: %d\n", n, a);
}

Resolución codificación laboratorio 05-002.c

Los cuerpos de las alternativas condicionales constan de una sola instrucción cada una por lo que las llaves no serán necesarias. Podemos alinear los dos casos para que el código sea más legible. Si añadimos los artificios para poder verificar el programa en el laboratorio nos queda de la siguiente manera:


/* 05-002.c
 * Programa que lee un número entero y calcula su valor absoluto
 * en la misma variable, mostrándolo a continuación en pantalla.
 */
#include <stdio.h>
#include <stdlib.h>

int main (void)
{
  int a, n;

  printf ("Introduce un número: ");
  scanf ("%d", &n);

  if (n < 0) a = -n;
  else       a = n;

  printf ("Valor absoluto de %d: %d\n", n, a);

  system ("pause");
  return 0;
}

Resolución alternativa 05-002

La condición propuesta selecciona el caso en el que la variable contiene un valor negativo (rama ), dejando el resto de los casos (valor positivo y nulo) para la alternativa (rama no, que se codificará como else en C).

Podríamos haber optado igualmente por una condición que selecciona (rama ) el caso que no hay que cambiar de signo (valor positivo y nulo), siendo la alternativa (rama no el caso en que hay que cambiar de signo (else en C).

El diagrama de flujo de esta segunda variante podría ser:

La porción de código correspondiente a esta alternativa sería:


...
  if (n >= 0) a =  n;
  else        a = -n;

Resolución DdF 05-009-1

La estructura del diagrama de flujo no sigue el esquema típico de lectura-cálculo-escritura.

Hay tres casos por lo que podemos hacer que cada condicional discrimina uno de ellos, salvo el último caso que siempre será el restante.

En la siguiente figura se muestra un posible DdF para resolver el problema.

Resolución codificación laboratorio 05-009.c

El programa para el laboratorio corresondiente al diagrama de flujo de la sección anterior puede ser:


/* 05-009-1.c
 * Programa que lee el balance de una cuenta corriente y dice si es positivo,
 * negativo o nulo.
 */
#include <stdio.h>
#include <stdlib.h>

int main (void)
{
  double bal;

  printf ("Introduce el balance: ");
  scanf ("%lf", &bal);

  if      (bal > 0) printf ("El balance %.2lf es positivo\n", bal);
  else if (bal < 0) printf ("El balance %.2lf es negativo\n", bal);
  else              printf ("El balance %.2lf es nulo\n",     bal);

  system ("pause");
  return 0;
}

Se han agrupado las instrucciones condicionales para distinguir los casos y las acciones asociadas a cada caso.

A continuación se muestra una porción de código equivalente para la parte condicional. En general se complica la legibilidad.


...
  if (bal > 0)
    printf ("El balance %.2lf es positivo\n", bal);
  else
    if (bal < 0)
      printf ("El balance %.2lf es negativo\n", bal);
    else
      printf ("El balance %.2lf es nulo\n",     bal); 

Podemos añadir llaves pero no va a quedar más legible que el primer caso:


...
  if (bal > 0) {
    printf ("El balance %.2lf es positivo\n", bal);
  }
  else {
    if (bal < 0) {
      printf ("El balance %.2lf es negativo\n", bal);
    }
    else {
      printf ("El balance %.2lf es nulo\n",     bal);
    }
  } 

Resolución DdF alternativo 05-009-2

Las expresiones condicionales utilizadas para discriminar los tres casos pueden ser varias. Entre otras muchas se muestra otra opción consistente en seleccionar primero un grupo (balance menor o igual a 0) siendo el caso discriminado (else) un caso final.

La porción de código correspondiente a esta alternativa sería:


...
  if (bal <= 0)
    if (bal < 0)
      printf ("El balance %.2lf es negativo\n", bal);
    else
      printf ("El balance %.2lf es nulo\n", bal);
  else
    printf ("El balance %.2lf es positivo\n", bal); 

Esta solución no facilita la alineación de la misma manera que la anterior en la que cada condicional va discriminando un caso.