Avatar billede Tony Juniormester
12. september 2001 - 19:05 Der er 33 kommentarer og
2 løsninger

Et spørgsmål om spørgsmål - Hvordan ...

Jeg har et spørgeskema med 56 spørgsmål.
Hvert spørgsmål har to svarmuligheder (radio buttons).
Resultaterne af de individuelle spørgsmål skal sendes til hver sin af 8 forskellige kategorier.
Efter procentvis konvertering af hver kategori skrives resultatet på skærmen.

1. Hvorfor smider den ikke resultatet tilbage ?
2. Findes der andre og bedre måder at konstrurerer koderne på - skal (helst) overholde NS & IE >4.0 ?
3. Ville det være en fordel at udfærdige spørgsmålene i JavaScript - evt. i Arrays ?
3A. Hvis Ja: hvordan skal det laves ?

Koderne / testfilen er her:
http://www16.brinkster.com/breindal/diverse/qmark/test.html

mvh. Tony
Avatar billede roenving Novice
12. september 2001 - 20:10 #1
Hvad laver du ??


function CopllectI2(){ // Undersøger hvor mange i gruppen I2 er \'true\'
    for(I2=0; P1<17; P1++)
    {return true;
    }
}

For det første er din for-gruppe ikke reguleret ordentligt:

for(i=0; i<17; i++)


For det andet returnerer den altid ved den første indgang i løkken.

Og true regnes åbenbart for en, såden returnerer skiftevis 100/12 og 100/16

Jeg gætter på, du vil et eller andet, som:

function CopllectI2(){ // Undersøger hvor mange i gruppen I2 er \'true\'
        var tael = 0;
    for(i=0; i<16; i++){
          if (I2[i])tael++;
    }
    return tael;
}

Du må gerne oplyse mig noget om, hvad jeg har overset, men jeg forstod altså ikke hvad du gjorde.

hth
jes
Avatar billede Tony Juniormester
12. september 2001 - 20:31 #2
> roenving - Ve\' du hva\' - Det gjorde jeg heller ik\' mer\' :)

Men Ja, det var det, jeg gerne ville, altså isolere dem der var \'fluet\' af.

Hvordan får jeg så smidt resultaterne op på skærmen ?
Avatar billede roenving Novice
12. september 2001 - 20:37 #3
Jamen du bruger jo resultatet af funktionen direkte, prøv lige at sætte koden direkte ind i, men det fungerer sikkert ikke ligeud, for så skal vi sikkert lige have lavet noget felt-navns- og selectedIndex-noget.

hth
jes
Avatar billede Tony Juniormester
12. september 2001 - 20:42 #4
jes - jeg har knoklet med denne her stort set hele dagen og er helt rundt på gulvet :~

Jeg er da nød til at samle dine funktioner op og konverterer resultatet til % og så ligge de nye variabler op på skærmen ik\' ?
Avatar billede roenving Novice
12. september 2001 - 20:46 #5
Ja, men jeg gættede på, at du havde lavet det som eksempel, så du ville lave noget start-test med det du havde her.
Avatar billede Tony Juniormester
12. september 2001 - 20:48 #6
Jo, helt rigtig. Men samtidig vil gerne at testen virker hele vejen, så kan jeg selv arbejde videre med de rigtige spørgsmål, GUI o.s.v.
Avatar billede jakoba Nybegynder
12. september 2001 - 22:56 #7
tony du skal kun have eet sæt <form kommandoer (\'mainform\' rundt om hele spørgeskematet) ikke rundt om hver eneste par radionknapper. De knyttes sammen af at de har samme navn.

for at adressere de enkelte knapper siger du så:

if ( document.mainForm.Sp1[0].checked )
    // true hvis første knap i parret \'Sp1\' er valgt
else
if ( document.mainForm.Sp1[2].checked )
    // true hvis anden knap i parret \'Sp1\' er valgt
else
... osv.

Såvidt jeg kan se sætter du  Sp1[0].checked  lig med false og  Sp1[1].checked  lig med true.  Jeg savner lidt intuitiv sammenhæng der.

Og det virker ihvertfalt ikke på den måde :(

prøv istedet:

var P1 = new Array(2, 9, 13, 16, 18, 22, 30, 44, 48, 50, 54, 56);

function CopllectP1(){ // Undersøger hvor mange i gruppen P1 er \'true\'
    var tael = 0;
    var t = document.mainForm.elements;
    for(i=0; i<12; i++){
          if ( t[\'sp\'+p1[i]][1].checked ) tael++;
    }
    return tael;
}

såvidt jeg kan se gør den præcis det samme, og du slipper for alle de individuelle variable (Sp1_2E=1, Sp1_2I=1, ...).

mvh JakobA



Avatar billede jakoba Nybegynder
12. september 2001 - 23:02 #8
Eller er det meningen der senere skal komme nogle variable der har værdien 0?
var Sp1_2N=0, Sp1_2J=0, ...

i så fald er det nemmeste at kode dem ind i arrayet:

var P1 = new Array(21, 90, 130, 161, 180, 221, 301, 440, 480, 500, 541, 561);

function CopllectP1(){ // Undersøger hvor mange i gruppen P1 er \'true\'
    var tael = 0;
    var t = document.mainForm.elements;
    for(i=0; i<12; i++){
          if ( t[\'sp\'+(P1[i]/10)][P1[i]%10].checked ) tael++;
    }
    return tael;
}
Avatar billede Tony Juniormester
13. september 2001 - 08:17 #9
Hej JakobA.

\"Jeg savner lidt intuitiv sammenhæng\". Ve\' du hva\' Jakob - Det gør jeg oss\'. Jeg syns\', jeg famler i mørke selv om jeg snart har slidt \"Sams\" og \"O\'Reily\" helt op og det irreterer mig grænseløst :)

ad \"... du skal kun have eet sæt <form kommandoer ...\"
OK er rettet.

ad \"... for at adressere de enkelte knapper siger du så: ...\"
Vil du så ha\' 56 if / else sætninger i <head> scriptet ?

ad \"var P1 = new Array(2, 9, 13, 16, 18, 22, 30, 44, 48, 50, 54, 56);\"
Der \'fisker\' du i et \'brutto-array\', eller hva\' ? I så fald, vil du have alle spørgsmålene (variablerne) samlet i ét overordnet array ? Ellers så forstår jeg ikke helt, hvordan den kan vide hvad der f.eks. ligger i [2] - ved den intuitivt at \'mainform\' er et array ???

ad \"... nogle variable der har værdien 0 ?\"
Nej ikke denne gang, men godt set; det havde jeg ikke skænket en tanke :(

/Tony
Avatar billede Tony Juniormester
13. september 2001 - 09:43 #10
... og skal
if ( document.mainForm.Sp1[0].checked )
    // true hvis første knap i parret \'Sp1\' er valgt
else
if ( document.mainForm.Sp1[2].checked )
    // true hvis anden knap i parret \'Sp1\' er valgt

ikke være: .Sp1[1] i else delen - der er jo kun to valgmuligheder ?
Avatar billede jakoba Nybegynder
13. september 2001 - 10:03 #11
Ups. Jo du har helt ret, det er Sp1[0] og Sp1[1].

nej ikke 56 if sætninger, dine regel-array er fine, jeg mangler blot lidt definition af hvordan reglerne virker.

P1 er præcis samme regelarray som det var før. jeg har blot klipper al den info der var \'overflødig\' væk. Tallene henviser til Sp2, Sp9, ...

mvh JakobA
Avatar billede Tony Juniormester
13. september 2001 - 10:19 #12
ad \"P1 er præcis samme regelarray som ...\"
Kære Jakob - jeg kan altså ikke få ind på \'lystavlen\' hvordan den kan vide at f.eks. Sp2_1P = 2 i \'var P1 = new Array(2, 9, ...\' ???
... eller er det fordi du ønsker at bruge begge udgaver af \'var P1\' ???

/Tony
Avatar billede jakoba Nybegynder
13. september 2001 - 11:17 #13
Jeg har også gættet en del. Og nogen af de gæt er tydeligvis gale.

jeg forestiller mig et spørgeskema i stil med dem der bruges ved personligheds tests hvor fx
spørgsmålene 2, 9, 13, 16, 18, ... relaterer til \"udadvendthed\"
spørgsmålene 3, 7, 10, 17, 18, ... relaterer til \"creativitet\"
spørgsmålene 1, 5, 11, 14, 19, ... relaterer til \"selvstændighed\"
osv osv
og at scriptet så skal tælle sammen hvor meget/lidt testpersonen har af diverse egenskaber.
med en liste med kun spørgsmålsnumre kan testen kun sammenregne hvad der er blevet svaret ja til.
ved (som i 12/09 2001 23:02:5) at sætte 0 eller 1 bagved spørgsmålmummeret kan både nej og ja komme til at tælle positivt.

Det er helt rigtigt observeret at jeg ikke ved om Sp2_1P=2, jeg konvertrede udfra at alle dine Sp?_xx variable var lig med 1.

mvh JakobA
Avatar billede Tony Juniormester
13. september 2001 - 11:43 #14
Nej - nej ! Dine gæt er slet ikke forkerte, tværtimod. Ja det er en personlighedstest (og som du så rigtig insinuerer, er det PAEI). D.v.s. der er 8 grupper de 56 spørgsmål releterer til og scriptet skal helt rigtig tælle sammen og give en procentuel dækning tilbage inden for hver gruppe.

Min tanke var:

1. Erklær og initialiser alle spørgsmål (variabler) til 1 (mener at radio buttons ar født som \'null\').
2. Isoler de forskellige spørgsmål i hver sin gruppe.
3. Tæl hvor mange spørgsmål, i hver gruppe, der er klikket ved.
4. Omsæt det antal til % af den enkelte gruppe.
5. Giv bruger feedback i resultatskema.
Avatar billede Tony Juniormester
13. september 2001 - 15:43 #15
Jeg har lagt den nyeste udgave op, men den giver fejl ...

http://www16.brinkster.com/breindal/diverse/qmark/test.html
Avatar billede jakoba Nybegynder
13. september 2001 - 19:07 #16
prøv denne: http://hjem.get2net.dk/Jakob.Aggernaes/temp/exp108814.html

tallene i arrayene (P1, P2, ...) har betydningen:
  tal/10 = spørgsmålets nummer 
  tal%10 = hvilken knap tæller op
fx:
tal = 20    ( 20/10 = 2 = Sp2 )
            ( 20%10 = 0 = tæl op hvis første knap valgt )
tal = 21    ( 21/10 = 2 = Sp2 )
            ( 20%10 = 1 = tæl op hvis anden knap valgt )
tal = 90    ( 90/10 = 9 = Sp9 )
            ( 90%10 = 0 = tæl op hvis første knap valgt )
tal = 91    ( 91/10 = 9 = Sp9 )
            ( 90%10 = 1 = tæl op hvis anden knap valgt )
osv.
pt er alle sat til \'anden knap valgt\'. Det er utvivlsomt forkert

Avatar billede jakoba Nybegynder
13. september 2001 - 19:13 #17
an dit punkt 3 \"Tæl hvor mange spørgsmål, i hver gruppe, der er klikket ved.\"
  Skal det være lovligt at spronge en gruppe over så der hverken er klikket det ene eller det andet?
Avatar billede jakoba Nybegynder
13. september 2001 - 19:19 #18
Ups. hvis man klikker ja til samtlige bliver det mere end 100% nogen steder og mindre end 100% andre steder
Avatar billede Tony Juniormester
13. september 2001 - 19:44 #19
Så har du gjort det igen :)

Nej, man må ikke undlade nogle spørgsmål.

Ja, den giver >100% - vist nok 104 i værste tilfælde. Pyt med det. En sådan test kan aldrig være andet end vejledende. I øvrigt, måske det var en god idé kun at give heltal (altså runde op / ned) i feedback\'en.

Og så et brugervenlighedsspørgsmål. Testen kommer til at foregå i et frame-miljø. Det betyder, at der vil være mulighed for, at hvert spørgsmål har sin egen fil sp1_1.html, sp1_2.html, sp2_1.html o.s.v. For mig at se giver det gode muligheder for praktisk og grafisk brugervenlighed, men det giver jo nok lidt problemer i script henseende, men måske et eksternt script vil være sagen - hvordan tror du en sådan fil / script vil se ud til ét spørgsmål ?

Hvad synes du om tanken ? ... eller vil en lang (og lidt tung) fil være bedre ?

/Tony
Avatar billede jakoba Nybegynder
13. september 2001 - 19:55 #20
I et frame miljø ville jeg samle data sammen i javascript variable i frameset filen, og så viderebearbejde dem til sidst. Det er ret så nemt at implementere.

du har ret i at 56 spørgsmål på een side er for mange. men 56 sideskift er også i overkanten.
Hvad med 7 sider a 8 spm, eller 8 sider med 7 på hver. Så er der nogenlunde mulighed for at holde det scrollfrit.

mvh JakobA
Avatar billede Tony Juniormester
13. september 2001 - 20:08 #21
En gylden mellemvej tilpasset mainFrame uden scroll - tja ok, det er nok ik\' så tosset.

Jeg prøver at lave det fulde skema og arbejde lidt med GUI, så vender jeg tilbage ... der kan godt gå en dag eller to :)

Tak for nu JakobA
Avatar billede Tony Juniormester
14. september 2001 - 15:26 #22
Jeg forstår ikke helt hvad du gør i disse arays:

var P1 = new Array( 21,  91, 131, 161, 181, 221, 301, 441, 481, 501, 541, 561 );
var P2 = new Array( 31,  51,  81, 111, 121, 151, 201, 231,
                  261, 291, 311, 341, 371, 381, 401, 471 );

Tallene 21, 91, 131 o.s.v. hvad refererer de til ? var P1 skulle gerne indeholde alle de spøgsmål der vedrører var P1 = new Array(Sp2_1P, Sp9_1P, Sp13_1P, .... så der senere kan tjekkes hvilke bruger har valgt.

P.s. jeg kan ikke så godt lægge skemaet ud nu med div. rettelser, da alle spørgsmål er implementeret og det ikke kan offentliggøres. Men hvis du har en mail adr., kan jeg sende dig et link hvor det ligger.
Avatar billede Tony Juniormester
14. september 2001 - 15:47 #23
Ok nu forstår jeg: 21, 91, 131 ... = 2_1, 9_1, 13_1 ...

Funktionen starter en indsamling, men i hvilken variabel samles resultatet - I2.length ? Kan du godt erklære den lokalt og skal den ikke initialiseres ? Og endelig kan funktionen (komme til at) leverer heltal rundet op / ned ?

function CollectI2(){ // Undersøger hvor mange i gruppen I2 er \'true\'
    var tael = 0;
    var t = document.mainForm.elements;
    for(i=0; I2.length>i; i++){
          if ( t[\'Sp\'+Math.round(I2[i]/10)][I2[i]%10].checked ) tael++;
    }
    return tael;
}

/Tony
Avatar billede jakoba Nybegynder
14. september 2001 - 15:53 #24
det behøves heller ikke, tallene i arrayet p1 fortæller 2 ting.
1) hvilke spørgsmål der betyder noget.
2) hvilken radioknap der sakl være trykker for at den attribut skal tælles op.

så de 21 først i P1 betyder:
spørgsmål nr 2 (Sp2) hvis han har klikket på anden radioknap i gruppen.

hvis der havde stået 20 havde det stadig været spørgsmål 2. men så vil den tælle op hvis første radioknap er valgt.

eksempel:
var C1 = new Array( 31, 70 ); // måler dumdristighed.
refererer til spørgsmål 3 og spørgsmål 7
Sp3 = \"Tør du slås med en løve?\"    Nej 0  ja 0
  hvis han svarer ja tælles dumdristig een op
Sp7 = \"Er du bange for pindsvin?\"    Nej 0  Ja 0
  hvis han svarer nej tælles dumdristig een op.

mvh JakobA
Avatar billede jakoba Nybegynder
14. september 2001 - 16:28 #25
attributten .length er defineret i ethvert array og indeholder \"antal elementer i dette array\".
Ved at teste imod den istedet for et tal slipper jeg for at holde rede i hvilke arrays har 12 elementer og hvilke har 16 elementer. forløkken gennemgår bare alle de elementer der er.

der tælles op i variablen tael, ligesom før.

\"heltal rundet op\" ?. heltal kan ikke afrundes.

Ups. Fandt en fejl. de 3 sidste linier i funktionen beregnform er forkerte, jeg havde sat dem til at dividere med længden af det forkerte array. Det skal være:
    E2_Result = (CollectE2() * 100)/E2.length;
    I1_Result = (CollectI1() * 100)/I1.length;
    I2_Result = (CollectI2() * 100)/I2.length;

Jep, det var den fejl der gjorde jeg ikke fik 100% i alle rækker ved \'ja\' på alle spm. jeg har lagt en retter version ud på samme adresser.

mvh JakobA
Avatar billede Tony Juniormester
14. september 2001 - 17:05 #26
OK - Så har jeg det på plads, kunne bare simpelthen ikke gennemskue det :)

Og med den sidste rettelse virker det fint nu.

Følgende resultatet vises på skærmen med f.eks.: 47,28 Det er der, det ville være dejligt, om den kunne runde op / ned til hele tal, altså f.eks.: 47 og så skrive \'%\' bagefter. (Er det ikke \'mathRound\' det hedder ?)

For bruger ville det også være godt, hvis han / hun, med et tryk på en knap, kunne udskrive sit resultat (på papir) direkte i popup\'en.

function visResultat( ) {
    beregnForm();
    var w = window.open( \'about:blank\', \'reswin\', \'width=200,height=300\' )
    w.focus();
    var tx = \"<table cellpadding=4 cellspacing=0 border=0 bgcolor=\'#ddddff\'>\"
            +\"<tr><td>P 1</td><td>=</td><td align=\'right\'>\"
              +toDecim(P1_Result) +\"</td></tr>\"
            +\"<tr><td>P 2</td><td>=</td><td align=\'right\'>\"
              +toDecim(P2_Result) +\"</td></tr>\"
            +\"<tr><td>A 1</td><td>=</td><td align=\'right\'>\"
              +toDecim(A1_Result) +\"</td></tr>\"
            +\"<tr><td>A 2</td><td>=</td><td align=\'right\'>\"
              +toDecim(A2_Result) +\"</td></tr>\"
            +\"<tr><td>E 1</td><td>=</td><td align=\'right\'>\"
              +toDecim(E1_Result) +\"</td></tr>\"
            +\"<tr><td>E 2</td><td>=</td><td align=\'right\'>\"
              +toDecim(E2_Result) +\"</td></tr>\"
            +\"<tr><td>I 1</td><td>=</td><td align=\'right\'>\"
              +toDecim(I1_Result) +\"</td></tr>\"
            +\"<tr><td>I 2</td><td>=</td><td align=\'right\'>\"
              +toDecim(I2_Result) +\"</td></tr>\"
            +\"</table>\";

    w.document.writeln(\"<center><b>Resultatet i % er:</b><br>\" +tx +\"</center>\" );
}; //end visResultat( )
//--> </script>

/Tony
Avatar billede jakoba Nybegynder
14. september 2001 - 17:11 #27
Rettelsen er allerede lavet i det der ligger på adressen.

istedet for    toDecim( P1_result )
kalder den nu  noDecim( P1_result ) 

mvh JakobA
Avatar billede jakoba Nybegynder
14. september 2001 - 17:15 #28
men printfunktionen skal lige laves.

PS skukke der ikke skrives lidt forklaring/fyld/reklame_for_tony  rundtom restultattabellen. Det er lovlig lidt at bruge et helt A4 ark på.

mvh JakobA
Avatar billede Tony Juniormester
14. september 2001 - 17:16 #29
Ok JacobA, så er den der vist. Endnu en gang tak for al din hjælp :)

>roenving. Lidt til dig også for din indledning :)

mvh. Tony
Avatar billede Tony Juniormester
14. september 2001 - 17:17 #30
Ok JacobA, så er den der vist. Endnu en gang tak for al din hjælp :)

>roenving. Lidt til dig også for din indledning :)

mvh. Tony
Avatar billede Tony Juniormester
14. september 2001 - 17:18 #31
Ups ...
Avatar billede jakoba Nybegynder
14. september 2001 - 17:29 #32
har tilføjet en printknap i linien:

    tx += \"<br><form><input type=\'button\' \"
        +\"value=\'Udskriv\' onclick=\'print()\'></form>\";

indsættes lige foran:
    w.document.writeln(...

tak for points

mvh JakobA
Avatar billede Tony Juniormester
14. september 2001 - 17:39 #33
Tak for alt Jakob.
Avatar billede roenving Novice
15. september 2001 - 02:06 #34
Takker også for points ;~}
Avatar billede Tony Juniormester
06. november 2001 - 13:30 #35
jakoba >>
Desværre kan jeg ikke få \'print()\' til at virke (heller ikke den på dit link). Hvis du, eller andre, har et bud, ligger der point over i spm: http://www.eksperten.dk/spm/130226

/Tony
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