C програмата продължава да се срива

Програмата ми продължава да се срива. Кодовете изглеждат законни и правилни. Чудя се какъв е проблема.

#include <stdio.h>

void queue(int length,int turns){
    int permutations,totalTurns;
    turns++;
    if (length>0){
        queue(length-1,turns);
        if (length>1){
            queue(length-2,turns);
        }
    } 
    else{
        permutations++;
        totalTurns+=turns;
    }
}

int main() 
{
    while(true){
        int length;
        float average;
        int permutations=0;
        int totalTurns=0;

        printf("Queue length: ");
        scanf("%d", &length);
        queue(length,-1);
        average=totalTurns/permutations;
        printf("The average turns are %f", average);
    }
}

person Amin Husni    schedule 13.12.2012    source източник
comment
Моля, публикувайте също съобщението за грешка, което получавате, когато се срине.   -  person span    schedule 13.12.2012


Отговори (2)


    int permutations=0;

    average=totalTurns/permutations;

Делиш на нула.

Имайте предвид, че променливата permutations, която сте декларирали в main(), е различна от тази в queue().

Вероятно трябва да върнете стойността permutations от queue(), като това:

int queue(int length,int turns){
    int permutations = 0;
    ...
    return permutations;
}

int main(void) {
    ...
    int permutations = queue(length,-1);
}
person Graham Borland    schedule 13.12.2012
comment
о! Тогава трябваше просто да направя глобална променлива вместо това. Благодаря ви за помощта ^^ - person Amin Husni; 13.12.2012

Трябва да декларирате пермутации като глобална променлива, т.е. извън главната функция, както и totalTurns, защото както други споменаха, винаги е 0, защото дори да си помислите, че го декларирате в опашката на функциите, той се забравя извън него.

#include <stdio.h>

static int permutations=0;
static int totalTurns=0;


void queue(int length,int turns){
    turns++;
    if (length>0){
        queue(length-1,turns);
        if (length>1){
            queue(length-2,turns);
        }
    } 
    else{
        permutations++;
        totalTurns+=turns;
    }
}

int main() 
{
    while(true){
        int length;
        float average;
        int totalTurns=0;

        printf("Queue length: ");
        scanf("%d", &length);
        queue(length,-1);
        average=totalTurns/permutations;
        printf("The average turns are %f", average);
    }
}
person Templar    schedule 13.12.2012
comment
По-спретнато само за връщане на стойността от queue(), вместо да се забърквате с глобални стойности. - person Graham Borland; 13.12.2012
comment
Тъй като и двете, permutations и totalTurns трябва да бъдат актуализирани, ще трябва да се върне структура, или int*, или да се предаде указател към поне един от тях. Ако използвате глобални, поне ги направете static, така че техният обхват да е ограничен до единицата за компилиране. - person Daniel Fischer; 13.12.2012