From 4655cd347729d366a23d9674e4447932e728cf0f Mon Sep 17 00:00:00 2001 From: JirR02 Date: Fri, 21 Mar 2025 23:35:38 +0100 Subject: [PATCH] Exercise 5 draft Added Exercise 5 but incomplete --- Informatik_I/Exercise_5/Task_1/calendar.cpp | 90 +++++++++++++++++++ Informatik_I/Exercise_5/Task_2/functions.cpp | 38 ++++++++ Informatik_I/Exercise_5/Task_3/main.md | 35 ++++++++ Informatik_I/Exercise_5/Task_4/run_length.cpp | 63 +++++++++++++ 4 files changed, 226 insertions(+) create mode 100644 Informatik_I/Exercise_5/Task_1/calendar.cpp create mode 100644 Informatik_I/Exercise_5/Task_2/functions.cpp create mode 100644 Informatik_I/Exercise_5/Task_3/main.md create mode 100644 Informatik_I/Exercise_5/Task_4/run_length.cpp diff --git a/Informatik_I/Exercise_5/Task_1/calendar.cpp b/Informatik_I/Exercise_5/Task_1/calendar.cpp new file mode 100644 index 0000000..2e3de00 --- /dev/null +++ b/Informatik_I/Exercise_5/Task_1/calendar.cpp @@ -0,0 +1,90 @@ +#include "calendar.h" +#include + +// PRE: a year greater or equal than 1900 +// POST: returns whether that year was a leap year +bool is_leap_year(int year) { + if (year >= 1900) { + if (year % 4 == 0 && year % 100 != 0) + return true; + else if (year % 4 == 0 && year % 400 == 0) + return true; + } + return false; +} + +// PRE: a year greater or equal than 1900 +// POST: returns the number of days in that year +int count_days_in_year(int year) { + if (year >= 1900) { + if (is_leap_year(year) == true) + return 366; + return 365; + } + return 0; +} + +// PRE: a month between 1 and 12 and a year greater or equal than 1900 +// POST: returns the number of days in the month of that year +int count_days_in_month(int month, int year) { + if (year >= 1900 && month > 0 && month <= 12) { + if (is_leap_year(year) == false) { + if (month % 2 != 0 && month != 2 && month <= 7) + return 31; + else if (month % 2 == 0 && month != 2 && month > 7) + return 31; + else if (month == 2) + return 28; + else + return 30; + } else { + if (month % 2 == 0 && month != 2 && month <= 7) + return 31; + else if (month % 2 == 0 && month != 2 && month > 7) + return 31; + else if (month == 2) + return 29; + else + return 30; + } + } + return 0; +} + +// PRE: n/a +// POST: returns whether the given values represent a valid date +bool is_valid_date(int day, int month, int year) { + if (day > 0 && day <= count_days_in_month(month, year) && month > 0 && + month <= 12 && year >= 1900) + return true; + return false; +} + +// PRE: the given values represent a valid date +// POST: returns the number of days between January 1, 1900 and this date +// (excluding this date) +int count_days(int day, int month, int year) { + int res_day = 0; + if (is_valid_date(day, month, year) == true) { + for (int j = 1901; j <= year; ++j) { + res_day += count_days_in_year(j); + } + for (int j = 1; j < month; ++j) { + res_day += count_days_in_month(j, year); + } + res_day += (day - 1); + } + return res_day; +} + +// PRE: the given values represent a (potentially invalid) date +// POST: prints the weekday if the date is valid or "invalid date" otherwise. +// Everything must be printed in lowercase. +void print_weekday(int day, int month, int year) { + if (is_valid_date(day, month, year) == true) { + std::string days[7] = {"sunday", "monday", "tuesday", "wednesday", + "thursday", "friday", "saturday"}; + std::cout << days[((count_days(day, month, year) + 1) % 7)]; + } else + std::cout << "invalid date"; +} diff --git a/Informatik_I/Exercise_5/Task_2/functions.cpp b/Informatik_I/Exercise_5/Task_2/functions.cpp new file mode 100644 index 0000000..6388bf8 --- /dev/null +++ b/Informatik_I/Exercise_5/Task_2/functions.cpp @@ -0,0 +1,38 @@ +// PRE: x > 0 +// POST: returns n^x +int f1(int n, int x) { + int res = 1; + for (; x > 0; x--) { + res *= n; + } + return res; +} + +// PRE: n > 0 +// POST: returns number of devisions by 10 with n +int f2(int n) { + int i = 0; + while (n > 0) { + n = n / 10; + ++i; + } + return i; +} + +// PRE: n > 1 +// POST: returns a bool to determine if n is prime +bool f3(int n) { + int i = 2; + for (; n % i != 0; ++i); + return n == i; +} + +// PRE: n is square number +// POST: returns root of n +int f4(int n) { + int i = 0; + while (i * i != n) { + ++i; + } + return i; +} diff --git a/Informatik_I/Exercise_5/Task_3/main.md b/Informatik_I/Exercise_5/Task_3/main.md new file mode 100644 index 0000000..067c331 --- /dev/null +++ b/Informatik_I/Exercise_5/Task_3/main.md @@ -0,0 +1,35 @@ +Please write your solution here. +For your convenience we have added a template for your answers below. + +Note: Remember to also describe the problem of the function. + +# Function `c++|is_even`: + +The problem with this function is that it does not return a bool if the number `i` is uneven. + +```c++ +// PRE: n/a +// POST: returns true if i is even. If not it returns false. +bool is_even(int i) { + if (i % 2 == 0) return true; + else return false; +} +``` + +# Function `c++|invert`: + +The problem with this function is + +```c++ +// PRE: x is positive or negative but not zero. +// POST: returns inverse with respect to multiplication of x. +double invert(int x) { + // TODO: Fix code below. + if (x != 0) { + return 1.0 / x; + } + else + std::cout << "0 has no inverse!"; +} +``` + diff --git a/Informatik_I/Exercise_5/Task_4/run_length.cpp b/Informatik_I/Exercise_5/Task_4/run_length.cpp new file mode 100644 index 0000000..899b780 --- /dev/null +++ b/Informatik_I/Exercise_5/Task_4/run_length.cpp @@ -0,0 +1,63 @@ +#include "run_length.h" + +void encode() { + int i; + int c; + int count; + std::cin >> i; + std::cout << 1 << " "; + while (i != -1) { + count = 0; + c = i; + while (i == c && i >= 0 && i <= 255) { + ++count; + std::cin >> i; + if (count == 255) { + break; + } + } + if (i < -1 || i > 255) { + if (count == 0) { + std::cout << "error"; + return; + } else { + std::cout << count << " "; + std::cout << c << " "; + std::cout << "error"; + return; + } + } + std::cout << count << " "; + std::cout << c << " "; + } + std::cout << -1; +} + +void decode() { + int i; + int count; + std::cin >> count; + std::cin >> i; + std::cout << 0 << " "; + while (count != -1) { + if (i < -1 || i > 255) { + std::cout << "error"; + return; + } + if (count < -1 || count > 255) { + std::cout << "error"; + return; + } + for (int j = 0; j < count; ++j) { + std::cout << i << " "; + } + std::cin >> count; + if (count != -1) + std::cin >> i; + if (i == -1) { + std::cout << "error"; + return; + } + } + std::cout << -1; +}