2016-02-11 2 views
3

FYI: Я новичок в программировании.Обратный массив с заданным значением дозорного устройства

У меня есть arraysize из 10, а значение дознавателя 0.

Мой первоначальный массив: [1 2 3] (пользовательский ввод), но мой реверс [0 0 0 0 0 0 0 3 2 1].

Мне нужна помощь, чтобы сделать мой обратный массив [3 2 1].

Вот мой код:

int temp; 
    for (int i = 0; i < arraysize/2; i++) 
    {   
    temp = array[arraysize-1-i]; 
    array[arraysize - i - 1] = array[i]; 
    array[i] = temp; 
    } 

    cout << "The reverse array: "; 
    for (int i = 0; i < arraysize; i++) 
    cout << array[i]<< ' '; 
    cout << endl; 
+0

Тогда почему вы распределения размера 'arraysize', когда у вас есть только 3 элементов (менее' ARRAYSIZE 'длина)? –

+0

Да, это может быть простое решение, но мы не должны этого делать. – Siri

+0

Ахмед, это не совсем решило проблему. Исходный массив 1 2 3 и обратный был 3 1 2 – Siri

ответ

-1

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

Как это:

int actualArraySize = 0; 

while(actualArraySize < arraysize && array[actualArraySize]!=0) 
{ 
actualArraySize++; 
} 

int temp; 
for (int i = 0; i < actualArraySize/2; i++) 
{ 
    temp = array[actualArraySize-1-i]; 
    array[actualArraySize - i - 1] = array[i]; 
    array[i] = temp; 
} 

cout << "The reverse array: "; 
for (int i = 0; i < actualArraySize; i++) 
    cout << array[i]<< ' '; 
cout << endl; 

Обратите внимание, что, actualArraySize может быть меньше или равна arraysize, но не более, чем это, потому что условия в while(actualArraySize < arraysize && array[actualArraySize]!=0), что означает остановку, когда либо 0 является найдено или размер массива достигнут.

+0

int temp; int actualArraySize = 0; while (actualArraySize Siri

+0

@Siri Вы добавили фигурные скобки '{}' к 'while' неправильным образом. См. Сообщение, я отредактировал его, чтобы включить фигурные скобки '{}' for 'while'. Обратите внимание: если после инструкции управления нет скобок '{}', она затрагивает только одну строку под ней. –

+0

Большое спасибо Ахмеду. Теперь он работает – Siri

4

Просто используйте стандартные алгоритмы библиотеки

auto end = std::find(std::begin(array),std::end(array),0); 
std::reverse(std::begin(array),end); 
//And if you only want to print the non-zero values: 
size_t effectiveArraySize = end - std::begin(array); 

Если массив фиксированного размера не является частью вашего требования, вы должны поместить ваши данные в векторе, который автоматически растет как большой, как вам нужно, вместо того, чтобы использовать массив, который может оказаться слишком маленьким:

std::vector<int> v; 
while(true) { 
    int t; 
    cin >> t; 
    if (t == 0) { 
     break; 
    } 
    v.push_back(t);  
} 
std::reverse(v.begin(),v.end()); 

Таким образом, у вас нет каких-либо значений дозорных в вашем массиве/вектор, чтобы начать с.

1

Примечание: Использование соответствующих функций из STL (std::reverse и std::find) лучше, я просто предполагал, что вы обязаны реализовать это самостоятельно.


Шаг один: Написать надлежащую функцию обратного. Тот, который принимает (указатель на) начало, а также (указатель на) конца диапазона, который следует перевернуть.

Шаг два: Написать функцию, чтобы найти (первое положение) Стражу в массиве (подать через начало и конец, опять же)

Шаг три: Соедините два: Reverse от начиная с позиции вашего дозорного.

Пример без шаблонов:

void reverse(int * from, int * to) { 
    while ((to - from) > 1) { 
    --to; 
    int temp = *from; 
    *from = *to; 
    *to = temp; 
    ++from; 
    } 
} 

int const * find(int const * from, 
       int const * const to, 
       int const value) { 
    while ((from != to) && (*from != value)) { 
    ++from; 
    } 
    return from; 
} 

void reverse_until (int * const from, 
            int * const to, 
            int const sentinel) { 
    int const * const position_sentinel = find(from, to, sentinel); 
    reverse(from, from + (position_sentinel - from)); 
    // return the sentinel position from this function 
    // if you want only the reversed part 
} 

Протестировано:

int main() { 
    int test[10]; 
    for (size_t i = 0; i < 10; ++i) { 
    test [i] = i + 1; 
    } 
    reverse_until (test, test + 10, 6); 
    copy(test, test + 10, ostream_iterator<int>{cout, " "}); 
    return 0; 
} 

(live here)

+0

@MikeMB Хорошая точка, сделано. –

Смежные вопросы