From 8719f4c1407896fcd7812bd82b780d430d1bd624 Mon Sep 17 00:00:00 2001 From: JirR02 Date: Sat, 22 Mar 2025 13:19:34 +0100 Subject: [PATCH] Exercise 5 & updated README Added Exercise 5 and translated README and added signature as well as disclaimer --- Informatik_I/Exercise_2/task_3b/README.md | 4 ++ Informatik_I/Exercise_5/Task_1/README.md | 50 ++++++++++++++ Informatik_I/Exercise_5/Task_1/calendar.cpp | 24 +++---- Informatik_I/Exercise_5/Task_2/README.md | 8 +++ Informatik_I/Exercise_5/Task_3/README.md | 28 ++++++++ Informatik_I/Exercise_5/Task_4/README.md | 64 ++++++++++++++++++ .../Task_4/pictures/encode_decode.png | Bin 0 -> 16360 bytes README.md | 14 +++- 8 files changed, 178 insertions(+), 14 deletions(-) create mode 100644 Informatik_I/Exercise_5/Task_1/README.md create mode 100644 Informatik_I/Exercise_5/Task_2/README.md create mode 100644 Informatik_I/Exercise_5/Task_3/README.md create mode 100644 Informatik_I/Exercise_5/Task_4/README.md create mode 100644 Informatik_I/Exercise_5/Task_4/pictures/encode_decode.png diff --git a/Informatik_I/Exercise_2/task_3b/README.md b/Informatik_I/Exercise_2/task_3b/README.md index fbfc30c..40cfeff 100644 --- a/Informatik_I/Exercise_2/task_3b/README.md +++ b/Informatik_I/Exercise_2/task_3b/README.md @@ -1,3 +1,7 @@ +# Mistakes + +- The variable `j` goes into overflow which is not allowed! + # Fibonacci overflow check ## Background diff --git a/Informatik_I/Exercise_5/Task_1/README.md b/Informatik_I/Exercise_5/Task_1/README.md new file mode 100644 index 0000000..f0d9a24 --- /dev/null +++ b/Informatik_I/Exercise_5/Task_1/README.md @@ -0,0 +1,50 @@ +# Task + +A perpetual calendar can be used to determine the weekday (Monday, ..., Sunday) of any given date. You may for example know that the Berlin wall came down on November 9, 1989, but what was the weekday? It was a Thursday. Or what is the weekday of the 1000th anniversary of the Swiss confederation, to be celebrated on August 1, 2291? It will be a Saturday. The task of this exercise is to write a program that outputs the weekday of a given input date. + +Your program will read the date from the input. The input is given as three integer values in the following order: Day, month, year. First the program must validate the input. Pay attention to special cases of February (leap years!) also, the date must be greater or equal to the reference date. If a date is invalid output invalid date. If the date is valid, calculate the weekday of this day. This can be done by calculating how many days lie between the date in question and a reference date whose weekday is known. As reference date use Monday, 1st January 1900. Finally, output the weekday as one word in English. + +**Approach**: The goal of this exercise is to learn the usage of functions. For that, we split the program into the following sub tasks given as function declarations. Your task is to **implement the provided functions** in the calendar.cpp file, so that they perform the action that is specified in their post condition. + +**Important: There is a well-known mathematical function to calculate the weekday of a date. Using this function is an incorrect solution as it defeats the purpose of this exercise.** + +```cpp +// PRE: a year greater or equal than 1900 +// POST: returns whether that year was a leap year +bool is_leap_year(int year); + +// PRE: a year greater or equal than 1900 +// POST: returns the number of days in that year +int count_days_in_year(int year); + +// 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); + +// PRE: n/a +// POST: returns whether the given values represent a valid date +bool is_valid_date(int day, int month, int year); + +// 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); + +// 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); +``` + +To complete the task, you have to provide the definition of the aforementioned functions. + +The `calendar.cpp` file contains skeletons of the functions to be implemented. The `main.cpp` file contains testing functions and the main function. In the main function, a menu is printed to select the function that has to be tested. + +**Important** the main is not editable. Required functions must be implemented in `calendar.cpp`. + +**Additional notes:** + +1. For function arguments that do **not** fulfill the precondition, the behavior is undefined. + +1. There are a few opportunities here to use switch statements. Use them if they result in better readable code. + +1. A leap year is defined as follows: It is an integer multiple of 4, except for years evenly divisible by 100, which are not leap years unless evenly divisible by 400. (Source: [Wikipedia](https://en.wikipedia.org/wiki/Leap_year)) diff --git a/Informatik_I/Exercise_5/Task_1/calendar.cpp b/Informatik_I/Exercise_5/Task_1/calendar.cpp index 2e3de00..a7e2406 100644 --- a/Informatik_I/Exercise_5/Task_1/calendar.cpp +++ b/Informatik_I/Exercise_5/Task_1/calendar.cpp @@ -28,24 +28,24 @@ int count_days_in_year(int year) { // 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 (is_leap_year(year) == true) { 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) + else if (month % 2 == 0 && month > 7) return 31; else if (month == 2) return 29; else return 30; + } else { + if (month % 2 != 0 && month != 2 && month <= 7) + return 31; + else if (month % 2 == 0 && month > 7) + return 31; + else if (month == 2) + return 28; + else + return 30; } } return 0; @@ -66,7 +66,7 @@ bool is_valid_date(int day, int month, int year) { 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) { + for (int j = 1900; j < year; ++j) { res_day += count_days_in_year(j); } for (int j = 1; j < month; ++j) { diff --git a/Informatik_I/Exercise_5/Task_2/README.md b/Informatik_I/Exercise_5/Task_2/README.md new file mode 100644 index 0000000..63bf4d5 --- /dev/null +++ b/Informatik_I/Exercise_5/Task_2/README.md @@ -0,0 +1,8 @@ +_This task is a text-based task. You do not need to write any program/C++ file: the answer should be written in functions.cpp._ + +Consider the functions implemented in `functions.cpp`. For each function, add proper pre- and post-conditions. + +- If no pre-condition is needed, you can simply write "n/a". +- The post-condition does not have to be a mathematical formula, e.g. it can be an informal description, but it must completely characterize the results and effects of the functions depending on the provided parameters. + +**Note**: For the purposes of this task, you can ignore overflows. diff --git a/Informatik_I/Exercise_5/Task_3/README.md b/Informatik_I/Exercise_5/Task_3/README.md new file mode 100644 index 0000000..818d83b --- /dev/null +++ b/Informatik_I/Exercise_5/Task_3/README.md @@ -0,0 +1,28 @@ +_This task is a text based task. You do not need to write any program/C++ file: the answer should be written in main.md (and might include code fragments if questions ask for them)._ + +# Task: + +What are the problems (if any) with the following functions? Fix them and find appropriate [pre-](https://en.wikipedia.org/wiki/Precondition) and [postconditions](https://en.wikipedia.org/wiki/Postcondition). + +1. function is_even: + +```cpp + +bool is_even(int i) { + if (i % 2 == 0) return true; +} +``` + +1. function invert: + +```cpp +double invert(int x) { + double result; + if (x != 0) { + result = 1.0 / x; + } + return result; +} +``` + +**Hint**: The C++ compiler does not protect you from certain types of errors. Therefore, even if you run a program in Code Expert, it is not guaranteed that the behaviour you observe is the “real” one. We have prepared a [program tracing handout](https://lec.inf.ethz.ch/ifmp/2023/guides/tracing/intro.html) that shows how to execute a program with a pen and paper and which conditions indicate bugs in the executed program not caught by the C++ compiler. diff --git a/Informatik_I/Exercise_5/Task_4/README.md b/Informatik_I/Exercise_5/Task_4/README.md new file mode 100644 index 0000000..8790993 --- /dev/null +++ b/Informatik_I/Exercise_5/Task_4/README.md @@ -0,0 +1,64 @@ +Task + +Run-length encoding is a simple data compression technique that represents $N$ consecutive identical values $W$ (a run) by a tuple ($N,W$). This method is applied for image compression, for instance. Example: + +![Encoding and Decoding](./pictures/encode_decode.png) + +Write a program that implements run-length encoding and decoding of a byte sequence as described above. By a byte, we mean an integer value in the range $\[ 0; 255 \]$. Use the stepwise refinement method to implement the program. **Your solution must consist of at least two functions, encode and decode. Please implement them in `run_length.cpp`.** + +The _input_ is structured as follows: + +1. One integer that determines whether to encode: $0$ or decode: $1$. +1. Byte sequence to be encoded or decoded (of arbitrary length). If a value outside the range $\[ 0; 255 \]$(except $-1$) is entered, output `error` and stop the en- or decoding. +1. Integer -1 signaling the end of the byte sequence. Any extra input should be ignored. + +For the example above, the inputs are: + +**Encode:** + +```sh +0 42 42 85 85 85 85 172 172 172 13 13 42 -1 +``` + +**Decode:** + +```sh +1 2 42 4 85 3 172 2 13 1 42 -1 +``` + +_The output_ is expected on a single line in the following format: + +1. A start value to indicate the begin of the sequence: either $0$ for decoded values or $1$ for encoded values. +1. The values that make up the encoded or decoded byte sequence. +1. The value $-1$ to indicate the end of the sequence. + +I.e., you can 'reuse' the output as the input. + +**Note 1):** As the encoded sequence must be a _byte_ sequence, runs of length 256 or longer need to be split into multiple runs of length 255 at most. + +**Note 2):** The first input element (the integer that determines wether to encode or decode), is already consumed by the `main`, that calls either the encode or decode function. + +**Note 3):** Your output should not be followed by new line (i.e., do not use `std::endl` or `\n` at the end of your printout) + +**Note 4):** The program will print your output (the result of the decoding or encoding), surrounded by asterisks. You don't have to worry about them, the autograder can safely recognize your solution + +**Note 5):** Output only what is strictly required (the encoded or decoded sequence). The autograder will only accept output that exactly matches the expected result. For all other messages, use `std::cerr` as in: + +```cpp +std::cerr << "This is a test message\n" +``` + +Those will be ignored by the autograder. + +**Special cases**: While decoding a byte sequence two special cases can occur. These must be handled as follows: + +1. If a byte sequence ends in the middle of a tuple, stop printing the output of en- or decoding and output `error`. +1. Tuples of run-length 0 are possible. For such tuples, output only the leading indicator ($0$/$1$) and the trailing $-1$. + +**Hint**: You can enter multiple numbers at once separated with a space on the console, e.g, you can copy and paste the above examples, and sequentially read them using multiple `std::cin >> _var_` calls. + +Also note that, even though the program's output and the user input are both shown in the same console, they are processed separately internally, so you do not have to worry that the two will mix: if your program outputs something to the console before reading another value, it will only read the user input and not the previous output value. See the Calculator code in the Lecture 4 handout for an example of reading input and producing output in a loop. + +Finally, part of the correctness for this task is the termination of your code, so pay attention to this. The autograder may not catch these kinds of mistakes. + +**Restrictions**: using a vector, an array or a similar data structure in any part of your code is not allowed and would result in 0 points. diff --git a/Informatik_I/Exercise_5/Task_4/pictures/encode_decode.png b/Informatik_I/Exercise_5/Task_4/pictures/encode_decode.png new file mode 100644 index 0000000000000000000000000000000000000000..f99b59f174ddc6e4f3183aaf63a3d2ce181c42fc GIT binary patch literal 16360 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 WDh*!qG+