Sie sind auf Seite 1von 5

UTEM Sec. 411: Laura Setti D.

Escuela de Informática ESTRUCTURA DE DATOS Sec. 412: Mauro Castillo V.


Prueba N° 1 2017-1 Sec. 413: Jorge Pavéz R.
PAUTA Sec. 301: David Castro S.
NOMBRE : ………………………………………………………………………………….

RUT : ……………………………………… SECCIÓN: ……………………………………….

80 puntos máximo Nota = (Puntaje*6) / 80 + 1 Nota = FORMA X1

¡¡NO SE ACEPTAN CONSULTAS DE NINGÚN TIPO Y A NADIE!!


NO PROGRAME LOS EJEMPLOS
1. En una matriz cuadrada de orden n se almacenan números enteros (positivos y negativos).
Se desea obtener la mayor suma entre los subrectangulos contenidos en la matriz original
(subrectangulo es cualquier conjunto de celdas en forma rectangular: dimensión 1x1 a nxn).
Ejemplo: Dada una matriz de 4x4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2

Algunos subrectangulos de la matriz, con su respectiva suma es:

0 -2 -7 0 0 -2 -7 0 0 -2 -7 0
9 2 -6 2 9 2 -6 2 9 2 -6 2
-4 1 -4 1 -4 1 -4 1 -4 1 -4 1
-1 8 0 -2 -1 8 0 -2 -1 8 0 -2
Suma = -4 Suma=13 Suma=-8

Nota: Todo subrectangulo de la matriz comienza en la posición: (0,0). El subrectangulo más


pequeño es de 1x1; y el más grande es de nxn.

a) Escribir la función Suma(A, i, j), que retorna la suma de los elementos de un


10 puntos subrectangulo contenido en la matriz A de nxn; la dimensión del subrectangulo siempre
estará dada desde la posición (0,0) hasta la posición (i,j).
b) Escribir la función MayorSuma(A, n), que retorna la mayor suma entre todos los
10 puntos
subrectangulos contenidos en la matriz A de nxn. Recuerde que todos los subrectangulos
comienzan en la posición (0,0).

a) int suma(int A[][max], int i, int j){


int k, h, s=0;
for(k=0; k<=i; k++)
for(h=0; h<=j; h++)
s = s + A[k][h];
return s;
}

1
b) int MayorSuma(int A[][max], int n){
int I,j,s,mayor=Suma(A,0,0);
for(i=0; i<n; i++)
for(j=0; j<n; j++)
{
s = Suma(A, i, j);
if(s > mayor)
mayor = s;
}
return mayor;
}

2. Una lista lineal simple L contiene la información de alimento para canes de distintas marcas
que mantiene en stock una gran tienda de mascotas. Esta tienda acostumbra a registrar los
distintos atributos de estas marcas, esto es: Nombre de la marca, peso en kg. por paquete,
tipo de alimento (Junior (1), Mediana edad (2), Adulto (3)), Calidad (Premiun (1), Medium
(2), Clasic (3)) y Valoración (opinión de los expertos calificada de 1 (baja valoración) a 7
(máxima valoración). Se pide realice los siguientes operadores recursivos.
El tipo del nodo de la lista es:

typedef struct nodo{


string marca;
float peso;
int tipo;
int calidad;
int valoracion;
struct nodo *link;
};
typedef nodo *Lista;

10 puntos a) AgregarMarca( L ): Que agrega una marca (un nuevo nodo) a la lista L con datos leídos
por teclado.

10 puntos b) Junior( L ): Que retorna el número de marcas de L que sus alimentos pertenecen a la
categoría Junior.

10 puntos c) PesoClasic( L ): Que retorna las suma de los pesos de las marcas con calidad Clasic
contenido en la lista L.

2
a) void AgregarMarca(Lista &L)
{
if(L == NULL){
L = new(nodo);
cin >> L->marca; //y leer los demás restantes campos
L->link = NULL;
}
else{
AgregarMarca(L->link);
}
}
b) int Junior(Lista &L)
{
If(L == NULL){
return 0;
}
else{
if(L->tipo == 1)
return 1 + Junior(L->link);
else
return 0 + Junior(L->link);
}
}

c) float PesoClasic(Lista &L)


{
if(L == NULL){
return 0;
}
else{
if(L->calidad == 3)
return L->peso + PesoClasic(L->link);
else
return 0 + PesoClasic(L->link);
}
}

3
3. Se desea llevar el registro de los caracteres que se utilizan a diario en twitter; para ello se
registra en una Lista Circular Doble (LCD), el carácter (tipo) y la cantidad de veces que se ha
registrado dicho carácter. La declarativa de la LCD es:
typedef struct Nodo2{
char tipo;
int cantidad;
struct Nodo2 *Sig;
struct Nodo2 *Ant;
};
typedef Nodo2 *Lista2;

Asuma que la LCD C, tiene a lo menos 2 nodos.


10 puntos a) Escribir el operador Disminuir( C ), que disminuye en uno (1) la cantidad registrada en
cada nodo de la LCD C.
b) Escribir el operador Depurar( C ), que elimina de la LCD C, el primer nodo encontrado
10 puntos que tenga registrada una cantidad nula (igual a cero), debe seguir manteniendo la LCD.
c) Escribir la función ElUltimo( C ), que permite disminuir en uno todas las cantidades de
10 puntos cada nodo, y si la cantidad es nula debe eliminar dicho nodo; esto se repite hasta que
quede un solo nodo. Debe retornar el carácter del nodo resultante.

a) void Disminuir(Lista2 C)
{ Lista2 p;
if(C ¡= NULL){
p = C->Sig;
C->cantidad--;
while(p ¡= C){
p->cantidad--;
P = p->Sig;
}
}
}

4
b) void Depurar(Lista2 &C)
{ Lista2 p;
if(C ¡= NULL){
if(C->cantidad == 0){
q = C;
C = C->Sig;
q->Ant->Sig = C;
C->Ant = q->Ant;
delete q;
}
else{
p = C->Sig;
while(p ¡= C){
if(p->cantidad == 0){
q = p->Sig;
p->Ant->Sig = p->Sig;
p->Sig->Ant = p->Ant;
delete p;
p = q;
}
else
p = p->Sig;
}
}
}
}

c) char ElUltimo(Lista2 C){


while(C != C->Sig){
Disminuir(C);
Depurar(C);
}
return C->tipo;
}

Das könnte Ihnen auch gefallen