цикл не работает, пытаясь перебрать элементы массива в обратном направлении - PullRequest
0 голосов
/ 03 декабря 2011

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

Это кажется глупым, но я знаю, что код внутри цикла for отлично работает вне его, , поэтому должно быть что-то не так с условием ..? я пытаюсь начать в конце массива char (навигация с помощью указателей) и выводить каждый символ (как целое число) до первого элемента.

Таким образом, желаемый результат - «0 - 1 - 0 - 1 -»

#include <iostream>

using std::cout;
using std::endl;

//prototypes
void binaryToDenary(const char* input, int& inputLength);

int main(){

    const char binaryInput[] = {1,0,1,0};
    int inputLength = sizeof(binaryInput)/sizeof(binaryInput[0]);

    binaryToDenary(binaryInput, inputLength);

    return 0;
}
void binaryToDenary(const char* input, int& inputLength){
    //testing some stuff--- this all works as expected
    //cout << input[2] << " " << (int)*(input+2) << " " << inputLength <<endl;

    int i;
    for(i = inputLength; i < 0; i--){
        cout << (int)*(input+i) << " - ";
    }

}

Ответы [ 6 ]

3 голосов
/ 03 декабря 2011

Ваш for цикл должен быть таким:

for(i = inputLength -1 ; i  >= 0; i--)
{
    cout << (int)*(input+i) << " - ";
}

В вашем коде есть две проблемы:

  • i = inputLength, которые должны быть i = inputLength -1
  • i < 0, который должен быть i >= 0

Кроме того, измените второй тип параметра с int & на int:

void binaryToDenary(const char* input, int inputLength) //now its better!

Тип int& уменьшает количество случаев использования, а преимущества почти ничего.Если вы используете int &, то все это даст ошибку компиляции :

const int inputLength = sizeof(binaryInput)/sizeof(binaryInput[0]);
^^^^ note this

binaryToDenary(binaryInput, inputLength); //compilation error
binaryToDenary(binaryInput, sizeof(binaryInput)/sizeof(binaryInput[0])); //error
binaryToDenary(binaryInput, 4); ////compilation error

Так что используйте int, и все вышеперечисленное прекрасно скомпилируется!

2 голосов
/ 03 декабря 2011

Индексы массива начинаются с нуля, поэтому последний элемент находится в inputLength - 1i < 0 вы немедленно выходите из цикла, поскольку это никогда не будет правдой ...

for(i = inputLength - 1; i >= 0; i--){
    cout << (int)*(input+i) << " - ";
}
1 голос
/ 03 декабря 2011

C массивы основаны на 0, поэтому действительный индекс задается как

(0 <= i) && (i < array_length)

В вашей программе это означает, что позиция последней цифры в вашей инициализации должна быть inputLength - 1, а условие цикла должно быть i >= 0.

(Что касается того, почему ваш цикл не работает, при запуске у вас есть i == inputLength, так что я положительный, немедленно выполняя условие i < 0).

1 голос
/ 03 декабря 2011
for(i = inputLength; i < 0; i--)

будет работать, только если inputLength меньше 0, что невозможно?

Вам нужно:

for(i = (inputLength-1); i >= 0; i--)
         ^^^^^^^^^^^^^^    ^^
0 голосов
/ 03 декабря 2011

Вы должны проверить, чтобы переменная итерационного цикла i была положительной ..

Однако вы должны использовать итератор STL для двоичного вектора ввода и не зацикливать его содержимое в стиле c, если вы хотите попрактиковаться в C ++, возможное решение может быть:

vector<char> binaryInput;

binaryInput.push_back(1);
binaryInput.push_back(0);
binaryInput.push_back(1);
binaryInput.push_back(0);

vector<char>::iterator it;

for ( it=myvector.begin() ; it < myvector.end(); it++ ){
    cout << " " << *it << endl; //or whatever you need to do with vector content
}
0 голосов
/ 03 декабря 2011

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

for(i = inputLength; i > 0; i--){
        cout << (int)*(input+i) << " - ";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...