diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..17a29423de0329a3016a962aceff5f2298600bbb
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,83 @@
+
+# Created by https://www.toptal.com/developers/gitignore/api/c,visualstudiocode
+# Edit at https://www.toptal.com/developers/gitignore?templates=c,visualstudiocode
+
+### C ###
+# Prerequisites
+*.d
+
+# Object files
+*.o
+*.ko
+*.obj
+*.elf
+
+# Linker output
+*.ilk
+*.map
+*.exp
+
+# Precompiled Headers
+*.gch
+*.pch
+
+# Libraries
+*.lib
+*.a
+*.la
+*.lo
+
+# Shared objects (inc. Windows DLLs)
+*.dll
+*.so
+*.so.*
+*.dylib
+
+# Executables
+*.exe
+*.out
+*.app
+*.i*86
+*.x86_64
+*.hex
+
+# Debug files
+*.dSYM/
+*.su
+*.idb
+*.pdb
+
+# Kernel Module Compile Results
+*.mod*
+*.cmd
+.tmp_versions/
+modules.order
+Module.symvers
+Mkfile.old
+dkms.conf
+
+### VisualStudioCode ###
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+*.code-workspace
+
+# Local History for Visual Studio Code
+.history/
+
+### VisualStudioCode Patch ###
+# Ignore all local history of files
+.history
+.ionide
+
+# Support for Project snippet scope
+!.vscode/*.code-snippets
+
+# End of https://www.toptal.com/developers/gitignore/api/c,visualstudiocode
+
+# Custom gitignore for project
+histo
+.vscode/launch.json
+.vscode/tasks.json
\ No newline at end of file
diff --git a/README.md b/README.md
index 0fe03bfe9ca724f700ddad1885618894ca784bd9..57ff576e635f004b698d22d80afa3081c680153e 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,86 @@
-# progseq-dynamic_memory_allocation
+# Tableaux unidimensionnels et allocation dynamique de mémoire
 
-6e travail pratique du cours de programmation séquentielle, 1er année (2021-2022).
+- **Class** : Programmation séquentielle en C
+- **Creation date** : 9 novembre 2021
+- **Description** : 6e travail pratique
 
-Tableaux unidimensionnels et allocation dynamique de mémoire.
\ No newline at end of file
+## Makefile configuration
+
+### Compile the project
+> `make` 
+
+Use this command to compile the project.
+
+### Clean the project
+> `make clean`
+
+Use this command to clean the project.
+
+## Visual Studio Code configuration
+
+You will find below the base configuration for the launch.json and tasks.json files in Visual Studio Code. Depending on your environment you will need to modify those files.
+
+### launch.json
+
+```json
+{
+    "version": "0.2.0",
+    "configurations": [
+        {
+            "name": "gcc-9 - Build and debug active file",
+            "type": "cppdbg",
+            "request": "launch",
+            "program": "${fileDirname}/histo",
+            "args": [],
+            "stopAtEntry": false,
+            "cwd": "${fileDirname}",
+            "environment": [],
+            "externalConsole": false,
+            "MIMode": "gdb",
+            "setupCommands": [
+                {
+                    "description": "Enable pretty-printing for gdb",
+                    "text": "-enable-pretty-printing",
+                    "ignoreFailures": true
+                }
+            ],
+            "preLaunchTask": "C/C++: gcc-9 build active file",
+            "miDebuggerPath": "/usr/bin/gdb"
+        }
+    ]
+}
+```
+
+### tasks.json
+
+```json
+{
+    "tasks": [
+        {
+            "type": "cppbuild",
+            "label": "C/C++: gcc-9 build active file",
+            "command": "/usr/bin/gcc-9",
+            "args": [
+                "-fdiagnostics-color=always",
+                "-g",
+                "${file}",
+                "-o",
+                "${fileDirname}/${fileBasenameNoExtension}",
+                "-lm"
+            ],
+            "options": {
+                "cwd": "${fileDirname}"
+            },
+            "problemMatcher": [
+                "$gcc"
+            ],
+            "group": {
+                "kind": "build",
+                "isDefault": true
+            },
+            "detail": "Task generated by Debugger."
+        }
+    ],
+    "version": "2.0.0"
+}
+```
diff --git a/histo.c b/histo.c
new file mode 100644
index 0000000000000000000000000000000000000000..f9dcfb540f391961574807aef818043bf5941835
--- /dev/null
+++ b/histo.c
@@ -0,0 +1,39 @@
+
+#include "unidimensional_array.h"
+
+int main() {
+    // Ask the user the size of the array
+    size_t array_size = ask_array_size();
+    int array[array_size];
+
+    // Fill the array with random values
+    fill_array_with_random_values(array, array_size);
+
+    // Find the lowest value in the array
+    int lowest_value = find_lowest_value_in_array(array, array_size);
+    printf("Lowest value : %d\n", lowest_value);
+    
+    // Swap the highest value of the array with the last element of the array
+    size_t index_highest_value = find_index_highest_value_in_array(array, array_size);
+    swap(&array[index_highest_value], &array[array_size - 1]);
+
+    // Calculate the average value of the array
+    int average = get_average_in_array(array, array_size);
+    printf("Average : %d\n", average);
+
+    // Calculate the variances of the elemenst in the array
+    int variance = get_variance_in_array(array, array_size);
+    printf("Variance : %d\n", variance);
+
+    // Asc sort the array
+    sort_array_asc(array, array_size);
+
+    // Find the median value
+    int median = get_median_value(array, array_size);
+    printf("Median : %d\n", median);
+
+    // Check the equitability of the random number generator
+    create_histo(array, array_size);
+
+    return 0;
+}
\ No newline at end of file
diff --git a/makefile b/makefile
new file mode 100644
index 0000000000000000000000000000000000000000..30b672d01c22a17ceb50bbacd9d401fb283b78c8
--- /dev/null
+++ b/makefile
@@ -0,0 +1,12 @@
+LIB=-lm
+CC=gcc -Wall -Wextra
+
+histo:unidimensional_array.o histo.o
+	gcc $^ -o $@ $(LIB)
+
+unidimensional_array.o: unidimensional_array.c unidimensional_array.h
+	$(CC) -c $< $(LIB)
+histo.o: histo.c
+	$(CC) -c $< $(LIB)
+clean:
+	rm -f *.o histo
\ No newline at end of file
diff --git a/unidimensional_array.c b/unidimensional_array.c
new file mode 100644
index 0000000000000000000000000000000000000000..a6739ee7a8fb7ba3b252af4a18cab1278e861663
--- /dev/null
+++ b/unidimensional_array.c
@@ -0,0 +1,175 @@
+/* Author : Dario GENGA
+ * Date : 12.10.2021
+ * Description : Manipulate an unidimensional array
+ */
+
+#include "unidimensional_array.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <math.h>
+#define PERCENT_OF_MAX_ARRAY_VALUE 10
+
+size_t ask_array_size() {
+    size_t array_size = 0;
+    printf("Size of the array : \n");
+    scanf("%ld", &array_size);
+    return array_size;
+}
+
+void fill_array_with_random_values(int array[], size_t array_size) {
+    size_t max_value = array_size / PERCENT_OF_MAX_ARRAY_VALUE;
+
+    srand(time(0));
+
+    for (size_t i = 0; i < array_size; i++)
+    {
+        int random_value = (rand() % (max_value + 1));
+        array[i] = random_value;
+    }
+}
+
+int find_lowest_value_in_array(int array[], size_t array_size) {
+    int lowest_value;
+
+    for (size_t i = 0; i < array_size; i++) {
+        if (i == 0) {
+            lowest_value = array[i];
+        } else if (array[i] < lowest_value) {
+            lowest_value = array[i];
+        }
+    }
+    return lowest_value;
+}
+
+int find_index_highest_value_in_array(int array[], size_t array_size) {
+    int highest_value;
+    size_t index_highest_value = 0;
+
+    for (size_t i = 0; i < array_size; i++) {
+        if (i == 0) {
+            highest_value = array[i];
+        } else if (array[i] > highest_value) {
+            highest_value = array[i];
+            index_highest_value = i;
+        }
+    }
+    return index_highest_value;
+}
+
+void swap(int *x, int *y)
+{
+    int tmp = *x;
+    *x = *y;
+    *y = tmp;
+}
+
+int get_average_in_array(int array[], size_t array_size) {
+    int sum = 0, average = 0;
+
+    for (size_t i = 0; i < array_size; i++) {
+        sum += array[i];
+    }
+    average = sum / (int)array_size;
+
+    return average;
+}
+
+int get_variance_in_array(int array[], size_t array_size) {
+    int average = get_average_in_array(array, array_size);
+    int variance = 0;
+    
+    for (size_t i = 0; i < array_size; i++) {
+        int x = array[i] - average;
+        variance += pow(x, 2);
+    }
+
+    variance = variance / (int)array_size;
+    return variance;
+}
+
+void sort_array_asc(int array[], size_t array_size)
+{
+    int is_array_sorted = 0;
+
+    while (is_array_sorted == 0)
+    {
+        is_array_sorted = 1;
+
+        for (size_t i = 0; i < array_size; i++)
+        {
+            int previous_index = i - 1;
+            int current_value = array[i];
+
+            if (previous_index >= 0 && current_value < array[previous_index])
+            {
+                // Swap the current value with the previous one
+                is_array_sorted = 0;
+                swap(&array[i], &array[previous_index]);
+            }
+        }
+    }
+}
+
+int get_median_value(int array[], size_t array_size) {
+    int median = 0;
+    size_t index1 = (array_size - 1) / 2;
+
+    if (array_size % 2 == 0) {
+        size_t index2 = (array_size / 2);
+        int val1 = array[index1];
+        int val2 = array[index2];
+        median = (val1 + val2) / 2;
+    } else {
+        median = array[index1];
+    }
+    return median;
+}
+
+void create_histo(int array[], size_t array_size) {
+    size_t histo_size = array_size / PERCENT_OF_MAX_ARRAY_VALUE + 1; // +1 because we didn't exclude the maximal value with the random
+    int histo[histo_size];
+
+    // Initialize the element of the histo
+    for (size_t i = 0; i < histo_size; i++)
+    {
+        histo[i] = 0;
+    }
+    
+    // Create the histo
+    for (size_t i = 0; i < array_size; i++) {
+        int value = array[i];
+        histo[value] += 1;
+    }
+    
+    // Print horizontally the histo
+    printf("\nHorizontal histo :\n");
+    for (size_t i = 0; i < histo_size; i++)
+    {
+        printf("%ld : %d\n", i, histo[i]);
+    }
+
+    // Print vertically the histo
+    printf("\nVertical histo :\n");
+    for (size_t i = 0; i < histo_size; i++)
+    {
+        printf("%ld", i);
+    }
+    printf("\n");
+
+    int index_highest_value = find_index_highest_value_in_array(histo, (size_t)histo_size);
+    int highest_value = histo[index_highest_value];
+
+    for (size_t i = 0; i < highest_value; i++)
+    {
+        for (size_t x = 0; x < histo_size; x++)
+        {
+            if (histo[x] <= i) {
+                printf(" ");
+            } else {
+                printf("*");
+            }
+        }
+        printf("\n");
+    }
+}
\ No newline at end of file
diff --git a/unidimensional_array.h b/unidimensional_array.h
new file mode 100644
index 0000000000000000000000000000000000000000..b0fb4ff8ef3e97a4ad3630b5d2508a7738305cb4
--- /dev/null
+++ b/unidimensional_array.h
@@ -0,0 +1,29 @@
+/* Author : Dario GENGA
+ * Date : 02.11.2021
+ * Description : Manipulate an unidimensional array
+ */
+#ifndef _UNIDIMENSIONAL_ARRAY_H
+#define _UNIDIMENSIONAL_ARRAY_H
+#include <stdio.h>
+#define PERCENT_OF_MAX_ARRAY_VALUE 10
+
+size_t ask_array_size();
+
+void fill_array_with_random_values(int array[], size_t array_size);
+
+int find_lowest_value_in_array(int array[], size_t array_size);
+
+int find_index_highest_value_in_array(int array[], size_t array_size);
+
+void swap(int *x, int *y);
+
+int get_average_in_array(int array[], size_t array_size);
+
+int get_variance_in_array(int array[], size_t array_size);
+
+void sort_array_asc(int array[], size_t array_size);
+
+int get_median_value(int array[], size_t array_size);
+
+void create_histo(int array[], size_t array_size);
+#endif
\ No newline at end of file