Basics of Programming 1 solutions

Week 5 (10.10.)

Task descriptions are on the portal

Task 1

#include <stdio.h>

typedef struct Rational {
    int nominator;
    int denominator;
} Rational;

void print_rat(Rational r) {
    printf("%d / %d", r.nominator, r.denominator);
}

Rational scan_rat() {
    Rational value;
    scanf("%d", &value.nominator);
    scanf("%d", &value.denominator);

    return value;
}

Rational mult_rat(Rational r_a, Rational r_b) {
    Rational value = {.nominator = r_a.nominator * r_b.nominator, .denominator = r_a.denominator * r_b.denominator};
    return value;
}

Rational add_rat(Rational r_a, Rational r_b) {
    int nom = (r_a.nominator * r_b.denominator) + (r_b.nominator * r_a.denominator);
    int den = r_a.denominator * r_b.denominator;
    Rational value =  {.nominator = nom, .denominator = den};
    return value;
}

double rat_to_double(Rational r) {
    return (double)r.nominator / r.denominator;
}

int main(void) {
    Rational r1 = scan_rat();
    printf("%f", rat_to_double(r1));
    return 0;
}

Task 2

#include <stdio.h>
typedef struct Time {
    int hour;
    int minute;
} Time;

void print_time(Time t) {
    printf("%02d:%02d\n", t.hour, t.minute);
}

Time add_to_time(Time t, int minutes) {
    Time value = {.hour = t.hour, .minute = t.minute+minutes};
    while (value.minute >= 60) {
        value.minute -= 60;
        value.hour += 1;
    }
    while (value.minute < 0) {
        value.minute += 60;
        value.hour -= 1;
    }
    while (value.hour >= 24) {
        value.hour -= 24;
    }
    while (value.hour < 0) {
        value.hour += 24;
    }
    return value;
}

int total_minutes(Time t) {
    return t.hour * 60 + t.minute;
}
int elapsed_time(Time late_time, Time early_time) {
    return total_minutes(late_time) - total_minutes(early_time);
}

Time subtract_from_time(Time t, int minutes) {
    return add_to_time(t, -minutes);
}

int main(void) {
    Time time_now = {.hour = 13, .minute = 5};
    print_time(time_now);
    printf("%d", elapsed_time(time_now, subtract_from_time(time_now, 60)));
}

Task 4

#include <stdio.h>
typedef struct Rod {
    int minimum_mm;
    int maximum_mm;
} Rod;

Rod join_rods(Rod r1, Rod r2) {
    Rod value;
    value.minimum_mm = r1.minimum_mm + r2.minimum_mm;
    value.maximum_mm = r1.maximum_mm + r2.maximum_mm;
    return value;
}

double mean_length(Rod r) {
    return (r.maximum_mm + r.minimum_mm) / 2.0;
}

int main(void) {
    Rod r1 = {.minimum_mm = 999, .maximum_mm = 1001};
    Rod r2 = {.minimum_mm = 498, .maximum_mm = 502};
    Rod r3 = {.minimum_mm = 300, .maximum_mm = 305};
    Rod r_joined = join_rods(join_rods(r1,r2), r3);
    printf("min: %d\nmax: %d\nmean: %.1f", r_joined.minimum_mm, r_joined.maximum_mm, mean_length(r_joined));
    return 0;
}