Está en la página 1de 11

UNIVERSIDAD MARIANO GÁLVEZ DE GUATEMALA

INGENIERÍA EN SISTEMAS
Centro Universitario de Cuilapa, Santa Rosa, Guatemala, C. A.
Asignatura: Programación III Código: 2014-22 Inicio: 02-02-2020
Ciclo: Quinto Sección: A Semestre: Primero Final: 05-05-2020
Instrucciones generales: Las respuestas deberán incluirse al final de cada serie del examen, es decir, en este mismo documento.
SERIE I: Desarrolle lo siguiente aplicando su conocimiento, creatividad, ingenio y sobre todo Estructuras de datos dinámicas.
La compañía farmacéutica “FARMLIST”, está proyectando el lanzamiento de su tienda virtual “VIRTUAL STORE – COVID 19” que se dedicará únicamente a
la gestión de las cotizaciones de los clientes de productos relacionados con la prevención de la pandemia. Debido al confinamiento, se prevé una gran cantidad de
clientes (innumerables) que desean cotizar diferentes productos (también innumerables) al mismo instante, tal y como se muestra en la imagen de abajo, como
ejemplo:

Se le pide que desarrolle una solución para registrar a todos los clientes y productos que cada cliente vayan cotizando en la tienda virtual. Es importante
mencionar que un cliente puede cotizar desde 1 producto hasta n productos. De la misma manera, pueden estar cotizando desde 1 cliente hasta n clientes.

Tomando en cuenta algunos aspectos como los siguientes:


 Cada artículo o producto contará con un código único.
 No habrá eliminaciones, es decir, una vez registrada una cotización ya no se podrá eliminar, sin embargo, si se podrá modificar alguna característica
del producto.
 En cualquier momento se podrá generar el detalle de la cotización por cliente y este debe estar totalizado
 Se deberá tener la posibilidad de moverse a través de la lista de productos por cliente, mediante las acciones de: siguiente, anterior o inicio del listado.
Por ejemplo:
o Siguiente: Mostrará el siguiente elemento en la lista, posterior al de su posición actual, si es que existe, caso contrario deberá desplegar un
mensaje donde advierta sobre el final de la lista
o Anterior: Mostrará el siguiente elemento en la lista, posterior al de su posición actual, si es que existe, caso contrario deberá desplegar un
mensaje donde advierta sobre el final de la lista

Datos importantes que se deberá registrar para cada asistente virtual:


 Código del producto
 Descripción
 Cantidad
 Descripción del Producto
 Descuento (0 si no aplica)
Tome en cuenta lo siguiente:
 Determine y desarrolle los métodos en C#, aplicando algunas de las operaciones para manejo eficiente de estructuras de datos dinámicas lineales
 Analice detenidamente lo que se le pide y aplique las estructuras de datos lineales estáticas y/o dinámicas adecuadas.
 Tome en cuenta que se deberá ajustar a los requerimientos de la compañía farmacéutica “FARMLIST”. Como sugerencia liste todas las operaciones
antes de llevar a cabo el desarrollo, además dejé constancia de todas las operaciones auxiliares que aplique.

Se le pide que entregue lo siguiente (en este mismo documento):


 Diagrama de Clases

 Algoritmo para modificar un producto en la “carretilla”


Verificar si la lista está vacía emitir mensaje y retornar.
Luego ingresar el dato que desea modificar.
2.1 Recorre la lista hasta llegar al dato.
2.2 Sino se encuentra el nodo retornar un mensaje que no fue encontrado.
2.3 De lo contrario.
2.4 Pedir al usuario que ingrese los nuevos datos.
Todo esfuerzo merece y obtiene su recompensa, ¡Éxitos!
2.5 Luego retornar mensaje
Sus datos han sido modificados exitosamente.
Salir
 Código fuente de toda la solución basado en el MENÚ PRINCIPAL (se calificará secuencia, orden del código y breves comentarios en su código),
ponga énfasis en las acciones del menú principal.
 Impresiones de pantalla de la solución en ejecución

 Código fuente de toda la solución basado en el MENÚ PRINCIPAL (se calificará secuencia, orden del código y breves comentarios en su código),
ponga énfasis en las acciones del menú principal.
Menú } static void Main(string[] args)
{
Listad opc = new Listad();

int opcion;
do
{
Console.Clear();

Console.WriteLine("\t\t\t TIENDA VIRTUAL-COVID 19


");
Console.WriteLine("\t\t\t
*********************************************************");
Console.WriteLine("\t\t\t (1).Agregar (5).Inicio ");
Console.WriteLine("\t\t\t (2).Listado (6).Siguiente ");
Console.WriteLine("\t\t\t (3).Buscar (7).Anterior ");
Console.WriteLine("\t\t\t (4).Modificar (8).Salir \n\n");

Console.WriteLine("\t\t\t\t Ingrese la opcion que desea realizar: ");


opcion = Convert.ToInt32(Console.ReadLine());

switch (opcion)
{
case 1:
Console.Clear();
1.InsertarNodo();
break;

case 2:
Console.Clear();
Console.WriteLine("\t\t\t Totalizacion de Datos \n");
1.Mostrar();
Console.ReadKey();
break;

case 3:
Console.Clear();
1.Buscar();
Console.ReadKey();
break;

case 4:
Console.Clear();
1.Modificar();
Console.ReadKey();
break;

case 5:
1.Inicio();
Console.ReadKey();
break;

case 6:
1.MoverSiguiente();
break;

case 7:
1.MoverAnterior();
break;
}
} while (opcion != 7);
}

}
}

Clase Listad
class Lista
{
Todo esfuerzo merece y obtiene su recompensa, ¡Éxitos!
private Nodo Primero = new Nodo();//apunta al primer nodo
private Nodo Ultimo = new Nodo();//apunta al ultimo nodo

public class Listad


{
Primero = null;
Ultimo = null;
}

public void InsertarNodo ()


{
Nodo nuevo = new Nodo();//Estamos creando el nuevo Nodo

Console.WriteLine("\t\t\t **************************** ");


Console.WriteLine("\t\t\t PRODUCTOS EN LA CARRETILLA ");
Console.WriteLine("\t\t\t **************************** ");
Console.WriteLine("\t\t\t GUANTES LATEX ");
Console.WriteLine("\t\t\t MASCARILLA BOZAL ");
Console.WriteLine("\t\t\t CUBREBARBAS ");
Console.WriteLine("\t\t\t BATA INDUSTRIAL ");
Console.WriteLine("\t\t\tCUBRE ZAPATOS ");
Console.WriteLine("\t\t\t **************************** |");

Console.WriteLine("\t\t\t\t| INGRESE LOS PRODUCTOS QUE DESEA COTIZAR |");


Console.Write("\t\t\t 1.Nombre: ");
nuevo.Nombre = Console.ReadLine(); //Guardaremos la informacion en la variable nuevo que hace referencia al apuntador de la Informacion.
Console.Write("\t\t\t 2.Apellido: ");
nuevo.Apellido = Console.ReadLine();
Console.Write("\t\t\t 3.Codigo del Producto: ");
nuevo.dato = int.Parse(Console.ReadLine());
Console.WriteLine("\t\t\t 4.Descripcion: ");
nuevo.Descripcion = Console.ReadLine();
Console.WriteLine("\t\t\t 5.Cantidad: ");
nuevo.Cantidad = int.Parse(Console.ReadLine());
Console.WriteLine("\t\t\t 6.Descripcion Producto: ");
nuevo.DescripciondelProducto = Console.ReadLine();
Console.WriteLine("\t\t\t 7.Precio: ");
nuevo.Precio = int.Parse(Console.ReadLine());
Console.WriteLine("\t\t\t 8.Descuento: ");
nuevo.Descuento = int.Parse(Console.ReadLine());//de aqui comenzamos con las operaciones para realizar el Descuento
nuevo.Total = nuevo.Precio * nuevo.Cantidad;
nuevo.desct = nuevo.Total * nuevo.Descuento / 100;
nuevo.tot = nuevo.Total - nuevo.desct;

if (Primero == null) //siempre validaremos el primer dato como nulo


{
Primero = nuevo;// El primero de la Lista apunta a null
Primero.siguiente = null;// El primero apunta al siguiente pero siempre en null
Primero.anterior = null;// El primero apunta al anterio de igual manera que en el anterior apuntando a null
Ultimo.Primero;// El primero sera igual a Ultimo
}
else
{
Ultimo.siguiente = nuevo;//apunta al siguiente para crear el nuevo dato
nuevo.siguiente = null;
nuevo.anterior = null;
Ultimo = nuevo;// el ultimo sera el nuevo nodo.
}

Console.WriteLine("\n El dato que usted ingreso fue agregado con exito");


Console.ReadKey();

}
public void Lista()
{
Nodo actual = new Nodo();//recorre los Datos que hemos ingresado

actual = Primero;// se empezara a recorrer desde el primero


while (actual != null) ; // se recorre la lista siempre y cuando el dato sea diferente de Nulo
{
Console.WriteLine("\t\t\t Nombre: " + actual.Nombre);
Console.WriteLine("\t\t\t Apellido: " + actual.Apellido);
Console.WriteLine("\t\t\t Codigo: " + actual.dato);
Console.WriteLine("\t\t\t Descripcion: " + actual.Descripcion);
Console.WriteLine("\t\t\t Cantidad: " + actual.Cantidad);
Console.WriteLine("\t\t\t Descripcion del Producto: " + actual.DescripciondelProducto);
Console.WriteLine("\t\t\t Precio: Q." + actual.Precio);
Console.WriteLine("\t\t\t Descuento %" + actual.Descuento);
Console.WriteLine("\t\t\t Cantidad Descontada Q." + actual.desct);
Console.WriteLine("\t\t\t Total a Pagar Q." + actual.tot);
actual = actual.siguiente;
}
Console.WriteLine("\t\t\t\tNo se encontraron datos para mostrar...");
}
public void Buscar()
{
Nodo actual = new Nodo();
actual = Primero;
bool encontrado = false; // variable que mantiene un valor a falso
Console.WriteLine("\t\t\t Ingrese el codigo que desea buscar");
int nodobuscado = int.Parse(Console.ReadLine());
while (actual != null && encontrado == false)
{
if (actual.dato == nodobuscado) // compara el valor de actual dato con el nodo buscado
{
Console.WriteLine("\t\t\t Nombre: " + actual.Nombre);
Todo esfuerzo merece y obtiene su recompensa, ¡Éxitos!
Console.WriteLine("\t\t\t Apellido: " + actual.Apellido);
Console.WriteLine("\t\t\t Codigo: " + actual.dato);
Console.WriteLine("\t\t\t Descripcion: " + actual.Descripcion);
Console.WriteLine("\t\t\t Cantidad: " + actual.Cantidad);
Console.WriteLine("\t\t\t Descripcion del Producto: " + actual.DescripciondelProducto);
Console.WriteLine("\t\t\t Precio: " + actual.Precio);
Console.WriteLine("\t\t\t Descuento " + actual.Descuento);
Console.WriteLine("\t\t\t Cantidad Descontada " + actual.desct);
Console.WriteLine("\t\t\t Total a Pagar " + actual.tot);
encontrado = true;
}
actual = actual.siguiente; // Cuando no es el dato deseado continua con el siguiente.
}
if (!encontrado)
{
Console.WriteLine("\t\t\t El dato que usted desea no fue encontrado.");
}

Console.WriteLine("\t\t\t Precio: " + actual.Precio);


Console.WriteLine("\t\t\t Descuento " + actual.Descuento);
Console.WriteLine("\t\t\t Monto Descontado " + actual.desct);
Console.WriteLine("\t\t\t Total a Pagar " + actual.tot);
encontrado = true;
}

public void Modificar()


{
Nodo actual = new Nodo(); // declaracion nodo de referencia para buscar el nodo que se quiere modificar
actual = Primero;
bool encontrado = false; // si no encuentra el dato sera falso
Console.WriteLine("\t\t\t Ingrese codigo que decea modificar");
int nodobuscado = int.Parse(Console.ReadLine());
while (actual != null && encontrado == false)
{
if (actual.dato == nodobuscado)
{
Console.WriteLine("\t\t\t Nombre: " + actual.Nombre);
Console.WriteLine("\t\t\t Apellido: " + actual.Apellido);
Console.WriteLine("\t\t\t Codigo: " + actual.dato);
Console.WriteLine("\t\t\t Descripcion: " + actual.Descripcion);
Console.WriteLine("\t\t\t Cantidad: " + actual.Cantidad);
Console.WriteLine("\t\t\t Descripcion del Producto: " + actual.DescripciondelProducto);
Console.WriteLine("\t\t\t Precio: " + actual.Precio);
Console.WriteLine("\t\t\t Descuento " + actual.Descuento);
Console.WriteLine("\t\t\t Cantidad Descontada " + actual.desct);
Console.WriteLine("\t\t\t Total a Pagar " + actual.tot);

Console.WriteLine("\t\t\t Por Favor ingrese los datos que desea Modificar");


Console.WriteLine("\t\t\t Descripcion: ");
actual.Descripcion = Console.ReadLine();
Console.WriteLine("\t\t\t Cantidad: ");
actual.Cantidad = int.Parse(Console.ReadLine());
Console.WriteLine("\t\t\t Descripcion Producto: ");
actual.DescripciondelProducto = Console.ReadLine();
Console.WriteLine("\t\t\t Precio: ");
actual.Precio = int.Parse(Console.ReadLine());
Console.WriteLine("\t\t\t Descuento: ");
actual.Descuento = int.Parse(Console.ReadLine());
actual.Total = actual.Precio * actual.Cantidad;
actual.desct = actual.Total * actual.Descuento / 100;
actual.tot = actual.Total - actual.desct;
Console.WriteLine("\t\t\t Ha modificado el dato con exito ");
encontrado = true;
}
actual = actual.siguiente;
}
if (!encontrado) // el nodo se a encontrado
{
Console.WriteLine("\t\t\t El Dato no fue encontrado");
}
}

public void Inicio()


{
Nodo actual = new Nodo();
actual = Primero;
int nodobuscado = 1; // indica la posicion en donde se va ubicar
bool encontrado = false;
while (actual != null && encontrado == false)
{
if (actual.dato == nodobuscado) // actual es igual al dato buscado hacer lo siguiente
{
Console.WriteLine("\t\t\t Nombre: " + actual.Nombre);
Console.WriteLine("\t\t\t Apellido: " + actual.Apellido);
Console.WriteLine("\t\t\t Codigo: " + actual.dato);
Console.WriteLine("\t\t\t Descripcion: " + actual.Descripcion);
Console.WriteLine("\t\t\t Cantidad: " + actual.Cantidad);
Console.WriteLine("\t\t\t Descripcion del Producto: " + actual.DescripciondelProducto);
Console.WriteLine("\t\t\t Precio: " + actual.Precio);
Console.WriteLine("\t\t\t Descuento " + actual.Descuento);
Console.WriteLine("\t\t\t Cantidad Descontada " + actual.desct);
Console.WriteLine("\t\t\t Total a Pagar " + actual.tot);
encontrado = true;
}
actual = actual.siguiente;
Todo esfuerzo merece y obtiene su recompensa, ¡Éxitos!
}
if (!encontrado)
{
Console.WriteLine("\t\t\t Dato no Fue encontrado");
}
}
public void siguiente ()
{
Nodo actual = new Nodo();
actual = Primero;
if (actual != null)
{
Console.WriteLine("\t\t\t Nombre: " + actual.Nombre);
Console.WriteLine("\t\t\t Apellido: " + actual.Apellido);
Console.WriteLine("\t\t\t Codigo: " + actual.dato);
Console.WriteLine("\t\t\t Descripcion: " + actual.Descripcion);
Console.WriteLine("\t\t\t Cantidad: " + actual.Cantidad);
Console.WriteLine("\t\t\t Descripcion del Producto: " + actual.DescripciondelProducto);
Console.WriteLine("\t\t\t Precio: " + actual.Precio);
Console.WriteLine("\t\t\t Descuento " + actual.Descuento);
Console.WriteLine("\t\t\t Cantidad Descontada " + actual.desct);
Console.WriteLine("\t\t\t Total a Pagar " + actual.tot);
Primero = Primero.siguiente; // Para avanzar el primero tiene que ser igual a primero y este apuntar al dato sieguiente
MoverSiguiente();
}
else
{ // Se muestra un mensaje cuando se este apunto de llegar al final de la lista
Console.WriteLine("\t\t\t\t\tLo siento esta a punto de llegar al final...");

}
public void Anterior()
{
Nodo actual = new Nodo();
actual = Ultimo;
if (actual != null)
{
Console.WriteLine("\t\t\t Nombre: " + actual.Nombre);
Console.WriteLine("\t\t\t Apellido: " + actual.Apellido);
Console.WriteLine("\t\t\t Codigo: " + actual.dato);
Console.WriteLine("\t\t\t Descripcion: " + actual.Descripcion);
Console.WriteLine("\t\t\t Cantidad: " + actual.Cantidad);
Console.WriteLine("\t\t\t Descripcion del Producto: " + actual.DescripciondelProducto);
Console.WriteLine("\t\t\t Precio: " + actual.Precio);
Console.WriteLine("\t\t\t Descuento " + actual.Descuento);
Console.WriteLine("\t\t\t Cantidad Descontada " + actual.desct);
Console.WriteLine("\t\t\t Total a Pagar " + actual.tot);
Ultimo = Ultimo.anterior;
MoverAnterior();
}
else
{
Console.WriteLine("\t\t\t Usted esta a punto de llegar al final");
}
}
public void MoverSiguiente() //Validar Dato
{
string respuesta;
int num;
do
{
Console.WriteLine("Siguiente Dato ");
num = int.Parse(Console.ReadLine());
if (num == 1) //llama al metodo siguiente siempre y cuando sea mayor que 1
{
siguiente();
}

Console.WriteLine(" Esta seguro que desea continuar (S=si, N=no)");


respuesta = Console.ReadLine();

} while (respuesta == "S" || respuesta == "s");


}
public void MoverAnterior() // Validacion para mover al dato anterior
{
string respuesta;
do
{
int num;
Console.WriteLine("Usted desea regresar Ingrese 1");
num = int.Parse(Console.ReadLine());
if (num == 1)// si numero es igual a uno se llama al metodo adelante y avanza
{
Anterior();
}

else
{
Console.WriteLine("No hay elementos.");
}
Console.WriteLine("Decea continuar (si = si, n = no).");
respuesta = Console.ReadLine();

} while (respuesta == "S" || respuesta == "s");


}
Todo esfuerzo merece y obtiene su recompensa, ¡Éxitos!
}

 Impresiones de pantalla de la solución en ejecución

Menú incio

Ingreso de Datos

Todo esfuerzo merece y obtiene su recompensa, ¡Éxitos!


Listado

Buscar

Todo esfuerzo merece y obtiene su recompensa, ¡Éxitos!


Modificar

Inicio

Todo esfuerzo merece y obtiene su recompensa, ¡Éxitos!


Siguiente

Anterior

Todo esfuerzo merece y obtiene su recompensa, ¡Éxitos!


Reglas y condiciones:
 Utilice específicamente las estructuras, algoritmos y operaciones implementadas en clase, no utilice estructuras propias del lenguaje de programación
como LIST, ARRAYLIST u otro similar.
 El examen es individual, a pesar de que puede utilizar todo el material que esté a su alcance, por ningún motivo deberán haber 2 o más exámenes
similares (en este mundo del desarrollo de software, cada ente es único en su forma de pensar y crear la solución), principalmente en esta serie del
examen.
 No entregue más de lo que se le pide

SERIE II: A continuación, lea detenidamente cada interrogante, respóndalas de forma clara y concisa, según corresponde.

1. ¿Qué sucede si en una lista doblemente enlazada se pierde el primer y ultimo nodo tipo apuntador, justifique su respuesta?

Lo que sucede es que ya no tenemos acceso a la lista la perdemos por completo ya que no sabemos dónde queda el apuntador y en donde es donde empieza
la lista. Ocasionando que ya no podemos recorrerla en ningún sentido

2. ¿ ¿Desarrolle en C# un único método para crear y deshacer una lista doblemente enlazada, asumiendo que la lista ya contiene datos?

public string Crear y DeshacerNodos()


{
int dato;
int Opcion;
Console.WriteLine("Ingrese 1 si decea Agregar y 2 si desea Eliminar");
Opcion = int.Parse(Console.ReadLine());
if (Opcion == 1)
{
Console.WriteLine("Ingrese un Numero");
dato = Convert.ToInt32(Console.ReadLine());
Nodo nuevoNodo = new Nodo(dato);
if (EstaVacia())
{
primerNodo = ultimoNodo = nuevoNodo;
}
else
{
nuevoNodo.ligasiguiente = primerNodo;
primerNodo.LigaAnterior = nuevoNodo;
primerNodo = nuevoNodo;
}

TotalNodos++;
return $"Elemento ingresado{dato}al inicio de la lista";
}
else
{

if (EstaVacia())
return "La lista esta vacia...";
else if (primerNodo == ultimoNodo)
{
primerNodo = ultimoNodo = null;

}
else
{
Nodo NodoEliminar;
NodoEliminar = primerNodo;

primerNodo = primerNodo.ligasiguiente;
primerNodo.LigaAnterior = null;

NodoEliminar = null;
}
TotalNodos--;
Todo esfuerzo merece y obtiene su recompensa, ¡Éxitos!
return "Nodo Eliminado";

}
3. Si en Estructuras de Datos, un único nodo es considerado un árbol, entonces, ¿cualquier nodo único es árbol?, justifique su respuesta demostrando las
características que debe reunir un único nodo para que ser considerado árbol.

En una estructura de Datos un nodo será considerado un árbol siempre y cuando no este vacío, no importa que sea nodo raíz siempre será considerado un
árbol. Sabemos que un subárbol es cualquier nodo de un árbol incluyendo sus descendientes siempre y cuando aplique las siguientes características.
1. Todo árbol que no es vacío contiene un nodo llamado raíz.
2. Un nodo X es descendiente de un nodo Y, siempre y cuando sea apuntado por X para el nodo Y
3. Un nodo es antecesor directo, si el nodo x apunta al Y
4. Todos los nodos son descendientes directos Hijo de un nodo padre son hermanos.
5. El nodo que no tiene ramificación se conoce como hoja
6. El grado es el numero descendientes de un nodo determinado
7. El nivel es el numero de arcos que deben ser recorrido para llegar a un nodo
8. La altura es el numero de niveles que tiene un árbol.
4.
SERIE III: Del siguiente árbol, encuentre lo que a continuación se le pide dejando constancia de todo el proceso para obtener el
resultado:

1. Altura del árbol


2. Grado del árbol
3. LCIM
4. LCEM

1. Altura del Árbol


El árbol tiene una altura de 8

2. Grado de Árbol:
Este árbol es de Grado 3
3. LCIM
Lo obtengo con estas formulas

LCI=1X1+2X3+3X4+4X5+5X4+6X6+7X2+8X1 = 117
LCIM= 117/26=4.5

4. LCEM
CONTIENE 53 NODOS ESPECIALES
LCE=317

4X3+6X4+12X5+7X6+16X7+5X8+3X9=317
12+24+60+42+112+40+27=317
LCEM=317/53= 5.98

Todo esfuerzo merece y obtiene su recompensa, ¡Éxitos!

También podría gustarte