6.8 KiB
A REVANCHA: EXAME TÉCNICO (BLOQUE 2)
I. DESENVOLVEMENTO E LÓXICA (C# / Python)
1. O Filtro de Seguridade (Tema 1 e 5):
Imagina que recibes una lista de "IDs de empleados" como un array de strings. Algunos pueden ser nulos o estar vacíos.
- Escribe una función/método que recorra la lista y solo imprima los IDs que tengan exactamente 5 caracteres y no sean nulos.
- Reto Extra: Usa un bloque try-catch (C#) o try-except (Python) para evitar que el programa explote si algún elemento de la lista da problemas.
Respuesta
En C#:
using System.Collections.Generic;
using System;
namespace Examen{
class Empleado{
public string? id;
public Empleado(string? id = null){
this.id = id;
}
public static List<string> filtrar(List<Empleado> empleados){
List<Empleado> filtrados = new List<Empleado>();
foreach(Empleado empleado in empleados)
if(empleado.id != null && empleado.id.Length == 5){
Console.WriteLine(empleado.id);
filtrados.Add(empleado);
}
return filtrados;
}
}
}
En Python:
from typing import Self, Optional, Sequence
class Empleado:
def __init__(self:Self, id:Optional[str] = None) -> None:
self.id:str|None = id
@staticmethod
def filtrar(empleados:Sequence[type[Self]]) -> list[type[Self]]:
filtrados:list[Empleado] = []
empleado:Empleado
for empleado in empleados:
if empleado.id is not None and len(empleado.id) == 5:
print(empleado.id)
filtrados.append(empleado)
return filtrados
Para los SQL hay que hacer uso de Procedimientos y no de funciones pues las funciones pueden retornar un valor, pero no pueden alterar ni mostrar selecciones.
En SQL Server:
use Examen
if object_id(N'dbo.crear_tablas', N'P') is not null drop procedure dbo.crear_tablas
go
create procedure dbo.crear_tablas as begin
set nocount on
if object_id(N'dbo.Empleados', N'U') is null create table dbo.Empleados(
id varchar(16) not null,
constraint empleados_id primary key(id),
constraint empleados_uq_id index unique(id)
)
end
go
if object_id(N'dbo.filtrar_empleados', N'P') is not null drop procedure dbo.filtrar_empleados
go
create procedure dbo.filtrar_empleados
@filtrados varchar(max) output
as begin
set nocount on
select id from dbo.Empleados where id is not null and len(id) = 5
set @filtrados = (select top 1 stuff((select ',' + id from dbo.Empleados where id is not null and len(id) = 5), 1, 1, '') as ids)
end
go
En MySQL/MariaDB:
use Examen;
delimiter ;^
drop procedure if exists crear_tablas;^
create procedure crear_tablas() begin
create table if not exists Empleados(
id varchar(16) not null,
constraint empleados_id primary key(id)
);
end;^
drop procedure if exists dbo.filtrar_empleados;^
create procedure dbo.filtrar_empleados(
out $filtrados text
) begin
select id from Empleados where id is not null and lenght(id) = 5;
set $filtrados := (select substring(ids, 1, length(ids)) as ids from (
select group_concat(',', id) from Empleados where id is not null and lenght(id) = 5 as ids
) limit 1);
end;^
delimiter ;
En SQLite no se puede de forma nativa, requerirías de estructuras que lo acompañen en otros lenguajes.
Corrección
- C#: Muy buena implementación. Solo un detalle de "profesor tiquismiquis": en la clase
TicketUrxentedel ejercicio siguiente intentas acceder athis.id, pero en la clase baseTicketlo definimos comoprivate. Para que la clase hija lo vea, debería serprotected. - Python: Perfecto el uso de
@staticmethodyOptional. - SQL Pro: Me has dejado loco con el procedimiento de filtrado. Usar
STUFFpara quitar la primera coma es de nivel experto en oposiciones de sistemas.
2. Herdanza e Métodos (Tema 4):
Si la clase Ticket de antes era la base, ahora crea una clase TicketUrxente que herede de Ticket.
- Esta clase hija debe tener un constructor que pase el id a la clase padre (base).
- Sobreescribe o añade un método para que, además de lo anterior, devuelva un mensaje que diga: "Prioridade Máxima asignada ao Ticket [ID]".
Respuesta
En C#:
using Examen;
namespace Examen{
class TicketUrxente:Ticket{
public TicketUrxente(int id):base(id){}
public string coger_mensaje_completo(){
return "Prioridade Máxima asinada ao Ticket [" + this.id + "]";
}
}
}
En Python:
from typing import Self
from Examen import Ticket
class TicketUrxente(Ticket):
def __init__(self:Self, id:int) -> None:
super().__init__(id)
def coger_mensaje_completo(self:Self) -> str:
return "Prioridade Máxima asinada ao Ticket [" + str(self.id) + "]"
Correción
- C#: Como te decía arriba, solo recuerda cambiar
private int idporprotected int iden la base para que elTicketUrxentepueda hacer el+ this.id. - Python: Uso de
super().__init__(id)perfecto.
II. SQL SERVER: O RETORNO DO "FROM" (Tema 7)
- A Consulta de Equipos:
Tenemos dos tablas:
- Equipos (id_equipo, nome_equipo, id_responsable)
- Responsables (id_responsable, nome_persona)
Escribe una consulta SQL que devuelva:
- El nome_equipo y el nome_persona del responsable.
- Pista: Necesitarás un JOIN. No te olvides del FROM.
Respuesta
En SQL Server:
select
equipos.nome_equipo as equipo,
responsables.nome_persoa as responsable
from dbo.Equipos equipos
join dbo.Responsables resonsables on equipos.id_responsable = responsables.id_responsable
En MySQL/MariaDB y SQLite:
select
equipos.nome_equipo as equipo,
responsables.nome_persoa as responsable
from Equipos equipos
join Responsables resonsables on equipos.id_responsable = responsables.id_responsable
Corrección
- ¡Objetivo cumplido! El
FROMestá donde debe estar. - Ojo con los alias: En el
JOINde SQL Server escribisteresonsables(te faltó la 'p') pero luego llamaste aresponsables.id_responsable. Es un error de escritura (typo) típico del cansancio, pero la lógica delONes impecable.
III. PREGUNTA TRAMPA DE SISTEMAS (Tema 27)
- Scripting en Bash:
Tienes que crear un script de una sola línea (o muy breve) que verifique si un archivo llamado backup_diario.sql existe en la carpeta actual. Si existe, que imprima "Ficheiro atopado".
Respuesta
#!/bin/bash
[ -f backup_diario.sql ] && echo "Fichero atopado"
Corrección
- Perfecto. El uso del operador AND lógico
&&es la forma más profesional y rápida de hacer un "one-liner" en Bash para oposiciones.