Удаление элемента из массива структур - PullRequest
0 голосов
/ 04 июля 2019

Мне поручено создать программу управления запасами, в которой пользователь может добавить элемент, отредактировать элемент или удалить элемент. Я почти закончил с кодом, у меня просто проблема при удалении элемента, особенно при удалении элемента из массива структур.

Я уже искал похожие проблемы и пробовал предложенные решения. Метод, который я попробовал в своем коде, заключался в удалении элемента в массиве путем смещения элементов рядом с ним на 1. Программа запускается, и гипотетически код должен работать, но каждый раз, когда я запускаю программу и ввожу опцию «удалить элемент» , программа останавливается (она не просто выходит, а говорит, что «программа перестала работать», то есть я нарушил правило или что-то в этом роде). Я думаю, что я могу превышать размер массива или что-то, но я не могу указать, в чем именно проблема. Запрещено смещать элементы в массиве структур или это просто мой код? Пожалуйста, помогите.

Это код моей структуры.

struct details {
    char name[30];
    double price;
    int code;
    int qty;
};


details item[SIZE];

Это основная функция:

int main (){



    int choice; //gets the choice of user from the menu
    bool condition = 1; //loops the menu
    int count=0; //counts the number of items in the inventory

    do{
        printheader(); //prints the title of the program
        printmenu(); //prints the menu (list of commands)
        scanf("%d", &choice);
        switch(choice){
            case 1: system("cls");
                    AddItem(count); //function in adding record
                    count++; //increments every time a new item is added
                    system("PAUSE");
                    system("cls");
                    break;
            case 2: system("cls");
                    EditItem(count); //function in editing a record
                    system("PAUSE"); 
                    system("cls");
                    break;
            case 3: system("cls");
                    count = DeleteItem(count); //function in deleting a record
                    system("PAUSE"); 
                    system("cls");
                    break;          
            case 4: system("cls");
                    //ViewItem(); //function in viewing a record
                    system("PAUSE"); 
                    system("cls");
                    break;  
            case 5: system("cls");
                    DisplayInventory(count); //function in displaying inventory
                    system("PAUSE");
                    system("cls");
                    break;
            case 6: system("cls");
                    SaveFile(count); //function in saving the records to a file
                    system("PAUSE");
                    system("cls");
                    break;
            case 7: system("cls");
                    count = LoadFile(); //function in loading the records from a saved file
                    system("PAUSE");
                    system("cls");
                    break;
            case 8: printf("\nThank you!");
                    exit(0); //ends the program
                    break;
            default: printf("\nInvalid Input!\n");  
                     getch();
                     system("cls");     

        }
    }while(condition = 1);


    return 0;
}

Это функция DeleteItem (). Он принимает n, которое является количеством элементов / записей.

int DeleteItem (int n){
    printheader();
    int i=0, code, pos;
    bool cont = true;
    printf("\nEnter the code of the item you want to delete: ");
    scanf("%d", code);
    do{
        if(code==item[i].code){ 
            for (pos=i; pos<(n-1); pos++){ 
            //  item[pos].name = item[pos+1].name; //this basically deletes the i'th element and shifts the remaining ones
                item[pos].price = item[pos+1].price;
                item[pos].code = item[pos+1].code;
                item[pos].qty = item[pos+1].qty;            
            }
            printf("\nItem deleted!");
            cont = false; //loop ends once the input of the user matches the data in the inventory
        }


        if(i==n){
            printf("\nCode not found!\n\n");
            cont = false; //loop ends when there are no matches
        }

        i++;

    }while(cont);   

}

Когда в программе введена опция удаления элемента, программа запрашивает у пользователя код элемента. Затем программа сканирует массив структур для элемента (item [i] .code), который соответствует коду. В идеале программа должна удалить элемент и сдвинуть другие элементы, если код соответствует. Однако происходит сбой и остановка программы. Мне нужна помощь, чтобы определить, где проблема. Большое спасибо!

EDIT Функция DeleteItem:

int DeleteItem (int n){
    printheader();
    int i=0, code, pos;
    //bool cont = true;
    printf("\nEnter the code of the item you want to delete: ");
    scanf("%d", code);
    while(i<n){
        if(code==item[i].code){ 
            for (pos=i; pos<(n-1); pos++){ 
                item[pos] = item[pos+1];            
            }
            printf("\nItem deleted!");
            break;; //loop ends once the input of the user matches the data in the inventory
        }

        i++;

        if(i==(n-1)){
            printf("\nCode not found!\n\n");
            break;; //loop ends when there are no matches
        }


    }   

    return (n-1);
}

Я новичок в C, поэтому мне очень жаль, если вы видите несколько проблемных кодов. Я работаю над этим.

1 Ответ

2 голосов
/ 04 июля 2019

Одна проблема в том, что ваша проверка для i == n выполнена после , когда вы проиндексировали массив с помощью i.Чтобы исправить это, вы должны увеличить i перед проверкой.Например:

    i++;  // Increment first

    if(i==n){  // then check
        printf("\nCode not found!\n\n");
        cont = false; //loop ends when there are no matches
    }

Другая проблема заключается в том, что вы не обрабатываете случай, когда n равен нулю.В общем, я думаю, что while(i < n) { ... }; - лучший подход, чем do { ...} while(...);.

Также обратите внимание, что этот код (в настоящее время закомментированный) неверен:

//  item[pos].name = item[pos+1].name;

Вы не можетескопировать строку с помощью присваивания (например, =).Вам нужно будет использовать strcpy

Также я не вижу обновления count при удалении элемента.Я думаю, это ошибка ... Я бы предположил, что count должно быть уменьшено.

Наконец, я не вижу функцию, возвращающую какое-либо значение.Это также ошибка, поскольку вы определяете функцию, возвращающую int.

Примечание ...

Использование флага типа cont для завершения while цикл будет работать нормально и поэтому не является ошибкой.Тем не менее, вам не нужен флаг.Вы можете использовать break, например:

do{
    ...
    ...

    if(i==n){
        printf("\nCode not found!\n\n");

        break; //loop ends when there are no matches
    }

    i++;

}while(1);   

, или просто сделать return, так как функции больше нечего делать.

EDIT

ОП опубликовал вторую редакцию кода.Этот адрес редактирования второй ревизии.

Одна проблема со второй ревизией состоит в том, что код всегда возвращает n-1.Это делается даже тогда, когда «код» не найден.Это ошибка.

if(i==(n-1)){ также неверен, так как это означает, что номер элемента n-i никогда не будет проверен.

Попробуйте что-то вроде этого:

int DeleteItem (int n){
    printheader();
    int i=0, code, pos;
    printf("\nEnter the code of the item you want to delete: ");
    scanf("%d", code);
    while(i<n){
        if(code==item[i].code){ 
            for (pos=i; pos<(n-1); pos++){ 
                item[pos] = item[pos+1];            
            }
            printf("\nItem deleted!");

            return n-1;  // End the function and return n-1 as an item was deleted
        }

        i++;
    }   

    printf("\nCode not found!\n\n");

    return n;   // End the function and return n as no item was deleted
}

Кстати: вы всегда должны проверять значение, возвращаемое scanf

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...