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

#include "array.h"
#include "mathtools.h"
#include "vectors.h"

#define MAX_LEN 20

int inputVector(int x[]) {
    int len;
    printf("Input vector length (maximum length %d): ", MAX_LEN);
    scanf("%d", &len);
    len = len < 0 ? 0 : (len > 20 ? 20 : len);
    if (len == 0) {
        printf("Length must be positive!");
        exit(1);
    }
    printf("Input vector of %d integers:\n", len);
    readArray(x, len);
    return len;
}

void computeNorm() {
    int x[MAX_LEN];
    int len = inputVector(x);
    int p;
    printf("Input order of the norm p = ");
    scanf("%d", &p);
    p = abs(p);
    if (p == 0) {
        printf("Order must be non-zero!");
        exit(1);
    }
    printf("%d-norm of vector = %f\n", p, norm_p(x, len, p));
}

void computeSum() {
    int x[MAX_LEN];
    int y[MAX_LEN];
    int *z;
    int lenX = inputVector(x);
    int lenY = inputVector(y);
    if (lenX != lenY) {
        printf("Length must be equal!");
        exit(1);
    }
		z = (int *)malloc(lenX * sizeof(int));
    sumVect(x, y, z, lenX);
    printf("Sum of vectors = ");
    printArray(z, lenX);
    free(z);
}

void computeDotProduct() {
    int x[MAX_LEN];
    int y[MAX_LEN];
    int lenX = inputVector(x);
    int lenY = inputVector(y);
    if (lenX != lenY) {
        printf("Length must be equal!");
        exit(1);
    }
    printf("Dot product of vectors = %d\n", dot(x, y, lenX));
}

void splitAtAverage() {
    int x[MAX_LEN];
    int *lt, *gt;
    int len = inputVector(x);
    double avg = average(x, len);
    int ltLength = 0, gtLength = 0;
    int i;
    lt = (int *) malloc(len * sizeof(int));
    gt = (int *) malloc(len * sizeof(int));
    printf("Average of vector is %.3f\n", avg);
    for (i = 0; i < len; ++i) {
        if (x[i] < avg)
            lt[ltLength++] = x[i];
        else if (x[i] > avg)
            gt[gtLength++] = x[i];
    }
    printf("Elements less than %.3f:\n", avg);
    printArray(lt, ltLength);
    printf("Elements greater than %.3f:\n", avg);
    printArray(gt, gtLength);
    free(lt);
    free(gt);
}
