Vous êtes sur la page 1sur 10

Guin de prcticas 2 Estructuras secuenciales avanzadas.

GUIN DE PRCTICAS 2:
ESTRUCTURAS SECUENCIALES AVANZADAS
Introduccin.
Hasta el momento hemos visto cmo realizar programas sencillos utilizando
instrucciones que se ejecutan de manera secuencial (una tras otra).
Con este segundo guin se pretende profundizar, tanto en la estructura del programa
principal, como en dichas rdenes secuenciales para aprender en profundidad su
manejo.
Varia!"#.
Observa prueba el siguiente programa donde se declaran utilizan distintos tipos de
variables.
#include <stdio.h>
#include <stdlib.h>
int main( void ){
/* Declaracin de variables.*/
int entero; // ENTERO
float real; // REAL
double real_mayor; // REAL con mayor precisin
char caracter; // CARACTER (un smbolo!
int logico_c; // L"#$CO (en len%ua&e C!
bool logico_cpp; // L"#$CO (en len%ua&e C''!
char cadena[100; // CADENA DE CARACTERE(

/* $niciali)ar l%icos.*/
logico_c ! 0;
logico_cpp ! false;
/* Leer variables.*/
print"(#$ntrodu%ca un caracter& #);
scan"(#'c#( )caracter);
print"(#$ntrodu%ca un *alor entero& #);
scan"(#'i#( )entero);
print"(#$ntrodu%ca un *alor real& #);
scan"(#'"#( )real);
print"(#$ntrodu%ca otro *alor real con muchos decimales& #);
scan"(#'l"#( )real_mayor);
print"(#$ntrodu%ca su nombre (ma+. 100 caracteres)& #);
scan"(#'s#( )cadena);
/* Escribir variables*/
print"(#,n-ola 's( los *alores .ue has introducido son&,n#(
cadena);
print"(#/ntero& 'i ,n#( entero);
print"(#0eal& '" ,n#( real);
print"(#0eal con precision& '" ,n#( real_mayor);
print"(#1aracter& 'c ,t 2u codigo 321$$ es& 'i,n#( caracter(
caracter);

system(#4352/#);
Pgina 1 de 10
Guin de prcticas 2 Estructuras secuenciales avanzadas.
6
Compila ejecuta el programa. Comprobar!s que no da ning"n error al compilar (si no
te has equivocado al copiar), pero # $funciona correctamente%.
&n principio, con valores normales, parece funcionar correctamente. 'amos a e(plicar
las partes que tiene el programa a descubrir algunos fallos.
Tipos de variables.
&n la seccin de declaracin de variables, se han definido variables de todo tipo,
desde las m!s simples (entero, real, lgico car!cter), hasta alguna estructura de
datos compleja como las cadenas de caracteres. &sta "ltima la trataremos en
profundidad en otra sesin de pr!cticas.
)as variables reales, como a comentamos en la primera sesin, pueden ser de *
tipos+
float real; // REAL
double real_mayor; // REAL con mayor precisin
&l tipo "loat es un real simple, mientras que el tipo double es un real con maor
precisin. )a diferencia est! en la cantidad de memoria que se reserva para cada tipo,
el tipo double utiliza m!s memoria.
&n cuanto al tipo lgico, tambi,n puede declararse de * formas+
int logico_c; // L"#$CO (en len%ua&e C!
bool logico_cpp; // L"#$CO (en len%ua&e C''!
&n realidad, en el lenguaje C no e(iste el tipo lgico, como tal. -or ello, se utiliza el tipo
entero para almacenar valores lgicos. -ara asignar un valor $a!#o se utiliza el .,
cualquier otro n"mero para almacenar un valor %"rdad"ro.
&n el lenguaje C// s0 e(iste el tipo lgico (bool). &n este caso, se utiliza true para
asignar verdadero "alse para asignar falso. 1i se utiliza este tipo, ha que
asegurarse de utilizar un compilador de C// para que no aparezcan errores al
compilar.
Inicializacin.
2l declarar una variable, se indica que se reserve un espacio en memoria para ella.
&se espacio reservado no se inicializa con ning"n valor, es decir, contendr! un valor
desconocido. -ara evitar problemas lo ideal es inicializar las variables en su
declaracin (o antes de su primer uso) de la siguiente manera+
int entero ! 0; // ENTERO
float real ! 0.0; // REAL
3ambi,n se pueden inicializar varias variables declaradas en una misma l0nea, por
ejemplo+
int a!0( b!0( c!10;
Pgina 2 de 10
Guin de prcticas 2 Estructuras secuenciales avanzadas.
E&"rcicio:
&limina la parte de 45nicializar lgicos6 e inicializa todas las variables en su
declaracin (incluidas las lgicas).
'("racion"# d" "ntrada d" dato#.
7espu,s de la declaracin (e inicializacin) de variables, el siguiente paso ser0a la
lectura de las entradas. &n este caso, hemos realizado una lectura por cada tipo de
variable para ver cmo se realiza dicha lectura, e(ceptuando las variables lgicas, a
que la funcin scan" no permite leer dicho tipo de variables.
El bffer de lectura.
2unque todo parece funcionar correctamente, no es as0. Cuando nos pide que
introduzcamos un car!cter, prueba a teclear un car!cter un n"mero separados con
un espacio+
Introduzca un caracter: f 6
Como comprobar!s, a no espera a que introduzca el siguiente valor entero. 8uestra
el mensaje pero no espera que introduzcamos nada por teclado, apareciendo en
pantalla algo parecido a esto+
Introduzca un caracter: f 6
Introduzca un valor entero: Introduzca un valor real:
1i contin"as introduciendo valores, ver!s que en realidad se ha le0do el entero puesto
despu,s del car!cter+
Introduzca un caracter: f 6
Introduzca un valor entero: Introduzca un valor real: 5.5
Introduzca otro valor real con muchos decimales: 6.00005
Introduzca su nombre (max. 100 caracteres): DonNadie
ola DonNadie! los valores "ue has introducido son:
#ntero: 6
$eal: 5.500000
$eal con %recision: 6.000050
&aracter: f 'u codi(o )'&II es: 10*
+resione una tecla %ara continuar . . .
Pgina 3 de 10
Guin de prcticas 2 Estructuras secuenciales avanzadas.
&n principio, esto no parece un gran problema, pero haz el siguiente ejercicio.
E&"rcicio:
8odifica el cdigo para que pida en primer lugar el nombre, a continuacin
el resto de valores (car!cter, entero, real real double).
Compila ejecuta el ejercicio anterior. $9unciona correctamente%.
-arece que no. &l problema consiste en el modo de funcionar de C. Cada vez que se
teclea un valor, ,ste se almacena en una zona llamada )$$"r. )a funcin scan" lee
de dicho b"ffer, dejando aquello que no necesita.
&n el primer caso, al ejecutar la funcin+
scan"(#'c#( )caracter);
,sta busca en el b"ffer un car!cter, al estar vac0o solicita los datos por el teclado. &n
ese momento introdujimos por teclado la siguiente secuencia+
:"ffer+ f ; <n
&l "ltimo car!cter (<n) simboliza la pulsacin de &=3&> tambi,n se almacena en el
b"ffer.
)a funcin scan" lee un solo car!cter (?c) dejando el b"ffer de la siguiente manera+
:"ffer+ ; <n
&n la siguiente lectura+
scan"(#'i#( )entero);
comprueba que ha valores en el b"ffer, por lo que busca un entero (?i) encuentra
el valor ;, dejando en el b"ffer+
:uffer+ <n
)a siguiente lectura pide un real como en el b"ffer no ha un real, elimina el <n pide
por teclado nuevos valores.
&n el segundo caso, en el que se lee primero el nombre, ocurre algo parecido.
7espu,s de leer el nombre queda en el b"ffer el s0mbolo <n, el cual es le0do como un
car!cter en la siguiente lectura.
-ara evitar este contratiempo, antes de realizar una operacin de entrada, se puede
utilizar la funcin ""lush, de la librer0a stdio.h. &sta funcin elimina todo el
contenido el b"ffer. )a forma de utilizarla es la siguiente+
print"(#$ntrodu%ca un caracter& #);
fflush(stdin),
scan"(#'c#( )caracter);
Pgina 4 de 10
Guin de prcticas 2 Estructuras secuenciales avanzadas.
)a palabra stdin le indica a ""lush que debe borrar el contenido de la entrada de
datos est!ndar (#tandard input).
E&"rcicio:
8odifica el cdigo, a@adiendo tantas l0neas como sea necesario, para que se
elimine el contenido del b"ffer antes de leer cualquier valor.
Leer textos con varias palabras.
'amos a buscar otro fallo. Cuando el programa te pide el nombre, introduce el nombre
tus apellidos separados por espacios. $Au, ha le0do%.
1i tu cdigo est! corregido elimina el b"ffer antes de cada lectura, debe funcionar
todo correctamente, pero slo debe haber le0do la primera palabra de tu nombre.
=o es misin de este guin aprender a manejar las cadenas de caracteres, por lo que
simplemente vamos a e(plicar cmo arreglar este problema. &n futuros guiones se
e(plicar!n las cadenas de caracteres en C.
&n lugar de escribir+
scan"(#'s#( )cadena);
la vamos a sustituir por esta otra orden+
gets( cadena );
&sta funcin de la librer0a stdio.h lee todo el b"ffer lo almacena en la variable
dada (en este caso cadena).
'("racion"# d" #a!ida d" dato#.
&n la seccin donde se muestran los resultados, ha distintas operaciones de salida+
/* Escribir variables*/
print"(#,n-ola 's( los *alores .ue has introducido son&,n#( cadena);
print"(#/ntero& 'i ,n#( entero);
print"(#0eal& '" ,n#( real);
print"(#0eal con precision& '" ,n#( real_mayor);
print"(#1aracter& 'c ,t 2u codigo 321$$ es& 'i,n#(caracter(caracter);
'amos a mejorar un poco esta salida.
Formateo de la salida.
)os n"meros enteros pueden alinearse a la derecha dentro de un campo de tama@o
fijado. -or ejemplo, si cambiamos la instruccin que muestra el entero por esta otra+
print"(#/ntero& '5i ,n#( entero);
&l entero se mostrar! as0+
Pgina 5 de 10
Guin de prcticas 2 Estructuras secuenciales avanzadas.
#ntero: 6
)o que ha hecho es a@adir B espacios al n"mero dado (a que el n"mero ; slo ocupa
un d0gito).
3ambi,n podemos hacer que rellene el espacio con ceros de la siguiente manera+
print"(#/ntero& '07i ,n#( entero);
&n este caso el entero se mostrar! as0+
#ntero: 00006
&sto es "til para poder alinear n"meros en varias l0neas.
E&"rcicio:
Haz un programa que muestre la tabla de multiplicar del C al C. de un
n"mero dado por teclado. 5ntenta que los d0gitos del resultado aparezcan
alineados a la derecha.
7e la misma forma, se puede cambiar la forma de mostrar n"meros reales. -ara ello
cambia la instruccin que muestra el real por la siguiente+
print"(#0eal& '6.*" ,n#( real);
&sto mostrar! en pantalla lo siguiente+
$eal: 5.50
&l n"mero dado (;.*) entre el tanto por ciento (?) la f, indica que se dejen ; espacios
para mostrar el n"mero que muestre slo * decimales (realizando un redondeo si es
necesario).
E&"rcicio#:
Cambia la forma de mostrar los reales para que adem!s rellene con . a la
izquierda la parte entera (f0jate en cmo lo hemos hecho para enteros).
8odifica el programa que muestra la tabla de multiplicar de un n"mero dado,
para que acepte reales como n"mero de entrada.
Mostrar caracteres.
2 la hora de mostrar un car!cter, podemos indicar a print" que nos lo muestre de *
formas distintas+
Pgina 6 de 10
Guin de prcticas 2 Estructuras secuenciales avanzadas.
8ostrar su #*+o!o, utilizando 'c.
8ostrar su ordina!, utilizando 'i. &n este caso el ordinal corresponde con su
valor 21C55.
Observa en la instruccin cmo hacemos para mostrar * veces la misma variable (en
este ejemplo, llamada caracter), que tenemos que escribirla * veces, aunque cada
vez se muestre de forma distinta+
print"(#1aracter& 'c ,t 2u codigo 321$$ es& 'i,n#(caracter(caracter);
Expresiones en la salida de datos.
Con la funcin print", adem!s de mostrar el contenido de las variables se puede
mostrar el valor de las constantes o de las e(presiones dadas, lo "nico que ha que
tener en cuenta es el tipo de resultado que se quiere mostrar.
2@ade la siguiente l0nea apara mostrar una nueva salida+
print"(#'i 8 '9.:" ! ';.<",n#( entero( real( entero8real);
E&"rcicio:
2@ade una nueva l0nea para mostrar el resultado de multiplicar las variables+
entero, real realDmaor.
'("racion"# arit+,tica#.
Con los valores de las variables se pueden realizar una gran cantidad de operaciones
aritm,ticas.
=o obstante, ha que tener en cuenta cmo funcionan qu, tipo de valores genera
cada operacin, a que si queremos almacenar el resultado, tendremos que hacerlo
en una variable del tipo adecuado.
2 continuacin vamos a centrarnos en algunas operaciones que necesitan especial
atencin.
La divisin.
&scribe el siguiente cdigo correspondiente a un nuevo programa+
#include <stdio.h>
#include <stdlib.h>
int main( void ){
/* ENTRADA(.*/
int a!0;
int b!0;
/* Leer variables.*/
print"(#$ntrodu%ca un numero entero& #);
scan"(#'i#( )a);
Pgina 7 de 10
Guin de prcticas 2 Estructuras secuenciales avanzadas.
print"(#$ntrodu%ca otro entero& #);
scan"(#'i#( )b);
/* *os+rar resul+ados*/
print"(#=i*ision& 'i,n#( a>b);

system(#4352/#);
6
1i compilas ejecutas el programa podr!s comprobar que la divisin que se realiza no
es realmente como se espera.
1i introducimos E F como valores enteros obtendr0amos la siguiente salida+
Introduzca un numero entero: 5
Introduzca otro entero: -
Division: 1
+resione una tecla %ara continuar . . .
)o que estamos calculando es la divisin entera. )o que ocurre es que la operacin de
dividir (G) realiza una divisin entera cuando los dos operandos (numerador
denominador) son enteros.
2hora a@ade las siguientes l0neas+
print"(#=i*ision entre :& 'i,n#( a>:);
print"(#=i*ision entre :.0& '",n#( a>:.0);
)a primera l0nea muestra una divisin entera, mientras que la segunda muestra una
divisin real. &l resultado ser! el siguiente+
Introduzca un numero entero: 5
Introduzca otro entero: -
Division: 1
Division entre *: *
Division entre *.0: *.500000
+resione una tecla %ara continuar . . .
&s decir, a@adiendo .. al final del n"mero hacemos que ,ste se interprete como un
real. -ero, $cmo lo hacemos para que lo haga con * variables (o constantes)%.
)a solucin es mu sencilla, ha que convertir una de las * variables a formato real.
-ara ello vamos emplear una t,cnica llamada casting. &scribe la siguiente l0nea+
print"(#=i*ision real& '",n#( a>(float)b);
Pgina 8 de 10
Guin de prcticas 2 Estructuras secuenciales avanzadas.
2@adiendo la palabra reservada "loat entre par,ntesis antes de la variable b,
hacemos que ,sta se interprete, temporalmente, como un real.
N'TA: =o todas las conversiones son posibles realizando casting.
E&"rcicio:
Haz un programa que muestre la tabla de dividir del C al C. de un n"mero
entero dado por el teclado. 7ebe mostrar tanto la divisin real como la entera.
El mdulo o resto.
2@ade la siguiente instruccin en la seccin donde se muestran los resultados.
print"(#0esto& 'i,n#( a'b);
&l operador que calcula el resto de una divisin, es el operador mdulo (?).
E&"rcicio:
8odifica el programa de la tabla de dividir para que se muestre, adem!s, el
resto de la divisin entera.
R"cu"rda.
&n el lenguaje C no e(iste el tipo lgico, ,ste se declara como entero,
utilizando el . para asignar el valor falso cualquier otro n"mero para asignar
un valor verdadero.
)as variables se pueden inicializar en su declaracin.
7ebes eliminar el b"ffer de entrada antes de cada lectura utilizando la funcin
""lush.
)as cadenas de caracteres se leen mejor utilizando la funcin gets.
)a funcin print" puede mostrar el valor de variables, constantes
e(presiones, siempre teniendo en cuenta qu, tipo de valor se quiere mostrar.
)a operacin de dividir (G) realiza una divisin entera cuando los dos operandos
(numerador denominador) son enteros. :asta con que uno de los operandos
sea real para que la divisin sea real.
&l casting es una t,cnica que convierte temporalmente el valor de una variable
o de una e(presin en el tipo que deseemos, pero no todas las conversiones
son posibles.
-ara obtener el resto de una divisin, se utiliza el operador -.
Pgina de 10
Guin de prcticas 2 Estructuras secuenciales avanzadas.
E&"rcicio# $ina!"#.
C. >ealiza un programa que pida el valor de F art0culos muestre el total la
media. 5ntenta formatear el resultado para se muestren los valores alineados
con los mismos decimales.
*. >ealiza un programa que dados el voltaje en voltios la resistencia en ohmios,
nos calcule la intensidad, mediante la aplicacin de esta frmula+
Int"n#idad . Vo!ta&" / R"#i#t"ncia
F. 1uponga que un individuo desea invertir su capital en un banco desea saber
cu!nto dinero ganar! despu,s de un mes si el banco paga a razn de *?
mensual. >ealiza un programa que calcule dicha ganancia teniendo como
entrada el capital invertido.
B. Hn vendedor recibe mensualmente un sueldo base m!s un C.? e(tra por
comisin de sus ventas. &l vendedor desea saber cu!nto dinero obtendr! por
concepto de comisiones por las tres ventas que realiza en el mes el total que
recibir! en el mes tomando en cuenta su sueldo base comisiones.
E. &n un hospital e(isten tres !reas+ Iinecolog0a, -ediatr0a 3raumatologia. &l
presupuesto anual del hospital se reparte conforme a la siguiente tabla+
r"a Porc"nta&" d"! (r"#u(u"#to
Iinecolog0a B.?
3raumatolog0a F.?
-ediatr0a F.?
-ara un presupuesto dado, obtener la cantidad de dinero que recibir! cada
!rea.
Pgina 10 de 10