1 Información general sobre las prácticas:

  • Presta mucha atención a este artículo: Cómo no realizar una práctica de programación.

  • La EPS pone a vuestra disposición una imagen VDI de la instalación de Ubuntu de sus laboratorios. Puedes descargarla de aquí.

    Si lo descargas desde tu navegador y dado que es un archivo muy grande es recomendable que uses alguna extensión para administrar descargas.

    Para resolver cualquier problema que puedas tener con la descarga de este archivo o con la instalación de la máquina virtual, ponte en contacto con los técnicos de la EPS.

  • Si finalmente te decides a usar este S.O. para las prácticas de la asignatura en este enlace tienes acceso a la Guía de escritorio de Ubuntu.

  • En la asignatura trabajamos en prácticas con GNU/Linux y el compilador de C++ del proyecto GCC, para ello empleamos la versión que hay instalada en los laboratorios de la EPS ( g++ --version ).

    Ten en cuenta lo siguiente ya que es MUY IMPORTANTE:

    • La corrección de las prácticas se realiza con esta versión del compilador de C++.

      Tenlo en cuenta ya que C++ es un lenguaje diferente a C y puede haber cambios entre una y otra versión del estándar del mismo.

      En la asignatura empleamos la versión de C++ de 2017, más conocida como C++17.

    • Es aconsejable que si utilizas tu ordenador personal para realizar las prácticas, antes de entregarlas, las compiles y pruebes con esa versión del compilador.

2 Consejos

2.1 Para la entrega de prácticas

  • Debes poner tu nombre y DNI en un comentario al principio de cada archivo de código que escribas y entregues. Es obligatorio, no ponerlo implica una nota de 0 en esa práctica.
  • Puedes entregar tantas veces como quieras una práctica mientras su plazo de entrega esté abierto, esto implica que no se admitirán entregas fuera de plazo o por otro cauce que no sea el indicado en el enunciado. Si esto ocurriera esa entrega será ignorada.
  • La publicación de notas se realiza en la web del DLSI.
  • Si necesitas revisar cualquier práctica de la asignatura debes reservar una tutoría presencial desde la aplicación de UA Cloud.

2.2 Para escribir el código de las prácticas

  • Recuerda:

    • No modifiques los archivos de cabecera entregados con el código de partida.
    • Comprobar si tu código compila y ejecuta de manera correcta con la versión del compilador instalada en los laboratorios de la EPS. Los errores de compilación impiden que se pueda comprobar si tu código funciona correctamente.
    • Inicializar todas las variables que declares a un valor que tenga sentido, así como realizar una primera implementación vacía o sencilla de las funciones o métodos pedidos en las prácticas, p.e.:
    • Si nos piden una función que no devuelve nada:
      void mi_funcion() {}
      
    • Si nos piden una función que devuelve un dato del tipo que sea, p.e. double
      double mi_funcion() { return 0.0; }
      
    • Si implementas una función recursiva, asegúrate que has tenido en cuenta el o los casos base que tenga.
  • Algunas funciones producen salida por pantalla cuando no se pide.

    Repasa tu código pues esto puede interferir en la corrección de la práctica.

    Devolver un resultado por parte de una función es algo totalmente distinto a imprimirlo. En los enunciados de las prácticas se indica claramente cuando se debe hacer una cosa o la otra.

3 Ampliación de conocimientos

  • Se llevará a cabo al principio de determinadas sesiones de prácticas.
  • En estas sesiones de ampliación de conocimientos explicaremos de manera muy breve algunas herramientas que se salen de los contenidos de la asignatura pero que os serán muy útiles y completarán vuestra formación informática.

3.1 Construcción de proyectos con Make. El depurador gdb. La herramienta de análisis en tiempo de ejecución valgrind.

Veremos cómo funcionan estas herramientas que emplearemos a lo largo de todo el curso.

3.2 Trabajo con el S.O. desde un terminal: Bash shell script

En este apartado explicaremos el funcionamiento básico del intérprete de órdenes bash.

Hablaremos de:

  • Diferencia entre shell y terminal.
  • Gestión de ficheros y directorios (ls, cd, rm, mkdir, pwd).
  • Sistema de ficheros, rutas relativas y absolutas.
  • Concepto de usuario (id), grupo, HOME.
  • Trabajos en primer y segundo plano (&, fg, bg, ^Z, ^C).
  • Gestión de procesos (kill, pidof, pkill, killall, ps, top, htop, etc...)
  • Uso básico de permisos (chmod, chown, chgrp).

3.3 Documentación del código: Doxygen

Debemos acostumbrarnos a documentar nuestro código y si, además, podemos generar documentación a partir de estos comentarios mucho mejor.

Existen diferentes herramientas que permiten llevar a cabo esta tarea. Para C++ nosotros emplearemos Doxygen y haremos uso de este código de ejemplo.

3.4 Control de versiones: Git

Hoy en día es obligatorio saber usar una herramienta de control de versiones, concretamente git, para gestionar los cambios en nuestro código y facilitar el trabajo en grupo.

Aprenderemos a usar git para el trabajo local con el código que escribamos.

Hablaremos de:

  • Qué es el control de versiones en general.
  • Qué es un repositorio y una copia de trabajo.
  • Cómo crear un repositorio y poner los archivos de un proyecto bajo control de versiones.
  • Cómo ir creando commits que contengan los cambios que vayamos haciendo al código.

3.5 Aplicaciones con interface de usuario gráfico: Dear ImGui, NappGui

Una vez conozcamos los elementos básicos de la Programación Orientada a Objetos veremos cómo construir aplicaciones que proporcionen un interfaz gráfico de usuario y que, por tanto, permitan mostrar Información de manera gráfica.

  • Para ello emplearemos el toolkit Dear ImGui:

    Hablaremos de:

    • Cómo crear una copia local de Dear ImGui.
    • Cómo compilar una aplicación sencilla que haga uso de esta biblioteca.
  • Y si prefieres probar una biblioteca para trabajar desde C puedes echar un vistazo a NappGui. Desarrollada por un alumno de Ingeniería informática de la Universidad de Alicante y para la que dispones de su manual en castellano.

  • Dado que en el tema 6 hablamos de la implementación de programación dirigida por eventos de la biblioteca Qt, aquí puedes ver un vídeo de introducción a la creación de aplicaciones con interfaz gráfico haciendo uso de Qt, en concreto de la versión 6 de esta biblioteca.

4 Enunciados de prácticas

4.1 Práctica 0

  1. Objetivos:

    • Comprobación de nuestro usuario en el sistema de entregas.
    • Entender y practicar con el sistema de entrega de prácticas y con el formato de entrega de las prácticas.
    • Repaso de conceptos de Programación I.
    • Uso de herramientas como make, gdb y valgrind.
    • Conocer y aprender a usar tipos de datos numéricos enteros de tamaño fijo.
    • Conocer algunas de las nuevas características que nos ofrece C++.
  2. Aquí tienes el enunciado y los archivos de partida para la misma.

4.2 Práctica 1

  1. Objetivos:

    • Adquirir práctica y destreza con las características de C++ que lo hacen un mejor C.
    • Profundizar en los conocimientos aprendidos en Programación I.
    • Hacer uso de las herramientas estudiadas en la práctica 0.
  2. Aquí tienes el enunciado y los archivos de partida para la misma.

4.3 Práctica 2

  1. Objetivos:

    • Seguir adquiriendo práctica y destreza con las características de C++ que lo hacen un mejor C.
    • Conocer que es una biblioteca, como se crea y se usa además de diferenciarla de un archivo de cabecera.
    • Implementar los TADs vistos en los temas 2 y 3 de la asignatura.
  2. Aquí tienes el enunciado y los archivos de partida para la misma.

4.4 Práctica 3

  1. Objetivos:

    • Poner en práctica los conocimientos sobre programación dirigida por eventos vistos en teoría.
  2. Aquí tienes el enunciado y los archivos de partida para la misma.

4.5 Práctica 4

  1. Objetivos:
    • Aprender a usar en código C++ conceptos de POO además de otros estudiados en teoría:
    • herencia de clases
    • zonas de visibilidad
    • clases abstractas
    • genericidad
    • espacios de nombres
    • redefinición de operadores
    • métodos y variables de clase
    • patrón RAII
    • Entrada/Salida, etc..