Avatar billede kiara Nybegynder
09. oktober 2002 - 13:55 Der er 18 kommentarer og
1 løsning

Lille udregning...

Jeg skal have lavet en funtion der udregner BMI. Det vil sige x/(y*y). Altså hvis x er 62 og y er 1.72 vil resultatet så blive 20.96.

Jeg havde forestillet mig to felter. Et til x og et til y. Resultater skulle så komme frem nedenunder. Eller endnu bedre.. 

Hvis resultatet er mindre end eller lig med 19 skal der står "Dit BMI er" resultatet. "Du er undervægtig".

Hvis resultatet er mellem 20 og 25 skal der stå "Dit BMI er" resultatet. "Din vægt er normal".

Hvis resultatet bliver mellem 26 og 30 skal der stå "Dit BMI er" resultatet. "Du er overvægtig".

Hvis resultatet er 31 eller større skal der stå "Dit BMI er" resultatet. "Du er svært overvægtig"
Avatar billede jakoba Nybegynder
09. oktober 2002 - 14:27 #1
et lille script i head:

<script type='text/javascript'>

function beregn( frmElem ) {
    var x = parseInt( 0+frmElem.x.value, 10 );
    if ( x == 0 ) {
        alert( "du skal udfylde feltet 'x'." );
        return;
    }
    var y = parseInt( 0+frmElem.y.value, 10 );
    if ( y == 0 ) {
        alert( "du skal udfylde feltet 'y'." );
        return;
    }
    var bmi = Math.round( x / ( y*y ) );
    frmElem.bmi.value = bmi;
    var tx = "";
    if ( bmi <= 19 ) tx = "Du er undervægtig";
    else
    if ( bmi <= 26 ) tx = "Du er undervægtig";
    else
    if ( bmi <= 30 ) tx = "Du er undervægtig";
    else
        tx = "Du er svært overvægtig";
    frmElem.tekst.value = tx;
}; //end beregn( HTML form element )

</script>

og din formular:
<form action="" onsubmit="beregn(this); return false">
  x: <input name='x' type='text' size=6 value="0"><br>
  y: <input name='y' type='text' size=6 value="0"><br>
  BMI: <input name='bmi' type='text' size=3 value=""><br>
  <input name='tekst' type='text' size=40 value="">
  <input type='submit' value="udregn BMI">
</form>

et lille host:
    Ja man kan forøge sin levetid og livskvalitet ved at holde vægten. men kan kan øge begge dele mere ved at være glad for livet og tilfreds med sig selv.

mvh JakobA
Avatar billede 12tri Nybegynder
09. oktober 2002 - 14:37 #2
Bare lige en lille kommentar. Hvorfor vil du lave det ? der er mange andre steder du kan udregne dit bmi eks www.netdokter.dk , men hvis du ønsker at opfinde den dyde t......  Så besøg dog en af de allerede lavede udregnere og kig lidt på deres "sovs"
Avatar billede kiara Nybegynder
09. oktober 2002 - 14:43 #3
Jeg har ikke tænkt mig at opfinde en dyb tallerken, og eftersom jeg spørger efter det ville det jo ikke være mig der opfandt den, men den der kom med det rette svar.... Jeg gør det fordi jeg synes det er spændende at lære og BMI bare var et eksempel. Det kunne lige så vel have været en funktion der regnede ud hvor lang tid et græsstrå er om at vokse op og hvor meget vand det skal have eller noget andet. BMI var blot mit første idnfald
Avatar billede kiara Nybegynder
09. oktober 2002 - 14:47 #4
Jakoba...

Så vidt jeg kan se dividerer den først x med y for derefter at gange med y. Den skal dog først gange y med y for derefter at dividere x med resultatet af y gange y
Avatar billede jakoba Nybegynder
09. oktober 2002 - 14:49 #5
Ups. kom til at skrive "Du er undervægtig" tre gange istedet for een. " af stederne skal der stå: "Din vægt er normal" og "Du er overvægtig"
Det skulle være til at hitte ud af hvor :-)
Avatar billede jakoba Nybegynder
09. oktober 2002 - 14:56 #6
parenteserne omkring y*y
      x / ( y*y )
sørger for at y*y bliver udregne før der divideres.
Avatar billede kiara Nybegynder
09. oktober 2002 - 14:59 #7
Jeps det ved jeg men det ved ie nok ikke ;-) Det sker i hvert fald ikke når jeg sætter tallene ind
Avatar billede kiara Nybegynder
09. oktober 2002 - 15:10 #8
..og kan man undgå at resultatet kommer i et input-felt og i stedet for står "frit" så man slipper for de lækre kasser.

Jakoba, du har helt ret. At være glad og tilfreds tæller mindst lige så meget :-)
Avatar billede jakoba Nybegynder
09. oktober 2002 - 15:20 #9
Det kan man godt, men det er mere besværligt og vil ikke virke i helt så mange browsere. Det ovenfor virker hvorsomhelst browseren forstår javascript.
Versionen herunder virker i IE5 og op, NS6 og op og måske i Opera:

<script type='text/javascript'>

function beregn( frmElem ) {
    var x = parseInt( 0+frmElem.x.value, 10 );
    if ( x == 0 ) {
        alert( "du skal udfylde feltet 'x'." );
        return;
    }
    var y = parseInt( 0+frmElem.y.value, 10 );
    if ( y == 0 ) {
        alert( "du skal udfylde feltet 'y'." );
        return;
    }
    var bmi = Math.round( x / ( y*y ) );
    document.getElementById("bmi").innerHTML = bmi;
//    frmElem.bmi.value = bmi;
    var tx = "";
    if ( bmi <= 19 ) tx = "Du er undervægtig";
    else
    if ( bmi <= 26 ) tx = "Din vægt er normal";
    else
    if ( bmi <= 30 ) tx = "Du er overvægtig";
    else
        tx = "Du er svært overvægtig";
    document.getElementById("tekst").innerHTML = tx;
//    frmElem.tekst.value = tx;
}; //end beregn( HTML form element )

</script>

og din formular:
<form action="" onsubmit="beregn(this); return false">
  x: <input name='x' type='text' size=6 value="0"><br>
  y: <input name='y' type='text' size=6 value="0"><br>
  BMI: <span id="bmi"> </span><br>
  <span id="tekst"> </span>
  <input type='submit' value="udregn BMI">
</form>

mvh JakobA
Avatar billede kiara Nybegynder
09. oktober 2002 - 15:26 #10
Ja det var jo straks langt pænere men ikke så heldigt mht browsere. Men jeg har nu stadig problem med at den ikke regner den korrekt. Hvis man siger x=62 og y=1.72 kommer den frem til 62 og dette er ikke rigtigt. Det rigtige tal er lige lidt over 20. 62 kommer man frem til hvis man tager det hele fra en ende af, altså den ignorerer paranteserne
Avatar billede jakoba Nybegynder
09. oktober 2002 - 15:57 #11
Ops. det er mig der ikke havde lagt mærke til at y var et kommatal ig kun aflæser heltalsdelen af det.
der skal stå:
    var y = parseFloat( "0"+frmElem.y.value );  // RETTTET
    if ( y == 0 ) {
        alert( "du skal udfylde feltet 'y'." );
        return;
    }

du kan evt lave samme rettelse for x hvis der er risiko for at folk indtaster vægten som kommatal.

mvh JakobA
Avatar billede ras2000 Nybegynder
09. oktober 2002 - 16:07 #12
Jakoba, kan du ikke bare fjerne rammerne i svar feltet, og lave det så det ikke kan modtage focus? Eller er det også browser specifikt?
Avatar billede ras2000 Nybegynder
09. oktober 2002 - 16:09 #13
altså et <input type="text" name="tekst" style="border-style:none"> eller hvad det nu hedder.
Avatar billede jakoba Nybegynder
09. oktober 2002 - 16:13 #14
rammerne er desværre. når man fifler med CSS borders på felter kommer der en fjoget lille firkant under feltet. (men det kan stadig aflæses, ser bare fjollet ud)
nemt at forhindre focus på feltet:

  BMI: <input name='bmi' type='text' size=3 value=""
          onfocus="this.blur()" readonly style="border:0px solid white;"><br>
  <input name='tekst' type='text' size=40 value=""
          onfocus="this.blur()" readonly style="border:0px solid white;">
Avatar billede kiara Nybegynder
10. oktober 2002 - 09:28 #15
Jakoba, tak for hjælpen :-)

Hvis du har tid og lyst, kan du så forklare kodningen til en nybegynder? Ikke formularen, den er lige til, men mere selve scriptet. If og else´erne kan jeg godt forstå, men variablerne og denne... document.getElementById("tekst").innerHTML = tx;.... kunne jeg godt tænke mig at få forståelse for.

På forhånd tak..

Venligst Kiara
Avatar billede jakoba Nybegynder
10. oktober 2002 - 09:58 #16
Når en HTMLfil vises i browseren bliver der samtidig internt i browseren lavet et struktur af objekter der repræsenterer den viste side.

Strukturens yderste niveau er et window objekt som indeholder alle de andre. window objektet indeholder information om det browservindue siden ligger i og desuden indeholder det siden selv i sit document objekt. dokument objektet kan så igen indeholde paragraf ocjekter, form objekter, table objekter osv osv i en pænt stor hierakisk struktur. et billede i en tabel ville have en adresse i retning af
    billedobjekt nrummer 4
i tabelcelle objket nummer 3
i tablerækkeobjekt nummer 5
i tabel nummer 2
i afsnit nummer 2
i dokumentet
Det er lidt meget at skulle huske, så man har 'kortsluttet' adresseringen med funktionen getElementById. Hvis det sideelement man ønsker at finde har et unikt id kan man finde det side-elements objekt med
    document.getElementById( "elementetsId" )
det er kommer ud af funktionen er en objekt-reference (ligesom document variablen er en objektreference til document objektet. så vi kan addressere videre ved at tilføje .innerHTML som igen er en standardvariabel der ligger i ehvert html objekt og indeholder den HTMLkode der er indeni objektet.
så vi kan finde <span objektet:  <span id="bmi"> </span>  med
    document.getElementById( "bmi" )
og udskifte det blanktegn der står indeni (imellen <span ...> og </span>) med noget andet tekst med:
    document.getElementById("bmi").innerHTML = "noget andet tekst";

Det er teorien, og den er jo meget smuk. Virkeligheden er at det er langt fra alle HTML elementer man sådan kan lave om løbende, men jo nyere brovser du prøver i jo bedre er det implementeret, så jo større chance er der for at det vil virke.

takker for points.

mvh JakobA
Avatar billede kiara Nybegynder
10. oktober 2002 - 10:23 #17
Selv tak :-)

Jeg har dog lige et enkelt spørgsmål til. I variablerne, hvad er 10-tallet og hvorfor er det der i parseInt men ikke i parseFloat. Jeg lagde også mærke til at du i Float har skrevet "0", men i Int har du undladt". Så vidt jeg kan se har det ingen betydning om man bruger dem eller ej og det samme med 10-tallet. Er det rigtigt?

Venligst Kiara
Avatar billede jakoba Nybegynder
10. oktober 2002 - 11:00 #18
parseInt skal modtage en streng som inddata og læser så forfra i strengen efter et tal. hvis der fx står "123Hopsa" vil den returnere taller 123.
men hvis der blot står "Hopsa" giver den fejl for der er jo ikke antydningen af et tal i den streng.
Det undgår jeg ved at skrive  0+streng  for på den måde sikrer jeg at der altid som minimum står et ciffer 0 forrest i strengen. Det laver parseInt så tallet 0 udaf.
men parseInt kan også læse binære, oktale og heksadecimale tal, hvad slags tal den skal læse skal så angives på en eller anden måde. og hvis et tal begunder med cifferet '0' den gå ud fra at det er et oktalt tal, hvis ikke man angiver en nr2 parameter der udtrykkeligt siger det er et decimalt tal.
test evt;
    alert( parseInt("012345") +", " +parseInt("012345",10) );

parseFloat er strengere i sine krav til inddata og benytter altid det decimale talsystem. Den vil give fejl hvis der står bogstaver efter tallet, så her sættes der kun "0" foran for at forhindre fejl ved helt tomt felt.

om det er 0+inputstreng eller "0"+inputstreng er helt ligegyldig. '+'-operatoren konvertere begge operander til strenge, blot een af dem er en streng.

Min bibel om javascripts foruddefinerede funktioner er http://developer.netscape.com/docs/manuals/js/client/jsref/index.htm (Client-Side JavaScript Reference) den har et super index at søge i.

Men man skal vænne sig lidt til den før den rigtig kan kaldes nyttig, så suppler med spørgsmål her :-)

mvh JakobA
Avatar billede kiara Nybegynder
10. oktober 2002 - 11:05 #19
Tusind tak for hjælpen :-)

Venligst Kiara
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester