2016-02-05 6 views
1

В чем разница между следующими тремя кодами.Некоторые вопросы о Scanf

1:

struct node 
{ 
    int data; 
}tree[100050]; 
/* 
some codes 
*/ 
int main() 
{ 
    int tot; 
    scanf("%d",&tot); 
    int tmp; 
    for(int i=0;i<=tot;++i){ 
     scanf("%d",&tmp); 
     tree[i].data=tmp; 
     insert(i,1); 
    } 
} 

Неправильный ответ

2:

struct node 
{ 
    int data; 
}tree[100050]; 
/* 
some codes 
*/ 
int main(){ 
    int n; 
    scanf("%d",&n); 
    int tmp; 
    for(int i=0;i<=n;++i){ 
     scanf("%d",&tree[i].data); 
     insert(i,1); 
    } 
} 

Принято

3:

struct node 
{ 
    int data; 
}tree[100050]; 
/* 
some codes 
*/ 
int main() 
{ 
    int tot; 
    scanf("%d",&tot); 
    int tmp; 
    for(int i=0;i<=tot;++i){ 
     scanf("%d",&tmp); 
     tree[i].data=tmp; 
     insert(i,1); 
     tmp=0; 
    } 
} 

Принято

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

Проблема здесь POJS024. Это написано на китайском языке. Ввод - это список чисел, который строит двоичное дерево сортировки, первым номером является корень. Вывести ход обхода и ход после заказа.

ответ

5

Все три используют неправильную логику. Вам повезло, во второй и третий, вероятно, потому, что insert имеет некоторую специальную обработку значений, которые равны 0.

Ошибка во всех трех является то, что вы используете

for(int i=0;i<=n;++i){ 

вместо

for(int i=0;i<n;++i){ 
      ^^^ Needs to be < not <= 

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

if (scanf(...) == 1) 
{ 
    insert(i,1); 
} 

Вот почему очень важно, что вы делаете в привычку проверять возвращаемое значение scanf семейства функций ВСЕГДА, чтобы убедиться, что вы были в состоянии прочитать все данные, которые вы ожидали.

2

Задача (которая на самом деле существует в каком-то смысле, во всех трех случаях) является то, что вы называете scanf() один слишком много раз, потому что вы используете <= сравнение в for цикле вместо того, чтобы с помощью < сравнения. В результате последний вызов scanf() фактически не выполняется. и вы вызываете insert(i,1) еще раз, чем следует называть.

В примере 1, в результате которого tree[i].data установлено на последнее значение, которое было считано в tmp, в примерах 2 и 3 это значение остается равным нулю. По-видимому, дополнительный вызов insert(i,1) не вызывает проблем в этом конкретном сценарии.