Asignatura: Fundamentos de Informática | ||
Especialidad: Electrónica - UPV/EHU | ||
Curso académico: 2013-2014 | ||
Profesor: Ismael Etxeberria Agiriano |
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:
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); }
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; }
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:
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); }
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; }
La condición propuesta selecciona el caso
en el que la variable contiene un valor negativo (rama sí
),
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 sí
)
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;
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.
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); } }
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.