Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // utils.c
- //
- // Created by Owatch on 29/12/2016.
- //
- #include "utils.h"
- #pragma mark Private Function Declarations
- #pragma mark Function Declarations: Allocative Operations
- /* Allocates and returns a vector of length 'length'*/
- Vector *newVector(size_t length) {
- if (length <= 0) return NULL;
- Vector *vector = malloc(sizeof(Vector));
- Number *array = malloc(length * sizeof(Number));
- if (vector == NULL || array == NULL) return NULL;
- vector->array = array;
- vector->length = length;
- return vector;
- }
- /* Allocates and returns a copy of an existing vector */
- Vector *copyVector(Vector *vector) {
- if (vector == NULL) return NULL;
- Vector *copy = malloc(sizeof(Vector));
- Number *array = malloc(vector->length * sizeof(Number));
- if (copy == NULL || array == NULL) return NULL;
- copy->length = vector->length;
- copy->array = memcpy(array,vector->array,vector->length * sizeof(Number));
- return copy;
- }
- /* Allocates and returns a vector containing all odd elements */
- Vector *getOdds(Vector *vector) {
- size_t n = vector->length/2 - (vector->length % 2);
- Vector *odds = newVector(n);
- int k = 1;
- for (int i = 0; i < n; i++) {
- odds->array[i] = newNumber(vector->array[k].r, vector->array[k].c);
- k += 2;
- }
- return odds;
- }
- /* Allocates and returns a vector containing all even elements */
- Vector *getEvens(Vector *vector) {
- size_t n = vector->length/2;
- Vector *evens = newVector(n);
- int k = 0;
- for (int i = 0; i < n; i++) {
- evens->array[i] = vector->array[k];
- k += 2;
- }
- return evens;
- }
- #pragma mark Function Declarations: Instance Operations
- /* Returns true if a number is zero, else false */
- int isZero(Number number) {
- return (number.r == 0 && number.c == 0);
- }
- /* Copies the contents of the vector 'a' to vector 'b' at the given index. Returns the pointer to vector 'b' */
- Vector *vectorWithVector(Vector *b, Vector *a, unsigned long index) {
- if (a == NULL || b == NULL) return NULL;
- int copySize = a->length;
- if (a->length + index > b->length) {
- copySize = b->length - index;
- }
- memcpy(b->array + index, a->array, copySize * sizeof(Number));
- return b;
- }
- /* Copies the first vector into the second vector at the given index */
- Vector *copyInto(Vector *b, Vector *a, int index) {
- int max = (index + a->length) < b->length ? (index + a->length) : b->length;
- for (int i = index; i < max; i++) {
- b->array[i] = a->array[i - index];
- }
- return b;
- }
- /* Sets all numbers in a vector to zero, returns pointer */
- Vector *zeroVector(Vector *vector) {
- for (int i = 0; i < vector->length; i++) {
- vector->array[i] = newNumber(0,0);
- }
- return vector;
- }
- /* Prints a Vector instance */
- void printVector(Vector *vector) {
- if (vector == NULL) return;
- putchar('[');
- for (int i = 0; i < vector->length; i++) {
- printNumber(vector->array[i]);
- if (i < vector->length - 1) printf(", ");
- }
- putchar(']');
- putchar('\n');
- }
- /* Free's a Vector instance */
- void freeVector(Vector *vector) {
- free(vector->array);
- free(vector);
- }
- #pragma mark Function Declarations: Numeric Operations
- /* Returns an initialized Number instance */
- Number newNumber(double_t r, double_t c) {
- return (Number){.r = r, .c = c};
- }
- /* Returns the sum of numbers 'a' and 'b' */
- Number sum(Number a, Number b) {
- return (Number){a.r + b.r, a.c + b.c};
- }
- /* Returns the difference of numbers 'a' and 'b' (a-b) */
- Number diff(Number a, Number b) {
- return (Number){a.r - b.r, a.c - b.c};
- }
- /* Returns the product between numbers 'a' and 'b' */
- Number product(Number a, Number b) {
- return (Number){a.r * b.r - a.c * b.c, a.r * b.c + b.r * a.c};
- }
- /* Returns a negated number */
- Number negative(Number number) {
- return (Number){-number.r, -number.c};
- }
- /* Prints a number */
- void printNumber(Number number) {
- putchar('(');
- if (number.r && number.c) {
- printf("%.3f %c %.3fi",number.r, (number.c < 0 ? '-' : '+'), fabs(number.c));
- } else if (!number.r && !number.c) {
- printf("%.3f",0.0);
- } else if (number.r) {
- printf("%.3f",number.r);
- } else if (number.c) {
- printf("%.3fi",number.c);
- }
- putchar(')');
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement