diff --git a/C/C2 AnimalShelter.zip b/C/C2 AnimalShelter.zip index bd3b7c0..431cf54 100644 Binary files a/C/C2 AnimalShelter.zip and b/C/C2 AnimalShelter.zip differ diff --git a/C/C2 AnimalShelter/build/main_test b/C/C2 AnimalShelter/build/main_test old mode 100644 new mode 100755 index 4125116..768bd4d Binary files a/C/C2 AnimalShelter/build/main_test and b/C/C2 AnimalShelter/build/main_test differ diff --git a/C/C2 AnimalShelter/shared/administration.c b/C/C2 AnimalShelter/shared/administration.c index 8a032fe..43bd0c1 100644 --- a/C/C2 AnimalShelter/shared/administration.c +++ b/C/C2 AnimalShelter/shared/administration.c @@ -7,34 +7,39 @@ #include "animal.h" int addAnimal(const Animal* animalPtr, Animal* animalArray, size_t animalArrayLength, size_t numberOfAnimalsPresent, size_t* newNumberOfAnimalsPresent){ - int fault = 0; - if (animalArray == NULL || animalPtr == NULL || numberOfAnimalsPresent >= animalArrayLength) { - fault = -1; // Invalid - } else { - animalArray[numberOfAnimalsPresent] = *animalPtr; - ++numberOfAnimalsPresent; + if (animalArray == NULL || animalPtr == NULL || newNumberOfAnimalsPresent == NULL || numberOfAnimalsPresent >= animalArrayLength) { + return -1; // Invalid } - *newNumberOfAnimalsPresent = numberOfAnimalsPresent; - return fault; + animalArray[numberOfAnimalsPresent] = *animalPtr; + *newNumberOfAnimalsPresent = numberOfAnimalsPresent + 1; + return 0; } int removeAnimal(int animalId, Animal* animalArray, size_t numberOfAnimalsPresent, size_t* newNumberOfAnimalsPresent){ int fault = -1; + size_t removedCount = 0; + if (animalArray == NULL || numberOfAnimalsPresent == 0) { fault = -1; // Invalid } else { - for (size_t i = 0; i < numberOfAnimalsPresent; ++i) { - if (animalArray[i].Id == animalId) { - // move the array elements to the left to remove the animal - for (size_t j = i; j < numberOfAnimalsPresent - 1; ++j) { - animalArray[j] = animalArray[j + 1]; + size_t writeIndex = 0; + + // Copy only animals that don't match the ID + for (size_t readIndex = 0; readIndex < numberOfAnimalsPresent; ++readIndex) { + if (animalArray[readIndex].Id != animalId) { + if (writeIndex != readIndex) { + animalArray[writeIndex] = animalArray[readIndex]; } - --numberOfAnimalsPresent; - fault = 0; - break; + writeIndex++; + } else { + removedCount++; + fault = 0; // Found some animal(s) to remove } } + // Update the number of animals present + numberOfAnimalsPresent -= removedCount; } + *newNumberOfAnimalsPresent = numberOfAnimalsPresent; return fault; } diff --git a/C/C2 AnimalShelter/test/administration_test.c b/C/C2 AnimalShelter/test/administration_test.c index 3d33366..b2ffb0e 100644 --- a/C/C2 AnimalShelter/test/administration_test.c +++ b/C/C2 AnimalShelter/test/administration_test.c @@ -17,11 +17,13 @@ const Animal originalArray[5] = { // Arrays for testing Animal animalArray[5]; Animal searchArray[5]; +Animal idTestArray[5]; void administration_setUp(void) { // Reset both arrays before each test memcpy(animalArray, originalArray, sizeof(originalArray)); memcpy(searchArray, originalArray, sizeof(originalArray)); + memcpy(idTestArray, originalArray, sizeof(originalArray)); } void administration_tearDown(void){} @@ -40,6 +42,15 @@ void test_administration_remove_invalid(void){ TEST_ASSERT_EQUAL(3, newNumberOfAnimalsPresent); } +void test_administration_remove_multiple_of_same_id(void){ + Animal newAnimal = {.Id = 3, .Species = Dog, .Age = 3, .Sex = Male, .DateFound = {1, 1, 2023}}; + idTestArray[3] = newAnimal; + size_t newNumberOfAnimalsPresent = 0; + int errorCode = removeAnimal(3, animalArray, 3, &newNumberOfAnimalsPresent); + TEST_ASSERT_EQUAL(0, errorCode); + TEST_ASSERT_EQUAL(2, newNumberOfAnimalsPresent); +} + void test_administration_add_valid(void){ Animal newAnimal = {.Id = 4, .Species = Dog, .Age = 3, .Sex = Male, .DateFound = {1, 1, 2023}}; size_t newNumberOfAnimalsPresent = 0; @@ -53,7 +64,7 @@ void test_administration_add_invalid(void){ size_t newNumberOfAnimalsPresent = 0; int errorCode = addAnimal(&newAnimal, animalArray, 3, 3, &newNumberOfAnimalsPresent); TEST_ASSERT_EQUAL(-1, errorCode); - TEST_ASSERT_EQUAL(3, newNumberOfAnimalsPresent); + TEST_ASSERT_NOT_EQUAL(4, newNumberOfAnimalsPresent); } void test_administration_find_valid(void){ @@ -81,6 +92,7 @@ void run_administration_tests() MY_RUN_TEST(test_administration_add_invalid); MY_RUN_TEST(test_administration_find_valid); MY_RUN_TEST(test_administration_find_invalid); + MY_RUN_TEST(test_administration_remove_multiple_of_same_id); UnityUnregisterSetupTearDown(); } diff --git a/C/C6 Adidas.zip b/C/C6 Adidas.zip index e39b60d..986da99 100644 Binary files a/C/C6 Adidas.zip and b/C/C6 Adidas.zip differ