Advertisement
Guest User

utils.c

a guest
Jan 6th, 2017
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //
  2. //  utils.c
  3. //
  4. //  Created by Owatch on 29/12/2016.
  5. //
  6.  
  7. #include "utils.h"
  8.  
  9. #pragma mark Private Function Declarations
  10.  
  11.  
  12. #pragma mark Function Declarations: Allocative Operations
  13.  
  14. /* Allocates and returns a vector of length 'length'*/
  15. Vector *newVector(size_t length) {
  16.     if (length <= 0) return NULL;
  17.     Vector *vector = malloc(sizeof(Vector));
  18.     Number *array = malloc(length * sizeof(Number));
  19.     if (vector == NULL || array == NULL) return NULL;
  20.     vector->array = array;
  21.     vector->length = length;
  22.     return vector;
  23. }
  24.  
  25. /* Allocates and returns a copy of an existing vector */
  26. Vector *copyVector(Vector *vector) {
  27.     if (vector == NULL) return NULL;
  28.     Vector *copy = malloc(sizeof(Vector));
  29.     Number *array = malloc(vector->length * sizeof(Number));
  30.     if (copy == NULL || array == NULL) return NULL;
  31.     copy->length = vector->length;
  32.     copy->array = memcpy(array,vector->array,vector->length * sizeof(Number));
  33.     return copy;
  34. }
  35.  
  36. /* Allocates and returns a vector containing all odd elements */
  37. Vector *getOdds(Vector *vector) {
  38.     size_t n = vector->length/2 - (vector->length % 2);
  39.     Vector *odds = newVector(n);
  40.     int k = 1;
  41.     for (int i = 0; i < n; i++) {
  42.         odds->array[i] = newNumber(vector->array[k].r, vector->array[k].c);
  43.         k += 2;
  44.     }
  45.     return odds;
  46. }
  47.  
  48. /* Allocates and returns a vector containing all even elements */
  49. Vector *getEvens(Vector *vector) {
  50.     size_t n = vector->length/2;
  51.     Vector *evens = newVector(n);
  52.     int k = 0;
  53.     for (int i = 0; i < n; i++) {
  54.         evens->array[i] = vector->array[k];
  55.         k += 2;
  56.     }
  57.     return evens;
  58. }
  59.  
  60. #pragma mark Function Declarations: Instance Operations
  61.  
  62. /* Returns true if a number is zero, else false */
  63. int isZero(Number number) {
  64.     return (number.r == 0 && number.c == 0);
  65. }
  66.  
  67. /* Copies the contents of the vector 'a' to vector 'b' at the given index. Returns the pointer to vector 'b' */
  68. Vector *vectorWithVector(Vector *b, Vector *a, unsigned long index) {
  69.     if (a == NULL || b == NULL) return NULL;
  70.     int copySize = a->length;
  71.     if (a->length + index > b->length) {
  72.         copySize = b->length - index;
  73.     }
  74.     memcpy(b->array + index, a->array, copySize * sizeof(Number));
  75.     return b;
  76. }
  77.  
  78. /* Copies the first vector into the second vector at the given index */
  79. Vector *copyInto(Vector *b, Vector *a, int index) {
  80.     int max = (index + a->length) < b->length ? (index + a->length) : b->length;
  81.     for (int i = index; i < max; i++) {
  82.         b->array[i] = a->array[i - index];
  83.     }
  84.     return b;
  85. }
  86.  
  87. /* Sets all numbers in a vector to zero, returns pointer */
  88. Vector *zeroVector(Vector *vector) {
  89.     for (int i = 0; i < vector->length; i++) {
  90.         vector->array[i] = newNumber(0,0);
  91.     }
  92.     return vector;
  93. }
  94.  
  95. /* Prints a Vector instance */
  96. void printVector(Vector *vector) {
  97.     if (vector == NULL) return;
  98.     putchar('[');
  99.     for (int i = 0; i < vector->length; i++) {
  100.         printNumber(vector->array[i]);
  101.         if (i < vector->length - 1) printf(", ");
  102.     }
  103.     putchar(']');
  104.     putchar('\n');
  105. }
  106.  
  107. /* Free's a Vector instance */
  108. void freeVector(Vector *vector) {
  109.     free(vector->array);
  110.     free(vector);
  111. }
  112.  
  113. #pragma mark Function Declarations: Numeric Operations
  114.  
  115. /* Returns an initialized Number instance */
  116. Number newNumber(double_t r, double_t c) {
  117.     return (Number){.r = r, .c = c};
  118. }
  119.  
  120. /* Returns the sum of numbers 'a' and 'b' */
  121. Number sum(Number a, Number b) {
  122.     return (Number){a.r + b.r, a.c + b.c};
  123. }
  124.  
  125. /* Returns the difference of numbers 'a' and 'b' (a-b) */
  126. Number diff(Number a, Number b) {
  127.     return (Number){a.r - b.r, a.c - b.c};
  128. }
  129.  
  130. /* Returns the product between numbers 'a' and 'b' */
  131. Number product(Number a, Number b) {
  132.     return (Number){a.r * b.r - a.c * b.c, a.r * b.c + b.r * a.c};
  133. }
  134.  
  135. /* Returns a negated number */
  136. Number negative(Number number) {
  137.     return (Number){-number.r, -number.c};
  138. }
  139.  
  140. /* Prints a number */
  141. void printNumber(Number number) {
  142.     putchar('(');
  143.     if (number.r && number.c) {
  144.         printf("%.3f %c %.3fi",number.r, (number.c < 0 ? '-' : '+'), fabs(number.c));
  145.  
  146.     } else if (!number.r && !number.c) {
  147.         printf("%.3f",0.0);
  148.  
  149.     } else if (number.r) {
  150.         printf("%.3f",number.r);
  151.  
  152.     } else if (number.c) {
  153.         printf("%.3fi",number.c);
  154.  
  155.     }
  156.     putchar(')');
  157. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement