Konahrik16 Ответов: 2

Сравните первый элемент с n элементами, если он уникален (struct in C)


Я работаю над базой данных на языке Си, которая предлагает пользователю ввести уникальный идентификационный код (UID) для продукта, например, значение int 1, для первого элемента, 2 для следующего, 3...и т. д...

Однако, когда я пытаюсь сравнить каждый UID, оператор if не ловит "ошибку", что другой элемент имеет тот же UID.

Напр.

Пункт 1: UID 1
Пункт 2: UID 1 / / это ошибка, над которой я сейчас работаю

Затем программа должна предупредить пользователя, что UID элемента 2 не является уникальным, и ввести "правильное" значение до тех пор, пока он этого не сделает. (это рекурсивный вызов функции).

Тогда результат должен быть:

Пункт 1: UID 1
Пункт 2: UID 2 и т. д...

Я был бы очень признателен за любую помощь

Что я уже пробовал:

// struct templates omitted
int num_of_items = 0;
// enter item details below
fprintf(stdout, "Enter unique identifier for item %d\n", num_of_items);
scanf("%d", &unique_ID);
fflush(stdin);

inventory[num_of_items].item_ID = unique_ID;

// check if ID is unique for each inventory item
if (inventory[num_of_items + 1].item_ID == inventory[num_of_items].item_ID)
{
    fprintf(stderr, "%s\n", "You must enter a unique identifier");
    add_new_item(inventory);
}
else
{
    // prompt user for values
}

2 Ответов

Рейтинг:
2

Patrice T

Ваш код явно ошибочен, но поскольку он выглядит как домашнее задание, полного решения проблемы нет.
Вот как бы вы организовали свой код

loop until user have entered a UID
    prompt user for new ID
    get user input
    loop for every item in inventory
        compare item ID with new ID
        if it match, new ID is not unique, ask again
    end of loop
end of loop
insert the new ID in inventory


Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволяет вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения, это невероятный инструмент обучения.

Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010-YouTube[^]
Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


Рейтинг:
1

OriginalGriff

Ну нет, не будет.
Он проверяет только элемент после того, который вы только что вставили, чтобы увидеть, совпадает ли он с тем, который вы только что туда вставили!

Если вы хотите проверить, то вы идете по неверному пути: убедитесь, что идентификатор не существует до ты положил его туда!

Начните с написания метода поиска идентификатора в списке.

MyStruct* Find(int ID)
   {
   int i;
   for (i = 0; i < num_of_items; i++)
      {
      if (inventory[i].item_ID == ID)
         {
         return &(inventory[i]);
         }
      }
   return (MyStruct*) 0;   
   }
Теперь вызовите это, передав ему новый" уникальный " идентификатор и посмотрите, что он возвращает. Если он возвращает нулевой указатель, его нет в списке, и вы можете добавить его:
MyStruct* pms = Find(unique_ID);
if (pms == (MyStruct*) 0)
   {
   inventory[num_of_items++] = ... // your new element with the ID.
   }
else
   {
   // Tell him it exists.
   }


Konahrik16

В этом есть смысл! Спасибо!

OriginalGriff

Приятным моментом является то, что, поскольку вы возвращаете указатель на любой существующий элемент с заданным идентификатором, вы можете использовать тот же метод позже, когда захотите найти запись для пользователя.