заставить пузыри сортироваться для работы со структурой - PullRequest
0 голосов
/ 14 апреля 2020

Я не уверен, как сортировать пузыри, используя структуры, например функцию sortMovies, чтобы иметь возможность сортировать фильмы по алфавиту по названию, но я получаю эти ошибки, перечисленные ниже.

#include <stdio.h>
#include <conio.h>
#define CONST 100
void sortMovies(struct movies main[CONST]);
void changeMovie(struct movies main);
int findMovie(struct movies main, int nOfMovies, struct movies tempMovie);
struct movies newMovie();
typedef struct movies{
    char title[30];
    char UPC[12];
    int qnty;
    double price;
}movies;

int main()
{
    int nOfMovies = 0, findR, stop = 0, nOfMoviesArr[CONST];
    char decider;
    while (stop != 1)
    {
        movies main[CONST];
        movies tempMovie;
        printf("(A)dd a new movie\n(C)hange a Movie's Information \n(D)elete a Movie \n(L)ist All Movies\n(Q)uit");
        scanf(" %c", &decider);

        switch (decider)
        {
        case 'a':
        case 'A':
            tempMovie = newMovie();
            nOfMovies = findMovie(main[CONST], nOfMovies, tempMovie);
            nOfMovies++;
            break;
        case 'c':
        case 'C':
            printf("enter movie upc:");
            scanf("%s", main);

            break;
        case 'l':
        case 'L':
            sortMovies(main[CONST]);
            break;
        case 'q':
        case 'Q':
            return 0;
            break;
        default:
            printf("An invalid option was selected!");
        }
    }


}

struct movies newMovie() {
    movies new;

    printf("enter movie upc:");
    scanf("%s", new.UPC);
    printf("enter movie title:");
    scanf("%s", new.title);
    printf("enter movie qauntity:");
    scanf("%d", new.qnty);
    if (new.qnty <= 0)
    {
        printf("quanitity must be greater than 0");
        printf("enter movie qauntity:");
        scanf("%d", new.qnty);
    }

    printf("enter movie price:");
    scanf("%lf", new.price);
    if (new.price <= 0)
    {
        printf("price must be greater than 0");
        printf("enter movie price:");
        scanf("%lf", new.price);
    }
    return new;
}


int findMovie(struct movies main, int nOfMovies, struct movies tempMovie)
{

    int count;
    for (count = 0; count < nOfMovies; count++)
    {
        if (tempMovie.UPC == main.UPC)
        {
            return count;
        }
        else
        {
            printf("error");
            return -1;
        }
    }

}
void changeMovie(struct movies main)
{
    char decider;

    printf("would you like to change the value? y or no input");
    switch (decider)
    {
    case 'y':
    case 'Y':
        printf("enter movie title:");
        scanf("%c", main.title);
        printf("enter movie qauntity:");
        scanf("%d", main.qnty);
        if (main.qnty <= 0)
        {
            printf("quanitity must be greater than 0");
            printf("enter movie qauntity:");
            scanf("%d", main.qnty);
        }

        printf("enter movie price:");
        scanf("%lf", main.price);
        if (main.price <= 0)
        {
            printf("price must be greater than 0");
            printf("enter movie price:");
            scanf("%lf", main.price);
        }
        break;

        return 0;

    }

}
void sortMovies(struct movies main[CONST])
{
    int i, sflag, count = 0;
    char temp;

    do
    {
        sflag = 0;
        for (i = 1; i < CONST; i++)
        {
            if (main[i - 1].title > main[i].title)
            {
                temp = main[i - 1].title;
                main[i - 1].title = main[i].title;
                main[i].title = temp;
                sflag = 1;
            }
        }
        count++;
    } while (sflag);

    for (i = 0; i < CONST; i++)
    {
        printf("%c\t%c\t%d\t%lf", main[i].title, main[i].UPC, main[i].qnty, main[i].price);
    }


} ```

Код серьезности Описание Файл проекта Состояние подавления строки Ошибка состояния подавления C2440 «функция»: невозможно преобразовать «фильмы» в «фильмы» * 40
Ошибка (активная) E0167 аргумент типа «фильмы» "несовместим с параметром типа" struct movies * "40
Ошибка (активная) Выражение E0137 должно быть изменяемым lvalue 148
Ошибка C2106 '=': левый операнд должен иметь значение l 148
Ошибка ( active) выражение E0137 должно быть изменяемым lvalue 149
ошибка C2106 '=': левый операнд должен иметь значение l 149


1 Ответ

0 голосов
/ 14 апреля 2020

Ошибка (активная) Аргумент E0167 типа "movies" несовместим с параметром типа "struct movies *" 40

Это происходит потому, что с main[CONST] вы пытаетесь передать единственный элемент массива main (элемент с индексом CONST), а не весь массив, когда метод sortMovies ожидает массив. Чтобы передать весь массив в функцию, используйте sortMovies(main);.

Ошибка (активная) Выражение E0137 должно быть изменяемым lvalue 148 Ошибка C2106 '=': левый операнд должен быть l-значением 148 Ошибка (активное) Выражение E0137 должно быть изменяемым lvalue 149 Ошибка C2106 '=': левый операнд должен иметь значение l 149

Это происходит потому, что вы пытаетесь скопировать содержимое одного массива символов в другой с оператором =, который недопустим. Вместо этого используйте strcpy(main[i - 1].title, main[i].title) и strcpy(main[i].title, temp).

Кроме того, в вашей функции sortMovies вы объявляете temp как символ, который вы пытаетесь использовать для замены строк title. То, что вы хотите здесь, это вместо char* temp. Если вы не знакомы с этим синтаксисом, я бы порекомендовал прочитать указатели в C. Они очень важная конструкция в языке, и лучшее понимание указателей, вероятно, также поможет вам разобраться во многих проблемах, которые возникают у вас с этой программой.

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