Universidad de Costa Rica
Escuela de Ciencias de la Computación e Informática
San Pedro, Montes de Oca

Prof. Jeisson Hidalgo-Céspedes
Prof. Daniel Alvarado González

Recurso Peso Descripción

Carta al estudiante

 — 

Programa del curso y acuerdos

Ejemplos: Gr01 Gr03

 — 

Ejemplos de programas realizados durante las lecciones

Material del curso

 — 

Material de referencia

Aula virtual

 — 

En Mediación Virtual

Ejercicios y quices

25%

En el material y aula virtual respectivamente

Tareas

25%

Simulación de calor

Proyecto01

30%

Servidor web concurrente y distribuido

Proyecto02

20%

Simulación de n cuerpos (incremento del desempeño)

Las semanas inician los jueves con la sesión virtual que termina el martes a la medianoche. El miércoles es día de revisión docente. El jueves es la lección presencial. Tras la lección presencial inicia la sesión virtual de la siguiente semana y se repite el ciclo. La primera semana es una excepción. Durante la sesión virtual el estudiantado revisa los videos, documenta los ejemplos, y realiza ejercicios. A lo largo de la semana el estudiantado realiza tareas y proyectos, con el miércoles considerado un buen día para estos fines, para aclarar dudas los jueves.

Simbología: E=Estudiante, D=Docente, A=Ambos, O=Opcional.
Modalidad: Pres=Presencial, Virt=Virtual.
Taxonomía de Bloom: re=recordar, co=comprender, ap=aplicar, an=analizar, ev=evaluar, y cr=crear.

1. [12ago, 16ago]

Table 1. Semana 1 (total 12:00)
Sesión Meta de aprendizaje Actividades y materiales Evaluación

1.1p
12ago
Presencial
1:40

  1. Discutir la carta al estudiante.

  2. Presentarse.

  3. Comprender la metodología del curso: aula invertida.

  4. Crear repositorio de control de versiones.

  1. A: Leer y discutir la carta al estudiante

  2. E: Llenar la encuesta de presentación.

  3. A: Explicar y simular la dinámica extraclase del material de curso.

  4. A: [personal_repo].

  5. A: [general_makefile].

  6. A: Crear ejemplo programa cuadrado (square) con Makefile: proyecto en C, enunciado, casos de prueba, compilarlo, correrlo, probarlo, estilo de código (linting), y documentación (doxygen).

  1. (Recibido conforme en semana 2)

  2. Respondió la encuesta de presentación.

  3. N/A

  4. Creó repositorio. Agregó docente/asistente. Agregó .gitignore. Configuró usuario, correo, y método de autenticación.

  5. Creó common/Makefile. Creó archivos iniciales para el ejemplo square cuyo Makefile incluye el common/Makefile.

  6. Creó documento de análisis y casos de prueba. Resolvió el ejercicio square en C. Probó que no genere accesos inválidos ni problemas de concurrencia. Verificó apego a convención de estilos. Generó documentación.

1.2v
[12ago, 16ago]
Virtual
7:00

  1. Familiarizarse con C, si no lo conoce ya.

  2. Definir los objetivos de los paradigmas de programación concurrente y distribuido.

  3. Crear programas concurrentes.

  4. Usar herramientas de desarrollo de software concurrente.

  5. Probar software concurrente.

  1. E: Si no ha programado en C, seguir el Taller de C++ a C.

  2. E: Iniciar ejercicio [glossary] (0:20)

  3. E: Ver videos del meta-paradigma concurrente y definir los subparadigmas. (2:30)

  4. E: Leer ejercicio [commented_examples]. (0:05)

  5. E: Ver Hola mundo con Pthreads y comentar ejemplo examples/pthreads/hello. (1:45)

  6. E: Seguir videos de herramientas. (1:00)

  7. E: Resolver [recursive_hello] y aplica las herramientas: estructura de archivos y directorios, documentación, linting, documentación, y no genera errores en tiempo de ejecución (Memcheck, Helgrind, ASan, TSan). (1:00)

  1. Si no ha programado en C, agregó los ejemplos a su repositorio.

  2. Commit con el archivo glosario con sus conceptos aún sin definir.

  3. Definió los conceptos 1 a 5 en el glosario.

  4. N/A

  5. Comentó ejemplo examples/pthreads/hello en control de versiones.

  6. N/A

  7. Resolvió exercises/pthreads/recursive_hello.

s17ago

Revisión docente

[12ago, 16ago]

Trabajar en Tarea01 (3:20)

2. [17ago, 22ago]

Table 2. Semana 2 (total 12:00)
Sesión Meta de aprendizaje Actividades y materiales Evaluación

2.1v
[17ago, 20ago]
Virtual
5:00

  1. Definir el concepto de hilo de ejecución.

  2. Rastrear la memoria de un programa concurrente.

  3. Definir indeterminismo.

  4. Crear programas concurrentes indeterministas.

  1. E: Ver Rastreo de memoria. (1:20)

  2. E: Definir hilo de ejecución en el glosario. (0:10)

  3. E: Resolver [recursive_hello_trace]. (1:00)

  4. E: Ver Indeterminismo y comentar ejemplo examples/pthreads/hello_w. (2:15)

  5. E: Definir indeterminismo en el glosario. (0:10)

  1. N/A

  2. Commit con definición de hilo de ejecución en el glosario.

  3. Imagen del rastreo de memoria en exercises/recursive_hello/trace/.

  4. Comentó ejemplo examples/pthreads/hello_w (commit).

  5. Commit con definición de indeterminismo en el glosario.

2.2p
19ago
Presencial
1:40

  1. Representar un escenario concurrente humano con hilos de ejecución.

  2. Corregir issues con commits (ej.: tras revisión de actividades).

  1. A: [grandma_lottery].

  2. A: Corregir y cerrar un issue con el mensaje de un commit.

  3. A: Dudas y seguimiento de tarea01.

  1. Commits con examples/grandma_lottery resuelto.

  2. N/A

  3. N/A

m21ago

Revisión docente

2.3p
22ago
Presencial
2:30

  1. Representar otro escenario concurrente humano con hilos de ejecución.

  1. A: Recibido conforme de la carta al estudiante.

  2. A: [team_shot_put].

  3. A: Dudas y seguimiento de tarea01.

  1. Firmó el recibido conforme.

  2. Commits con examples/team_shot_put resuelto.

  3. N/A

[17ago, 23ago]

Trabajar en Tarea01 (2:50)

s24ago

Entrega de Tarea01

3. [23ago, 29ago]

Table 3. Semana 3 (total 12:00)
Sesión Meta de aprendizaje Actividades y materiales Evaluación

3.1v
[23ago, 27ago]
Virtual
7:30

  1. Definir memoria privada y memoria compartida.

  1. E: Ver Memoria privada y comentar examples/pthreads/hello_iw_pri. (1:32)

  2. E: Ver Memoria compartida y comentar ejemplo examples/pthreads/hello_iw_shr. (0:20)

  3. E: Definir Memoria privada y compartida en el glosario. (0:05)

  4. E: Ver Espera activa y comentar ejemplo examples/pthreads/hello_order_busywait. (1:20)

  5. E: Definir Espera activa en el glosario. (0:05)

  1. Comentó examples/pthreads/hello_iw_pri.

  2. Comentó examples/pthreads/hello_iw_shr.

  3. Comentó examples/pthreads/hello_order_busywait.

  4. Definió Memoria privada y compartida, y Espera activa en el glosario.

3.2p
26ago
Presencial
1:40

  1. Facilitar la creación de equipos de hilos.

  1. A: [create_thread_team].

  2. A: Dudas y seguimiento del diseño de la tarea02.

  1. Commits con examples/create_thread_team resuelto.

m28ago

Revisión docente

3.3p
29ago
Presencial
2:30

  1. Comprender lo nocivo que es la espera activa y la espera con retraso.

  1. A: [delayed_busy_wait] en equipos de 3.

  2. A: Dudas y seguimiento del diseño de la tarea02.

  1. Commits con examples/delayed_busy_wait resuelto.

  2. N/A

[23ago, 29ago]

Revisión de la tarea01 con asistente (0:20).
Diseño de la solución de tarea02. Discutirla con docente (4:00).

4. [30ago, 05set]

Table 4. Semana 4 (total 12:00)
Sesión Meta de aprendizaje Actividades y materiales Evaluación

4.1v
[30ago, 03set]
Virtual
5:20

  1. Detectar, corregir, y evitar condiciones de carrera.

  2. Definir el concepto de hilo de exclusión mutua en el glosario. {sin efecto en la nota}

  1. E: Ver Condición de carrera y exclusión mutua y comentar examples/pthreads/race_position. (1:50)

  2. E: Ver Semáforos y comentar ejemplo examples/pthreads/hello_order_semaphor. (1:43)

  3. E: Definir Condición de carrera en el glosario. (0:05)

  4. E: Resolver [birthday_pinata]. (1:00)

  5. E: Ver Seguridad condicional y comentar ejemplo examples/pthreads/hello_order_cond_safe. (0:47)

  6. E: Definir Control de concurrencia y Seguridad condicional en el glosario. Contrastar ambos conceptos y proveer ejemplos de cada uno. (0:10)

  1. Comentó examples/pthreads/race_position.

  2. Comentó examples/pthreads/hello_order_semaphor.

  3. Comentó examples/pthreads/hello_order_cond_safe.

  4. Definió Condición de carrera, Control de concurrencia y Seguridad condicional en el glosario. Contrastó los dos últimos y proveyó ejemplos.

  5. Resolvió exercises/pthreads/birthday_pinata.

4.2p
02set
Presencial
1:40

  1. Contrastar espera activa, semáforos y seguridad condicional.

  1. A: [sem_vs_condsafe] en equipos de 3.

  2. A: Implementación y seguimiento de la tarea02.

  1. Commits con examples/sem_vs_condsafe resuelto.

m04set

Revisión docente

4.3p
05set
Presencial
2:30

  1. Sincronizar tareas con semáforos

  1. A: [building_tasks].

  2. A: Implementación y seguimiento de la tarea02.

  1. Commits con examples/building_tasks resuelto.

[30ago, 05set]

Implementación de la tarea02 (2:30).

5. [06set, 12set]

Table 5. Semana 5 (total 12:00)
Sesión Meta de aprendizaje Actividades y materiales Evaluación

5.1v
[06set, 10set]
Virtual
6:30

  1. Comprender y aplicar el patrón productor-consumidor.

  1. E: Definir Semáforo en el glosario (pendiente de la semana 4) (0:10)

  2. E: Ver Problema de buffer acotado y comentar examples/pthreads/prod_cons_bound. (1:30)

  3. E: Ver Problema de buffer no acotado y comentar examples/pthreads/prod_cons_unbound. (3:40)

  4. E: Ver Patrón productor-consumidor. (1:40)

  1. Definió Semáforo en el glosario.

  2. Comentó examples/pthreads/prod_cons_bound.

  3. Comentó examples/pthreads/prod_cons_unbound.

5.2p
09set
Presencial
1:40

  1. Aplicar el patrón productor-consumidor.

  1. A: [network_simul_packet_loss] (inicio): Solución en pseudocódigo de productor-consumidor de buffer acotado y no acotado.

  2. A: Análisis de proyecto 1.1.

  1. Commits con examples/network_simul_packet_loss con pseudocódigo.

m11set

Revisión docente

5.3p
12set
Presencial
2:30

  1. Resolver problemas con el patrón productor-consumidor.

  1. A: [network_simul_packet_loss] (continuación): Comprender código reutilizable. Modificar simulación para introducir pérdida de paquetes.

  2. A: Análisis de proyecto 1.1.

  1. Commits con examples/network_simul_packet_loss resuelto.

s14set

Tarea02

6. [13set, 19set]

Table 6. Semana 6 (total ??:00)
Sesión Meta de aprendizaje Actividades y materiales Evaluación

6.1v
[13set, 17set]
Virtual
4:05

  1. Analizar los requerimientos del proyecto 1.1.

  2. Comprender descomposición y mapeo.

  1. E: Ver Servidor web concurrente (proyecto 1) y trabajar en documento de análisis. (1:32)

  2. E: Ver Optimización. (0:15)

  3. E: Ver Descomposición y definir Descomposición en el glosario. (0:22)

  4. E: Ver Mapeo y definir Mapeo en el glosario. (1:00)

  5. E: Ver Métricas y definir Incremento de velocidad en el glosario. Agregar y definir el concepto de Eficiencia en el glosario. (1:00)

  1. Crear equipo, repositorio para proyectos, importar archivos iniciales del servidor web, escribir requerimientos en documento de análisis. Diseño preliminar del flujo de datos.

  2. Definió Descomposición, Mapeo, Incremento de velocidad, y Eficiencia en el glosario.

6.2p
16set
Presencial
1:40

  1. Resolver problemas con el patrón productor-consumidor.

  1. Commits con network_simul_packet_loss2 resuelto en examples/network_simul_packet_loss.

  2. Commits con network_simul_producers resuelto en examples/network_simul_packet_loss.

m18set

Revisión docente

6.3p
19set
Presencial
2:30

  1. Resolver problemas con el patrón productor-consumidor.

  1. A: [network_simul_bounded].

  2. A: Diseño diagrama de flujo de datos del proyecto 1.1.

  1. Commits con examples/network_simul_bounded resuelto en examples/network_simul_packet_loss.

[13set, 19set]

Análisis y diseño de proyecto 1.1 (3:45).

7. [20set, 26set]

Table 7. Semana 7 (total 12:00)
Sesión Meta de aprendizaje Actividades y materiales Evaluación

6.1v
[20set, 24set]
Virtual
2:36

  1. Resolver problemas con la Ley de Amdahl.

  2. Comprender descomposición y mapeo.

  1. E: Ver Ley de Amdahl. (0:34)

  2. E: Ver Profiling. (0:40)

  3. E: Ver Clústers de computadoras. (0:28)

  4. E: Ver Falso compartido. (0:54)

6.2p
23set
Presencial
1:40

  1. Diseñar e implementar avance 1.1.

  1. A: Resolver amdahl_compare_ab.

  2. E: Diseñar e implementar avance 1.1. Consultas a docente.

Visto bueno de docente de diseño . Resolvió ejercicio amdahl_compare_ab en aula virtual y hoja de cálculo en control de versiones.

m25set

Revisión docente

6.3p
26set
Presencial
2:30

  1. Implementar avance 1.1.

  1. E: Implementar avance 1.1. Consultas a docente.

  1. Prerevisiones de implementación.

s28set

Proyecto 1.1 (5:14).

8. [27set, 03oct]

Table 8. Semana 8 (total 12:00)
Sesión Meta de aprendizaje Actividades y materiales Evaluación

8.1v
[27set, 01oct]
Virtual
{0:00 a 4:47}

Aprender los patrones básicos para resolver problemas de sincronización de ejecutantes (Opcional redes de Petri).

  1. O: Ver Primitivas de concurrencia de tareas. {0:00 a 1:33}

  2. O: Ver Patrones básicos y definir Barrera en el glosario. {0:00 a 4:14}

Definió Barrera en el glosario.

8.2p
30set
Presencial
1:40

Diseñar soluciones con patrones básicos de sincronización de ejecutantes.

A: Diseñar soluciones en pseudocódigo para los ejemplos de Patrones básicos.

Commits con examples/taskc_patterns en control de versiones.

m02oct

Revisión docente

8.3p
03oct
Presencial
2:30

Diseñar soluciones con patrones básicos de sincronización de ejecutantes.

A: Diseñar soluciones en pseudocódigo para los ejemplos de Patrones básicos.

Commits con examples/taskc_patterns en control de versiones.

[30set, 04oct]

Revisión proyecto 1.1 (1:00).
Trabajar en tarea03 {2:00 a 6:50}.

9. [04oct, 10oct]

Table 9. Semana 9 (total 12:00)
Sesión Meta de aprendizaje Actividades y materiales Evaluación

9.1v
[04oct, 08oct]
Virtual
{0:00 a 4:12}

Resolver problemas de paralelismo de datos de forma declarativa.

  1. O: Ver OpenMP. {0:00 a 4:12}

9.2p
07oct
Presencial
1:40

Implementar soluciones sencillas con paralelismo de datos declarativo (OpenMP).

A: Resolver [omp_team].
A: Resolver [omp_for].

Commits con examples/omp_team y examples/omp_for en control de versiones.

m09oct

Revisión docente

9.3p
10oct
Presencial
2:30

Implementar soluciones de paralelismo de datos declarativo con OpenMP.

  1. A: Resolver [omp_several_for_stages].

  2. A: Resolver [omp_stats].

Commits con examples/omp_several_for_stages y examples/omp_stats en control de versiones.

[04oct, 09oct]

Trabajar en tarea03 {3:20 a 7:50}.

12oct

Entrega de Tarea03 (Revisión 0:30).

10. [11oct, 17oct]

Table 10. Semana 10 (total 12:00)
Sesión Meta de aprendizaje Actividades y materiales Evaluación

10.1v
[11oct, 15oct]
Virtual
(0:00)

10.2p
14oct
Presencial
1:40

Resolver problemas con paralelismo de datos declarativo (OpenMP).

  1. A: Resolver [omp_mergesort].

Commits con examples/omp_mergesort en control de versiones.

m16oct

Revisión docente

10.3p
17oct
Presencial
2:30

  1. Comprender el concepto de distribución y clústers de computadoras

  2. Diseñar la cadena de producción del proyecto 1.2.

  1. A: Paralelizar la mediana con mergesort en [omp_stats].

  2. D: Comprender el concepto de distribución, clúster de computadoras, y una reseña de MPI.

Commits con examples/omp_stats en control de versiones.

[11oct, 16oct]

Trabajar en proyecto 1.2 (7:50).

11. [18oct, 24oct]

Table 11. Semana 11 (total 12:00)
Sesión Meta de aprendizaje Actividades y materiales Evaluación

11.1v
[18oct, 22oct]
Virtual
(0:00)

11.2p
21oct
Presencial
1:40

Pre-revisión diseño avance 1.2

m23oct

Revisión docente

11.3p
24oct
Presencial
2:30

Distribuir procesos en clústers de computadoras.

  1. A: Correr [mpi_hello] en Poás, guardar salida.

  2. A: Resolver [mpi_wrapper] y correr saludo en Poás.

  1. Commits con examples/mpi_hello en control de versiones.

  2. Commits con examples/mpi_wrapper en control de versiones.

26oct

Entrega de proyecto 1.2 (?:??).

12. [25oct, 31oct]

Table 12. Semana 12 (total ??:??)
Sesión Meta de aprendizaje Actividades y materiales Evaluación

12.1v
[25oct, 29oct]
Virtual
(0:00)

12.2p
28oct
Presencial
1:40

  1. Contrastar el concepto de hilo de ejecución contra proceso

  1. A: Resolver [hybrid_distr_arg].

  2. A: Resolver [mpi_error] en mpi_wrapper.

  3. A: Resolver [hybrid_distr_stdin] en examples/hybrid_distr_arg.

  1. Commits con examples/hybrid_distr_arg resuelto.

  2. Commits con examples/mpi_wrapper y la subclase Mpi::Error.

  3. Commits con examples/hybrid_distr_arg que lee rango de la entrada estándar si no se provee en los argumentos de línea de comandos.

m30oct

Revisión docente

12.3p
31oct
Presencial
2:30

Intercomunicar procesos a través de paso de mensajes punto a punto.

  1. A: Agregar paso de mensajes a [hybrid_distr_arg] para distribuir rango cuando se lee en la entrada estándar.

  2. A: Resolver [mpi_wrapper_send_recv] en examples/mpi_wrapper. Aplicarlo a examples/hybrid_distr_arg.

  3. A: Resolver [mpi_wrapper_send_recv_arr] en examples/mpi_wrapper. Aplicarlo a examples/hybrid_distr_arg.

  1. Commits con examples/hybrid_distr_arg en control de versiones.

  2. Commits con examples/mpi_wrapper en control de versiones con comunicación punto a punto genérica.

26oct

Trabajar en tarea 4 (?:??).

13. [01nov, 07nov]

Table 13. Semana 13 (total ??:??)
Sesión Meta de aprendizaje Actividades y materiales Evaluación

13.1v
[01nov, 05nov]
Virtual
(0:00)

13.2p
04nov
Presencial
1:40

  1. Resolver problemas con paso de mensajes

  1. A: Resolver [send_recv_ord_sem] en examples/mpi_wrapper/hello_ord.

  1. Commits con examples/mpi_wrapper/hello_ord resuelto.

m06nov

Revisión docente

13.3p
07nov
Presencial
2:30

Resolver problemas con paso de mensajes punto a punto.

  1. A: Resolver [send_recv_ord_itm] en examples/mpi_wrapper/hello_itm. Agregar caso de prueba para 3 procesos.

  2. A: Resolver [send_recv_urd].Simular seguridad condicional en examples/mpi_wrapper/hello_itm. Proceso receptor recibe en cualquier orden, pero guarda los mensajes en un arreglo y al final lo imprime.

  3. A: Resolver [mpi_wrapper_stream_op] en examples/mpi_wrapper. Aplicarlo a examples/examples/mpi_wrapper/hello_itm.

  4. A: Resolver [ping_pong_perfect] y [ping_pong_realistic] en examples/mpi_ping_pong.

  1. Commits con examples/mpi_wrapper/hello_itm, sus casos de prueba, y seguridad condicional.

  2. Commits con examples/mpi_wrapper con operadores de flujo.

  3. Commits con examples/mpi_ping_pong resuelto.

  4. Commits con examples/mpi_relay_race resuelto.

01nov-07nov

Trabajar en tarea 4 (16nov) y Diseño de proyecto 1.3.

14. [08nov, 14nov]

Table 14. Semana 14 (total ??:??)
Sesión Meta de aprendizaje Actividades y materiales Evaluación

14.1v
[08nov, 12nov]
Virtual
(0:00)

14.2p
11nov
Presencial
1:40

  1. Analizar problema de proyecto02

  1. E: Escribir documento de análisis en repositorio de proyecto02.

  1. Commits con análisis en proy02/readme.adoc.

m13nov

Revisión docente

14.3p
14nov
Presencial
2:30

Resolver problemas con paso de mensajes punto a punto y comunicación colectiva.

  1. A: Resolver [relay_race_dist] en examples/mpi_relay_race.

  2. A: Resolver [hybrid_distr_bcast] en examples/mpi_hybrid_distr_bcast.

  1. Commits con examples/mpi_relay_race resuelto.

  2. Commits con examples/mpi_hybrid_distr_bcast resuelto.

16nov

Entrega tarea04

15. [15nov, 21nov]

Table 15. Semana 15 (total ??:??)
Sesión Meta de aprendizaje Actividades y materiales Evaluación

15.1v
[15nov, 19nov]
Virtual
(0:00)

15.2p
18nov
Presencial
1:40

  1. Resolver problemas con comunicación colectiva

  1. A: Resolver [lucky_number_reduce] en examples/mpi_lucky_number_reduce.

  2. A: Resolver [lucky_number_who] en examples/mpi_lucky_number_who.

  1. Commits con examples/lucky_number_reduce resuelto.

  2. Commits con examples/mpi_lucky_number_who resuelto.

m20nov

Revisión docente

15.3p
21nov
Presencial
2:30

Resolver problemas de sincronización (concurrencia de tareas).

  1. A: Resolver [mist_cond_var] en examples/mist_cond_var.

  2. A: Resolver [dining_philosophers] en examples/dining_philosophers.

  1. Commits con examples/mist_cond_var resuelto.

  2. Commits con examples/dining_philosophers resuelto.

15nov-21nov

Diseñar proyecto 1.3.

16. [22nov, 28nov]

Table 16. Semana 16 (total ??:??)
Sesión Meta de aprendizaje Actividades y materiales Evaluación

16.1v
[22nov, 26nov]
Virtual
(0:00)

16.2p
25nov
Presencial
1:40

  1. Resolver problemas de control de concurrencia

  1. A: Resolver [readers_writers] en examples/readers_writers.

  2. A: Resolver [readers_writers_rwlock] en examples/readers_writers.

  3. A: Resolver [reentrant_rand] en examples/reentrant_rand.

  1. Commits con examples/readers_writers resuelto en pseudocódigo y Pthreads con candados de lectura y escritura.

  2. Commits con examples/reentrant_rand resuelto.

m27nov

Revisión docente

16.3p
28nov
Presencial
2:30

Resolver problemas de sincronización (concurrencia de tareas).

  1. A: Diseñar solución a [build_h2o] en examples/build_h2o.

  2. A: Diseñar solución a la secuencia [dancing_pairs_1] a [dancing_pairs_6] en examples/dancing_pairs.

  1. Commits con examples/build_h2o resuelto.

  2. Commits con examples/dancing_pairs resuelto.

30nov

Entrega proyecto 1.3.

17. [29nov, 05dic]

Table 17. Semana 17 (total ??:??)
Sesión Meta de aprendizaje Actividades y materiales Evaluación

07dic

Entrega proyecto 2.

Material de referencia

Taller de C++ a C