Как я могу объединить два массива и вывести сохраненные значения, как написано в описании. Может быть, есть несколько способов сделать это? - PullRequest
0 голосов
/ 30 октября 2018

Описание задачи -> Полное описание задачи здесь

Я покончил с сортировкой и застрял. Как я могу объединить эти массивы в одну из уже отсортированных пар?


printf("\nHeight of boys in descending order\n");

for (i = (LENGTH1 - 1); i >= 0; i--)
{
    printf("%d ", heightBoys[i]);
}

for (i = 0; i < LENGTH2; i++)
{
    for (j = 0; j < (LENGTH2 - j - 1); j++)
    { 
        if (heightGirls[j] > heightGirls[j+1])
        {
            temp = heightGirls[j];
            heightGirls[j] = heightGirls[j+1];
            heightGirls[j+1] = temp;
        }
    }
}

printf("\nHeight of girls in descending order\n");

for (j = (LENGTH2 - 1); j >= 0; j--)
{
    printf("%d ", heightGirls[j]);
}

1 Ответ

0 голосов
/ 30 октября 2018

У вас есть сорт [для девочек], но он сломан. Изменения:

for (j = 0; j < (LENGTH2 - j - 1); j++)

В

for (j = 0; j < (LENGTH2 - i - 1); j++)

Чтобы избежать [ненужной] репликации кода, поместите код сортировки в отдельную функцию.

Сортировка обоих массивов.

Возьмите минимальную длину двух массивов (например, minlen).

Я не уверен, что вы подразумеваете [точно] под "спариванием", но самое простое - печать спаривание

Тогда просто включите:

for (i = 0;  i < minlen;  ++i)
    printf("Girl:%d Boy:%d\n",heightGirls[i],heightBoys[i]);

Если вам нужно что-то более сложное, вам может понадобиться массив struct, например:

struct pair {
    int boyheight;
    int girlheight;
};

Этот массив должен иметь длину не менее minlen. Вы можете заполнить его, адаптировав окончательный цикл печати. ​​


Но если вы просто печатаете, вот пример кода:

#include <stdio.h>

void
print_single(const int *height,int len,const char *sex)
{

    printf("\nHeight of %s in descending order\n",sex);

    for (int i = (len - 1); i >= 0; i--)
        printf(" %d", height[i]);

    printf("\n");
}

void
sort_height(int *height,int len)
{

    for (int i = 0; i < len; i++) {
        for (int j = 0; j < (len - i - 1); j++) {
            if (height[j] > height[j + 1]) {
                int temp = height[j];
                height[j] = height[j + 1];
                height[j + 1] = temp;
            }
        }
    }
}

int
main(void)
{

    int heightBoys[] = { 5, 8, 7, 9, 6 };
    int heightGirls[] = { 3, 1, 2 };

    int LENGTH1 = sizeof(heightBoys) / sizeof(heightBoys[0]);
    int LENGTH2 = sizeof(heightGirls) / sizeof(heightGirls[0]);

    sort_height(heightBoys,LENGTH1);
    print_single(heightBoys,LENGTH1,"boys");

    sort_height(heightGirls,LENGTH2);
    print_single(heightGirls,LENGTH2,"girls");

    int minlen = LENGTH1;
    if (minlen > LENGTH2)
        minlen = LENGTH2;

    printf("\n");
    printf("Pairing:\n");
    for (int i = 0;  i < minlen;  ++i)
        printf("Girl:%d Boy:%d\n",heightGirls[i],heightBoys[i]);

    return 0;
}

UPDATE:

Допустим, мы сами вводим высоты и их количество. Если у нас есть дополнительные высоты мальчиков или девочек, как мы можем вывести эти дополнительные высоты отдельно от остальных?

Две дополнительные петли for, добавленные внизу, должны помочь. Чтобы это работало, переменная итерации последнего цикла for в предыдущем примере должна быть определена вне цикла. Другими словами, обратите внимание на определение и использование ipair ниже.

Если вы создаете массив типа struct, который я предложил, эти циклы могут заполнить его. Тогда размер массива должен быть max(LENGTH1,LENGTH2).

И в непарных циклах (например, для мальчика 8 значение девочки в структуре может быть установлено на 0 или -1, чтобы указать, что мальчик непарный)

#include <stdio.h>

void
print_single(const int *height,int len,const char *sex)
{

    printf("\nHeight of %s in descending order\n",sex);

    for (int i = (len - 1); i >= 0; i--)
        printf(" %d", height[i]);

    printf("\n");
}

void
sort_height(int *height,int len)
{

    for (int i = 0; i < len; i++) {
        for (int j = 0; j < (len - i - 1); j++) {
            if (height[j] > height[j + 1]) {
                int temp = height[j];
                height[j] = height[j + 1];
                height[j + 1] = temp;
            }
        }
    }
}

int
main(void)
{

    int heightBoys[] = { 5, 8, 7, 9, 6 };
    int heightGirls[] = { 3, 1, 2 };

    int LENGTH1 = sizeof(heightBoys) / sizeof(heightBoys[0]);
    int LENGTH2 = sizeof(heightGirls) / sizeof(heightGirls[0]);

    sort_height(heightBoys,LENGTH1);
    print_single(heightBoys,LENGTH1,"boys");

    sort_height(heightGirls,LENGTH2);
    print_single(heightGirls,LENGTH2,"girls");

    int minlen = LENGTH1;
    if (minlen > LENGTH2)
        minlen = LENGTH2;

    int ipair = 0;

    printf("\n");
    printf("Pairing:\n");
    for (;  ipair < minlen;  ++ipair)
        printf("Girl:%d Boy:%d\n",heightGirls[ipair],heightBoys[ipair]);

    if (ipair < LENGTH1) {
        printf("\n");
        printf("Unpaired Boys:\n");
        for (int i = ipair;  i < LENGTH1;  ++i)
            printf("Boy:%d\n",heightBoys[i]);
    }

    if (ipair < LENGTH2) {
        printf("\n");
        printf("Unpaired Girls:\n");
        for (int i = ipair;  i < LENGTH2;  ++i)
            printf("Girl:%d\n",heightGirls[i]);
    }

    return 0;
}
...