Basics of Programming 1 solutions

Week 7 (10.18.)

The practical was held on the 18th of October, Saturday, in place of a day off on the 24th due to a national holiday. Task descriptions are on the portal

Task 1

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

void separate(int* input, int size, int* smaller, int* greater,
int* small_count, int* big_count) {
    double average = 0;
    for (int i = 0; i < size; i++) {
        average += input[i];
    }
    average /= size;

    for (int i = 0; i < size; i++) {
        if (input[i] < average) {
            smaller[(*small_count)++] = input[i];
        } else {
            greater[(*big_count)++] = input[i];
        }
    }
}

void print_array(int* arr, int count)
{
    for (int i = 0; i < count; i++) {
        printf("%d\n", arr[i]);
    }
}


int main(void) {
    int arr[5] = {1,2,3,4,5};
    int smaller[5], greater[5];
    int small_count = 0, great_count = 0;
    separate(arr, 5, smaller, greater, &small_count, &great_count);
    print_array(smaller, small_count);
    printf("------\n");
    print_array(greater, great_count);


    return 0;
}

Task 2

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

void swap(int* a, int* b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

void print_array(int* arr, int count)
{
    for (int i = 0; i < count; i++) {
        printf("%d\n", arr[i]);
    }
}

void reverse(int* input, int input_size, int* output) {
    for (int i = 0; i < input_size; i++) {
        output[i] = input[input_size - i - 1];
    }
}
void reverse_in_place(int* input, int input_size)
{
    for (int i = 0; i < input_size / 2; i++)
    {
        swap(&input[i], &input[input_size-i-1]);
    }
}

int main(void) {
    int input[6] = {1,2,3,4,5,6};
    int output[6];
    reverse(input,6,output);
    print_array(output, 6);
    reverse_in_place(input, 6);
    print_array(input, 6);

    return 0;
}

Task 3

#include <stdio.h>

typedef struct Date {
    int year, month, day;
} Date;

typedef struct Competitor {
    char name[31];
    Date birth;
    int rank;
} Competitor;

void filter(Competitor* input, int input_size, Competitor* output, int* output_size) {
    //where it places the competitors born before 2000 and ranked in the top 100
    for (int i = 0; i < input_size; i++) {
        if (input[i].birth.year < 2000 && input[i].rank <= 100)
            output[(*output_size)++] = input[i];
    }
}

int main(void) {
    Competitor input[3] = {
        {.name = "Peter", .birth = {.year = 1999, .month = 6, .day = 15}, .rank = 50},
        {.name = "Mark", .birth = {.year = 2002, .month = 8, .day = 10}, .rank = 60},
        {.name = "John", .birth = {.year = 1999, .month = 4, .day = 5}, .rank = 150},
    };
    Competitor output[3];
    int output_size = 0;
    filter(input, 3, output, &output_size);
    return 0;
}