2017-01-08 3 views
0

У меня есть этот код, ниже которого записывается слово назад, я понимаю все, кроме одной маленькой детали в цикле for: for (int i = 0; i < numberOfChars/2; i ++). Что делает «/ 2» и почему он работает только с ним?Обратный массив, почему это работает, когда я делю на 2?

#include <stdio.h> 
#include <math.h> 
#include <stdlib.h> 
#include <string.h> 
#include <time.h> // time 


void reverse(char array[], int numberOfChars) { 

    for (int i = 0; i < numberOfChars /2; i++) { 
     char tmp; 

     tmp = array[i]; 
     array[i] = array[numberOfChars - i - 1]; 
     array[numberOfChars - i - 1] = tmp; 

    } 
} 


int main(void) { 

    char word[55]; 
    int howMany; 

    printf("Please enter a word:\n"); 
    scanf_s("%s", word, sizeof(word)); 
    printf("how many char do you want to reverse?\n"); 
    scanf_s("%d", &howMany); 

    reverse(word, howMany); 

    printf("New arr:%s\n", word); 


    return 0; 
} 
+3

Вы заменяете первую половину массива другой половиной. Если вы дважды поменяли обе половины ... – Ryan

+0

Вы пытались удалить '/ 2' и выяснить, что происходит? Вы пытались отлаживать шаг за шагом (с коротким словом в качестве ввода) и понимаете, почему он работает «аккуратно» с '/ 2', но не без него? –

+0

@barakmanos Да, если я удалю «/ 2» код ничего не меняет. Или мне нравится, что кто-то сказал здесь, он изменился дважды! – perolako

ответ

0

Разделение разделяет массив. Когда вы отслеживаете алгоритм, он меняет местами с левой стороны, другой - с правой стороны. Для четного размера каждый номер обменивается. Для нечетного размера, такого же, как evens, кроме среднего, остался на том же месте. Когда я столкнулся с алгоритмом, я решил его использовать бумагу и ручку. Потому что путь более эффективный, чтобы получить свою логику. Here - описание. В результате, если он не уменьшен в два раза, сначала реверсирован до половины массива, а затем снова отменяется, поэтому он остается в том же порядке.

0

Потому что с помощью этого кода вы ставите начало в конце, а конец в начале строки. Итак, когда вы запускаете половину символа «howMany», который ваш пользователь хочет изменить, он уже полностью изменил его.

0

Как заметил Райан в комментарии, если вы не включили /2, каждая позиция в массиве будет заменена дважды и снова вернется туда, где она началась. Например, если у вас есть 5 элементов, он делает это:

swap 0 with 4 
    swap 1 with 3 
    swap 2 with 2 
    swap 3 with 1 
    swap 4 with 0 

Кстати, я думаю, что этот код становится более ясным, если использовать два индекса для перебора массива вместо одного:

int i=0; 
int j=numberOfChars-1; 
while(i < j){ 
    char tmp = array[i]; 
    array[i] = array[j]; 
    array[j] = tmp; 
    i++; 
    j--; 
} 
Смежные вопросы