From a06bd5861d5b2709f5653cc6180f9c73b3c80064 Mon Sep 17 00:00:00 2001 From: ohofmann Date: Wed, 26 Mar 2025 06:03:17 +0100 Subject: [PATCH] Added mrange --- .idea/AlgoDatSoSe25.iml | 1 + praktika/01_big_o/max_folge.py | 20 +++++++++----------- utils/memory_array.py | 23 ++++++++++++++++++----- utils/memory_manager.py | 2 +- utils/memory_range.py | 24 ++++++++++++++++++++++++ utils/test_memory_array.py | 17 ++++------------- 6 files changed, 57 insertions(+), 30 deletions(-) create mode 100644 utils/memory_range.py diff --git a/.idea/AlgoDatSoSe25.iml b/.idea/AlgoDatSoSe25.iml index dec32b3..bf024fa 100644 --- a/.idea/AlgoDatSoSe25.iml +++ b/.idea/AlgoDatSoSe25.iml @@ -3,6 +3,7 @@ + diff --git a/praktika/01_big_o/max_folge.py b/praktika/01_big_o/max_folge.py index 3629315..cae2fac 100644 --- a/praktika/01_big_o/max_folge.py +++ b/praktika/01_big_o/max_folge.py @@ -1,20 +1,20 @@ from utils.memory_array import MemoryArray -from utils.literal import Literal from utils.memory_cell import MemoryCell from utils.constants import MIN_VALUE from utils.memory_manager import MemoryManager +from utils.memory_range import mrange def max_sequence_1(z: MemoryArray): - n = len(z) + n = z.length() m = MemoryCell(MIN_VALUE) s = MemoryCell() l = MemoryCell() r = MemoryCell() - for i in range(n): - for j in range(i, n): + for i in mrange(n): + for j in mrange(i, n): s.set(0) - for k in range(i, j): - s += z[Literal(k)] + for k in mrange(i, j): + s += z[k] if s > m: m.set(s) l.set(i) @@ -22,11 +22,9 @@ def max_sequence_1(z: MemoryArray): return m, l, r -def example(max_sequende_func): - z = MemoryArray(Literal(10)) - for i, v in enumerate([-59, 52, 46, 14, -50, 58, -87, -77, 34, 15]): - z[Literal(i)] = Literal(v) - m, l, r = max_sequende_func(z) +def example(max_sequence_func): + z = MemoryArray([-59, 52, 46, 14, -50, 58, -87, -77, 34, 15]) + m, l, r = max_sequence_func(z) print(m, l, r) diff --git a/utils/memory_array.py b/utils/memory_array.py index 8aeecb6..65f40e9 100644 --- a/utils/memory_array.py +++ b/utils/memory_array.py @@ -6,7 +6,16 @@ from random import randint class MemoryArray: - def __init__(self, size): + def __init__(self, parm): + if isinstance(parm, Literal): + self.init_with_size(parm) + elif isinstance(parm, list): + self.size = len(parm) + self.cells = [MemoryCell(value) for value in parm] + else: + raise ValueError("Invalid parameter type") + + def init_with_size(self, size): """Initialisiert ein Speicherarray mit einer bestimmten Größe.""" assert isinstance(size, Literal), "Size must be a Literal or MemoryCell" assert isinstance(size.value, int), "Size must be an int" @@ -45,6 +54,10 @@ class MemoryArray: """Gibt eine Liste der Indizes der Speicherzellen zurück.""" return [Literal(i) for i in range(self.size)] + def length(self): + """Gibt die Größe des Speicherarrays zurück.""" + return Literal(self.size) + def reset_counters(self): """Setzt alle Zähler auf 0 zurück.""" for cell in self.cells: @@ -85,8 +98,8 @@ if __name__ == "__main__": for i in a.indices(): a[i] = Literal(random.randint(1,100)) print(a) - sum = MemoryCell(0) + s = MemoryCell(0) for cell in a.cells: - sum += cell - print(sum) - MemoryManager.print_statistics() \ No newline at end of file + s += cell + print(s) + print(f"Anzahl der Additionen: {MemoryManager.count_adds()}") diff --git a/utils/memory_manager.py b/utils/memory_manager.py index e07012f..85cb2ec 100644 --- a/utils/memory_manager.py +++ b/utils/memory_manager.py @@ -53,7 +53,7 @@ class MemoryManager: def reset(): manager = MemoryManager.get_instance() for cell in manager.cells: - cell.reset_counters + cell.reset_counters() @staticmethod def purge(): diff --git a/utils/memory_range.py b/utils/memory_range.py new file mode 100644 index 0000000..3470d67 --- /dev/null +++ b/utils/memory_range.py @@ -0,0 +1,24 @@ +from utils.literal import Literal + +# a generator that yields items instead of returning a list +def mrange(parm1, parm2=None, parm3=None): + if parm2 is None: + start = 0 + stop = int(parm1) + step = 1 + elif parm3 is None: + start = int(parm1) + stop = int(parm2) + step = 1 + else: + start = int(parm1) + stop = int(parm2) + step = int(parm3) + num = start + while num < stop: + yield Literal(num) + num += step + +if __name__ == "__main__": + for l in mrange(10): + print(l) diff --git a/utils/test_memory_array.py b/utils/test_memory_array.py index 0d15eee..5b5c81d 100644 --- a/utils/test_memory_array.py +++ b/utils/test_memory_array.py @@ -22,27 +22,18 @@ class TestMemoryArray(TestCase): def test_get_item(self): l = random.randint(5,10) - size = Literal(l) - a = MemoryArray(size) - values = [] - for i in a.indices(): - v = Literal(random.randint(1,100)) - values.append(v.value) - a[i] = v + values = [random.randint(1,100) for _ in range(l)] + a = MemoryArray(values) for pos, i in enumerate(a.indices()): self.assertEqual(a[i].value, values[pos]) def test_reset_counters(self): l = random.randint(5,10) - size = Literal(l) - a = MemoryArray(size) - for i in a.indices(): - v = Literal(random.randint(1,100)) - a[i] = v + values = [random.randint(1,100) for _ in range(l)] + a = MemoryArray(values) for i in a.indices(): self.assertEqual(a[i].write_count, 1) a.reset_counters() - for i in a.indices(): self.assertEqual(a[i].write_count, 0)