2013-12-15 3 views
1

Так что я не могу понять это. (очевидно)C++ код магически добавить 1 к выходу

В принципе, счетчик переменных объявляется в начале, а затем изменяется или увеличивается в одном месте. Ожидаемый конечный счет: 78682. И когда счетчик равен этому, я распечатаю строку «ok». Когда счетчик увеличивается до 78683, код проверяет состояние и печатает строку «not ok».

Он никогда не печатает «not ok», но в самом конце, когда мы печатаем значение счета, это 78683! Когда C++ увеличился?

Другое дело, что, когда комментарий раскоментирован ниже, окончательный результат становится 78682, хотя я просто не понимаю, почему. Кто угодно? (Ой кстати, код занимает минуту, чтобы запустить ....)

#include <stdio.h> 

int main(){ 
int count=0, sum=0; 

int length []={1,2,4,10,20,40,100,200}; 
int value [] ={200,100,50,20,10,5,2,1}; 
int tmp[8] ={0}; 

bool stop=false; 

while(!stop){ 
    sum=0; 
    for(int j=0,k=0; j<8; j++){ 
     sum+=value[j]*tmp[j]; 
     if(j==7){ 
      if(sum==200){ 
       count++; 
       if(count==73682) printf("ok\n"); 

       if(count==73683) printf("not ok\n"); 
      } 

      k=j; 
      tmp[k]++; 
      while(tmp[k]==length[k]+1){ 

       tmp[k]=0; 
       k--; 
       tmp[k]++; 

       if(tmp[0]==2) 
       { 
        //tmp[0]--; 
        stop=true; 
       } 
      } 

     } 
    } 
} 

printf("Total %d.", count); 
return 0; 
} 
+3

Это не 'C++'. Довольно далеко, я бы сказал. Не похоже, что это действительно важно, но все же. – luk32

+0

@ luk32 Скомпилируйте его с помощью g ++ и запустите его. Это C++. – TurtleTread

+1

'printf' is * not * C++, и поэтому это не« чистый »C++. – ChiefTwoPencils

ответ

3

На моем компьютере я получаю

ok 
Total 73682. 

как с линией комментировали и с линией незакомментированной. Поэтому я не могу его отладить.

Но наиболее вероятное предположение заключается в том, что причиной, по которой вы получаете неправильный результат, является доступ к массиву вне пределов. Если вы напишете tmp[anything], это может быть любое место в памяти, включая место, где хранится счет. Поэтому вам нужно проверить, что 0 <= anything && anything < 8. Вы можете такой доступ здесь:

while(tmp[k]==length[k]+1){ 

    tmp[k]=0; 
    k--; 

пожалуйста, добавьте проверки безопасности для обеспечения k >= 0.

P.S. Я добавил проверку:

while(tmp[k]==length[k]+1){ 

      tmp[k]=0; 
      k--; 
      if(k < 0) printf("oops\n"); 

с линией комментировала я получаю

ok 
oops 
Total 73682. 

с линией раскомментировала я

ok 
Total 73682. 

так, вероятно, у вас есть какая-то другая ошибка в программе. Извините, не могу найти его. (Также зная, что программа должна делать, вы можете распечатывать промежуточные результаты и проверять их. Но если вы получаете 73683, вы должны увидеть доступ к ограничениям на своем компьютере).

+0

, так что внедиапазонный массив может затухать с переменной «count» (по крайней мере, на моем компьютере)? – TurtleTread

+1

@campuswebber, да, если вы пишете tmp [-anything], это может быть любое место в памяти, включая место, где хранится счет. – klm123

+0

Это именно то, что произошло. Без комментариев цикл while запускается в последний раз, а k получает -1. tmp [k] ++, который сделал count ++. Благодарю. – TurtleTread

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