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
@@ -0,0 +1,8 @@
add_course_exercise(NAME c_arrays MODULE 04_arrays_and_strings STANDARD 17
SOURCES src/c_arrays.cpp test/c_arrays_test.cpp)
add_course_exercise(NAME std_string MODULE 04_arrays_and_strings STANDARD 17
SOURCES src/std_string.cpp test/std_string_test.cpp)
add_course_exercise(NAME std_vector MODULE 04_arrays_and_strings STANDARD 17
SOURCES src/std_vector.cpp test/std_vector_test.cpp)
add_course_exercise(NAME multidimensional MODULE 04_arrays_and_strings STANDARD 17
SOURCES src/multidimensional.cpp test/multidimensional_test.cpp)
+17
View File
@@ -0,0 +1,17 @@
# Module 04: Arrays and Strings
## Learning Goals
- Use C-style arrays and understand their limitations
- Work with `std::string` manipulation
- Master `std::vector` as a dynamic array
- Handle multi-dimensional data structures
## Exercises
| Exercise | Topic |
|----------|-------|
| `c_arrays` | Fixed-size arrays, bounds |
| `std_string` | String operations |
| `std_vector` | Dynamic arrays |
| `multidimensional` | 2D vectors and matrices |
@@ -0,0 +1,11 @@
#pragma once
#include <cstddef>
namespace arrays {
[[nodiscard]] auto array_sum(const int* data, std::size_t size) -> int;
[[nodiscard]] auto array_max(const int* data, std::size_t size) -> int;
void reverse_array(int* data, std::size_t size);
} // namespace arrays
@@ -0,0 +1,13 @@
#pragma once
#include <vector>
namespace arrays {
using Matrix = std::vector<std::vector<int>>;
[[nodiscard]] auto create_matrix(int rows, int cols, int fill) -> Matrix;
[[nodiscard]] auto transpose(const Matrix& matrix) -> Matrix;
[[nodiscard]] auto row_sums(const Matrix& matrix) -> std::vector<int>;
} // namespace arrays
@@ -0,0 +1,12 @@
#pragma once
#include <string>
namespace arrays {
[[nodiscard]] auto to_uppercase(std::string text) -> std::string;
[[nodiscard]] auto trim(const std::string& text) -> std::string;
[[nodiscard]] auto replace_all(std::string text, char from, char to) -> std::string;
[[nodiscard]] auto starts_with(const std::string& text, const std::string& prefix) -> bool;
} // namespace arrays
@@ -0,0 +1,12 @@
#pragma once
#include <vector>
namespace arrays {
[[nodiscard]] auto vector_sum(const std::vector<int>& data) -> int;
void remove_value(std::vector<int>& data, int value);
[[nodiscard]] auto unique_sorted(std::vector<int> data) -> std::vector<int>;
[[nodiscard]] auto chunk(const std::vector<int>& data, std::size_t size) -> std::vector<std::vector<int>>;
} // namespace arrays
@@ -0,0 +1,9 @@
#include "c_arrays.hpp"
namespace arrays {
auto array_sum(const int* data, std::size_t size) -> int { (void)data; (void)size; return 0; }
auto array_max(const int* data, std::size_t size) -> int { (void)data; (void)size; return 0; }
void reverse_array(int* data, std::size_t size) { (void)data; (void)size; }
} // namespace arrays
@@ -0,0 +1,9 @@
#include "multidimensional.hpp"
namespace arrays {
auto create_matrix(int rows, int cols, int fill) -> Matrix { (void)rows; (void)cols; (void)fill; return {}; }
auto transpose(const Matrix& matrix) -> Matrix { (void)matrix; return {}; }
auto row_sums(const Matrix& matrix) -> std::vector<int> { (void)matrix; return {}; }
} // namespace arrays
@@ -0,0 +1,10 @@
#include "std_string.hpp"
namespace arrays {
auto to_uppercase(std::string text) -> std::string { (void)text; return {}; }
auto trim(const std::string& text) -> std::string { (void)text; return {}; }
auto replace_all(std::string text, char from, char to) -> std::string { (void)text; (void)from; (void)to; return {}; }
auto starts_with(const std::string& text, const std::string& prefix) -> bool { (void)text; (void)prefix; return false; }
} // namespace arrays
@@ -0,0 +1,10 @@
#include "std_vector.hpp"
namespace arrays {
auto vector_sum(const std::vector<int>& data) -> int { (void)data; return 0; }
void remove_value(std::vector<int>& data, int value) { (void)data; (void)value; }
auto unique_sorted(std::vector<int> data) -> std::vector<int> { (void)data; return {}; }
auto chunk(const std::vector<int>& data, std::size_t size) -> std::vector<std::vector<int>> { (void)data; (void)size; return {}; }
} // namespace arrays
@@ -0,0 +1,19 @@
#include "c_arrays.hpp"
#include <gtest/gtest.h>
TEST(CArrays, Sum) {
const int data[] = {1, 2, 3, 4};
EXPECT_EQ(arrays::array_sum(data, 4), 10);
}
TEST(CArrays, Max) {
const int data[] = {1, 9, 3};
EXPECT_EQ(arrays::array_max(data, 3), 9);
}
TEST(CArrays, Reverse) {
int data[] = {1, 2, 3, 4};
arrays::reverse_array(data, 4);
EXPECT_EQ(data[0], 4);
EXPECT_EQ(data[3], 1);
}
@@ -0,0 +1,20 @@
#include "multidimensional.hpp"
#include <gtest/gtest.h>
TEST(Multidimensional, CreateMatrix) {
const auto m = arrays::create_matrix(2, 3, 7);
ASSERT_EQ(m.size(), 2U);
ASSERT_EQ(m[0].size(), 3U);
EXPECT_EQ(m[1][2], 7);
}
TEST(Multidimensional, Transpose) {
const arrays::Matrix m{{1, 2}, {3, 4}};
const auto t = arrays::transpose(m);
EXPECT_EQ(t, (arrays::Matrix{{1, 3}, {2, 4}}));
}
TEST(Multidimensional, RowSums) {
const arrays::Matrix m{{1, 2, 3}, {4, 5, 6}};
EXPECT_EQ(arrays::row_sums(m), (std::vector<int>{6, 15}));
}
@@ -0,0 +1,19 @@
#include "std_string.hpp"
#include <gtest/gtest.h>
TEST(StdString, ToUppercase) {
EXPECT_EQ(arrays::to_uppercase("Hello"), "HELLO");
}
TEST(StdString, Trim) {
EXPECT_EQ(arrays::trim(" hi "), "hi");
}
TEST(StdString, ReplaceAll) {
EXPECT_EQ(arrays::replace_all("a-b-c", '-', '_'), "a_b_c");
}
TEST(StdString, StartsWith) {
EXPECT_TRUE(arrays::starts_with("C++26", "C++"));
EXPECT_FALSE(arrays::starts_with("C++26", "Java"));
}
@@ -0,0 +1,21 @@
#include "std_vector.hpp"
#include <gtest/gtest.h>
TEST(StdVector, Sum) {
EXPECT_EQ(arrays::vector_sum({1, 2, 3}), 6);
}
TEST(StdVector, RemoveValue) {
std::vector<int> data = {1, 2, 2, 3};
arrays::remove_value(data, 2);
EXPECT_EQ(data, (std::vector<int>{1, 3}));
}
TEST(StdVector, UniqueSorted) {
EXPECT_EQ(arrays::unique_sorted({3, 1, 2, 2, 3}), (std::vector<int>{1, 2, 3}));
}
TEST(StdVector, Chunk) {
EXPECT_EQ(arrays::chunk({1, 2, 3, 4, 5}, 2),
(std::vector<std::vector<int>>{{1, 2}, {3, 4}, {5}}));
}