Initial Course

This commit is contained in:
David Gil de Gómez Pérez
2026-08-11 17:40:36 +03:00
commit 9aed1d1d86
202 changed files with 3420 additions and 0 deletions
+8
View File
@@ -0,0 +1,8 @@
add_course_exercise(NAME conditionals MODULE 02_control_flow STANDARD 17
SOURCES src/conditionals.cpp test/conditionals_test.cpp)
add_course_exercise(NAME switch_statements MODULE 02_control_flow STANDARD 17
SOURCES src/switch_statements.cpp test/switch_statements_test.cpp)
add_course_exercise(NAME loops MODULE 02_control_flow STANDARD 17
SOURCES src/loops.cpp test/loops_test.cpp)
add_course_exercise(NAME break_continue MODULE 02_control_flow STANDARD 17
SOURCES src/break_continue.cpp test/break_continue_test.cpp)
+17
View File
@@ -0,0 +1,17 @@
# Module 02: Control Flow
## Learning Goals
- Write conditional logic with `if`, `else if`, and `else`
- Use `switch` statements and understand fall-through
- Implement loops: `for`, `while`, and range-based patterns
- Control loop execution with `break` and `continue`
## Exercises
| Exercise | Topic |
|----------|-------|
| `conditionals` | Classification, min/max, sign |
| `switch_statements` | Menu dispatch, enum handling |
| `loops` | Summation, factorial, search |
| `break_continue` | Filtering, early exit |
@@ -0,0 +1,11 @@
#pragma once
#include <vector>
namespace control_flow {
[[nodiscard]] auto sum_positive(const std::vector<int>& data) -> int;
[[nodiscard]] auto first_multiple_of(const std::vector<int>& data, int divisor) -> int;
[[nodiscard]] auto collect_until_negative(const std::vector<int>& data) -> std::vector<int>;
} // namespace control_flow
@@ -0,0 +1,11 @@
#pragma once
namespace control_flow {
enum class Grade { A, B, C, D, F };
[[nodiscard]] auto classify_score(int score) -> Grade;
[[nodiscard]] auto max_of_three(int a, int b, int c) -> int;
[[nodiscard]] auto sign_of(int value) -> int;
} // namespace control_flow
+12
View File
@@ -0,0 +1,12 @@
#pragma once
#include <vector>
namespace control_flow {
[[nodiscard]] auto sum_range(int from, int to) -> int;
[[nodiscard]] auto factorial(int n) -> long long;
[[nodiscard]] auto count_occurrences(const std::vector<int>& data, int target) -> int;
[[nodiscard]] auto first_index_of(const std::vector<int>& data, int target) -> int;
} // namespace control_flow
@@ -0,0 +1,13 @@
#pragma once
#include <string>
namespace control_flow {
enum class Operation { Add, Subtract, Multiply, Divide, Unknown };
[[nodiscard]] auto parse_operation(char op) -> Operation;
[[nodiscard]] auto apply_operation(Operation op, int lhs, int rhs) -> int;
[[nodiscard]] auto day_name(int day) -> std::string;
} // namespace control_flow
@@ -0,0 +1,20 @@
#include "break_continue.hpp"
namespace control_flow {
auto sum_positive(const std::vector<int>& data) -> int {
(void)data;
return 0;
}
auto first_multiple_of(const std::vector<int>& data, int divisor) -> int {
(void)data; (void)divisor;
return -1;
}
auto collect_until_negative(const std::vector<int>& data) -> std::vector<int> {
(void)data;
return {};
}
} // namespace control_flow
@@ -0,0 +1,22 @@
#include "conditionals.hpp"
namespace control_flow {
auto classify_score(int score) -> Grade {
// TODO: A>=90, B>=80, C>=70, D>=60, else F
(void)score;
return Grade::F;
}
auto max_of_three(int a, int b, int c) -> int {
(void)a; (void)b; (void)c;
return 0;
}
auto sign_of(int value) -> int {
// TODO: Return -1, 0, or 1
(void)value;
return 0;
}
} // namespace control_flow
+26
View File
@@ -0,0 +1,26 @@
#include "loops.hpp"
namespace control_flow {
auto sum_range(int from, int to) -> int {
(void)from; (void)to;
return 0;
}
auto factorial(int n) -> long long {
(void)n;
return 1;
}
auto count_occurrences(const std::vector<int>& data, int target) -> int {
(void)data; (void)target;
return 0;
}
auto first_index_of(const std::vector<int>& data, int target) -> int {
// TODO: Return index or -1 if not found
(void)data; (void)target;
return -1;
}
} // namespace control_flow
@@ -0,0 +1,21 @@
#include "switch_statements.hpp"
namespace control_flow {
auto parse_operation(char op) -> Operation {
(void)op;
return Operation::Unknown;
}
auto apply_operation(Operation op, int lhs, int rhs) -> int {
(void)op; (void)lhs; (void)rhs;
return 0;
}
auto day_name(int day) -> std::string {
// TODO: 1=Monday ... 7=Sunday, else "Invalid"
(void)day;
return "Invalid";
}
} // namespace control_flow
@@ -0,0 +1,15 @@
#include "break_continue.hpp"
#include <gtest/gtest.h>
TEST(BreakContinue, SumPositive) {
EXPECT_EQ(control_flow::sum_positive({1, -2, 3, -4, 5}), 9);
}
TEST(BreakContinue, FirstMultipleOf) {
EXPECT_EQ(control_flow::first_multiple_of({1, 3, 4, 8}, 4), 8);
EXPECT_EQ(control_flow::first_multiple_of({1, 3, 5}, 4), -1);
}
TEST(BreakContinue, CollectUntilNegative) {
EXPECT_EQ(control_flow::collect_until_negative({1, 2, 3, -1, 4}), (std::vector<int>{1, 2, 3}));
}
@@ -0,0 +1,19 @@
#include "conditionals.hpp"
#include <gtest/gtest.h>
TEST(Conditionals, ClassifyScore) {
EXPECT_EQ(control_flow::classify_score(95), control_flow::Grade::A);
EXPECT_EQ(control_flow::classify_score(82), control_flow::Grade::B);
EXPECT_EQ(control_flow::classify_score(55), control_flow::Grade::F);
}
TEST(Conditionals, MaxOfThree) {
EXPECT_EQ(control_flow::max_of_three(1, 9, 3), 9);
EXPECT_EQ(control_flow::max_of_three(-1, -5, -2), -1);
}
TEST(Conditionals, SignOf) {
EXPECT_EQ(control_flow::sign_of(10), 1);
EXPECT_EQ(control_flow::sign_of(0), 0);
EXPECT_EQ(control_flow::sign_of(-3), -1);
}
@@ -0,0 +1,21 @@
#include "loops.hpp"
#include <gtest/gtest.h>
TEST(Loops, SumRange) {
EXPECT_EQ(control_flow::sum_range(1, 5), 15);
EXPECT_EQ(control_flow::sum_range(5, 5), 5);
}
TEST(Loops, Factorial) {
EXPECT_EQ(control_flow::factorial(0), 1);
EXPECT_EQ(control_flow::factorial(5), 120);
}
TEST(Loops, CountOccurrences) {
EXPECT_EQ(control_flow::count_occurrences({1, 2, 2, 3}, 2), 2);
}
TEST(Loops, FirstIndexOf) {
EXPECT_EQ(control_flow::first_index_of({4, 5, 6}, 5), 1);
EXPECT_EQ(control_flow::first_index_of({4, 5, 6}, 9), -1);
}
@@ -0,0 +1,18 @@
#include "switch_statements.hpp"
#include <gtest/gtest.h>
TEST(SwitchStatements, ParseOperation) {
EXPECT_EQ(control_flow::parse_operation('+'), control_flow::Operation::Add);
EXPECT_EQ(control_flow::parse_operation('?'), control_flow::Operation::Unknown);
}
TEST(SwitchStatements, ApplyOperation) {
EXPECT_EQ(control_flow::apply_operation(control_flow::Operation::Add, 2, 3), 5);
EXPECT_EQ(control_flow::apply_operation(control_flow::Operation::Multiply, 4, 5), 20);
}
TEST(SwitchStatements, DayName) {
EXPECT_EQ(control_flow::day_name(1), "Monday");
EXPECT_EQ(control_flow::day_name(7), "Sunday");
EXPECT_EQ(control_flow::day_name(0), "Invalid");
}