next up previous


Informática. Exame de Teoría Resolto. Septiembre 2002

  1. (2.5 PUNTOS) Diseñar en pseudocódigo un algoritmo que lea un conjunto de números positivos (asúmase que la condición de parada para el proceso de lectura es la introducción de un número negativo) y determine su valor medio, la mediana y la diferencia en valor absoluto entre la media y la mediana.

    Nota: Se define como mediana el valor central de los datos tras un proceso de ordenación de los mismos. En el caso de que el número de datos sea par, la mediana se define como el valor medio de los dos valores centrales.

    SOLUCIÓN:

    algoritmo ejercicio1
    inicio
    variable x(100), vmed, med, dif: real
    variable i, n: entero
    
    i=1 Inicio del procedimiento de lectura
    escribir Introduzca un número positivo (-1 para salir)
    leer x(i)
    mientras x(i) > 0
      i = i+1
      escribir Introduzca un número positivo (-1 para salir)
      leer x(i)
    fin_mientras
    n = i -1
    si n > 0
      vmed = vmedio(x, n) Invocación a la funcón para el cálculo del valor medio
      med = mediana(x, n) Invocación para el cálculo de la mediana
      escribir El valor medio es , vmed
      escribir La mediana es , med
      dif = vmed - med Calculamos el valor absoluto de la diferencia
      si dif < 0
         dif = -dif
      fin_si
      escribir La diferencia en valor absoluto entre la media y la mediana es, dif
    sino
      escribir No se puede calcular el valor mediano y la mediana sobre un conjunto de cero datos
    fin_si
    fin
    
    función vmedio(x, n)
    inicio
    variable x(100), sum: real
    variable i, n: entero
    
    sum = x(1)
    desde i=2 hasta n paso 1
      sum = sum + x(i)
    fin_desde
    devolver(sum/n)
    fin
    
    función mediana(x, n)
    inicio
    variable x(100): real
    variable i, j, n: entero
    variable ordenado: lógica
    
    ordenado = falso Bandera para indicar que tenemos el vector ordenado
    i = 1
    mientras i<n-1 y ordenado=falso Procedimiento de ordenación
      ordenado = cierto
      desde j=1 hasta n-i
         si x(j) > x(j+1)
            temp = x(j)
            x(j) = x(j+1)
            x(j+1) = temp
            ordenado = falso
         fin_si
      fin_desde
      i = i+1
    fin_mientras
    si (n/2)*2 = n es n par?
       devolver ((x(n/2)+x(n/2 +1))/2)
    sino
       devolver(x(n/2 + 1))
    fin
    

  2. (2.5 PUNTOS) Escribir un programa en Fortran que implemente el algoritmo del ejercicio anterior. El programa debe leer los datos (enteros) de un archivo en el que la primera línea contenga el número de datos a leer, y la segunda contenga dichos datos (separados por espacios en blanco). Finalmente, el programa debe añadir a ese archivo el valor medio, mediana y diferencia en valor absoluto entre la media y la mediana.

          program examen
          real  x(100), media, mediana, dif
          integer  i, n
    
          open (2, file="datos.dat", status='old', err=2)
          read (2, *, end=3) n
          read (2, *, end=3) (x(i), i = 1, n)
          print 4, (x(i), i = 1, n)
     4    format(f8.3)
    
          media = fmedia(x, n)
          mediana = fmediana(x, n)
          write (2, 1) media, mediana, abs(media - mediana)
     1    format(3(f8.3, 3x))
          close(2)
          
          stop
     2    print *, "Error en open"
          stop
     3    print *, "Fin de fichero"
          end
    
    ccccccccccccccccccccccccccccccccccccc
          function fmedia(x, n)
          real  x(*)
          
          fmedia = 0
          do 1 i = 1, n
     1       fmedia = fmedia + x(i)
          if(n.ne.0) then
             fmedia = fmedia/n
          endif
          return
          end
    
    
    cccccccccccccccccccccccccccccccccccccc
          function fmediana(x, n)
          real  x(*), temp
          logical  fin
    
          i = n
     2    fin = .true.
          do 1 j = 1, i - 1
             if(x(j).gt.x(j + 1)) then
                temp = x(j)
                x(j) = x(j + 1)
                x(j + 1) = temp
                fin = .false.
             endif
     1    continue
          i = i - 1
          if(fin) then
             i = 1
          endif
          if(i.gt.1) then
             goto 2
          endif
          print 3, (x(i), i = 1, n)
     3    format(f8.3)
    
    
          if(mod(n, 2).eq.0) then
             fmediana = (x(n/2) + x(n/2+1))/2
          else
             fmediana = x(n/2 + 1)
          endif
    
          return
          end
    

  3. (1 PUNTOS) Encontrar y explicar (brevemente) la causa de los errores en el siguiente programa:
          print *, "Introduce un número entero:"
          read *, n
    
          x = 2*n
          if (n .gt. 0) then
             n + 5 = x ERROR: expresión a la izquierda de una asignación (debe ser una variable)
             goto 2 ERROR: salto desde fuera a dentro de un bucle do
          endif
    
          do 1 i = 1, 10
     2       print *, f(i) ERROR: f es una subrutina y debe ser llamada con call
     1    stop ERROR: un stop no puede ser sentencia terminal de un do
          end
    
    
          subroutine f(x)
          integer  x
          f = x*x ERROR: la variable f no está definida porque f es una subrutina (no una función)
          return
          end
    

  4. Cuestiones sobre representación interna de la información:

    1. (0.5 PUNTOS) ¿Cuál de las siguientes igualdades NO es correcta?
      1C16 = 111002
      1F.C16 = 11111.112
      A6416 = 1010011001002
      239.416 = 110011101.12

      SOLUCIÓN: 239.4 en base 16 no es igual a 110011101.1 en base 2

    2. (0.5 PUNTOS) ¿Cuál de los siguientes números expresados en binario representa al número decimal 28.375?
      11011.0011
      11100.0110
      11011.0100
      10011.1100

      SOLUCIÓN: 28.375 en base 10 = 11100.0110 en base 2

    3. (0.5 PUNTOS) ¿Cuál de las siguientes respuestas representa con el mínimo número de bits posibles el número decimal -122 en complemento a 1?
      1111010
      11111010
      10000101
      1111011

      SOLUCIÓN: -122 en base 10 = 10000101 en complemento a 1

  5. Cuestiones de UNIX:
    1. (0.5 PUNTOS) ¿Qué significan los permisos rw-wx-- en el directorio trabajos? Explicar el significado real de cada permiso.

      SOLUCIÓN: El propietario puede ver el contenido (archivos y directorios) del directorio (porque tiene permiso de lectura) y crear / borrar archivos y/o directorios del mismo (porque tiene permiso de escritura), pero no puede entrar con cd en el directorio (porque no tiene permiso de ejecución). Los usuarios del mismo grupo pueden crear/borrar archivos del directorio (tienen permiso de escritura) y pueden entrar en el mismo (permiso de ejecución) pero no pueden ver sus contenidos (no tienen permiso de lectura). El resto de usuarios no puede hacer nada.

    2. (0.5 PUNTO) ¿Cómo podríamos borrar un directorio vacío? ¿Y uno que no está vacío?

      SOLUCIÓN: El comando rmdir permite borrar un directorio cuando este está vacío. El comando rm, con su opción -r permite borrar directorios que no están vacíos.

    3. (0.5 PUNTOS) Escribir los comandos necesarios para permitir al propietario la lectura y escritura sobre el archivo notas.dat, y a los usuarios de su grupo quitarle el permiso de ejecución sobre ese archivo.

      SOLUCIÓN: chmod u+rw notas.dat; chmod g-x notas.dat

  6. (1 PUNTO) Resolver, utilizando Matlab, el siguiente sistema de ecuaciones lineales.


    3x + 2y - z = 8     (1)
    x - y - z = 0     (2)
    x + 3y + 2z = 5     (3)

    SOLUCIÓN:

    >> A = [3 2 -1;1 -1 -1;1 3 2];
    >> B=[8 0 5]';
    >> inv(A)*B
    

next up previous
© 2006, Dr. Manuel Fernández Delgado, Universidad de Santiago de Compostela, Departamento de Electrónica e Computación