Ошибка: присваивание выражению с типом массива при использовании selection-sort - PullRequest
2 голосов
/ 13 февраля 2020

В основном я пытаюсь sort повестку дня с 3 именами, используя метод selection sort. Уверен, что часть выбора сортировки в порядке. Проблема в том, что, очевидно, мой код может идентифицировать символы [0] строки, но не может передать одну строку другой переменной. Вот мой код:

include <stdio.h>

typedef struct{
    char name[25];
} NAME;

int main(){

    int a, b;
    char x, y[25];

    static NAME names[]={
        {"Zumbazukiba"},
        {"Ademiro"},
        {"Haroldo Costa"}
    };

    for(a=0; a<4; a++){

        x = names[a].name[0];
        y = names[a];

        for(b=(a-1); b>=0 && x<(names[b].name[0]); b--){
            names[b+1] = names[b];
        }
        names[b+1].name = y;
    }
}

Я получаю это сообщение об ошибке:

main. c: 21: 11: ошибка: присвоение выражению с типом массива y = имена [а];

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

Для начала я не вижу сортировки выбора. Кажется, вы имеете в виду сортировку вставкой.

Массивы не имеют оператора присваивания. Поэтому операторы типа

names[b+1].name = y;

, в которых вы пытаетесь присвоить массив, недопустимы.

И в операторах, подобных этому

y = names[a];

, вы пытаетесь назначить объект типа структуры в массив символов.

Кроме того, циклы также являются неправильными.

Массив имеет только 3 элемента. Так что неясно, что маги c номер 4 делают в этом l oop

for(a=0; a<4; a++){

, и этот l oop

for(b=(a-1); b>=0 && x<(names[b].name[0]); b--){

пропускает первую итерацию, когда a равно 0.

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

#include <stdio.h>
#include <string.h>

#define LENGTH  25

typedef struct
{
    char name[LENGTH];
} NAME;

int main(void) 
{
    NAME names[] =
    {
        { "Zumbazukiba" },
        { "Ademiro" },
        { "Haroldo Costa" }
    };

    const size_t N = sizeof( names ) / sizeof( *names );

    for ( size_t i = 0; i < N; i++ )
    {
        puts( names[i].name );
    }

    putchar( '\n' );

    for ( size_t i = 0; i < N; i++ )
    {
        size_t min = i;

        for ( size_t j = i + 1; j < N; j++ )
        {
            if ( strcmp( names[j].name, names[min].name ) < 0 )
            {
                min = j;
            }
        }

        if ( i != min )
        {
            NAME tmp = names[i];
            names[i] = names[min];
            names[min] = tmp;
        }
    }


    for ( size_t i = 0; i < N; i++ )
    {
        puts( names[i].name );
    }

    putchar( '\n' );

    return 0;
}

Вывод программы:

Zumbazukiba
Ademiro
Haroldo Costa

Ademiro
Haroldo Costa
Zumbazukiba
0 голосов
/ 13 февраля 2020

В вашем коде как минимум две ошибки в строке, помеченной вашим компилятором. Во-первых, вы не можете копировать символьные строки (или, действительно, любой другой тип массива), используя оператор простого присваивания (=) в C - вам нужно использовать функцию strcpy ( который требует строки #include <string.h> в вашем коде).

Во-вторых, вы объявили y как массив символов (char y[25]), но names - это массив NAME структур ; предположительно, вы хотите скопировать поле name данной структуры в y.

Так что вместо:

y = names[a];

вы должны использовать:

strcpy(y, names[a].name);

Не стесняйтесь просить дальнейших разъяснений и / или объяснений.

...