Examen: Parcial 1:2025_03_31:Robotica - myTeachingURJC/2019-20-LAB-AO GitHub Wiki

Examen Parcial 2: 2025-03-31. Robotica

  • Tiempo: 50 minutos
  • Descripción: Examen Parcial 2. Laboratorio. Grado en Ingeniería de Robótica Software
  • Fecha: 2025/Marzo/31
  • Temario: Sesiones L5,L6,L7 y L8

Contenido

Enunciado

El examen se ha realizado a través de Aula virtual. Tiene dos partes: Test y un programa

Test (5 ptos)

  • Realizado a través de Aula virtual
  • 10 preguntas tipo test
  • Las respuesats incorrectas restan un 25% del valor de la pregunta
  • Solución disponible en Aula virtual

Programa (5 ptos)

Una función muy utilizada en la automatización de comunicaciones masivas es la que reemplaza una marca en una plantilla genérica por el nombre real del destinatario con el objeto de personalizarlo. Este tipo de funciones son ofrecidas por la mayoría de los procesadores de texto, clientes de correo electrónico, etc.

El programa requerido en este ejercicio es una versión simplificada de la automatización de automatizaciones masivas. Partiendo de una cadena de texto definida en el segmento de datos que incluya la secuencia "n", y que podría tener el siguiente contenido:

      "Estimado n:\nBienvenido al examen de Arquitectura de Computadores"

Se ha de requerir al usuario final que inserte un nombre por consola (máximo 20 caracteres), y sobre la cadena anterior se ha de reemplazar la secuencia "n" por el nombre introducido por el usuario final y finalmente ha de mostrarse por pantalla

Ejemplo de ejecución:

Consideraciones adicionales. Puede asumir que la cadena de texto a transformar no va a tener nunca más de 100 caracteres. Valor ASCII de:

'*' 42
'n' 110

NOTA: Se ha de entregar el programa en un fichero llamado: "replace.s" Si se utiliza algún fichero auxiliar con definiciones, ha de ser entregado.

Solución al programa

Asume existencia de fichero servicios.asm con las definiciones de las llamadas al sistema (syscalls) de RISC-V

	   #-- Constantes del Sistema operativo
	   .include "servicios.asm"
	   
	   #-- Longitud maxima del nombre
	   .eqv LONGITUD_NOMBRE 21

	   #-- Caracteres ascii
	  .eqv ASTERISCO 42  #'*'
	  .eqv N_MINUS   110 #'n'
	  
	  .data

nombre:     .string "Introduzca el nombre: "
template:   .string "Estimado *n*:\nBienvenido al examen de Arquitectura de Computadores"
input_name: .space 21   #-- Almacenamiento del nombre
salida:     .space 121  #-- Cadena final de salida

	 .text

	 # Imprimir mensaje para pedir nombre
	 li a7, PRINT_STRING
	 la a0, nombre
	 ecall

	 # leer de consola el nombre y guardar nombre en input_name
	 li a7, READ_STRING
	 la a0, input_name
	 li a1, LONGITUD_NOMBRE
	 ecall

	 # recorrer template hasta *n* y copiar en cadena de salida
	 la t0,template
	 la t5, salida

bucle1:

	 #-- Leer caracter del template
	 lb t1, 0(t0)

	 #-- chequea si es secuencia a reemplazar
	 #-- Caracteres de la secuencia a comprobar
	 li t2, ASTERISCO
	 li t3, N_MINUS

	 #-- No es el asterisco inicial
	 bne t1,t2,no_secuencia
	 lb t4,1(t0)

	 #-- No es el menos
	 bne t4,t3,no_secuencia
	 lb t4,2(t0)

	 #-- No es el asterisco final
	 bne t4, t2, no_secuencia

	 #-- Secuencia detectada!
	 b secuencia

no_secuencia:
      #-- Secuancia NO detectada:
	  #-- copia caracter leido en cadena de salida
	  sb t1,0(t5)

      #-- Apuntar a los siguientes caracteres en las
      #-- cadenas de template y salida
	  addi t0, t0,1
	  addi t5, t5,1

	  #-- Repetir
	  b bucle1


	  #-- Secuencia detectada: Copiar nombre en la
	  #-- cadena de salida
secuencia:
	  # t0 apunta a la primera posición de la secuencia, mejor no tocarlo

	  #-- t2: Puntero al nombre
	  la t2, input_name

bucle2:

	#-- Leer primer caracter del nombre
	lb t3, 0(t2)

	#-- Si el caracter es 0, el nombre ya se ha compiado
	beq t3,zero,nombre_copiado

	#-- Si el caractere es \n, el nombre ya se ha copiado
	li t4, '\n'
	beq t3, t4, nombre_copiado

	#-- Copiar el caracter
	sb t3, 0(t5)

	#-- Apuntar al siguiente caracter del nombre
	addi t2, t2, 1

	#-- Apuntar al siguiente caracter de la cadena de salida
	addi t5, t5, 1

	#-- Repetir
	b bucle2

nombre_copiado:
	# continuar recorriendo cadena template hasta el final y copiando en cadena de salida

	#-- Hacer que t0 apunte al siguiente caracter tras la secuencia
	addi t0, t0, 3 #3 es tamaño de secuencia


bucle3:

	#-- Leer caracter del template
	lb t1, 0(t0)

	#-- Copiarlo en la cadena de salida
	sb t1, 0(t5)

	#-- Incrementar puntero de template y salida
	addi t0, t0, 1
	addi t5,t5,1

	#-- Si el caracter leido del template es 0, hemos terminado
	#-- De lo contrario repetimos el bucle
	bne t1, zero, bucle3

	# imprimir la cadena final
	li a7, PRINT_STRING
	la a0, salida
	ecall

	# salir
	li a7, EXIT
	ecall

Evaluación

La evaluación del programa se hace en dos fases:

  • Funcionalidad (2.5 ptos): Se comprueba si el programa funciona, y si cumple con las especificaciones (Nombre del fichero correcto, ensablado sin errores, sin errores en tiempo de ejecución, resultado correcto, variables definidas en sus posiciones de memoria especificadas, etc). Esto se hace mediante un script de test, que automatiza el proceso

  • Código (2.5 ptos): Se inspecciona visualmente cómo está hecho el código: código limpio, claro, con comentarios, instrucciones correctas, fallos de programación, etc...

TEST automático

TODO

Autores

  • Juan Ignacio Pérez

Licencia

Enlaces