c-first-steps

a C playground
Index Commits Files Refs README
commit 8b6ce552697b1cf86bb7550a9f1ab198d9a2dd18
parent 3d69f93dd9143363ecb71e626a22f22d9d704655
Author: Martin J. Klöckner <martin.cachari@gmail.com>
Date:   Sat, 19 Dec 2020 18:02:27 -0300

Reorganized files and directories, added part of summer recess project
(probably gonna make it secret until delivery date);

Diffstat:
A95.11/tp01/Makefile | 18++++++++++++++++++
A95.11/tp01/README.md | 17+++++++++++++++++
A95.11/tp01/include/arguments.h | 13+++++++++++++
A95.11/tp01/include/data.h | 4++++
A95.11/tp01/include/macros.h | 10++++++++++
A95.11/tp01/include/main.h | 10++++++++++
A95.11/tp01/main | 0
A95.11/tp01/src/arguments.c | 35+++++++++++++++++++++++++++++++++++
A95.11/tp01/src/data.c | 0
A95.11/tp01/src/main.c | 28++++++++++++++++++++++++++++
A95.11/workbook/clean.sh | 25+++++++++++++++++++++++++
A95.11/workbook/guia01/ej1.c | 39+++++++++++++++++++++++++++++++++++++++
A95.11/workbook/guia01/ej2.c | 15+++++++++++++++
A95.11/workbook/guia01/ej5.c | 27+++++++++++++++++++++++++++
A95.11/workbook/guia01/ej6.c | 20++++++++++++++++++++
A95.11/workbook/guia01/ej8.c | 27+++++++++++++++++++++++++++
A95.11/workbook/guia02/ex01.c | 16++++++++++++++++
A95.11/workbook/guia02/ex02.c | 21+++++++++++++++++++++
A95.11/workbook/guia02/ex03.c | 15+++++++++++++++
A95.11/workbook/guia02/ex04.c | 79+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A95.11/workbook/guia02/ex05.c | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A95.11/workbook/guia02/ex06.c | 27+++++++++++++++++++++++++++
A95.11/workbook/guia02/ex07.c | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A95.11/workbook/guia02/ex08.c | 73+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A95.11/workbook/guia02/ex09.c | 107+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A95.11/workbook/guia02/ex10.c | 39+++++++++++++++++++++++++++++++++++++++
A95.11/workbook/guia02/ex11.c | 39+++++++++++++++++++++++++++++++++++++++
A95.11/workbook/guia02/ex14.c | 11+++++++++++
A95.11/workbook/guia02/ex16.c | 16++++++++++++++++
A95.11/workbook/guia02/ex17.c | 12++++++++++++
A95.11/workbook/guia02/ex18.c | 92+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A95.11/workbook/guia03/a.out | 0
A95.11/workbook/guia03/ex01.c | 20++++++++++++++++++++
A95.11/workbook/guia03/ex02.c | 19+++++++++++++++++++
A95.11/workbook/guia03/ex04.c | 17+++++++++++++++++
A95.11/workbook/guia03/ex05.c | 14++++++++++++++
A95.11/workbook/guia03/ex06.c | 24++++++++++++++++++++++++
A95.11/workbook/guia03/ex07.c | 29+++++++++++++++++++++++++++++
A95.11/workbook/guia03/ex08.c | 38++++++++++++++++++++++++++++++++++++++
A95.11/workbook/guia03/ex08_modular.c | 66++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A95.11/workbook/guia03/ex09_modular.c | 60++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A95.11/workbook/guia03/ex10.c | 23+++++++++++++++++++++++
A95.11/workbook/guia03/ex11.c | 19+++++++++++++++++++
A95.11/workbook/guia03/ex12.c | 19+++++++++++++++++++
A95.11/workbook/guia03/ex13.c | 61+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A95.11/workbook/guia03/ex14.c | 35+++++++++++++++++++++++++++++++++++
A95.11/workbook/guia03/ex15.c | 21+++++++++++++++++++++
A95.11/workbook/guia03/ex16.c | 28++++++++++++++++++++++++++++
A95.11/workbook/guia03/ex17.c | 34++++++++++++++++++++++++++++++++++
A95.11/workbook/guia03/ex18.c | 57+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A95.11/workbook/guia03/ex20.c | 24++++++++++++++++++++++++
A95.11/workbook/guia03/ex21.c | 20++++++++++++++++++++
A95.11/workbook/guia03/ex22.c | 20++++++++++++++++++++
A95.11/workbook/guia03/ex23.c | 23+++++++++++++++++++++++
A95.11/workbook/guia03/ex23_imp.c | 28++++++++++++++++++++++++++++
A95.11/workbook/guia03/ex24.c | 27+++++++++++++++++++++++++++
A95.11/workbook/guia03/ex24_imp.c | 28++++++++++++++++++++++++++++
A95.11/workbook/guia03/ex25_imp.c | 53+++++++++++++++++++++++++++++++++++++++++++++++++++++
A95.11/workbook/guia03/ex26.c | 58++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A95.11/workbook/guia03/ex27.c | 27+++++++++++++++++++++++++++
A95.11/workbook/guia03/ex28.c | 13+++++++++++++
A95.11/workbook/guia03/ex29.c | 23+++++++++++++++++++++++
A95.11/workbook/guia03/ex30.c | 34++++++++++++++++++++++++++++++++++
A95.11/workbook/guia03/ex30_std_dev.c | 45+++++++++++++++++++++++++++++++++++++++++++++
A95.11/workbook/guia03/ex32.c | 65+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A95.11/workbook/guia03/ex33.c | 16++++++++++++++++
A95.11/workbook/guia03/ex34.c | 13+++++++++++++
A95.11/workbook/guia04/ex02.c | 15+++++++++++++++
A95.11/workbook/guia05/ex01.c | 18++++++++++++++++++
A95.11/workbook/guia05/ex02.c | 0
A95.11/workbook/guia06/ex01.c | 20++++++++++++++++++++
A95.11/workbook/guia07/ex05.c | 31+++++++++++++++++++++++++++++++
A95.11/workbook/guia08/ex01.c | 58++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A95.11/workbook/guia08/malloc_basics.c | 22++++++++++++++++++++++
A95.11/workbook/guia08/text.txt | 23+++++++++++++++++++++++
75 files changed, 2247 insertions(+), 0 deletions(-)
diff --git a/95.11/tp01/Makefile b/95.11/tp01/Makefile
@@ -0,0 +1,18 @@
+$(CC)=gcc
+
+all: make_main clean
+
+
+make_main: main.o arguments.o
+    $(CC) main.o arguments.o -o main
+
+main.o: src/main.c include/main.h include/arguments.h include/macros.h
+    $(CC) -c src/main.c
+
+arguments.o: src/arguments.c include/arguments.h include/macros.h
+    $(CC) -c src/arguments.c
+
+clean:
+    rm -f *.o
+
+
diff --git a/95.11/tp01/README.md b/95.11/tp01/README.md
@@ -0,0 +1,17 @@
+# TRABAJO PRACTICO NUMERO 1 - ALGORITMOS Y PROGRAMACION I (95.11)
+
+This folder contains the first project of "algoritmos y 
+programacion I" a subject from Facultad de Ingenieria de la
+Universidad de Buenos Aires. This project is a program that 
+runs on CLI which its function is to process data entered via 
+a .csv file, with a specified format, otherwise it will be considered
+corrupt. 
+
+What it does is receive a number for a country, date, and number of
+cases (of COVID19), and prints it on stdout with a human readable
+format.
+
+Bibliography:
+
+"The C programming language" - Brian W. Kernighan & Dennis Ritchie
+
diff --git a/95.11/tp01/include/arguments.h b/95.11/tp01/include/arguments.h
@@ -0,0 +1,13 @@
+#include "main.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifndef ARGUMENTS_H
+#define ARGUMENTS_H
+
+status_t validate_arguments(int argc, char * argv[]);
+
+status_t set_files_name(int argc, char * argv[], char * src, char * dest);
+
+#endif
diff --git a/95.11/tp01/include/data.h b/95.11/tp01/include/data.h
@@ -0,0 +1,4 @@
+#ifndef DATA_H
+#define DATA_H
+
+#endif
diff --git a/95.11/tp01/include/macros.h b/95.11/tp01/include/macros.h
@@ -0,0 +1,10 @@
+#ifndef MACROS_H
+#define MACROS_H
+
+#define NO_CMD_ARGUMENTS    1
+#define MAX_CMD_ARGUMENTS    5
+
+#define SOURCE_ARGUMENT            "-in"
+#define DESTINATION_ARGUMENT    "-out"
+
+#endif
diff --git a/95.11/tp01/include/main.h b/95.11/tp01/include/main.h
@@ -0,0 +1,10 @@
+#ifndef MAIN_H
+#define MAIN_H
+
+typedef enum {
+    OK,
+    ERROR_INVOCATING_PROGRAM,
+    ERROR_NULL_POINTER
+} status_t;
+
+#endif
diff --git a/95.11/tp01/main b/95.11/tp01/main
Binary files differ.
diff --git a/95.11/tp01/src/arguments.c b/95.11/tp01/src/arguments.c
@@ -0,0 +1,35 @@
+#include "../include/arguments.h"
+#include "../include/macros.h"
+
+
+//    Checks if the arguments are right;
+status_t validate_arguments(int argc, char * argv[])
+{
+    if(argc == NO_CMD_ARGUMENTS)
+        return ERROR_INVOCATING_PROGRAM;
+    else if(argv == NULL)
+        return ERROR_NULL_POINTER;
+
+    return OK;
+}
+
+//    Set the files name acording to the arguments;
+status_t set_files_name(int argc, char * argv[], char * src, char * dest)
+{
+    int i;
+    for(i = 1; i < argc; i++) {
+        if(!strcmp(argv[i], SOURCE_ARGUMENT)) {
+            printf("Encontre un '-in'\n");
+            strcpy(src, argv[++i]);
+            printf("\tthen input file: %s\n", src);
+        }
+        if(!strcmp(argv[i], DESTINATION_ARGUMENT)) {
+            printf("Encontre un '-out'\n");
+            strcpy(dest, argv[++i]);
+            printf("\tthen output file: %s\n", argv[i]);
+        }
+
+    }
+    return OK;
+}
+
diff --git a/95.11/tp01/src/data.c b/95.11/tp01/src/data.c
diff --git a/95.11/tp01/src/main.c b/95.11/tp01/src/main.c
@@ -0,0 +1,28 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "../include/main.h"
+#include "../include/arguments.h"
+#include "../include/macros.h"
+
+int main(int argc, char * argv[])
+{
+    status_t st;
+    if((st = validate_arguments(argc, argv)) != OK)
+        return st;
+    
+    char * src;
+    char * dest;
+
+    src = (char *)malloc(100 * sizeof(char));
+    dest = (char *)malloc(100 * sizeof(char));
+
+    if((st = set_files_name(argc, argv, src, dest)) != OK)
+        return st;
+
+    printf("src: %s, dest: %s;\n", src, dest);
+
+    return OK;
+}
+
+
diff --git a/95.11/workbook/clean.sh b/95.11/workbook/clean.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+
+# Removes every a.out from every subfolder where the 
+# script is executed;
+
+# Set the filename;
+file='a.out'
+
+# The path where 'file' is gonna be looked for;
+subfolders=./**/$file
+currentdir=./$file
+
+# First checks  if the file exist in the current directory
+# or in any sub-folder, if exist removes it from everywhere;
+if [ -e $currentdir ] || [ -e $subfolders ];
+then
+        rm -v -f ./**/"$file" 
+        rm -v -f "$file"
+        echo "everithing cleaned succesfully"
+
+# if doesn't exist then does nothing;
+else
+        echo "everything seems clean"
+        echo "there is nothing to do"
+fi
diff --git a/95.11/workbook/guia01/ej1.c b/95.11/workbook/guia01/ej1.c
@@ -0,0 +1,39 @@
+#include <stdio.h>
+
+#define DIVISA_NAME_ARS    "Pesos"
+#define DIVISA_NAME_BRL    "Reales"
+#define DIVISA_NAME_USD    "Dolares"
+#define DIVISA_NAME_EUR "Euros"
+
+#define MAX_DIVISAS    4
+
+typedef enum {
+    ARS, BRL, USD, EUR
+} divisa_t;
+
+
+int main( void ) {
+
+    divisa_t divisa_origen = ARS;
+    divisa_t divisa_final = USD;
+
+    float monto_origen, monto_final;
+
+    monto_origen = 1000;
+    
+
+
+    float divisas[MAX_DIVISAS][MAX_DIVISAS] = {
+        {1.000, 0.067, 0.012, 0.011},    //    ARS
+        {0.067, 1.000, 0.190, 0.160},    //    BRL
+        {0.012, 0.190, 1.000, 0.850},    //    USD
+        {0.011, 0.160, 0.850, 1.000}    //    EUR
+    };
+
+    monto_final = (monto_origen * divisas[divisa_origen][divisa_final]);
+    printf("%f\n", monto_final);
+
+    return 0;
+}
+
+
diff --git a/95.11/workbook/guia01/ej2.c b/95.11/workbook/guia01/ej2.c
@@ -0,0 +1,15 @@
+/*    Calculates the total resistance of a closed circuit    */
+
+#include <stdio.h>
+
+#define MAX_RESISTORS 7
+
+int main( void  ) {
+
+    int resistor[MAX_RESISTORS];
+
+
+
+
+    return 0;
+}
diff --git a/95.11/workbook/guia01/ej5.c b/95.11/workbook/guia01/ej5.c
@@ -0,0 +1,27 @@
+#include <stdio.h>
+#include <math.h>
+
+int main( void ) {
+
+    float raiz = 25;
+    float inv = 4;
+
+    printf("sqrt(%.2f) = ", raiz);
+
+    if(raiz > 0)
+        raiz = sqrt(raiz);
+    else
+        return 1;
+
+    printf("%.2f\n", raiz);
+    printf("inv(%.2f) = ", inv);
+
+    if (inv != 0)
+        inv = 1/inv;
+    else
+        return 1;
+
+    printf("%.2f\n", inv);
+
+    return 0;
+}
diff --git a/95.11/workbook/guia01/ej6.c b/95.11/workbook/guia01/ej6.c
@@ -0,0 +1,20 @@
+#include <stdio.h>
+#include <math.h>
+
+
+int main( void ) {
+
+    int a, b, c;
+    float x1, x2;
+    
+    a =  1;
+    b = -12;
+    c =  36;
+
+    x1 = ((-b) + sqrtf( (b*b)-(4*a*c) )) / (2*a);
+    x2 = ((-b) - sqrtf( (b*b)-(4*a*c) )) / (2*a);
+
+    printf("x1 = % .2f\nx2 = % .2f\n", x1, x2);
+
+    return 0;
+}
diff --git a/95.11/workbook/guia01/ej8.c b/95.11/workbook/guia01/ej8.c
@@ -0,0 +1,27 @@
+/*    Calculates the factorial of a given number.    */
+
+#include <stdio.h>
+
+#define ERR_MSG_NEG "ERR: The entered number is negative!"
+
+int main(void) {
+    
+    int fact, i, res;
+
+    printf("Enter a number: ");
+    if(scanf("%i", &fact) == EOF)
+        return 1;        
+
+    if(fact < 0) {
+        printf(ERR_MSG_NEG"\n");
+        return 1;
+    }
+
+    res = 1;
+    for(i = 1; i <= fact; i++) {
+        res *= i;
+    }
+
+    printf("%d! = %d\n", fact, res);
+    return 0;
+}
diff --git a/95.11/workbook/guia02/ex01.c b/95.11/workbook/guia02/ex01.c
@@ -0,0 +1,16 @@
+#include <stdio.h>
+
+typedef enum {
+        FALSE,
+        TRUE
+} bool_t; 
+
+int main(void)
+{
+    bool_t isworking = TRUE;
+    printf("%s\n", isworking ? "TRUE" : "FALSE");
+
+    return 0;
+}
+
+
diff --git a/95.11/workbook/guia02/ex02.c b/95.11/workbook/guia02/ex02.c
@@ -0,0 +1,21 @@
+#include <stdio.h>
+
+typedef enum {
+        ERROR,
+        OK
+} status_t; 
+
+int main(void)
+{
+
+    status_t isworking = OK;
+
+    if (isworking == 1)
+        printf("OK\n");
+    else
+        printf("ERROR\n");
+
+    return 0;
+}
+
+
diff --git a/95.11/workbook/guia02/ex03.c b/95.11/workbook/guia02/ex03.c
@@ -0,0 +1,15 @@
+#include <stdio.h>
+
+typedef enum {
+    LUN, MAR, MIE, JUE, VIE, SAB, DOM
+} dia_t;
+
+int main(void)
+{
+    dia_t dia = VIE;
+
+    printf("%d\n", dia);
+    
+
+    return 0;
+}
diff --git a/95.11/workbook/guia02/ex04.c b/95.11/workbook/guia02/ex04.c
@@ -0,0 +1,79 @@
+/*    Ejercicio 4 - Guia 2, Algoritmos y Programacion I - FIUBA    */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#define MAX_INP_LEN 10
+
+typedef enum {
+    FAHRENHEIT,
+    CELSIUS
+} escala_t;
+
+typedef float dato_t;    
+                    
+dato_t ftoc(dato_t fahrenheit)
+{
+    return (((fahrenheit - 32) *5 ) / 9);
+}
+
+dato_t ctof(dato_t celsius)
+{
+    return (((celsius * 9) / 5) + 32);
+}
+
+void title(int i)
+{
+    printf(
+        "---------------------------------------\n"
+        "---------------------------------------\n"
+        "--- %s TO %s CONVERTER ---\n"
+        "---------------------------------------\n"
+        "---      to exit press Ctrl+D      ----\n"
+        "---------------------------------------\n"
+        "---------------------------------------\n",
+        i ? "CELSIUS" : "FAHRENHEIT",
+        i ? "FAHRENHEIT" : "CELSIUS"
+    );
+}
+
+void cursor()
+{
+    printf(">> ");
+}
+
+
+
+int main(void)
+{
+    char buffer[MAX_INP_LEN];
+    escala_t c;
+    dato_t i, res;
+    printf("0 - FAHRENHEIT TO CELSIUS\n");
+    printf("1 - CELSIUS TO FAHRENHEIT\n");
+    cursor();
+    c = getchar() - '0';
+    if (c == FAHRENHEIT) {
+        title(FAHRENHEIT);
+        while (fgets(buffer, MAX_INP_LEN, stdin) != NULL) {
+            i = atoi(buffer);
+            res = ftoc(i);
+            printf("%.0f°F = %.2f°C\n", i, res);
+            cursor();
+        }
+    } else if (c == CELSIUS) {
+        title(CELSIUS);
+        while (fgets(buffer, MAX_INP_LEN, stdin) != NULL) {
+            i = atoi(buffer);
+            res = ctof(i);
+            printf("%.0f°C = %.2f°F\n", i, res);
+            cursor();
+        }
+    }
+    printf("\n");
+    return 0;
+}
+
+
+
diff --git a/95.11/workbook/guia02/ex05.c b/95.11/workbook/guia02/ex05.c
@@ -0,0 +1,62 @@
+#include <stdio.h>
+
+typedef enum {
+    JAN, FEB, MAR, APR, MAY, JUN, JUL, AGO, SEP, OCT, NOV, DEC
+} mes_t;
+
+#define JANUARY        "ENERO"
+#define FEBRUARY    "FEBRERO"
+#define MARCH         "MARZO"
+#define APRIL        "ABRIL"
+#define MAYO        "MAYO"
+#define JUNE        "JUNIO"
+#define JULY        "JULIO"
+#define AUGUST        "AGOSTO"
+#define SEPTEMBER    "SEPTIEMBRE"
+#define OCTOBER        "OCTUBRE"
+#define NOVEMBER    "NOVIEMBRE"
+#define DECEMBER    "DICIEMBRE"
+
+int main(void) {
+    mes_t mes = NOV;
+    switch(mes)
+    {
+        case JAN:
+            printf(JANUARY"\n");
+            break;
+        case FEB:
+            printf(FEBRUARY"\n");
+            break;
+        case MAR:
+            printf(MARCH"\n");
+            break;
+        case APR:
+            printf(APRIL"\n");
+            break;
+        case MAY:
+            printf(MAYO"\n");
+            break;
+        case JUN:
+            printf(JUNE"\n");
+            break;
+        case JUL:
+            printf(JULY"\n");
+            break;
+        case AGO:
+            printf(AUGUST"\n");
+            break;
+        case SEP:
+            printf(SEPTEMBER"\n");
+            break;
+        case OCT:
+            printf(OCTOBER"\n");
+            break;
+        case NOV:
+            printf(NOVEMBER"\n");
+            break;
+        case DEC:
+            printf(DECEMBER"\n");
+            break;
+    }    
+    return 0;
+}
diff --git a/95.11/workbook/guia02/ex06.c b/95.11/workbook/guia02/ex06.c
@@ -0,0 +1,27 @@
+#include <stdio.h>
+#include <ctype.h>
+
+int main(void)
+{
+    int alpha, nonalpha, num;
+    int c;
+    
+    alpha = nonalpha = num = 0;
+
+    while((c = getchar()) != EOF ) {
+        if(isalpha(c))
+            alpha++;
+        else if(isdigit(c))
+            num++;
+        else if(!isalnum(c))
+            nonalpha++;
+    }
+    printf(
+        "Alphanumerics: %d\n"
+        "NonAlphanumerics: %d\n"
+        "Digits: %d\n",
+        alpha, nonalpha, num
+    );
+
+    return 0;
+}
diff --git a/95.11/workbook/guia02/ex07.c b/95.11/workbook/guia02/ex07.c
@@ -0,0 +1,62 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+#define MAX_LEN 5    // max digits of the entered degree;
+#define ERR_MSG_LEN "El angulo ingresado contiene demasiados digitos"
+
+typedef enum {
+    AGUDO, OBTUSO, RECTO
+} angulo_t;
+
+
+void clean(char *buffer)
+{
+    for(size_t i = 0; i < MAX_LEN; i++)
+        buffer[i] = '\0';
+}
+
+
+int main(void) {
+    
+    char buffer[MAX_LEN];
+    clean(buffer);
+    int c, d, e, i;
+    i = 0;        
+    while(((c = getchar()) != EOF) && c != '\n') {
+        if(i < MAX_LEN) {
+            buffer[i] = c;
+            i++;
+        } else if (i >= MAX_LEN) {
+            fprintf(stderr, ERR_MSG_LEN"\n");
+            return 1;
+        }
+    }
+    d = atoi(buffer);
+
+    if (d < 90)
+        e = AGUDO;
+    else if (d == 90)
+        e = RECTO;
+    else if (d > 90)
+        e = OBTUSO;
+
+
+    switch (e)
+    {
+        case AGUDO:
+            printf("El angulo es AGUDO\n");
+            break;
+        case RECTO:
+            printf("El angulo es RECTO\n");
+            break;
+        case OBTUSO:
+            printf("El angulo es OBTUSO\n");
+            break;
+    }
+    return 0;
+}
+
+
+
+
diff --git a/95.11/workbook/guia02/ex08.c b/95.11/workbook/guia02/ex08.c
@@ -0,0 +1,73 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+#define MAX_LEN 5    // max digits of the entered degree;
+#define ERR_MSG_LEN "El angulo ingresado contiene demasiados digitos"
+
+#define FST_YR 48
+#define SND_YR 95
+#define TRD_YR 143
+
+
+typedef enum {
+    FIRST, SECOND, THIRD, FOURTH
+} year_t;
+
+
+void clean(char *buffer)
+{
+    for(size_t i = 0; i < MAX_LEN; i++)
+        buffer[i] = '\0';
+}
+
+
+int main(void) {
+    
+    char buffer[MAX_LEN];
+    clean(buffer);
+    int c, d, i;
+    year_t e;
+    i = 0;        
+    while(((c = getchar()) != EOF) && c != '\n') {
+        if(i < MAX_LEN) {
+            buffer[i] = c;
+            i++;
+        } else if (i >= MAX_LEN) {
+            fprintf(stderr, ERR_MSG_LEN"\n");
+            return 1;
+        }
+    }
+    d = atoi(buffer);
+
+    if (d <= FST_YR) 
+        e = FIRST;
+    else if ((d > FST_YR) && (d <= SND_YR))
+        e = SECOND;
+    else if ((d > SND_YR) && d <= (TRD_YR))
+        e = THIRD;
+    else if (d > TRD_YR) 
+        e = FOURTH;
+
+
+    switch (e)
+    {
+        case FIRST:
+            printf("Primer año\n");
+            break;
+        case SECOND:
+            printf("Segundo año\n");
+            break;
+        case THIRD:
+            printf("Tercer año\n");
+            break;
+        case FOURTH:
+            printf("Curto año o superior\n");
+            break;
+    }
+    return 0;
+}
+
+
+
+
diff --git a/95.11/workbook/guia02/ex09.c b/95.11/workbook/guia02/ex09.c
@@ -0,0 +1,107 @@
+/*    Reads a number of credits from stdin and prints the corresponding
+    grade of the Engineer in stdout*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+#define MAX_LEN 5    // max digits of the entered degree;
+#define ERR_MSG_LEN "El numero ingresado contiene demasiados digitos"
+#define ERR_NEG_MSG "El numero ingresado no es valido"
+
+#define FST_YR 52
+#define SND_YR 104
+#define TRD_YR 156
+
+#define FST_MSG "Primer año"
+#define SND_MSG "Segundo año"
+#define TRD_MSG "Tercer año"
+#define FTH_MSG "Cuarto año"
+
+typedef enum {
+    FIRST, SECOND, THIRD, FOURTH
+} year_t;
+
+typedef enum {
+    OK, ERROR
+} status_t;
+
+status_t clean(char *buffer)
+{
+    if(buffer == NULL)
+        return ERROR;
+
+    for(size_t i = 0; i < MAX_LEN; i++)
+        buffer[i] = '\0';
+    
+    return OK;
+}
+
+
+int main(void) {
+    
+    /*    Defining variables    */
+    char buffer[MAX_LEN]; 
+    int c, credits, i;
+    year_t year;
+    i = 0;        
+    
+    /*    Cleaning buffer in case it contains a random number    */ 
+    if(clean(buffer) == ERROR)
+        return ERROR;
+    
+    /*    Reading one char from stdin and storing it on a buffer until EOF    */
+    while(((c = getchar()) != EOF) && c != '\n') {
+        if(i < MAX_LEN) {
+            buffer[i] = c;
+            i++;
+        } else if (i >= MAX_LEN) {
+            fprintf(stderr, ERR_MSG_LEN"\n");
+            return 1;
+        }
+    }
+    
+    /*    Converting the first portion of buffer to int with atoi() 
+        and cleaning the buffer    */
+    credits = atoi(buffer);
+    if(clean(buffer) == ERROR)
+        return ERROR;
+
+    /*    Checks if credits is a valid number    */
+    if(credits < 0) {
+        fprintf(stderr, ERR_NEG_MSG"\n");
+        return 1;
+    }
+
+    /*    Evaluating the numbers of credits to match the current year     */
+    if (credits <= FST_YR) 
+        year = FIRST;
+    else if ((credits > FST_YR) && (credits <= SND_YR))
+        year = SECOND;
+    else if ((credits > SND_YR) && (credits <= TRD_YR))
+        year = THIRD;
+    else if (credits > TRD_YR) 
+        year = FOURTH;
+
+    /*    Printing to stdout the corresponding year    */
+    switch (year)
+    {
+        case FIRST:
+            printf(FST_MSG"\n");
+            break;
+        case SECOND:
+            printf(SND_MSG"\n");
+            break;
+        case THIRD:
+            printf(TRD_MSG"\n");
+            break;
+        case FOURTH:
+            printf(FTH_MSG"\n");
+            break;
+    }
+    return OK;
+}
+
+
+
+
diff --git a/95.11/workbook/guia02/ex10.c b/95.11/workbook/guia02/ex10.c
@@ -0,0 +1,39 @@
+#include <stdio.h>
+
+
+#define TM "3M Corporation"
+#define MAXWELL "Maxwell Corporation"
+#define SONY "Sony Corporation"
+#define VERBATIM "Verbatim Corporation"
+
+typedef enum {
+    TM_CORPORATION,
+    MAXWELL_CORPORATION,
+    SONY_CORPORATION,
+    VERBATIM_CORPORATION
+} manufacturer_t;
+
+
+int main(void) {
+    manufacturer_t c;
+    printf("Introduzca un Id. de fabricante: ");
+    c = (getchar() - '0');
+    switch(c) {
+        case TM_CORPORATION:
+            printf(TM"\n");
+            break;
+        case MAXWELL_CORPORATION:
+            printf(MAXWELL"\n");
+            break;
+        case SONY_CORPORATION:
+            printf(SONY"\n");
+            break;
+        case VERBATIM_CORPORATION:
+            printf(VERBATIM"\n");
+            break;
+        default:
+            printf("El numero ingresado no es valido\n");
+            return 1;
+    }
+    return 0;
+}
diff --git a/95.11/workbook/guia02/ex11.c b/95.11/workbook/guia02/ex11.c
@@ -0,0 +1,39 @@
+#include <stdio.h>
+
+
+#define TM            "3M Corporation"
+#define MAXWELL        "Maxwell Corporation"
+#define SONY        "Sony Corporation"
+#define VERBATIM     "Verbatim Corporation"
+
+typedef enum {
+    TM_CORPORATION            = '3',
+    MAXWELL_CORPORATION        = 'M',
+    SONY_CORPORATION        = 'S',    
+    VERBATIM_CORPORATION    = 'V'
+} manufacturer_t;
+
+
+int main(void) {
+    manufacturer_t c;
+    printf("Introduzca un Id. de fabricante: ");
+    c = getchar();
+    switch(c) {
+        case TM_CORPORATION:
+            printf(TM"\n");
+            break;
+        case MAXWELL_CORPORATION:
+            printf(MAXWELL"\n");
+            break;
+        case SONY_CORPORATION:
+            printf(SONY"\n");
+            break;
+        case VERBATIM_CORPORATION:
+            printf(VERBATIM"\n");
+            break;
+        default:
+            printf("El numero ingresado no es valido\n");
+            return 1;
+    }
+    return 0;
+}
diff --git a/95.11/workbook/guia02/ex14.c b/95.11/workbook/guia02/ex14.c
@@ -0,0 +1,11 @@
+#include <stdio.h>
+
+typedef enum { 
+    1200, 2400, 4800, 9600 
+} baudrate_t;
+
+int main(void) 
+{
+    baudrate_t baudrate = 9600;
+    return 0;
+}    
diff --git a/95.11/workbook/guia02/ex16.c b/95.11/workbook/guia02/ex16.c
@@ -0,0 +1,16 @@
+#include <stdio.h>
+
+#define TRUE 0
+
+#ifdef TRUE
+    #undef TRUE
+    #define TRUE 1
+#endif
+
+int main(void) 
+{
+    printf("TRUE = %d\n", TRUE);
+    return 0;
+}
+
+
diff --git a/95.11/workbook/guia02/ex17.c b/95.11/workbook/guia02/ex17.c
@@ -0,0 +1,12 @@
+#include <stdio.h>
+
+int main(void)
+{
+    #ifdef DEBUG
+        printf("DEBUGGING\n");
+    #endif
+    
+    printf("Hello world!\n");
+
+    return 0;
+}
diff --git a/95.11/workbook/guia02/ex18.c b/95.11/workbook/guia02/ex18.c
@@ -0,0 +1,92 @@
+#include <stdio.h>
+
+#define LANGUAGE GER    //    Define language in which month are displyed ESP,GER,ENG
+
+#if LANGUAGE == ESP
+    #define JANUARY        "ENERO"
+    #define FEBRUARY    "FEBRERO"
+    #define MARCH         "MARZO"
+    #define APRIL        "ABRIL"
+    #define MAYO        "MAYO"
+    #define JUNE        "JUNIO"
+    #define JULY        "JULIO"
+    #define AUGUST        "AGOSTO"
+    #define SEPTEMBER    "SEPTIEMBRE"
+    #define OCTOBER        "OCTUBRE"
+    #define NOVEMBER    "NOVIEMBRE"
+    #define DECEMBER    "DICIEMBRE"
+#elif LANGUAGE == GER 
+    #define JANUARY        "JANUAR"
+    #define FEBRUARY    "FEBRUAR"
+    #define MARCH         "MÄRZ"
+    #define APRIL        "APRIL"
+    #define MAYO        "MAI"
+    #define JUNE        "JUNI"
+    #define JULY        "JULI"
+    #define AUGUST        "AUGUST"
+    #define SEPTEMBER    "SEPTEMBER"
+    #define OCTOBER        "OKTOBER"
+    #define NOVEMBER    "NOVEMBER"
+    #define DECEMBER    "DEZEMBER"
+#else 
+    #define JANUARY        "JANUARY"
+    #define FEBRUARY    "FEBRUARY"
+    #define MARCH         "MARCH"
+    #define APRIL        "ABPRIL"
+    #define MAYO        "MAY"
+    #define JUNE        "JUNE"
+    #define JULY        "JULY"
+    #define AUGUST        "AUGUST"
+    #define SEPTEMBER    "SEPTEMBER"
+    #define OCTOBER        "OCTOBER"
+    #define NOVEMBER    "NOVEMBER"
+    #define DECEMBER    "DECEMBER"
+#endif
+
+typedef enum {
+    JAN, FEB, MAR, APR, MAY, JUN, JUL, AGO, SEP, OCT, NOV, DEC
+} mes_t;
+
+int main(void) {
+    mes_t mes = MAR;
+    switch(mes)
+    {
+        case JAN:
+            printf(JANUARY"\n");
+            break;
+        case FEB:
+            printf(FEBRUARY"\n");
+            break;
+        case MAR:
+            printf(MARCH"\n");
+            break;
+        case APR:
+            printf(APRIL"\n");
+            break;
+        case MAY:
+            printf(MAYO"\n");
+            break;
+        case JUN:
+            printf(JUNE"\n");
+            break;
+        case JUL:
+            printf(JULY"\n");
+            break;
+        case AGO:
+            printf(AUGUST"\n");
+            break;
+        case SEP:
+            printf(SEPTEMBER"\n");
+            break;
+        case OCT:
+            printf(OCTOBER"\n");
+            break;
+        case NOV:
+            printf(NOVEMBER"\n");
+            break;
+        case DEC:
+            printf(DECEMBER"\n");
+            break;
+    }    
+    return 0;
+}
diff --git a/95.11/workbook/guia03/a.out b/95.11/workbook/guia03/a.out
Binary files differ.
diff --git a/95.11/workbook/guia03/ex01.c b/95.11/workbook/guia03/ex01.c
@@ -0,0 +1,20 @@
+#include <stdio.h>
+
+#define MAX_LEN 100
+
+
+int main(void) {
+
+    char s[MAX_LEN];
+
+    printf("> ");
+    scanf("%s", s);
+    puts(s);
+
+    printf("> ");
+    // gets(s); removed from std C11 because it's very unsecure
+    fgets(s, MAX_LEN, stdin);
+    puts(s);
+
+    return 0;
+}
diff --git a/95.11/workbook/guia03/ex02.c b/95.11/workbook/guia03/ex02.c
@@ -0,0 +1,19 @@
+#include <stdio.h>
+#include <string.h>
+
+#define MAX_LEN 100
+#define ERR_EMPTY_MSG "no chars have been readed"
+
+int main(void) {
+    
+    char s[MAX_LEN];
+    if(fgets(s, MAX_LEN, stdin) == NULL) {
+        fprintf(stderr, ERR_EMPTY_MSG"\n");
+        return 1;
+    } else if(strcmp(s, "") == 0) {
+        fprintf(stderr, ERR_EMPTY_MSG"\n");
+        return 1;
+    }
+    printf("%s", s);
+    return 0;
+}
diff --git a/95.11/workbook/guia03/ex04.c b/95.11/workbook/guia03/ex04.c
@@ -0,0 +1,17 @@
+#include <stdio.h>
+#include <string.h>
+
+int main(void) {
+
+    char s[] = "Hello world!\n";
+    char aux;
+    int n;
+
+    for(n = strlen(s); n >= 0; n--) {
+        aux = s[n];
+        if(aux != '\n')
+            putchar(aux);
+    }
+    putchar('\n');
+    return 0;
+}
diff --git a/95.11/workbook/guia03/ex05.c b/95.11/workbook/guia03/ex05.c
@@ -0,0 +1,14 @@
+/*    Calculates the length of a string and prints it on stdout    */
+
+#include <stdio.h>
+
+int main(void) {
+
+    char s[] = "Hello world!\n";
+    int i;    
+    for(i = 0; s[i] != '\0'; i++) {
+    }
+    printf("%d\n", i);
+    
+    return 0;
+}
diff --git a/95.11/workbook/guia03/ex06.c b/95.11/workbook/guia03/ex06.c
@@ -0,0 +1,24 @@
+#include <stdio.h>
+#include <string.h>
+
+
+
+int main(void) {
+
+    char origen[] = "Hello world!\n";
+    size_t i, len;
+    len = strlen(origen);    
+    char destino[len];
+
+    for(i = 0; i <= len; i++) {
+        destino[i] = origen[i];
+        if(i == len)
+            destino[i + 1] = '\0';
+    }
+
+    printf("%s", origen);
+    printf("%s", destino);
+
+
+    return 0;
+}
diff --git a/95.11/workbook/guia03/ex07.c b/95.11/workbook/guia03/ex07.c
@@ -0,0 +1,29 @@
+#include <stdio.h>
+#include <string.h>
+
+
+int main(void) {
+
+    char s1[] = "Hello world!";
+    char s2[] = "Hola mundo!";
+
+
+    int i, s1_len, s2_len, cat_len;
+    s1_len = strlen(s1);
+    s2_len = strlen(s2);
+
+    cat_len = ((s1_len + s2_len) + 1); //    One more for the '\0' byte;
+    char cat[cat_len];
+
+    for(i = 0; i <= cat_len; i++) {
+        if (i < s1_len) {
+            cat[i] = s1[i];
+        } else if (i >= s1_len) {
+            cat[i] = s2[i - s1_len];
+        } else if (i == cat_len) {
+            cat[i + 1] = '\0';
+        }
+    }
+    printf("%s\n", cat);
+    return 0;
+}
diff --git a/95.11/workbook/guia03/ex08.c b/95.11/workbook/guia03/ex08.c
@@ -0,0 +1,38 @@
+#include <stdio.h>
+#include <string.h>
+
+size_t str_len(const char *str) {
+    if(str == NULL)
+        return 1;
+
+    size_t i;
+    for(i = 0; str[i] != '\0'; i++)
+        ; 
+
+    return i;
+}
+
+int main(void) {
+
+    char s1[] = "ABC";
+    char s2[] = "ABC";
+
+    size_t s1_len, s2_len;
+    int i, j, cmp;
+
+    s1_len = str_len(s1);
+    s2_len = str_len(s2);
+    
+    j = (s1_len > s2_len) ? s1_len : s2_len;
+
+    for(i = 0, cmp = 0; i < j; i++) {
+        if(s1[i] < s2[i]) {
+            cmp -= (s2[i] - s1[i]);
+        } else 
+            if (s1[i] > s2[i]) {
+                cmp += (s1[i] - s2[i]);
+            }
+    }    
+    printf("%d\n", cmp);
+    return 0;
+}
diff --git a/95.11/workbook/guia03/ex08_modular.c b/95.11/workbook/guia03/ex08_modular.c
@@ -0,0 +1,66 @@
+/*    Makes a lexicographical comparison between two strings    */
+/*    similar to strcmp() function from <string.h>        */
+
+#include <stdio.h>
+
+/*    This function calculates the length of given string
+    and returns the lenghth by its name as a size_t        */
+size_t str_len(const char *str) 
+{
+    if(str == NULL)
+        return 1;
+    size_t i;
+    for(i = 0; str[i] != '\0'; i++) 
+        ;
+
+    return i;
+}
+
+/*    This function is equivalent to strcmp() function from    
+    <string.h> library                    */
+int str_cmp(const char *str1, const char *str2) 
+{ 
+//    In case one of the given strings is NULL returns 1; 
+    if(str1 == NULL || str2 == NULL)
+        return 1;
+
+
+    char aux1, aux2;
+    int i, j, cmp, str1_len, str2_len;
+    str1_len = str_len(str1);
+    str2_len = str_len(str2);
+
+//    Assigns the length of the longer string to j;
+    j = (str1_len > str2_len) ? str1_len : str2_len; 
+
+//    The for loop itinirate until the longest str ENDs
+    for(i = 0, cmp = 0; i < j; i++) {
+
+        aux1 = str1[i];
+        aux2 = str2[i];
+
+//        This statement assigns to cmp the difference between
+//        the two coresponding chars of str1 and str2
+        if(aux1 < aux2) {
+            cmp -= (aux2 - aux1);
+        } else if (aux1 > aux2) {
+                cmp += (aux1 - aux2);
+            }
+
+    }
+    return cmp;
+}
+
+    
+int main(void) {
+
+    char s1[] = "AB";
+    char s2[] = "ABC";
+
+    int i, j;
+    i = str_cmp(s1, s2);
+
+    printf("%d\n", i);
+    
+    return 0;
+}
diff --git a/95.11/workbook/guia03/ex09_modular.c b/95.11/workbook/guia03/ex09_modular.c
@@ -0,0 +1,60 @@
+/*  Makes a lexicographical comparison between the first n    */
+/*    numbers of two given strings                            */
+/*    similar to strncmp() function from <string.h>            */
+
+#include <stdio.h>
+
+/*    This function calculates the length of given string
+    and returns it by its name, equivalent to strlen()        
+    function from <string.h> library                        */
+size_t str_len(const char *str)
+{
+    if(str == NULL)
+        return 1;
+
+    size_t i;
+    for(i = 0; str[i] != '\0'; i++) 
+        ;
+
+    return i;
+}
+
+/*  This function is equivalent to strncmp() function from   
+    <string.h> library                                      */
+int str_cmp(const char *str1, const char *str2, size_t n)
+{ 
+    if(str1 == NULL || str2 == NULL)
+        return 1;
+
+    char aux1, aux2;
+    int i, j, cmp, str1_len, str2_len;
+    str1_len = str_len(str1);
+    str2_len = str_len(str2);
+    
+    if(n > str1_len || n > str2_len)
+        return 1;
+
+    for(i = 0, cmp = 0; i <= n; i++) {
+        aux1 = str1[i];
+        aux2 = str2[i];
+        if(aux1 < aux2) {
+            cmp -= (aux2 - aux1);
+        } else if (aux1 > aux2) {
+                cmp += (aux1 - aux2);
+            }
+    }
+    return cmp;
+}
+
+    
+int main(void) {
+
+    char s1[] = "AB ";
+    char s2[] = "ABC";
+
+    int i;
+    i = str_cmp(s1, s2, 4);
+
+    printf("%d\n", i);
+    return 0;
+}
diff --git a/95.11/workbook/guia03/ex10.c b/95.11/workbook/guia03/ex10.c
@@ -0,0 +1,23 @@
+#include <stdio.h>
+#include <string.h>
+
+
+
+int main(void) {
+
+    char src[] = "Hello world!\n";
+    size_t i, n;
+
+    n = 12;
+    char cpy[n];
+
+    for(i = 0; i <= n; i++) {
+        cpy[i] = src[i];
+    }
+
+    printf("%s", src);
+    printf("%s", cpy);
+
+
+    return 0;
+}
diff --git a/95.11/workbook/guia03/ex11.c b/95.11/workbook/guia03/ex11.c
@@ -0,0 +1,19 @@
+#include <stdio.h>
+#include <ctype.h>
+
+int main(void) 
+{
+    char str[] = "hello world";
+    int i;
+    char aux;
+
+    for(i = 0; (aux = str[i]) != '\0'; i++)
+        if(islower(aux))
+            str[i] = toupper(aux);
+
+    printf("%s\n", str);
+    return 0;
+}
+
+
+
diff --git a/95.11/workbook/guia03/ex12.c b/95.11/workbook/guia03/ex12.c
@@ -0,0 +1,19 @@
+#include <stdio.h>
+#include <ctype.h>
+
+int main(void) 
+{
+    char str[] = "HELLO WORLD";
+    int i;
+    char aux;
+
+    for(i = 0; (aux = str[i]) != '\0'; i++)
+        if(isupper(aux))
+            str[i] = tolower(aux);
+
+    printf("%s\n", str);
+    return 0;
+}
+
+
+
diff --git a/95.11/workbook/guia03/ex13.c b/95.11/workbook/guia03/ex13.c
@@ -0,0 +1,61 @@
+//    Reads a string from stdin and converts it to uppercase or lowercase 
+//    depending on an option readed from stdin
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#define MSG_STR_PROMPT    "Introduzca una cadena:"
+#define MSG_FMT_PROMPT    "Convertir a: (0 - MAYUSCULAS / 1 - MINUSCULAS)"
+#define MSG_FMT_ERR        "Err: Formato incorrecto"
+
+#define MAX_STR_LEN 100
+
+typedef enum {
+    FMT_MAYUSCULAS, FMT_MINUSCULAS
+} format_t;
+
+
+int main ( void ) {
+
+
+    char buffer[MAX_STR_LEN];
+    char str[MAX_STR_LEN];
+    format_t format;
+
+
+    printf(MSG_STR_PROMPT"\n>> ");
+    fgets(buffer, MAX_STR_LEN, stdin);
+    strcpy(str, buffer);
+
+    printf(MSG_FMT_PROMPT"\n>> ");
+    format = (getchar () - '0');
+    if((format < 0) || (format > 1)) {
+        fprintf(stderr, MSG_FMT_ERR"\n");
+        return 1;
+    }
+
+    printf("La cadena ingresada: %sOpcion elegida: %d\n", str, format);            
+
+    int i, aux;
+    switch(format)
+    {
+        case FMT_MAYUSCULAS: 
+            for(i = 0; (aux = str[i]) != '\n'; i++) {
+                if(islower(aux))
+                    str[i] = toupper(aux);
+            }
+            break;
+        case FMT_MINUSCULAS:
+            for(i = 0; (aux = str[i]) != '\n'; i++) {
+                if(isupper(aux))
+                    str[i] = tolower(aux);
+            }
+            break;
+    }
+
+    printf("%s", str);
+    return 0;
+}
diff --git a/95.11/workbook/guia03/ex14.c b/95.11/workbook/guia03/ex14.c
@@ -0,0 +1,35 @@
+#include <stdio.h>
+
+
+typedef enum {
+    OK, ERROR
+} status_t; 
+
+
+size_t rechar(char *str, char old, char new);
+
+
+int main( void ) {
+
+    char str[] = "Hello world!";
+
+    rechar(str, 'o', 'e');
+
+    printf("%s\n", str);
+    return OK;
+}
+
+
+
+size_t rechar(char *str, char old, char new) {
+    if(str == NULL)
+        return ERROR;
+
+    int i;
+    for(i = 0; str[i] != '\0'; i++) {
+        if(str[i] == old) {
+            str[i] = new;
+        }
+    }
+    return OK;
+}
diff --git a/95.11/workbook/guia03/ex15.c b/95.11/workbook/guia03/ex15.c
@@ -0,0 +1,21 @@
+#include <stdio.h>
+
+#define MAX_LEN 100
+
+int main(void) {
+
+    int i, j;
+    char str[MAX_LEN];
+
+    fgets(str, MAX_LEN, stdin);
+
+    j = 0;
+    while(str[j] == ' ')
+        j++;
+
+    for(i = 0; str[i] != '\0'; i++) {
+        str[i] = str[i + j];
+    }
+    puts(str);
+    return 0;
+}
diff --git a/95.11/workbook/guia03/ex16.c b/95.11/workbook/guia03/ex16.c
@@ -0,0 +1,28 @@
+//    Reads a string from stdin and if it ends in blank
+//    spaces it erase them and moves the '\n', '\0' chars
+//    it performs a "right trim"
+
+
+#include <stdio.h>
+
+#define MAX_LEN 100
+
+
+int main ( void ) {
+
+    int i, j, k;
+    char str[MAX_LEN];
+
+    if(fgets(str, MAX_LEN, stdin) == NULL)
+        return 1;
+
+    for(i = 0; str[i] != '\0'; i++) 
+        if(str[i + 1] == '\n') 
+            for(j = 0; str[i - j] == ' '; j++)
+                ;
+            
+    str[(i - j) - 1] = str[i - 1];
+    str[(i - j)] = '\0';
+
+    return 0;
+}
diff --git a/95.11/workbook/guia03/ex17.c b/95.11/workbook/guia03/ex17.c
@@ -0,0 +1,34 @@
+#include <stdio.h>
+#include <string.h>
+
+#define MAX_LEN 100
+
+
+int main ( void ) {
+
+    int i, j;
+    
+    char s1[MAX_LEN];
+    char s2[MAX_LEN];
+    
+    if(fgets(s1, MAX_LEN, stdin) == NULL)
+        return 1;
+
+    if(fgets(s2, MAX_LEN, stdin) == NULL)
+        return 1;
+
+    if(strlen(s2) > strlen(s1))
+        return 1;
+
+    for(i = 0; s1[i] != '\0'; i++)
+        if(s1[i] == s2[0])
+            for(j = 0; (s2[j] != '\0'); j++)
+                if(s1[i] == s2[j]) {
+                    putchar(s1[i]);
+                    i++;
+                }
+    putchar('\n');
+    return 0;
+}
+
+
diff --git a/95.11/workbook/guia03/ex18.c b/95.11/workbook/guia03/ex18.c
@@ -0,0 +1,57 @@
+//    Reads a string of chars from stdin and check if it's
+//    a palindrome.
+
+#include <stdio.h>
+#include <ctype.h>
+
+#define MAX_LEN 100
+
+
+int main ( void ) {
+
+    char str[MAX_LEN];
+    int aux, len, i, j;
+
+    if(fgets(str, MAX_LEN, stdin) == NULL)
+        return 1;
+
+//    Converts all the string to lowercase;
+    for(i = 0; str[i] != '\0'; i++)
+        if(isupper(str[i]))
+            str[i] = tolower(str[i]);
+
+//    If the readed string it's a sentence, erases all
+//    the blank spaces between the words;
+    for(i = 0; str[i] != '\0'; i++) {
+        if(str[i] == ' ') {
+            aux = i;
+            while(str[aux] != '\0') {
+                str[aux] = str[aux + 1];
+                aux++;
+            }
+        }
+    }
+
+//    Counts the length of the string;
+    for(i = 0; str[i] != '\n'; i++)
+        ;
+
+//    Stored the lengh of the string for later, 
+//    and subtract one from i because of the last char;
+    len = i;
+    i = (i - 1);
+
+//    This part compares one by one the chars from the 
+//    string, first with last, second with before last,
+//    and so on, only comparing the next one if the previous
+//    one was equal;
+    for(j = 0; (str[j] == str[i]) && (str[j] != '\0'); j++, i--)
+        ;
+
+//    If the string or sentence its palindrome, then in the previous
+//    block j would end with the value of the lengh, stored previously;
+    if(j == len)
+        printf("La cadena es capicua.\n");
+
+    return 0;
+}
diff --git a/95.11/workbook/guia03/ex20.c b/95.11/workbook/guia03/ex20.c
@@ -0,0 +1,24 @@
+//    Reads a string of chars from stdin and converts
+//    it to a number, int or float;
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#define MAX_LEN 100
+
+int main ( void ) {
+
+    char buffer[MAX_LEN];
+    int num1;
+    float num2;
+
+    fgets(buffer, MAX_LEN, stdin);
+    num1 = atoi(buffer);
+    printf("n1(int) = %d\n", num1);
+
+    fgets(buffer, MAX_LEN, stdin);
+    num2 = atof(buffer);
+    printf("n2(float) = %.2f\n", num2);
+
+    return 0;
+}
diff --git a/95.11/workbook/guia03/ex21.c b/95.11/workbook/guia03/ex21.c
@@ -0,0 +1,20 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#define MAX_LEN 100
+
+int main ( void ) {
+
+    char buffer[MAX_LEN];
+    float num;
+    char num2[MAX_LEN];
+
+    if(fgets(buffer, MAX_LEN, stdin) == NULL)
+        return 1;
+
+    num = atof(buffer);
+    sprintf(num2, "%.2f\n", num);
+
+    printf("%s", num2);
+    return 0;
+}
diff --git a/95.11/workbook/guia03/ex22.c b/95.11/workbook/guia03/ex22.c
@@ -0,0 +1,20 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#define MAX_LEN 100
+
+int main ( void ) {
+
+    char buffer[MAX_LEN];
+    int num;
+    char num2[MAX_LEN];
+
+    if(fgets(buffer, MAX_LEN, stdin) == NULL)
+        return 1;
+
+    num = atoi(buffer);
+    sprintf(num2, "%d\n", num);
+
+    printf("%s", num2);
+    return 0;
+}
diff --git a/95.11/workbook/guia03/ex23.c b/95.11/workbook/guia03/ex23.c
@@ -0,0 +1,23 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#define MAX_LEN 100
+
+int main ( void ) {
+
+    char buffer[MAX_LEN];
+    int num;
+    char num2[MAX_LEN];
+
+    if(fgets(buffer, MAX_LEN, stdin) == NULL)
+        return 1;
+
+    num = atoi(buffer);
+
+//    Converts num to octal and stores it on num2 str;
+    sprintf(num2, "%o\n", num);
+
+//    prints the string with the octal number;
+    printf("%s", num2);
+    return 0;
+}
diff --git a/95.11/workbook/guia03/ex23_imp.c b/95.11/workbook/guia03/ex23_imp.c
@@ -0,0 +1,28 @@
+//    Reads an integer from stdin and prints it
+//    on stdout in octal base; 
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#define MAX_LEN 100
+#define ERR_MSG_NEG "Err: the number is negative"
+
+int main ( void ) {
+
+    int num;
+    char buffer[MAX_LEN];
+
+    if(fgets(buffer, MAX_LEN, stdin) == NULL)
+        return 1;
+
+//    Converts the input str to int, if the number
+//    is negative, puts an error message on stderr;
+    if((num = atoi(buffer)) < 0 ) {
+        fprintf(stderr, ERR_MSG_NEG"\n");
+        return 1;
+    }
+    
+//    prints the integer in octal base;
+    printf("%o\n", num);
+    return 0;
+}
diff --git a/95.11/workbook/guia03/ex24.c b/95.11/workbook/guia03/ex24.c
@@ -0,0 +1,27 @@
+//    Reads a number from stdin and prints it 
+//    in hexadecimal base on stout;
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#define MAX_LEN 100
+
+int main ( void ) {
+
+    char buffer[MAX_LEN];
+    int num;
+    char num2[MAX_LEN];
+
+    if(fgets(buffer, MAX_LEN, stdin) == NULL)
+        return 1;
+
+    num = atoi(buffer);
+
+//    Converts num to hexadecimal and stores it
+//    on num2 str;
+    sprintf(num2, "%x\n", num);
+
+//    prints the string with the octal number;
+    printf("%s", num2);
+    return 0;
+}
diff --git a/95.11/workbook/guia03/ex24_imp.c b/95.11/workbook/guia03/ex24_imp.c
@@ -0,0 +1,28 @@
+//    Reads an non-negative integer from stdin and prints it
+//    on stdout in hexadecimal base; 
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#define MAX_LEN 100
+#define ERR_MSG_NEG "Err: the number is negative"
+
+int main ( void ) {
+
+    unsigned int num;
+    char buffer[MAX_LEN];
+
+    if(fgets(buffer, MAX_LEN, stdin) == NULL)
+        return 1;
+
+//    Converts the input str to int, if the number
+//    is negative, puts an error message on stderr;
+    if((num = atoi(buffer)) < 0 ) {
+        fprintf(stderr, ERR_MSG_NEG"\n");
+        return 1;
+    }
+    
+//    prints the integer in hexadecimal base;
+    printf("%X\n", num);
+    return 0;
+}
diff --git a/95.11/workbook/guia03/ex25_imp.c b/95.11/workbook/guia03/ex25_imp.c
@@ -0,0 +1,53 @@
+//    Reads an integer from stdin and prints it
+//    on stdout in binary base.
+//    only for numbers below 128; 
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#define MAX_LEN    8 
+#define ERR_MSG_NEG "Err: invalid number!"
+
+int main ( void ) {
+
+    int i, num;
+    char buffer[MAX_LEN];
+//    0000 0000
+    int bin[MAX_LEN] = {0,0,0,0,0,0,0,0};
+
+    if(fgets(buffer, MAX_LEN, stdin) == NULL)
+        return 1;
+
+//    Converts the input str to int, if the number
+//    is negative or greater than 128, puts an 
+//    error message on stderr;
+    if((num = atoi(buffer)) < 0 || num > 128) {
+        fprintf(stderr, ERR_MSG_NEG"\n");
+        return 1;
+    }
+
+//    Converts num to binary base by dividing it
+//    by 2 until its zero, the rest of the division
+//    is stored in every itineration in bin[];
+    for(i = 0; num != 0; i++) {
+        if((num % 2) == 1) {
+            bin[i] = 1;
+        } else {
+            bin[i] = 0;
+        }
+        num = (num / 2);
+    }
+
+//    This part print bin in reverse order because
+//    the previous algorithm stores the values in 
+//    reverse order;
+    for(i = 7; i >= 0; i--) {
+        if(i == 3)
+            putchar(' ');
+
+        printf("%d", bin[i]);
+    }
+
+    putchar('\n');
+    return 0;
+}
diff --git a/95.11/workbook/guia03/ex26.c b/95.11/workbook/guia03/ex26.c
@@ -0,0 +1,58 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#define MAX_LEN 100
+#define ERR_MAX_STR_LEN "Err: the entered number is too big"
+
+
+int main ( void ) {
+
+    char buffer[MAX_LEN], str1[MAX_LEN], str2[MAX_LEN];
+    char dest[MAX_LEN];
+    int i, j, num;
+
+    if(fgets(str1, MAX_LEN, stdin) == NULL) {
+        return 1;
+    }
+
+//  This part counts the length of the first string
+//    and replaces the new line character for a blank space;
+    for(i = 0; str1[i] != '\0'; i++)
+        if(str1[i] == '\n')
+            str1[i] = ' ';
+            str1[i + 1] = '\0';
+
+    if(fgets(str2, MAX_LEN, stdin) == NULL) {
+        return 1;
+    }
+
+    if(fgets(buffer, MAX_LEN, stdin) == NULL) {
+       return 1;
+    }
+
+    num = atoi(buffer);
+
+//  This part checks if the input number is bigger than
+//  the length of the first string;
+    if(num > i) {
+        fprintf(stderr, ERR_MAX_STR_LEN"\n");
+        return 1;
+    }
+
+
+//    Removes the new line chracter from string two;
+    for(i = 0; str2[i] != '\0'; i++)
+        if(str2[i] == '\n')
+            str2[i] = '\0';
+
+    for(i = 0, j = 0; str2[j] != '\0'; i++) {
+        if((i <= num) && (str1[i] != '\0')) {
+            dest[i] = str1[i];
+        } else { 
+            dest[i] = str2[j];
+            j++;
+        }
+    }
+    printf("%s\n", dest);
+    return 0;
+}
diff --git a/95.11/workbook/guia03/ex27.c b/95.11/workbook/guia03/ex27.c
@@ -0,0 +1,27 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#define MAX_LEN 100
+
+int main ( void ) {
+
+    char str[MAX_LEN], buffer[MAX_LEN];
+    int i, j, num;
+
+    if(fgets(str, MAX_LEN, stdin) == NULL)
+        return 1;
+
+    if(fgets(buffer, MAX_LEN, stdin) == NULL)
+        return 1;
+
+    num = atoi(buffer);
+
+    for(i = 0; str[i] != '\0'; i++)
+        if(str[i] == '\n')
+            i++;
+            for(j = 0; j <= num; j++)
+                str[i + j] = ' ';
+
+    printf("%s\n", str);
+    return 0;
+}
diff --git a/95.11/workbook/guia03/ex28.c b/95.11/workbook/guia03/ex28.c
@@ -0,0 +1,13 @@
+#include <stdio.h>
+
+#define MAX_LEN 20
+
+int main (void) {
+
+    int i, vector[MAX_LEN];
+
+    for(i = 0; i < MAX_LEN; i++)
+        printf("%d\n", vector[i]);
+
+    return 0;
+}
diff --git a/95.11/workbook/guia03/ex29.c b/95.11/workbook/guia03/ex29.c
@@ -0,0 +1,23 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#define MAX_LEN 20
+
+int main (void) {
+
+    int i, suma, vector[MAX_LEN], vector_end;
+    char buffer[MAX_LEN];
+
+    vector_end = MAX_LEN;
+    for(i = 0, suma = 0; i < vector_end; i++) {
+        if(fgets(buffer, sizeof(int) + 1, stdin) != NULL) {
+            vector[i] = atoi(buffer);
+            suma += vector[i];
+        } else {
+            vector_end = i;
+            i = MAX_LEN;
+        }
+    }
+    printf("%d\n", suma);
+    return 0;
+}
diff --git a/95.11/workbook/guia03/ex30.c b/95.11/workbook/guia03/ex30.c
@@ -0,0 +1,34 @@
+//    Calculates the arithmetic mean of a certain amount of
+//    numbers. First ask for the quantity and then calculates
+//    it and prints it;
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#define MAX_LEN 20
+
+int main (void) {
+
+    int i, n;
+    float x, suma, numbers[MAX_LEN];
+    char buffer[MAX_LEN];
+
+//    Read the quantity of numbers to mean;
+    if(fgets(buffer, sizeof(int) + 1, stdin) != NULL)
+        n = atoi(buffer);
+    else return 1;
+
+//    Read the values to mean  and stores it on numbers;
+    for(i = 0, suma = 0; i < n; i++) {
+        if(fgets(buffer, sizeof(int) + 1, stdin) != NULL) {
+            numbers[i] = atof(buffer);
+            suma += numbers[i];
+        } else return 1;
+    }
+//    Calculate the arithmetic mean and stores it on x;
+    x = ((1 / (float)n) * suma); 
+    
+//    Print the arithmetic mean;
+    printf("x = %.3f\n", x);
+    return 0;
+}
diff --git a/95.11/workbook/guia03/ex30_std_dev.c b/95.11/workbook/guia03/ex30_std_dev.c
@@ -0,0 +1,45 @@
+//    Calculates the arithmetic mean of a certain amount of
+//    numbers. First ask for the quantity and then calculates
+//    it and prints it;
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+#define MAX_LEN 20
+
+int main (void) {
+
+    int i, n;
+    float d, x, suma, numbers[MAX_LEN];
+    char buffer[MAX_LEN];
+
+//    Read the quantity of numbers to mean;
+    if(fgets(buffer, sizeof(int) + 1, stdin) != NULL)
+        n = atoi(buffer);
+    else return 1;
+
+//    Read the values to mean  and stores it on numbers;
+    for(i = 0, suma = 0; i < n; i++) {
+        if(fgets(buffer, sizeof(int) + 1, stdin) != NULL) {
+            numbers[i] = atof(buffer);
+            suma += numbers[i];
+        } else return 1;
+    }
+
+//    Calculate the arithmetic mean and stores it on x;
+    x = ((1 / (float)n) * suma); 
+
+//    Calculates the standard deviation;
+    for(i = 0; i < n; i++) {
+        suma += (numbers[i] - x);
+        d = sqrtf((1/n) * powf(suma, 2.0));
+    }
+
+//    Print the arithmetic mean;
+    printf("x = %.3f\n", x);
+
+//    Print the standard deviation;
+    printf("d = %.3f\n", d);
+    return 0;
+}
diff --git a/95.11/workbook/guia03/ex32.c b/95.11/workbook/guia03/ex32.c
@@ -0,0 +1,65 @@
+//    Calculates the max or min in an array of numbers;
+//    of type int;
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <limits.h>
+
+#define MAX_ELEM                10
+#define NO_ARGUMENT_ENTERED        1 
+#define EXTREMO_ARGUMENT        1
+
+typedef enum {
+    MAXIMUM,
+    MINIMUM
+} extreme_t;
+
+typedef enum {
+    OK,
+    ERROR_INVOCATING_PROGRAM,
+    ERROR_NULL_POINTER
+} status_t;
+
+status_t validate_arguments (int argc, char ** argv);
+
+int main (int argc, char * argv[])
+{
+    size_t i;
+    int vector[MAX_ELEM] = {9, 10, 25, 31, 9, 5, 11, 46, 50, 20};
+    extreme_t extremo;
+    status_t st; 
+
+    if((st = validate_arguments(argc, argv)) != OK)
+        return st;
+
+    extremo = atoi(argv[EXTREMO_ARGUMENT]);
+    if(extremo == MAXIMUM) {
+    //    Find maximum element in array;
+        int maximum;
+        for(i = 0, maximum = INT_MIN; i < (sizeof(vector)/sizeof(vector[0])); i++)
+            if(vector[i] > maximum)
+                maximum = vector[i];
+        
+        printf("%d\n", maximum);
+    } else if (extremo == MINIMUM){
+    //    Find minimum element in array;
+        int minimum;
+        for(i = 0, minimum = INT_MAX; i < (sizeof(vector)/sizeof(vector[0])); i++)
+            if(vector[i] < minimum)
+                minimum = vector[i];
+
+        printf("%d\n", minimum);
+    }
+    return 0;
+}
+
+status_t validate_arguments (int argc, char ** argv) {
+    if(argc == NO_ARGUMENT_ENTERED)
+        return ERROR_INVOCATING_PROGRAM;
+
+    else if (argv == NULL)
+        return ERROR_NULL_POINTER;
+
+    else return OK;
+}
+
diff --git a/95.11/workbook/guia03/ex33.c b/95.11/workbook/guia03/ex33.c
@@ -0,0 +1,16 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#define N 10
+
+int main (void)
+{
+    int vector[N];
+    size_t i;
+
+    for(i = 0; i < N; i++) {
+        vector[i] = rand();
+        printf("%d\n", vector[i]);    
+    }
+    return 0;
+}
diff --git a/95.11/workbook/guia03/ex34.c b/95.11/workbook/guia03/ex34.c
@@ -0,0 +1,13 @@
+#include <stdio.h>
+
+#define N_MAX 10
+
+int main (void) 
+{
+    int vector[N];
+
+            
+
+
+    return 0;
+}
diff --git a/95.11/workbook/guia04/ex02.c b/95.11/workbook/guia04/ex02.c
@@ -0,0 +1,15 @@
+#include <stdio.h>
+
+#define MAX 10
+
+int main ( void ) {
+
+    int x, array[MAX];
+    array[4] = 1;
+
+    x = array[4];
+
+    printf("%d\n", x);
+
+    return 0;
+}
diff --git a/95.11/workbook/guia05/ex01.c b/95.11/workbook/guia05/ex01.c
@@ -0,0 +1,18 @@
+#include <stdio.h>
+
+unsigned long fact ( int num ) {
+    unsigned long j, res;
+    res = 1;
+
+    for (j = 1; j <= num; j++) {
+        res = (res * j);
+    }
+    return res;
+}
+
+int main ( void ) {
+
+    printf("%lu\n", fact(5));
+
+    return 0;
+}
diff --git a/95.11/workbook/guia05/ex02.c b/95.11/workbook/guia05/ex02.c
diff --git a/95.11/workbook/guia06/ex01.c b/95.11/workbook/guia06/ex01.c
@@ -0,0 +1,20 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#define ERR_ARG "Error: No arguments"
+
+int main (int argc, char *argv[]) {
+    size_t i;
+    if(argc == 1) {
+        fprintf(stderr, ERR_ARG"\n");
+        return 1;
+    }
+
+    printf("argc: %d \n", argc);
+
+    for (i = 0; i < argc; i++) {
+        printf("argv[%ld] = %s \n", i, argv[i]);
+    }
+
+    return EXIT_SUCCESS;
+}
diff --git a/95.11/workbook/guia07/ex05.c b/95.11/workbook/guia07/ex05.c
@@ -0,0 +1,31 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#define MASK_BYTE 0xFF
+
+int main(void) {
+
+//    0x10 30 25 F4
+    unsigned int n = 271590900;
+
+//    Arreglo de 4 bytes;
+    unsigned char v[4]; 
+
+    size_t i;
+/*
+    v[0] = (n >> 24) & 0xFF;
+    v[1] = (n >> 16) & 0xFF;
+    v[2] = (n >> 8) & 0xFF;
+    v[3] = (n >> 0) & 0xFF;
+*/
+    for(i = 0; i < sizeof(unsigned int); i++)
+        v[i] = (n >> ( (sizeof(unsigned int) - 1 - i) * 8  )) & 0xFF;
+
+    printf("%d\n", n);
+    printf("%x\n", n);
+
+    for(i = 0; i < sizeof(unsigned int); i++)
+        printf("v[%lu] = %x\n", i, v[i]);
+
+    return EXIT_SUCCESS;
+}
diff --git a/95.11/workbook/guia08/ex01.c b/95.11/workbook/guia08/ex01.c
@@ -0,0 +1,58 @@
+//    Clones a given string entered as arguments of function main;
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define NO_ARGUMENT          1
+#define INIT_SIZE        100
+
+typedef enum {
+    OK,
+    ERROR_PROGRAM_INVOCATION,
+    ERROR_NULL_POINTER,
+    ERROR_ALLOC_MEMORY
+} status_t;
+
+status_t validar_argumentos(int argc, char **argv);
+
+int main (int argc, char * argv[]) 
+{
+    char *dest;
+    size_t i;
+    status_t st;
+
+//    Verify if arguments are right;
+    if((st = validar_argumentos(argc, argv) != OK))
+        return st;
+
+//    Allocates memmory in heap of size INIT_SIZE;
+    if((dest = (char *)malloc(INIT_SIZE * sizeof(char))) == NULL)
+            return ERROR_ALLOC_MEMORY;
+
+//    Assigns 1 to i to avoid the first element of argv, 
+//    which is the program name. Then copies every string of argv
+//    into dest and prints it on stdout;
+    for(i = 1; (int)i < argc; i++) {
+        strcpy(dest, argv[i]);
+    //    Puts a space in between strings, avoiding a blank
+    //    space after first string is printed;
+        if(i != 1) putchar(' ');
+        printf("%s", dest);
+    }
+
+//    Adds the new line character;
+    putchar('\n');
+    free(dest);
+    return OK;
+}
+
+status_t validar_argumentos(int argc, char **argv) 
+{
+    if(argc == NO_ARGUMENT)
+        return ERROR_PROGRAM_INVOCATION;
+
+    else if(argv == NULL)
+        return ERROR_NULL_POINTER;
+
+    else return OK;
+}
diff --git a/95.11/workbook/guia08/malloc_basics.c b/95.11/workbook/guia08/malloc_basics.c
@@ -0,0 +1,22 @@
+//    Stores an array of numbers in heap, then prints it on
+//    stdout finally frees the memory used;
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#define ARR_LEN 10
+
+int main (void) 
+{
+    int *p;
+
+    if((p = (int*)malloc(ARR_LEN * sizeof(int))) == NULL)
+        return 1;
+
+    for(int i = 0; i < ARR_LEN; i++) {
+        *(p + i) = i;
+        printf("%d\n", *(p + i));
+    }
+    free(p);
+    return 0;
+}
diff --git a/95.11/workbook/guia08/text.txt b/95.11/workbook/guia08/text.txt
@@ -0,0 +1,23 @@
+The  malloc()  function allocates size bytes and returns a pointer
+to the allocated memory.  The memory is not initialized.  If  size
+is 0, then malloc() returns either NULL, or a unique pointer value
+that can later be successfully passed to free().
+
+The free() function frees the memory  space  pointed  to  by  ptr,
+which must have been returned by a previous call to malloc(), cal‐
+loc(), or realloc().  Otherwise, or if free(ptr) has already  been
+called  before, undefined behavior occurs.  If ptr is NULL, no op‐
+eration is performed.
+
+The calloc() function allocates memory for an array of nmemb  ele‐
+ments  of  size  bytes each and returns a pointer to the allocated
+memory.  The memory is set to zero.  If nmemb or size is  0,  then
+calloc()  returns  either NULL, or a unique pointer value that can
+later be successfully passed to free().  If the multiplication  of
+nmemb and size would result in integer overflow, then calloc() re‐
+turns an error.  By contrast, an integer overflow would not be de‐
+tected  in the following call to malloc(), with the result that an
+incorrectly sized block of memory would be allocated:
+
+   malloc(nmemb * size);
+