From 83b96c944288fc1acf477877f60ec1e4b0b0cf93 Mon Sep 17 00:00:00 2001 From: Pia Keil Date: Tue, 9 Dec 2025 08:07:35 +0100 Subject: [PATCH] Implement createNumbers alternative + tests --- numbers.c | 103 ++++++++++++++++++++++++++++++--- numbers.o | Bin 0 -> 1800 bytes test_numbers | Bin 0 -> 55376 bytes test_numbers.c | 152 +++++++++++++++++++++++++++++++++++++++++++++++++ test_numbers.o | Bin 0 -> 3976 bytes 5 files changed, 248 insertions(+), 7 deletions(-) create mode 100644 numbers.o create mode 100755 test_numbers create mode 100644 test_numbers.c create mode 100644 test_numbers.o diff --git a/numbers.c b/numbers.c index f59d9a2..741a27d 100644 --- a/numbers.c +++ b/numbers.c @@ -11,16 +11,105 @@ * Duplizieren eines zufälligen Eintrags im Array. * in `getDuplicate()`: Sortieren des Arrays und Erkennen der doppelten Zahl durch Vergleich benachbarter Elemente. */ -// Returns len random numbers between 1 and 2x len in random order which are all different, except for two entries. -// Returns NULL on errors. Use your implementation of the binary search tree to check for possible duplicates while -// creating random numbers. -unsigned int *createNumbers(unsigned int len) -{ +// ------------------------------------------------------------- +// Vergleichsfunktion für qsort (Aufsteigend sortieren) +// ------------------------------------------------------------- +static int compareUnsignedInt(const void *a, const void *b) +{ + const unsigned int *ia = a; + const unsigned int *ib = b; + + if (*ia < *ib) return -1; + if (*ia > *ib) return 1; + return 0; } -// Returns only the only number in numbers which is present twice. Returns zero on errors. + + +// ------------------------------------------------------------- +// createNumbers +// Erzeugt ein Array aus len Zufallszahlen (1..2*len), alle verschieden. +// Danach wird genau EIN zufälliger Eintrag dupliziert. +// Parameter: len = Anzahl der gewünschten Zufallszahlen +// Rückgabe: Pointer auf das erzeugte Array (muss mit free() freigegeben werden) +// ------------------------------------------------------------- +unsigned int *createNumbers(unsigned int len) +{ + if (len < 2) + return NULL; + + srand(time(NULL)); + + unsigned int *numbers = malloc(len * sizeof(unsigned int)); + if (!numbers) + return NULL; + + unsigned int count = 0; + + // alle Werte verschieden erzeugen + while (count < len) + { + unsigned int value = (rand() % (2 * len)) + 1; + + // Duplikatsprüfung (linear) + int exists = 0; + for (unsigned int i = 0; i < count; i++) { + if (numbers[i] == value) { + exists = 1; + break; + } + } + + if (!exists) + numbers[count++] = value; + } + + // EIN Duplikat erzeugen + unsigned int i1 = rand() % len; + unsigned int i2 = rand() % len; + while (i2 == i1) + i2 = rand() % len; + + numbers[i2] = numbers[i1]; + + return numbers; +} + + + +// ------------------------------------------------------------- +// getDuplicate +// Findet die einzige Zahl, die im Array zweimal vorkommt. +// Sortiert dazu eine Kopie des Arrays und vergleicht benachbarte Werte. +// Parameter: numbers = Array von Zufallszahlen +// len = Anzahl der Elemente +// Rückgabe: die doppelte Zahl oder 0 bei Fehler +// ------------------------------------------------------------- unsigned int getDuplicate(const unsigned int numbers[], unsigned int len) { + if (!numbers || len < 2) + return 0; -} \ No newline at end of file + // Kopie erzeugen, damit das Original unverändert bleibt + unsigned int *copy = malloc(len * sizeof(unsigned int)); + if (!copy) + return 0; + + memcpy(copy, numbers, len * sizeof(unsigned int)); + + // Sortieren + qsort(copy, len, sizeof(unsigned int), compareUnsignedInt); + + // benachbarte Elemente vergleichen + unsigned int duplicate = 0; + for (unsigned int i = 1; i < len; i++) { + if (copy[i] == copy[i - 1]) { + duplicate = copy[i]; + break; + } + } + + free(copy); + return duplicate; +} diff --git a/numbers.o b/numbers.o new file mode 100644 index 0000000000000000000000000000000000000000..b7f40415d569022fc9ef4b9cabd324142e12199f GIT binary patch literal 1800 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 +#include +#include +#include "unity.h" +#include "numbers.h" + + +// ------------------------------------------------------------- +// Hilfsfunktion: zählt, wie oft ein Wert im Array vorkommt +// ------------------------------------------------------------- +static unsigned int countOccurrences(const unsigned int *arr, unsigned int len, unsigned int value) +{ + unsigned int count = 0; + for (unsigned int i = 0; i < len; i++) + if (arr[i] == value) + count++; + return count; +} + + + +// ------------------------------------------------------------- +// Test 1: Array wird korrekt erzeugt (nicht NULL) +// ------------------------------------------------------------- +void test_createNumbersReturnsNotNull(void) +{ + unsigned int len = 20; + unsigned int *numbers = createNumbers(len); + + TEST_ASSERT_NOT_NULL(numbers); + + free(numbers); +} + + + +// ------------------------------------------------------------- +// Test 2: Alle Zahlen liegen im erlaubten Bereich (1..2*len) +// ------------------------------------------------------------- +void test_numbersAreInCorrectRange(void) +{ + unsigned int len = 50; + unsigned int *numbers = createNumbers(len); + + TEST_ASSERT_NOT_NULL(numbers); + + for (unsigned int i = 0; i < len; i++) + { + TEST_ASSERT_TRUE(numbers[i] >= 1); + TEST_ASSERT_TRUE(numbers[i] <= 2 * len); + } + + free(numbers); +} + + + +// ------------------------------------------------------------- +// Test 3: Es gibt GENAU EIN Duplikat +// ------------------------------------------------------------- +void test_exactlyOneDuplicateExists(void) +{ + unsigned int len = 80; + unsigned int *numbers = createNumbers(len); + + TEST_ASSERT_NOT_NULL(numbers); + + unsigned int duplicatesFound = 0; + + for (unsigned int i = 0; i < len; i++) + { + unsigned int occurrences = countOccurrences(numbers, len, numbers[i]); + if (occurrences == 2) + duplicatesFound++; + } + + // Da das Duplikat an zwei Positionen vorkommt, + // erwarten wir duplicatesFound == 2 + TEST_ASSERT_EQUAL_UINT(2, duplicatesFound); + + free(numbers); +} + + + +// ------------------------------------------------------------- +// Test 4: getDuplicate() findet die richtige doppelte Zahl +// ------------------------------------------------------------- +void test_getDuplicateFindsCorrectValue(void) +{ + unsigned int len = 100; + unsigned int *numbers = createNumbers(len); + + TEST_ASSERT_NOT_NULL(numbers); + + unsigned int duplicate = getDuplicate(numbers, len); + + TEST_ASSERT_TRUE(duplicate >= 1); + TEST_ASSERT_TRUE(duplicate <= 2 * len); + + TEST_ASSERT_EQUAL_UINT(2, countOccurrences(numbers, len, duplicate)); + + free(numbers); +} + + + +// ------------------------------------------------------------- +// Test 5: createNumbers() erzeugt len Elemente +// ------------------------------------------------------------- +void test_arrayLengthIsCorrect(void) +{ + unsigned int len = 30; + unsigned int *numbers = createNumbers(len); + + TEST_ASSERT_NOT_NULL(numbers); + + // Unity-Funktion prüft nicht direkt Länge, aber wir können checken, + // ob Zugriff auf alle Elemente möglich ist (Segfault würde Test crashen). + for (unsigned int i = 0; i < len; i++) + TEST_ASSERT_TRUE(numbers[i] >= 1); + + free(numbers); +} + + + +// ------------------------------------------------------------- +// Leere setUp/tearDown +// ------------------------------------------------------------- +void setUp(void) {} +void tearDown(void) {} + + + +// ------------------------------------------------------------- +// Hauptprogramm für Unity-Tests +// ------------------------------------------------------------- +int main(void) +{ + UNITY_BEGIN(); + + printf("\n============================\nNumbers tests\n============================\n"); + + RUN_TEST(test_createNumbersReturnsNotNull); + RUN_TEST(test_numbersAreInCorrectRange); + RUN_TEST(test_exactlyOneDuplicateExists); + RUN_TEST(test_getDuplicateFindsCorrectValue); + RUN_TEST(test_arrayLengthIsCorrect); + + return UNITY_END(); +} diff --git a/test_numbers.o b/test_numbers.o new file mode 100644 index 0000000000000000000000000000000000000000..139baad745eabc5e77d95e4d4ceabc756740afb2 GIT binary patch literal 3976 zcmb7HPiz!b7=Luzvi&3FpB6=BF^B z|9$VxoAF>M$Gz+mrpwXiieVm9GI@;6dTRg4D&U*|km7;03Q9OyMN7%zKTx-Z> z24EOnsXbjjuc)>a$c#lN2qDY{cVPx{IlePO;5RRwf#5k{J&QtkQ>|jH@ zf&M`=;~E9~P}c4>3_Tgt@2QuZinl2$=QiFX1X83{5ppvGYtZHJEg+sD8_$U30*n4U zp!9?g=V62}Vi(ELAo4nf5Kp3Wd{B?x<~|j_%pP7cHoHxX9;+#)&tF+Le(H)bjtD18 z5%B;+t}aK~9~=~R zH{na;mLuY&;JSYe+eOzs@O@p4Jl@2t7rv+~-JOc7go+Er<<_a9abR2V7x9mRmzz(Ix>+oBTBx`+%q*$&B-+Vn@ zCbhDJdHN(*(IcdfRn}AzO|t$WG4i@1DSm#-7mi8E&x?PAB@7icn_PfwU);rm{Bl5wcR-@HmE~~@ZznA&@%!yr)2nlXiWJ$ahCSr*JuJJ+ z{3OeXn#GV-x}iI3fZp+@qdQw1^#!TQZ0C%OI7t^ zVN{eMfqzH^+ufPT6i{#MjFlHTVUJ}m6UHF^3A+2)Y4P%A z1l8=pb$os`HTFA}#VM!kUY_vAEsA(U5w9!aHAS>3;#HAz`v*5G76jN=6bl0ECh;%9 C9T0H< literal 0 HcmV?d00001