Basics of Programming 1 solutions

Week 9 (11.07.)

Task descriptions are on the portal

Task 2

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

double * allocate(int n) {
  return (double*)malloc(sizeof(double)*n);
}

int main(void) {
  double curr;
  int arr_size = 0;
  double* arr;
  scanf("%lf", &curr);
  while (curr != -1) {
    double* new_arr = allocate(++arr_size);
    for (int i = 0; i < arr_size-1; i++) {
      new_arr[i] = arr[i];
    }
    new_arr[arr_size-1] = curr;
    if (arr != NULL) free(arr);
    arr = new_arr;
    scanf("%lf", &curr);
  }
  for (int i = arr_size-1; i >= 0; i--) {
    printf("%f, ", arr[i]);
  }
  free(arr);
  return 0;
}

Task 2

#include <stdio.h>
#include <string.h>

void remove_spaces(char* input) {
  size_t length = strlen(input);
  for (int i = 0; i < length; i++) {
    while (input[i] == ' ') {
      for (int j = i; j < length; j++) {
        input[j] = input[j+1];
      }
    }
  }
}

int main(void) {
  char text[50+1];
  strcpy(text, "Hello, this is text!");
  //[50];
  //scanf("%s", text);
  printf("%s\n", text);
  remove_spaces(text);
  printf("%s", text);

  return 0;
}

Task 3-4

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

typedef struct {
  double* values;
  size_t count;
} Set;

Set* set_new() {
  Set* result = (Set*)malloc(sizeof(Set));
  result->values = (double*)malloc(0);
  result->count = 0;
  return result;
}

bool value_is_in_set(Set* s, double value) {
  for (size_t i = 0; i < s->count; i++) {
    if (value == s->values[i]) return true;
  }
  return false;
}

void set_add(Set* s, double value) {
  if (value_is_in_set(s, value)) return;
  s->values = (double*)realloc(s->values, ++(s->count)*sizeof(double));
  s->values[s->count-1] = value;
}

void set_remove(Set* s, double value) {
  for (size_t i = 0; i < s->count; i++) {
    if (s->values[i] == value) {
      for (size_t j = i; j < s->count - 1; j++) {
        s->values[j] = s->values[j+1];
      }
      s->values = (double*)realloc(s->values, --(s->count)*sizeof(double));
    }
  }
}

void set_print(Set* s) {
  for (size_t i = 0; i < s->count; i++) {
    printf("%f, ", s->values[i]);
  }
  printf("\n");
}

void set_destroy(Set* s) {
  if (s != NULL) {
    free(s->values);
    free(s);
  }
}

int main(void) {
  Set* s = set_new();
  set_add(s, 5);
  set_add(s, 3);
  set_print(s);
  set_remove(s, 5);
  set_print(s);
  set_destroy(s);
}