Vinnaren i pepparkakshustävlingen!
2017-02-20, 17:49
  #1
Medlem
Kod:
var scores = [60, 50, 60, 58, 54, 54, 58, 50, 52, 54, 48, 69, 34, 55, 51, 52, 44, 51, 69, 64, 66, 55, 52, 61, 46, 31, 57, 52, 44, 18, 41, 53, 55, 61, 51, 44];
var costs = [.25, .27, .25, .25, .25, .25, .33, .31, .25, .29, .27, .22, .31, .25, .25, .33, .21, .25, .25, .25, .28, .25, .24, .22, .20, .25, .30, .25, .24, .25, .25, .25, .27, .25, .26, .29];

function printAndGetHighScore(scores){
    var highScore = 0;
    var output;

    for (var i = 0; i < scores.length; i++){
        output = "Bubble solution #" + i + " score: " + scores[i];
        console.log(output);
        if (scores[i] > highScore){
            highScore = scores[i];
        }  
    }

    return highScore;   
}
function getBestResults(scores, highScore){
    var bestSolutions = [];
    for(var i = 0; i < scores.length; i++){
        if(scores[i] == highScore){
            bestSolutions.push(i);  
        }
    }
    return bestSolutions;
}
function getMostCostEffectiveSolution(scores, costs, highScore){
    var cost = 100;
    var index;

    for (var i=0; i< scores.length; i++){
        var costsIndex = costs[i];
        if(scores[i]>=highScore && costsIndex < cost){
            index = scores[i];
            cost = costs[i]    
        }
    }
    return index;
}

var mostCostEffective = getMostCostEffectiveSolution(scores, costs, highScore);


var highScore = printAndGetHighScore(scores);
console.log("Bubbles tests: " + scores.length);
console.log("Highest bubble score: " + highScore);

var bestSolutions = getBestResults(scores, highScore);
console.log("Solutions with the highest score: " + bestSolutions);
console.log("Bubble Solution #" + mostCostEffective + " is the most cost effective");

Problemet är funktionen getMostCostEffectiveSolution, som helt enkelt ska jämföra det högsta värdet från scores-Arrayen med motsvarande indexplats i costs-Arrayen, nu kan det finnas flera värden i scores som är lika stora. Ifall det händer ska den alltså ta den hösta värdet från scores, med det lägsta värdet från costs. Helt enkelt, man ska få den bästa produkten(scores) för det lägsta priset (costs). Men förstår inte varför jag får #undefined på utskriften. Och tyvärr har jag ännu inte hunnit sätta mig in i debugging på Javascript, ska försöka kolla igenom någon Youtubefilm om det senare under kvällen. Så tips och förslag på hur man ska felsöka eller åtgärda felet???
Citera
2017-02-20, 17:52
  #2
Medlem
Varje index i de båda arrayerna motsvarar alltså en produkt, så index 0 i costs och scores = produkt A. Och ja, det är en uppgift från en bok, och nej, det är ingen skoluppgift exakt. Och ja, svaret står på nästa sida, men hur kul är det att läsa facit utan att förstå varför
Citera
2017-02-20, 17:55
  #3
Medlem
Brunbeverns avatar
Har inte kollat så noggrant, men ser ett tankefel i din första anropade funktion getMostCostEffectiveSolution(). Du returnerar inte index, du returnerar värdet på indexplatsen.

Se rad: index = scores[i]
Citera
2017-02-20, 18:30
  #4
Medlem
Problemet ligger i vilken ordning du anropar funktionerna.
Kod:
var mostCostEffective = getMostCostEffectiveSolution(scores, costs, highScore);


var highScore = printAndGetHighScore(scores);
Du skapar highScore efter att du anropar getMostCostEffectiveSolution, dvs du skickar in undefined och därför blir det fel.

Edit: Anledningen till att javascript inte klagar på odeklarerade variabler är att språket använder sig av hoisting. Det innebär att när javascript parsar ett scope, tex det globala eller någon funktion, så letar den först efter alla variabler som skapas i scopet och placerar implicit dessa deklarationer längst upp i scopet. Dvs, längst upp i koden under costs står egentligen
Kod:
var highScore;
med standardvärde undefined.
__________________
Senast redigerad av tankme 2017-02-20 kl. 18:46.
Citera
2017-02-20, 21:57
  #5
Medlem
Citat:
Ursprungligen postat av tankme
Problemet ligger i vilken ordning du anropar funktionerna.
Kod:
var mostCostEffective = getMostCostEffectiveSolution(scores, costs, highScore);


var highScore = printAndGetHighScore(scores);
Du skapar highScore efter att du anropar getMostCostEffectiveSolution, dvs du skickar in undefined och därför blir det fel.

Edit: Anledningen till att javascript inte klagar på odeklarerade variabler är att språket använder sig av hoisting. Det innebär att när javascript parsar ett scope, tex det globala eller någon funktion, så letar den först efter alla variabler som skapas i scopet och placerar implicit dessa deklarationer längst upp i scopet. Dvs, längst upp i koden under costs står egentligen
Kod:
var highScore;
med standardvärde undefined.

Efter att jag ändrat ordningen på funktionsanropen ordnade det sig alldeles utmärkt. Tackar för hjälpen :-D Nu är det bara den där lilla detaljen med att ta med sig indexet och inte värdet på indexet.
Citera
2017-02-21, 11:08
  #6
Medlem
Citat:
Ursprungligen postat av Andree1
Nu är det bara den där lilla detaljen med att ta med sig indexet och inte värdet på indexet.
Se Brunbeverns svar ett par poster upp.
Citera
2017-02-21, 17:44
  #7
Medlem
Och nu funkar det precis som boken sa att det skulle funka. Så tackar för hjälpen.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback