javascsipt medelvärde!
jag ska skriva ett program som samlar in 4 poäng och tar sedan bort det lägsta och det högsta. så långt har jag kommit. men sedan ska jag kunna räkna ut medelvärdet av dom två resterande talen (summan och dela på två) och det är den jag inte får till..
min kod:
<html>
<head>
<meta charset="UTF-8">
<title>övning26</title>
</head>
<body>
<script>
function berakna()
{
var tal1, tal2, tal3,tal4;
tal1 = document.getElementById("tal1").value;
tal2 = document.getElementById("tal2").value;
tal3 = document.getElementById("tal3").value;
tal4 = document.getElementById("tal4").value;
var poang = [tal1, tal2, tal3, tal4];
poang.sort(function(a, b) {return a-b});
poang.splice(0, 1);
poang.splice(2, 1);
var total, num;
return total + num;
document.getElementById("poang").value;
document.getElementById("svar").value = return;
}
</script>
<form name="f1">
Skriv in dina poäng:<br><br>
<input type="text" id="tal1" /><br>
<input type="text" id="tal2" /><br>
<input type="text" id="tal3" /><br>
<input type="text" id="tal4" /><br>
<input type="button" value="Beräkna total poängen" onClick="berakna();"/>
<br><br>
Din poäng är: <input type="text" id="svar" />
</form>
</body>
</html>
Hej,
Det finns några fel i din kod som måste först fixas innan vi kan lösa ditt problem! Du har skrivit:
return total + num;
och sedan
document.getElementById("svar").value = return;
Orden return måste bort och bytas ut mot t.ex en variabel. Return används bara ifall du vill skicka tillbaks något. Ifall du har en funktion som adderar två tal så kan du använda dig av return för att skicka tillbaka resultatet av additionen.
Sedan undrar jag varför du använder dig av poang.splice på din lista. .splice använder du ifall du vill lägga in nya tal, och det vill vi inte. Därför rekommenderar jag att du tar bort de linjerna också. Den sista saken som du kan ta bort är:
document.getElementById("poang").value;
Denna linje hämtar vad ett HTML objekt med ID:et poang har för värde. I ditt fall har du inget HTML objekt med det värdet, så den linjen skapar bara problem.
Nu kan vi börja fundera på din fråga!
I en lista så har varje list plats ett index värde. Första talet i listan har alltså index värdet 0, andra har index värdet 1 osv. Med hjälp av detta index värde så kan vi hämta ett värde som finns på en viss plats i listan. För att hämta dem två första talen kan vi använda:
var förstaTalListan = poang[0];
var andraTalListan = poang[1];
osv
Med hjälp av detta kan du hämta dina mittersta tal och räkna ut medelvärdet!
Ifall du stöter på några problem eller funderingar är det bara att fråga!
IGIL skrev :Hej,
Det finns några fel i din kod som måste först fixas innan vi kan lösa ditt problem! Du har skrivit:
return total + num;
och sedan
document.getElementById("svar").value = return;Orden return måste bort och bytas ut mot t.ex en variabel. Return används bara ifall du vill skicka tillbaks något. Ifall du har en funktion som adderar två tal så kan du använda dig av return för att skicka tillbaka resultatet av additionen.
Sedan undrar jag varför du använder dig av poang.splice på din lista. .splice använder du ifall du vill lägga in nya tal, och det vill vi inte. Därför rekommenderar jag att du tar bort de linjerna också. Den sista saken som du kan ta bort är:
document.getElementById("poang").value;
Denna linje hämtar vad ett HTML objekt med ID:et poang har för värde. I ditt fall har du inget HTML objekt med det värdet, så den linjen skapar bara problem.
Nu kan vi börja fundera på din fråga!
I en lista så har varje list plats ett index värde. Första talet i listan har alltså index värdet 0, andra har index värdet 1 osv. Med hjälp av detta index värde så kan vi hämta ett värde som finns på en viss plats i listan. För att hämta dem två första talen kan vi använda:
var förstaTalListan = poang[0];
var andraTalListan = poang[1];
osvMed hjälp av detta kan du hämta dina mittersta tal och räkna ut medelvärdet!
Ifall du stöter på några problem eller funderingar är det bara att fråga!
tack så hjärtligt för svar!
jag använde mig utan poang.splice för att det tog bort mitt första och sista tal efter att jag radat upp dom i storleksordning men med ditt indexvärde så blir det lättare tror jag...sak skriva lite kod så återkommer jag :D
nu skrev jag min kod på detta sätt:
<script>
function berakna()
{
var tal1, tal2, tal3, tal4;
tal1 = document.getElementById("tal1").value;
tal2 = document.getElementById("tal2").value;
tal3 = document.getElementById("tal3").value;
tal4 = document.getElementById("tal4").value;
var poang = [tal1, tal2, tal3, tal4];
poang.sort(function(a, b) {return a-b});
var plats1 = poang[0];
var plats2 = poang[1];
var plats3 = poang[2];
var plats4 = poang[3];
var tot;
tot = plats2 + plats3;
tot = tot / 2;
document.getElementById("svar").value = tot;
}
</script>
men svaret blir helt fel för det jag vill dårå är :
1. att siffrorna jag matar in ska ställas i storleksordning
2. att välja ut dom i mitten..
3. addera dom siffrorna
4. dela det svaret med 2. (för att få ut medelvärdet på dom)
.. men blir helt fel... matade in 2,1,6,8... förväntade mig att d ska bli att mina mittersta tal blir: 2 och 6.. plussa ihop dom till 8 och dela på 2.. alltså 4 men får svaret 13 :S
För att det ska stå på hemsidan i rätt ordning måste du säga åt ett visst element att byta värde till plats1, plats2, plats3 eller plats4. Det kan du göra med document. och sedan välja dina input fält med id tal1, tal2, tal3 eller tal4.
Hoppas du får till det nu, om inte, fråga!
får fortfarande inte till den..
<script>
function berakna()
{
var tal1, tal2, tal3, tal4;
tal1 = document.getElementById("tal1").value;
tal2 = document.getElementById("tal2").value;
tal3 = document.getElementById("tal3").value;
tal4 = document.getElementById("tal4").value;
var poang = [tal1, tal2, tal3, tal4];
poang.sort(function(a, b) {return a-b});
var plats1 = poang[0];
var plats2 = poang[1];
var plats3 = poang[2];
var plats4 = poang[3];
plats1 = document.getElementById("tal1").value;
plats2 = document.getElementById("tal2").value;
plats3 = document.getElementById("tal3").value;
plats4 = document.getElementById("tal4").value;
var tot;
tot = plats2 + plats3;
tot = tot / 2;
document.getElementById("svar").value = tot;
}
</script>
känns som att nått blir fel där i sorteringen eller när jag försöker dela tot i 2..
inputelement.value returnerar strängar, så när du gör plats2+plats3 blir det '2'+'6'='26', när du sedan delar med 2 så görst strängen om till tal, och 26/2=13.
Du måste göra om plats2 och plats3 till tal innan du gör + med dom.
När du skriver:
plats1 = document.getElementById("tal1").value;
Skriver du att variabeln plats1 ska få värdet som finns på elementet med ID tal1. Du vill sätta värdet till plats1. För att göra det skriver du följande:
document.getElementById("tal1").value = plats1;
Sedan vid din uträkning av medelvärdet räknar du med en text och inte tal. I javascript så kan var innehålla nästan vad som helst. När du hämtar ett värde från ett HTML element hämtas det som en text. Du måste alltså göra om plats2 och plats3 till tal. Det kan du på föjande sätt:
plats2 = parseInt(plats2);
Det som händer är att vi skriver över plats2 med värdet av texten plats2.
Hoppas du lyckas lösa uppgiften nu!
Ett enkelt sätt att ta bort det största och minsta talen är att sortera dem (numeriskt, tänk på att ett anrop till sort utan en egen sorteringsfunktion sorterar alfabetiskt) och därefter med slice ta bort det första och sista talet.
Summor är enkla att räkna ut med array-metoden reduce.
Och ett medelvärde är bara en summa av en talserie delat med längden på den.
// Skapa html för vårt formulär
const createForm = () => `
<form>
${[...new Array(4)].map((x, i) =>
`Tal ${i + 1}: <input><br>`).join('')}
<br>Resultat: <input><br><br>
<input type="reset" value ="Börja om">
<input type="submit" value="Beräkna">
</form>
`;// Räkna ut ett medelvärde av en talserie
const average = (...nums) => nums.reduce((x, y) => x + y) / nums.length;const calc = e => {
// Förhindra sidomladdning
e.preventDefault();
// Läs av värdena (och omvandla till nummer)
let nums = [...document.forms[0].elements].map(x =>
+x.value.split(',').join('.')
).slice(0, 4);
// Ta bort det högsta och lägsta talen
nums = nums.sort((a, b) => a - b).slice(1, -1);
// Beräkna medelvärdet och lägg in som result i formuläret
document.forms[0].elements[4].value = average(...nums);
}// Lägg till formuläret i DOM
// koppla eventhantering till när man vill "skicka" det
document.body.innerHTML = createForm();
document.forms[0].addEventListener('submit', calc);