Итерация по массиву и смещение элементов до конца массива - PullRequest
0 голосов
/ 14 декабря 2018

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

, поэтому если array [] = {a, b, c, d} и integer = 3;с первым удаляется.Тогда б, потом д.Победительв конце мне нужно распечатать массив с результатами в порядке удаления.поэтому печатный массив должен быть: a, d, b, c.Я пытаюсь сделать это только с помощью указателей без дополнительных массивов.

Вот что я получил, проблема в том, что я пытаюсь перезапустить цикл for с правильного индекса и перебрать оставшихся игроковкто еще не проиграл и не может сделать это правильно:

char *names[] = {"Tyrion Lannister","Daenerys Targaryen","Jon Snow","Arya Stark","Theon Greyjoy", "Joffrey Baratheon","Khal Drogo","Ted Mosby","Marshall Eriksen","Robin Scherbatsky","Barney Stinson", "Lily Aldrin", "Tracy McConnell", "Ted Mosby", "Leonard Hofstadter","Sheldon Cooper", "Penny", "Howard Wolowitz", "Raj Koothrappali", "Bernadette Rostenkowski-Wolowitz","Amy Farrah Fowler", "Gregory House", "Lisa Cuddy", "James Wilson","Eric Foreman", "Allison Cameron", "Robert Chase" ,"Lawrence Kutner", "Chris Taub","Remy 13 Hadley", "Amber Volakis"};
int Length = 31;
int number = 10;
char *tmp;
int i = 0, j;
int boom = number;
for (int i = number - 1; i < Length; i += boom - 1)
{

    tmp = *(names + i);

    for (int index = i; index < Length - 1; index++)
    {
        *(names + index) = *(names + index + 1);
    }

    *(names + Length - 1) = tmp;


    Length--;
    if (((number - 1) + i) >= Length)
    {
        int tempIndex = i;
        i = tempIndex - Length;
        printf("tmep index is %d, i is %d, Length is %d\n", tempIndex, i, Length);
    }
}
for (i = 0; i < 31; i++)
    printf("%s\n", names[i]);

Я также попробовал другой способ с оператором%, но не смог сделать это.Помощь будет высоко ценится:

for (int i = number - 1; i < Length * (number - 1); i += boom - 1)  
{
    int t = i % Length;
    printf("%d\n", t);
    if (t < size)
    {
        counter++;
        tmp = *(names + t);
        // tmptwo = *(names + 31 - j);
        for (int index = t; index < size - 1; index++)
        {
            *(names + index) = *(names + index + 1);
        }

        *(names + size - 1) = tmp;
        size--;
        printf("size %d\n", size);
    }
}

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

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

Реализация функции дляперемещение данного индекса к последнему индексу для данного размера может быть аналогично следующему, где a - массив, который необходимо переупорядочить, elem_idx - индекс элемента для перемещения к последнему элементу в элементах sz:

void element_to_last (int *a, int elem_idx, int sz)
{
    if (elem_idx > sz - 1) {    /* valdate index in range */
        fprintf (stderr, "error: index %d out of range for size %d\n",
                elem_idx, sz);
        return;
    }

    int i = elem_idx,   /* declare, initialize i, tmp */
        tmp = *(a + i);

    if (elem_idx == sz - 1)     /* elem_idx is last index */
        return;     /* no-swap */

    for (; i < sz - 1; i++)     /* loop shifting elements down */
        *(a + i) = *(a + i + 1);

    *(a + i) = tmp;     /* set last to tmp */
}

( примечание: вы хотите проверить, чтобы индекс элемента для перемещения в конец находился в допустимом диапазоне индексов, и нет необходимости выполнять своп, если индекс потериуже последний в диапазоне).

Короткий рабочий пример, в котором константа WRAP просто контролирует вывод не более WRAP значений на строку при печати результатов, а добавленное определение DEBUG позволяет выводитьдополнительной информации, показывающей каждую операцию, если -DDEBUG включен в строку компиляции, например,

#include <stdio.h>

#ifndef WRAP
 #define WRAP 10
#endif

void element_to_last (int *a, int elem_idx, int sz)
{
    if (elem_idx > sz - 1) {    /* valdate index in range */
        fprintf (stderr, "error: index %d out of range for size %d\n",
                elem_idx, sz);
        return;
    }

    int i = elem_idx,   /* declare, initialize i, tmp */
        tmp = *(a + i);

    if (elem_idx == sz - 1) {   /* elem_idx is last index */
#ifdef DEBUG
        fprintf (stderr, " index %d (%d) is last index %d - no swap.\n",
                elem_idx, tmp, sz - 1);
#endif
        return;     /* no-swap */
    }

#ifdef DEBUG
    printf (" index %d (%d) to end %d\n", elem_idx, tmp, sz - 1);
#endif

    for (; i < sz - 1; i++)     /* loop shifting elements down */
        *(a + i) = *(a + i + 1);

    *(a + i) = tmp;     /* set last to tmp */
}

void prn_array (int *a, int sz, int wrap)
{
    for (int i = 0; i < sz; i++) {
        if (i && i % wrap == 0)
            putchar ('\n');
        printf (" %2d", *(a + i));
    }
    putchar ('\n');
}

int main (void) {

    int a[] = {0,1,2,3,4,5,6,7,8,9},    /* original array order */
        sz = sizeof a/sizeof *a,        /* nelem in original */
        n = sz,                         /* n tracks remaining size */
        loser[] = {2,0,7,3,2,3,2,1,1},  /* order of losing indexes */
        lsz = sizeof loser/sizeof *loser;   /* nelem in loser array */

    puts ("before:");
    prn_array (a, sz, WRAP);

    puts ("\nelimination\n(remove indexes 2,0,7,3,2,3,2,1,1):");
    for (int i = 0; i < lsz; i++) {
        element_to_last (a, loser[i], n > 0 ? n-- : n);
        prn_array (a, sz, WRAP);
    }

    puts ("\nafter:");
    prn_array (a, sz, WRAP);
}

( примечание: оставшиеся игроки, например, оставшееся количество элементов отслеживается с помощью n, в то время как sz сохраняет исходный размер всего массива.lsz используется для размера массива loser)

Пример Использование / Вывод

Без определения DEBUG, выход просто показывает состояниемассив после проигравшего перемещается в конец оставшихся игроков:

$ ./bin/array_rotate
before:
  0  1  2  3  4  5  6  7  8  9

elimination
(remove indexes 2,0,7,3,2,3,2,1,1):
  0  1  3  4  5  6  7  8  9  2
  1  3  4  5  6  7  8  9  0  2
  1  3  4  5  6  7  8  9  0  2
  1  3  4  6  7  8  5  9  0  2
  1  3  6  7  8  4  5  9  0  2
  1  3  6  8  7  4  5  9  0  2
  1  3  8  6  7  4  5  9  0  2
  1  8  3  6  7  4  5  9  0  2
  1  8  3  6  7  4  5  9  0  2

after:
  1  8  3  6  7  4  5  9  0  2

Выход DEBUG

С определенным DEBUG, дополнительная информация, показывающая каждый index и (value) перемещается в показанный конечный индекс вместе с примечанием о том, был ли тогда конечный индекс проигравшим; в этом случае была предпринята попытка "no-swap":

$ ./bin/array_rotate
before:
  0  1  2  3  4  5  6  7  8  9

elimination
(remove indexes 2,0,7,3,2,3,2,1,1):
 index 2 (2) to end 9
  0  1  3  4  5  6  7  8  9  2
 index 0 (0) to end 8
  1  3  4  5  6  7  8  9  0  2
 index 7 (9) is last index 7 - no swap.
  1  3  4  5  6  7  8  9  0  2
 index 3 (5) to end 6
  1  3  4  6  7  8  5  9  0  2
 index 2 (4) to end 5
  1  3  6  7  8  4  5  9  0  2
 index 3 (7) to end 4
  1  3  6  8  7  4  5  9  0  2
 index 2 (6) to end 3
  1  3  8  6  7  4  5  9  0  2
 index 1 (3) to end 2
  1  8  3  6  7  4  5  9  0  2
 index 1 (8) is last index 1 - no swap.
  1  8  3  6  7  4  5  9  0  2

after:
  1  8  3  6  7  4  5  9  0  2

Просмотрите все и дайте мне знать, еслиу вас есть дополнительные вопросы.

0 голосов
/ 15 декабря 2018

Этот код должен решить проблему с помощью модуля.

int size = 31;
int inc = 10;

for (int i = 0; i < size; i++)
{
    int t = ((i + 1) * inc) % (size - i);
    int *tmp = *(names + t);
    printf("%d\n", t);

    for (int j = t; j < (size - 1); j++)
    {
        *(names + j) = *(names + j + 1);
    }

    *(names + size - 1) = tmp;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...