1
UNIVERSIDAD DON BOSCO
FACULTAD DE ESTUDIOS TECNOLÓGICOS
ESCUELA DE COMPUTACION
CICLO: 01/ 2015
GUIA DE LABORATORIO #03
Nombre de la Practica: Estructura Condicional y Selectiva en Lenguaje C/C++
Lugar de Ejecución: Centro de Computo
Tiempo Estimado: 2 horas y 30 minutos
MATERIA: Introducción a la Programación
I. OBJETIVOS
Que el alumno sea capaz de:
Aplique correctamente las estructuras de decisión (IF simple y doble) dentro del código
fuente de un programa en lenguaje C
Diseñe menús de varias opciones en un programa de C++, utilizando instrucciones if-else
Pueda aplicar la estructura de decisión (switch - case) dentro del código fuente de un
programa
Diseñe menús de varias opciones en un programa de C++, utilizando switch- case
II. INTRODUCCION TEORICA
La Toma de decisiones en Lenguaje C
Con el lenguaje C++ puede tomar decisiones gracias a 2 estructuras:
a) Estructura if
b) Estructura switch
Este tipo de sentencias le permiten alterar la secuencia normal de pasos de su programa en
base a la redacción de condiciones específicas.
A continuación veremos sintaxis y uso de la estructura IF.
Estructura IF para toma de decisiones
A la estructura if se le define una condición para así bifurcar la secuencia del programa en
una de dos alternativas posibles. De la siguiente manera:
a) Si se cumple la condición ejecutará las Sentencias1.
b) Si no se cumplen la condición, ejecutará las Sentencias2.
Guía #: 03 Estructura Condicional y Selectiva en Lenguaje C+++
Introducción a la Programación 2
La sintaxis de la estructura IF se define así (COMPARE ATENTAMENTE LAS 2
REDACCIONES):
Lenguaje C Comparación con el Pseudocódigo
i f ( c o n d i c i ó n ) { / / S e n t e n c i a s s i c u m p l e c o n d i c i ó n S e n t e n c i a s 1 } e l s e { / / S e n t e n c i a s s i n o c u m p l e c o n d i c i ó n S e n t e n c i a s 2 }
Si (condición) entonces
Sentencias si cumple condición
Sentencias 1
Sino
Sentencias si no cumple condición
Sentencias 2
Fin Si
Cada uno de los dos bloques de sentencias: el bloque i f (si se cumple condición) y el bloque
e l s e (si no se cumple condición), tiene una pareja de llaves de apertura-cierre { } para
indicar el inicio y final de las sentencias a realizar en cada caso dentro de la estructura
condicional if.
Los valores lógicos que utiliza C son los números enteros: 1 (significa verdadero) y 0
(significa falso), por lo que al evaluar a una Condición en un if:
a) si esta devuelve 1, se ejecuta el bloque de sentencias 1.
b) Si devuelve 0, se ejecuta el bloque de sentencias 2. Este bloque e l s e { } es
opcional, puede ser ignorado por el programador si lo cree así conveniente.
Las condiciones a evaluar por una estructura if puede ser de 2 tipos:
a) Simple y b) Compleja.
En una Condición simple, se compara una variable con un valor o sino con otra variable,
gracias a los operadores relacionales de C++ que son los siguientes:
> m a y o r q u e
< m e n o r q u e
> = m a y o r o i g u a l q u e
< = m e n o r o i g u a l q u e
== i g u a l q u e
!= D i f e r e n t e a , N o i g u a l q u e
Guía #: 03 Estructura Condicional y Selectiva en Lenguaje C+++
Introducción a la Programación 3
Algunos ejemplos de condiciones simples utilizadas dentro de un IF son los siguientes:
i f ( a > 5 ) i f ( Z < = 1 2 ) i f ( q ! = 0 )
Una condición compleja permite evaluar 2 o más condiciones simples como una sola
evaluación lógica, gracias al uso de los operadores lógicos. Los operadores lógicos de C son
los siguientes:
Operador
lógico
Descripción de funcionamiento
&& (Y lógico: AND/Y)
El operador "&&" equivale al "AND" o "Y"; devuelve 1 (verdadero) sólo si las
dos expresiones evaluadas son verdaderas (true) o distintas de cero. En caso
contrario devuelve cero (falso). Si la primera expresión evaluada es falsa (false),
C no evalúa a la segunda y devuelve false.
|| ( O lógico: OR/ O)
El operador "||" equivale al "OR" u "O inclusivo"; devuelve 1 (true) si
cualquiera de las expresiones evaluadas es verdadera (true) o distinta de cero,
en caso contrario devuelve 0 (false). Si la primera expresión evaluada es
verdadera 1, la segunda no se evalúa.
! No lógico o negación: (signo de admiración NOT / negación de).
El operador " ! " es equivalente al "NOT", o "NO", y devuelve "true" sólo si la
expresión evaluada es falsa (false) o cero, en caso contrario devuelve "true".
La sintaxis de uso cada uno de estos operadores lógicos es:
(<expresión1> && <expresión2>) (<expresión1> || <expresión2>) ! <Expresión>
Ejemplos de condiciones complejas utilizando los operadores lógicos dentro de un if:
i f ( ( a > 5 ) & & ( Z < = 1 2 ) )
i f ( ( Z > 5 ) | | ( w < 1 ) )
i f ( ( r e n t a < = 1 2 0 ) & & ( A F P > 4 5 ) )
i f ( ( a > 0 ) | | ( b < = 0 ) & & ( n ! = a ) )
Guía #: 03 Estructura Condicional y Selectiva en Lenguaje C+++
Introducción a la Programación 4
Anidamiento de estructuras de decisión
Se anidan colocando una en el interior de la otra
Diseño Pseudocódigo Código en C
Si ( condición1 ) entonces
……..
Si (condición2) entonces
…..
fin si
fin si
if( condicion1 )
{ ………
if( condicion2 )
{ ……..
}
}
Estructura de decisión SWITCH
La instrucción de selección switch es una instrucción de selección múltiple que permite
efectuar un grupo de acciones según el resultado de evaluar una variable con una serie de
valores.
Esta variable al ser evaluada debe proporcionar
como resultado un valor entero o, en ocasiones, un
carácter, de lo contrario generara resultados
imprevistos. La sintaxis de switch se muestra en el
cuadro a la derecha: La estructura de una sentencia
switch comienza con la palabra reservada switch
seguida de un Variable entre paréntesis. El valor de
esta variable es la que se quiere comparar con una
serie de valores definidos dentro de la sentencia
switch.
Luego se definen una pareja de llaves { } que
limitan el cuerpo de switch. A continuación, se
utilizan las etiquetas de selección Case., para definir
cada uno de los valores con los cuales se comparara
SINTAXIS DE INSTRUCCIÓN
SWITCH
switch (Variable) {
c a s e ' c o n s t a n t e 1 ' :
i n s t r u c c i o n e s 1 ;
b r e a k ;
c a s e ' c o n s t a n t e 2 ' :
i n s t r u c c i o n e s 2 ;
b r e a k ;
. .
. .
c a s e ' c o n s t a n t e N ' :
i n s t r u c c i o n e s N ;
b r e a k ;
d e f a u l t :
i n s t r u c c i o n e s
Guía #: 03 Estructura Condicional y Selectiva en Lenguaje C+++
Introducción a la Programación 5
a la variable. Esta palabra case debe tener como
argumento obligatoriamente constantes enteras, o
caracteres individuales sea bajo forma numérica o
simbólica.
Normalmente, la sentencia switch compara en secuencia a la Variable con el valor definido en
cada Case. Si cumple que es igual al valor definido en un Case particular, desarrolla el
conjunto de Instrucciones definidas luego de los 2 puntos respectivos.
La instrucción break
Esta instrucción se utiliza para producir una salida inmediata de cualquier estructura de
control, ya sea selectiva múltiple (como el switch), o para producir la salida anticipada de un
ciclo o lazo de tipo while, do…while o for. La ejecución del programa continúa con la primera
instrucción fuera de la estructura de control suspendida.
III. MATERIALES Y EQUIPO
Para la realización de la guía de práctica se requerirá lo siguiente:
No
.
Requerimiento Cantidad
1 Guía de Laboratorio #03 de IP 1
2 Compilador de C++. 1
3 Memoria USB 1
IV. PROCEDIMIENTO
1. Cree una carpeta con su nombre para que guarde sus archivos cpp de los ejercicios
solicitados:
Guía #: 03 Estructura Condicional y Selectiva en Lenguaje C+++
Introducción a la Programación 6
2. Ahora desarrolle cada uno de los programas de C a continuación, teniendo cuidado de
aplicar las reglas siguientes en cada código fuente:
Cuide el uso de mayúsculas y minúsculas en al redactar palabras reservadas y los
nombres de variables y/o funciones, ya que lenguaje C es sensible a mayúsculas y
minúsculas.
Realice la compilación respectiva, con el fin de generar el archivo .exe de aplicación. En
caso de errores, compare cuidadosamente su código con el redactado en el
procedimiento.
Desarrolle varias pruebas de ejecución, ingresando diversos datos en cada prueba, para
construir una idea general del funcionamiento del programa!!
Cuando encuentre una nota de IMPORTANTE, al final de un código, realice sin falta las
pruebas solicitadas ahí, para deducir las respuestas apropiadas!!
1. Código cpp del Programa E1_GUIA1IP.cpp ¿Cómo saber cuál de dos números es mayor?
# i n c l u d e < s t d i o . h >
# i n c l u d e < s t d l i b . h >
/ / P a r a s a b e r c u a l d e d o s n u m e r o s e s m a y o r
i n t m a i n ( ) {
/ / d e c l a r a c i o n v a r i a b l e s d e E n t r a d a
i n t a = 0 , b = 0 ; / / c r e a 2 v a r i a b l e s e n t e r a s
p r i n t f ( " \ n \ t P r o g r a m a q u e d e t e r m i n a c u a l d e 2 n u m e r o s e s e l m a y o r
\ n \ n " ) ;
p r i n t f ( " I n t r o d u z c a 1 e r n u m e r o : \ t " ) ;
s c a n f ( " % d " , & a ) ;
p r i n t f ( " A h o r a i n t r o d u z c a 2 d o n u m e r o a c o m p a r a r : \ t " ) ;
s c a n f ( " % d " , & b ) ;
i f ( a > b ) {
p r i n t f ( " \ n % d e l p r i m e r o e s e l m a y o r . . . \ n " , a ) ;
}
e l s e {
i f ( a < b ) {
p r i n t f ( " \ n % d e l s e g u n d o e s e l m a y o r . . . \ n " , b ) ;
} e l s e {
p r i n t f ( " L o s d o s n u m e r o s s o n i g u a l e s \ n " ) ;
} / / f i n i f - 2
} / / f i n i f - 1
s y s t e m ( " p a u s e " ) ; / / d e t i e n e e j e c u c i o n h a s t a q u e u s u a r i o p r e s i o n a
U N A t e c l a
} / / f i n f u n c i o n p r i n c i p a l m a i n
Guía #: 03 Estructura Condicional y Selectiva en Lenguaje C+++
Introducción a la Programación 7
IMPORTANTE:
- Intente digitar un número decimal en lugar de uno de los números enteros que espera
la aplicación. ¿Qué sucede con los resultados del programa?
2. Nombre de código fuente E2_GUIA1IP.cpp ¿Calcular el area de una figura geometrica?
Realice un programa en C que pregunte a usuario cual de los siguientes tipos de área desea calcular:
1.rectángulo, 2..triangulo o 3.circulo, para luego pedir los datos apropiados y mostrar el área final. Avise al
usuario cuando no seleccione opción valida
/ * p r o g r a m a d e s e l e c c i o n d e a r e a ( r e c t a n g u l o , t r i a n g u l o y c i r c u l o )
y s u c a l c u l o r e s p e c t i v o * /
# i n c l u d e < i o s t r e a m . h >
# i n c l u d e < c o n i o . h > / / p o r q u e u s a r a f u n c i o n g e t c h
# i n c l u d e < m a t h . h > / / u s a f u n c i o n p o w
# i n c l u d e < s t d l i b . h > / / c o n t i e n e f u n c i o n s y s t e m
# d e f i n e P I 3 . 1 4 1 5 9 2 / / d e c l a r a v a l o r d e c o n s t a n t e P I
m a i n ( ) {
/ / d e c l a r a c i o n d e v a r i a b l e s a u t i l i z a r
/ / > > > e n t r a d a s
c h a r T i p A r e a ; / / t i p o d e a r e a a c a l c u l a r
f l o a t l a r , a n c ; / / l a r g o y a n c h o d e r e c t a n g u l o
f l o a t b a s , a l t ; / / b a s e y a l t u r a d e t r i a n g u l o
f l o a t r a d i o ; / / r a d i o d e c i r c u l o
/ / > > > s a l i d a s
f l o a t a r e a = 0 ; / / r e s u l t a d o c a l c u l o a r e a s e l e c c i o n a d a
c o u t < < " * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \ n " ;
c o u t < < " * P R O G R A M A P A R A C A L C U L O S D E A R E A S * \ n " ;
c o u t < < " * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * " ;
c o u t < < " \ n \ n S e l e c c i o n e l e t r a d e o p c i o n d e u n a d e \ n " ;
c o u t < < " l a s s i g u i e n t e s f i g u r a s p a r a m o s t r a r l e s u A r e a : \ n " ;
c o u t < < " \ n \ t ( a ) . R e c t a n g u l o \ t ( b ) . T r i a n g u l o \ t ( c ) . C i r c u l o \ n " ;
T i p A r e a = g e t c h ( ) ; / / c a p t u r a U N A t e c l a p r e s i o n a d a p o r u s u a r i o
i f ( T i p A r e a = = ' a ' ) {
s y s t e m ( " c l s " ) ; / / l i m p i a c o n t e n i d o p a n t a l l a d e e j e c u c i o n
/ / p i d e d a t o s n e c e s a r i o s p a r a d e t e r m i n a r a r e a d e l r e c t a n g u l o
c o u t < < " \ E s c r i b e l a r g o d e l r e c t a n g u l o : " ; c i n > > l a r ;
c o u t < < " \ n y a h o r a d i g i t e a n c h o d e l m i s m o : " ; c i n > > a n c ;
a r e a = l a r * a n c ;
c o u t < < " E l A r e a d e r e c t a n g u l o e s d e " < < a r e a < < " m e t r o s
Guía #: 03 Estructura Condicional y Selectiva en Lenguaje C+++
Introducción a la Programación 8
c u a d r a d o s \ n " ;
} e l s e {
i f ( T i p A r e a = = ' b ' ) {
s y s t e m ( " c l s " ) ;
/ / p i d e d a t o s n e c e s a r i o s p a r a c a l c u l a r a r e a d e t r i a n g u l o
c o u t < < " \ E s c r i b e b a s e y l u e g o l a r g o d e l t r i a n g u l o : \ n " ;
c i n > > b a s > > a l t ;
a r e a = ( b a s * a l t ) / 2 ;
c o u t < < " A r e a d e l t r i a n g u l o e s d e " < < a r e a < < " m e t r o s
c u a d r a d o s \ n " ;
} e l s e {
i f ( T i p A r e a = = ' c ' ) {
s y s t e m ( " c l s " ) ;
/ / p i d e l o s d a t o s n e c e s a r i o s p a r a c a l c u l a r a r e a c i r c u l o
c o u t < < " \ n E s c r i b e e l R a d i o d e l C i r c u l o : \ t " ;
c i n > > r a d i o ;
/ / l a f u n c i o n p o w c a l c u l a l a p o t e n c i a d e u n n u m e r o
a r e a = P I * p o w ( r a d i o , 2 ) ; / / i n v o c a f u n c i o n p o w
c o u t < < " \ n E l a r e a d e l C i r c u l o e s d e " < < a r e a < < " m e t r o s
c u a d r a d o s \ n " ;
} e l s e {
c o u t < < " \ n \ n \ t > > E R R O R : N o m e d i s t e u n a o p c i o n v a l i d a
< < < \ n \ n " ;
} / / f i n t e r c e r i f - e l s e
} / / f i n s e g u n d o i f - e l s e
} / / f i n p r i m e r i f - e l s e
s y s t e m ( " p a u s e " ) ; / / g e n e r a p a u s a e n e j e c u c i o n d e l a a p l i c a c i o n ! !
} / / f i n f u n c i o n m a i n
Guía #: 03 Estructura Condicional y Selectiva en Lenguaje C+++
Introducción a la Programación 9
3. Nombre de código fuente E3_GUIA1IP.cpp Programa que te dirá lo que ocurrirá este día!!
4. Archivo cpp fuente del Programa E4_GUIA1IP.cpp: ¿Determinar descuento a una tienda?
Pida a un cliente su total de compras y luego debe aplicarle un descuento según la categoría de descuento del
negocio. Al final mostrar cual es su categoría de Descuento y su total a pagar (quitando el descuento). Las
categorías son las siguientes:
Categoría Si Total de Compras es... Descuento (%)
1 menos de $ 52.7: no se aplica descuento Ninguno
2 entre $ ( 52.7 y 806.3 ) 10%
3 Mas de $ 806.3 20%
.
/ * P r o g r a m a p a r a a p l i c a r u n a c a t e g o r í a d e d e s c u e n t o s o b r e u n a
c o m p r a * /
# i n c l u d e < s t d i o . h >
# i n c l u d e < c o n i o . h >
# i n c l u d e < s t d l i b . h >
m a i n ( ) {
/ / P a r a u n C l i e n t e . . .
f l o a t T o t C o m p r a s ; / / t o t a l d e c o m p r a s
i n t C a t C l i ; / / C a t e g o r í a d e d e s c u e n t o ( 1 , 2 , 3 ) a s i g n a d a
Guía #: 03 Estructura Condicional y Selectiva en Lenguaje C+++
Introducción a la Programación 10
f l o a t D e s c ; / / M o n t o d e l d e s c u e n t o a p l i c a d o s e g ú n s u C a t e g o r í a
c h a r N o m b r e C [ 2 0 ] ; / / N o m b r e d e l c l i e n t e q u e r e a l i z a l a c o m p r a
p r i n t f ( " I n g r e s e e l n o m b r e d e l c l i e n t e : \ t " ) ;
s c a n f ( " % s " , & N o m b r e C ) ; / / c a p t u r a c a d e n a s s i n e s p a c i o s
/ / g e t s ( N o m b r e C ) ; / / c a p t u r a c a d e n a s c o n e s p a c i o s
p r i n t f ( " I n g r e s e s u t o t a l d e c o m p r a s ( e n d o l a r e s $ ) : \ t " ) ;
s c a n f ( " % f " , & T o t C o m p r a s ) ;
i f ( T o t C o m p r a s < 1 2 . 5 ) { / / c a t e g o r i a 1
C a t C l i = 1 ;
D e s c = 0 ;
} e l s e i f ( ( T o t C o m p r a s > = 1 2 . 5 ) & & ( T o t C o m p r a s < = 4 6 . 7 0 ) ) {
C a t C l i = 2 ; / / C a t e g o r i a 2
D e s c = 0 . 1 0 ; / / P o r c e n t a j e 1 0 %
} e l s e {
C a t C l i = 3 ; / / C a t e g o r í a 3
D e s c = 0 . 2 0 ; / / P o r c e n t a j e 2 0 %
} / / F i n u l t i m o i f - e l s e
s y s t e m ( " c o l o r 4 a " ) ;
/ / S e c a l c u l a e l m o n t o d e l d e s c u e n t o
D e s c = D e s c * T o t C o m p r a s ;
/ / S e a p l i c a e l d e s c u e n t o a l t o t a l d e c o m p r a s
T o t C o m p r a s = T o t C o m p r a s - D e s c ;
p r i n t f ( " \ n - - > C l i e n t e % s e s t a e n l a c a t e g o r i a
% d " , N o m b r e C , C a t C l i ) ;
p r i n t f ( " \ n \ t M o n t o d e D e s c u e n t o a p l i c a d o e s $ % . 1 f " , D e s c ) ;
p r i n t f ( " \ n \ t M o n t o f i n a l d e l T o t a l d e c o m p r a s :
$ % . 2 f \ n \ n " , T o t C o m p r a s ) ;
s y s t e m ( " p a u s e " ) ;
} / / f i n d e m a i n
IMPORTANTE:
- La cadena de texto “4a” usada en llamada system("color 4a") representa un Byte
escrito en hexadecimal (de 2 digitos). Modifique “4a” por otra pareja de digitos
hexadecimales diferentes, incluso pruebe después con digitos iguales (Ej: “bb“ o “55”)
¿Qué sucede con los resultados del programa?
5. Programa E5_GUIA1IP: Búsqueda y corrección de errores en un código fuente de C.
A continuación se ofrece un programa que indica el cuadrante (1, 2, 3, 4) donde esta ubicado un punto con
coordenada X e Y.
/ * P r o g r a m a p a r a d e t e r m i n a r u b i c a c i o n d e p u n t o e n p l a n o
c a r t e s i a n o * /
# i n c l u d e < s t d i o . h >
# i n c l u d e < c o n i o . h >
Guía #: 03 Estructura Condicional y Selectiva en Lenguaje C+++
Introducción a la Programación 11
m a i n ( ) {
/ / l i s t a d e v a r i a b l e s a u t i l i z a r
i n t x , Y ; / / c o o r d e n a d a s p u n t o P ( x , y )
c h a r c u a ; / / n u m d e c u a d r a n t e d e u b i c a c i o n d e l p u n t o P
p r i n t f ( " \ t \ t P r o g r a m a p a r a d e t e r m i n a r C u a d r a n t e d e P l a n o : \ n " ) ;
p r i n t f ( " \ n I n g r e s e c o o r d e n a d a s ( x , y ) d e l p u n t o a u b i c a r : \ n " ) ;
s c a n f ( " % d % d " , & x , & y ) ; / l e c t u r a d e c o o r d e n a d a s
i f ( ( x > 0 ) & & ( Y < 0 ) ) { c u a = ' 4 ' ;
e l s e i f ( ( x < 0 ) & & ( Y < 0 ) ) { c u a = ' 3 ' ;
} e l s e {
i f ( x > 0 ) c u a = ' 1 ' ; e l s e c u a = ' 2 ' ;
}
p r i n t f ( " \ n \ n E l p u n t o ( % d , d ) e s t a u b i c a d o e n C u a d r a n t e
% c " , x , y , c u a ) ;
s y s t e m ( " p a u s e ) ;
} / / f i n d e m a i n
IMPORTANTE:
- Este último código fuente presenta errores de todo tipo, no logra compilar.
- Ubique y corrija los errores sintácticos que encuentre en el código fuente, para lograr
generar el archivo ejecutable (.exe)
V. DISCUSION DE RESULTADOS
Ejercicio 1:
Realice los cálculos necesarios para convertir una cantidad de dinero en una moneda inicial a otra
moneda final. Las monedas disponibles en el programa son a) Euro, b) Yen Japones, c) Peso Mexicano y
d) Dólares, según la selección del usuario.
Ejemplo: el usuario puede indicar que su aplicación determine: ¿cuantos Yenes equivalen 24 Euros?,
¿cuanto equivale 45.34 dólares en Euros?
Ejercicio 2:
Realice un programa en C/C++ que permita a un cajero ingresar el precio individual ($) de un
producto y su total a vender (unidades). Luego se le muestra un menú para ingresar el modo de pago.
Las tres formas de pago disponibles son:
Guía #: 03 Estructura Condicional y Selectiva en Lenguaje C+++
Introducción a la Programación 12
a) En Efectivo b) con Cheque c) Tarjeta de credito.
El programa le regresa (en $) al cajero:
a) el monto inicial a pagar (sin descuento), b) total de descuento aplicado y c) Monto final a pagar
(monto inicial menos descuento).
Tenga en cuenta que si el pago es en efectivo se aplicara un descuento del 12.4%, si paga con cheque se
realizará un descuento del 8.6%, y si paga con tarjeta de crédito se le aplicara un descuento del 4.21%.
Por ejemplo: si cajero registra venta de 21 productos con precio individual de $3.2 y paga con cheque,
la salida mostrará:
Precio de productos sin descuento: $ 67.20
Descuento aplicado: $ 5.78
Total a pagar: $ 61.42
Nota: Utilice Switch para el desarrollo de este ejercicio.
Ejercicio 3:
Presente el cod.fuente del Ejemplo 5 del procedimiento de esta práctica, pero ya corregido, que
funcione apropiadamente ante el usuario.
VII. BIBLIOGRAFIA
Metodología de la Programación: Diagramas de Flujo, Algoritmos y Programación estructurada.
Joyanes Aguilar, Luis. No. De Clasificación 005.1 J88 1998. Editorial: MCGRAW HILL
Cómo Programar en C/C++. Deitel, Harvey M... No. De Clasificación 005.362 D325 1995 Editorial:
PRENTICE HALL
Top Related