#include <math.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>

/* ======================== *
 * Manipulation de vecteurs *
 * ======================== */

struct vector_s {
  int     taille  ; /* taille du tableau content */
  float* content ;  /* tableau d'éléments        */
};
typedef struct vector_s *vector;

/* Affichage d'un vecteur */
void print_vector(vector v) {
  if (v->taille == 0) {
    printf("()");
  } else {
    printf("(%f", v->content[0]);
    for (int i = 1; i < v->taille; i++) {
      printf(", %f", v->content[i]);
    }
    printf(")");
  }
}
/* Calcul de la distance euclidienne entre deux vecteurs */
float distance(vector v1, vector v2) {
  float sum_sq = 0;
  for (int i = 0; i < v1->taille; i++) {
    float diff = v2->content[i] - v1->content[i];
    sum_sq += diff * diff;
  }
  return sqrt(sum_sq);
}
/* Ajoute le vecteur v2 au vecteur v1, le résultat est stocké dans le vecteur
   v1 */
void add_to_vector(vector v1, vector v2) {
  for (int i = 0 ; i < v1->taille ; i ++) {
    v1->content[i] = v1->content[i] + v2->content[i];
  }
  return ;
}
/* effectue la multiplication du vecteur v1 par un scalaire. Le résultat est
   stocké dans le vecteur v1 */
void scale_to_vector(float alpha, vector v1) {
  for (int i = 0; i < v1->taille; i++) {
    v1->content[i] = alpha * v1->content[i];
  }
  return;
}
/* réinitialise le vecteur v à 0 */
void set_to_null(vector v) {
  for (int i = 0; i < v->taille; i++) {
    v->content[i] = 0;
  }
  return;
}
