Avatar billede pedepede Nybegynder
15. februar 2005 - 09:35 Der er 29 kommentarer og
1 løsning

Logisk problem

Jeg mangler hjælp til at løse et logisk problem i javascript.

Jeg har 100 varer, som kan sælges enkeltvis eller i 3 pakker. Man kan markere de varer man vil bestille på en liste. Programmet skal tjekke om alle de varer man vil bestille indgår i en pakke. Hvis de gør det, skal programmet vise at man bestiller en (eller flere) pakker i stedet for at liste varerne enkeltvis. Hvis brugeren vil bestille hvad der svarer til to pakker og nogle tre varer der ikke indgår i pakkerne vil listen dermed se således ud:
- Pakke 1
- Pakke 2
- Vare x
- Vare y
- Vare z

Det er (muligvis) noget med programmet først skal teste om varene indgår i pakke og så liste pakkenavnet hvis det gør. Dernæst skal testes for varer der ikke indgår i en pakke. Hvis en vare indgår i en pakke skal den ikke listes igen.

Er der en logisk tænkende person der kan løse problemet inden mit hoved bryder sammen?
Avatar billede roenving Novice
15. februar 2005 - 14:14 #1
Hvordan med flere af den samme vare, skal der så listes både pakke og vare ?-)

-- og kan de i det hele taget findes mere end een gang ?o]

Min første tanke går på, at lave nogle arrays med indholdet af pakkerne, først checke om de er fuldt til stede og bagefter checke resten !-)
Avatar billede pedepede Nybegynder
15. februar 2005 - 14:18 #2
En vare skal kun listes hvis den ikke samtidig er med i en pakke. Så hvis den er i pakken skal den ikke listes.

De kan ikke findes mere end en gang.

Kan det lade sig gøre, tror du?
Avatar billede roenving Novice
15. februar 2005 - 14:33 #3
Ja, det kan det sagtens, prøver lige at kigge på det !-)
Avatar billede roenving Novice
15. februar 2005 - 14:36 #4
Er der forøvrigt en logisk sammenhæng i de tre pakker, så man kunne lave listen logisk i forhold til pakkerne, og er alle de 100 varer med i en pakke, og/eller netop een pakke !-)
Avatar billede pedepede Nybegynder
15. februar 2005 - 14:37 #5
Hov lige en vigtig kommentar!! Jeg tror måske jeg misforstod dit andet spørgsmål. En vare kan optræde i flere forskellige pakker!
Avatar billede roenving Novice
15. februar 2005 - 14:37 #6
-- så er mit sidste spørgsmål næsten overflødigt !-)
Avatar billede pedepede Nybegynder
15. februar 2005 - 14:39 #7
:O) Tja... Der er ingen logisk sammenhæng overhovedet...
Avatar billede roenving Novice
15. februar 2005 - 15:41 #8
Hrm, jeg er lige stødt ind i et problem, med at kunne slå dem fra igen, den må jeg lige tænke noget over !-)

-- ellers har jeg den, men den er lidt væsentlig !-)
Avatar billede pedepede Nybegynder
15. februar 2005 - 15:48 #9
(Der er vist lidt problemer med Ekspertens database...)

Glæder mig til at se hvad du når frem til! :O)
Avatar billede roenving Novice
15. februar 2005 - 17:43 #10
Som den er nu, er den stærkt afhængig af navngivningsskemaet, og det vil være irriterende at lave det ret meget om, men du kan jo teste om den gør som den skal:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>

<head>

<title>Tomt dokument</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css">
html,body{height:100%;margin:0px;border:0px;padding:0px;font-family:tahoma,verdana,arial,sans-serif;font-size:small;}
table{border-collapse:collapse;}
td{padding:0 5px;vertical-align:bottom;text-align:center;border-bottom:1px solid black;}
h5{margin:2px 0;color:#c06;}
h6{margin:4px 0;color:red;font-style:italic;margin:0;padding:0;line-height:1;}
.noBorder{border:0;}
.marked{background:#6c3;font-weight:bold;}
</style>

<script type="text/javascript">
var pakke = new Array();
pakke[1] = ['vare1','vare2','vare3','vare4','vare5'];
pakke[2] = ['vare1','vare7','vare13','vare14','vare18'];
pakke[3] = ['vare6','vare8','vare13','vare17','vare19'];

function visBestilling(elm){
  var f = elm.form,abort=false;
  var varer = new Array(),txt="",num=0,pakkefuld;
  for(i=1;i<=20;i++)varer[i]=false;
  for(i=1;i<=3;i++){
    pakkefuld = true;
    for(j=0;j<pakke[i].length;j++){
      pakkefuld = pakkefuld&&f.elements[pakke[i][j]].checked;
      if(elm.name == pakke[i][j] && !elm.checked)
        abort = true;
    }
    if(pakkefuld){
      f.elements['pakke'+i].checked = true;
    }else if(abort){
      f.elements['pakke'+i].checked = false;
    }
    if(f.elements['pakke'+i].checked){
      for(j=0;j<pakke[i].length;j++){
        f.elements[pakke[i][j]].checked = true;
        num = +pakke[i][j].replace(/^.*?(\d+)$/,"$1");
        varer[num] = true;
      }
      txt += 'pakke' + i + "<br>";
    }
  }
  for(i=1;i<=20;i++)
    if(f.elements['vare'+i].checked&&!varer[i])
      txt += 'vare' + i + "<br>";
  document.getElementById('bestilling').innerHTML = txt;
}
</script>
</head>

<body>

<form style="float:left;margin:0 20px;">
<table>
  <tr>
    <td style="text-align:right;width:100px;"><h6 style="text-align:right;">Med i pakke:</h6></td>
    <td>&nbsp;</td>
    <td><h5>1</h5></td>
    <td><h5>2</h5></td>
    <td><h5>3</h5></td>
  </tr>
  <tr>
    <td class="noBorder"><h6>Vare</h6></td>
    <td class="noBorder" colspan="4">&nbsp;</td>
  </tr>
  <tr>
    <td><h5>Pakke 1</h5></td>
    <td><input type="checkbox" name="pakke1" onclick="visBestilling(this)"></td>
    <td class="marked">X</td>
    <td>-</td>
    <td>-</td>
  </tr>
  <tr>
    <td><h5>Pakke 2</h5></td>
    <td><input type="checkbox" name="pakke2" onclick="visBestilling(this)"></td>
    <td>-</td>
    <td class="marked">X</td>
    <td>-</td>
  </tr>
  <tr>
    <td><h5>Pakke 3</h5></td>
    <td><input type="checkbox" name="pakke3" onclick="visBestilling(this)"></td>
    <td>-</td>
    <td>-</td>
    <td class="marked">X</td>
  </tr>
  <tr>
    <td height="12" colspan="5" class="noBorder">&nbsp</td>
  </tr>
  <tr>
    <td><h5>Vare 1</h5></td>
    <td><input type="checkbox" name="vare1" onclick="visBestilling(this)"></td>
    <td class="marked">X</td>
    <td class="marked">X</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td><h5>Vare 2</h5></td>
    <td><input type="checkbox" name="vare2" onclick="visBestilling(this)"></td>
    <td class="marked">X</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td><h5>Vare 3</h5></td>
    <td><input type="checkbox" name="vare3" onclick="visBestilling(this)"></td>
    <td class="marked">X</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td><h5>Vare 4</h5></td>
    <td><input type="checkbox" name="vare4" onclick="visBestilling(this)"></td>
    <td class="marked">X</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td><h5>Vare 5</h5></td>
    <td><input type="checkbox" name="vare5" onclick="visBestilling(this)"></td>
    <td class="marked">X</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td><h5>Vare 6</h5></td>
    <td><input type="checkbox" name="vare6" onclick="visBestilling(this)"></td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td class="marked">X</td>
  </tr>
  <tr>
    <td><h5>Vare 7</h5></td>
    <td><input type="checkbox" name="vare7" onclick="visBestilling(this)"></td>
    <td>&nbsp;</td>
    <td class="marked">X</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td><h5>Vare 8</h5></td>
    <td><input type="checkbox" name="vare8" onclick="visBestilling(this)"></td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td class="marked">X</td>
  </tr>
  <tr>
    <td><h5>Vare 9</h5></td>
    <td><input type="checkbox" name="vare9" onclick="visBestilling(this)"></td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td><h5>Vare 10</h5></td>
    <td><input type="checkbox" name="vare10" onclick="visBestilling(this)"></td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td><h5>Vare 11</h5></td>
    <td><input type="checkbox" name="vare11" onclick="visBestilling(this)"></td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td><h5>Vare 12</h5></td>
    <td><input type="checkbox" name="vare12" onclick="visBestilling(this)"></td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td><h5>Vare 13</h5></td>
    <td><input type="checkbox" name="vare13" onclick="visBestilling(this)"></td>
    <td>&nbsp;</td>
    <td class="marked">X</td>
    <td class="marked">X</td>
  </tr>
  <tr>
    <td><h5>Vare 14</h5></td>
    <td><input type="checkbox" name="vare14" onclick="visBestilling(this)"></td>
    <td>&nbsp;</td>
    <td class="marked">X</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td><h5>Vare 15</h5></td>
    <td><input type="checkbox" name="vare15" onclick="visBestilling(this)"></td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td><h5>Vare 16</h5></td>
    <td><input type="checkbox" name="vare16" onclick="visBestilling(this)"></td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td><h5>Vare 17</h5></td>
    <td><input type="checkbox" name="vare17" onclick="visBestilling(this)"></td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td class="marked">X</td>
  </tr>
  <tr>
    <td><h5>Vare 18</h5></td>
    <td><input type="checkbox" name="vare18" onclick="visBestilling(this)"></td>
    <td>&nbsp;</td>
    <td class="marked">X</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td><h5>Vare 19</h5></td>
    <td><input type="checkbox" name="vare19" onclick="visBestilling(this)"></td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td class="marked">X</td>
  </tr>
  <tr>
    <td><h5>Vare 20</h5></td>
    <td><input type="checkbox" name="vare20" onclick="visBestilling(this)"></td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
</table>
</form>
<div style="float:left;text-align:center;">Bestilling:<br>
<span id="bestilling"></span>
</div>
</body>
</html>
Avatar billede pedepede Nybegynder
16. februar 2005 - 10:06 #11
Jamen dog! Det er jo en sand genistreg. Det kan jo nærmest bruges uden ændringer.
Vil du ikke have nogle point?

Tusind tak for hjælpen!
- Pede
Avatar billede roenving Novice
16. februar 2005 - 13:51 #12
Velbekomme '-)
Avatar billede roenving Novice
16. februar 2005 - 13:51 #13
-- men hov, det er alt for mange point at kaste efter dette !-)
Avatar billede pedepede Nybegynder
16. februar 2005 - 13:54 #14
Nej, slet ikke. Jeg har stirret mig gasblå i hovedet på det problem ...
Avatar billede roenving Novice
16. februar 2005 - 13:59 #15
Okay, tak for point ;~}
Avatar billede pedepede Nybegynder
16. februar 2005 - 13:59 #16
Selvtak!! :O)
Avatar billede pedepede Nybegynder
21. februar 2005 - 11:02 #17
Lige et spørgsmål... Hvad er det der sker i linjen:

num = +pakke[i][j].replace(/^.*?(\d+)$/,"$1");

??
Avatar billede roenving Novice
21. februar 2005 - 11:25 #18
Først tager den strengen fra pakke[i][j], derfra udtrækkes de tal, som afslutter strengen, og til sidst konverteres det til et tal med +-operatoren !-)
Avatar billede pedepede Nybegynder
21. februar 2005 - 13:50 #19
Jeg troede jeg havde styr på det, men det gør jeg ikke. :O(
Hvordan kan det være, at jeg ikke kan klikke en pakke fra igen?
Avatar billede roenving Novice
21. februar 2005 - 16:26 #20
Fordi du jo så har alle de varer checket af, som hører til pakken !-)
Avatar billede pedepede Nybegynder
21. februar 2005 - 20:47 #21
Nå, ja!! Selvfølgelig! Noget helt andet er, at hvis jeg laver en løkke i javascript, der skriver alle chekboxene, så får jeg en fejl i linien:
      pakkefuld = pakkefuld&&f.elements[pakke[i][j]].checked;
Objektet kan tilsyneladende ikke findes. Er det ikke fuldstændig ligemeget om det er almindelig html eller om det er dannet af javascript?
Avatar billede roenving Novice
22. februar 2005 - 01:10 #22
Hvordan ser dine arrays ud ?-)
Avatar billede pedepede Nybegynder
22. februar 2005 - 08:53 #23
Der er 78 varer inkl. pakkerne. Til højre for lighedstegnet står [varenavn,varenummer,pris]


var materials = new Array(78);
materials["pakke1"] = ["pakke1","9208100","1000"];
materials["pakke2"] = ["pakke2","9208200","1000"];
materials["pakke3"] = ["pakke3","9208300","1000"];
materials["vare1"] = ["Tomatsuppe","9206410","60"];
materials["vare2"] = ["Tændstikker","9206890","220"];
materials["vare3"] = ["Bleer","9206440","120"];
materials["vare4"] = ["Brænde","9206430","110"];
....

Scriptet der skriver varene og chekboxene:

for(ii=1; ii <= 3; ii++){
  document.write('<tr><td><input type="checkbox" name="pakke' + ii + '" onClick="visBestilling(this)"></td><td>');
  document.write(materials['pakke'+ii][0]);
  document.write('</td><td align="right">');
  document.write(materials['pakke'+ii][2] + "</td></tr>");
                    }
                   
for(ii=1; ii < materials.length; ii++){   
  document.write("<tr><td><input type=\"checkbox\" name=\"vare" + ii + "\" onClick=\"visBestilling(this)\"></td><td>" + materials['vare'+ii][0] + "</td><td align=\"right\">" + materials['vare'+ii][2] + "</td></tr>");
}
Avatar billede pedepede Nybegynder
22. februar 2005 - 14:45 #24
Jeg har også lavet en funktion på en knap der kan markere alle pakker og varer:

function markAll() {
    for (i=1; i <= 3; i++) {
        eval("liste.elements.pakke" + i + ".checked = true;")
    }
    for (i=1; i <= materials.length; i++) {
        eval("liste.elements.vare" + i + ".checked = true;")
    }
}

De virker fint, bortset fra, at visBestilling-funktionen ikke bliver kørt og siden derfor ikke bliver opdateret. Jeg kan ikke køre funktionen, fordi jeg mangler this-parameteren som bliver sendt med når der klikkes på en chekbox. Hvordan kan jeg mon komme omkring det?
Avatar billede roenving Novice
23. februar 2005 - 15:54 #25
To ting, i de ovenstående slår mig:

document.write er mest effektiv, hvis den kun udføres een gang, så det kan bedst betale sig at samle det, f.eks. i en tekststreng og så udskrive det til sidst:

var txt = "";
var materials = new Array(78);
materials["pakke1"] = ["pakke1","9208100","1000"];
...

for(ii=1; ii <= 3; ii++){
  txt += '<tr><td><input type="checkbox" name="pakke' + ii + '" onClick="visBestilling(this)"></td><td>';
  txt +=  materials['pakke'+ii][0];
  txt += '</td><td align="right">';
  txt += materials['pakke'+ii][2] + "</td></tr>";
}

for(ii=1; ii < materials.length; ii++){   
  txt += "<tr><td><input type=\"checkbox\" name=\"vare" + ii + "\" onClick=\"visBestilling(this)\"></td><td>" + materials['vare'+ii][0] + "</td><td align=\"right\">" + materials['vare'+ii][2] + "</td></tr>";
}

document.write(txt);

-- og din markAll-funktion skal bare afsluttes med et kald til funktionen:

function markAll() {
    var l = document.forms["liste"];
    for (x in materials) {
        l.elements[x].checked = true;
    }
    visBestilling(l.pakke1);
}

-- bemærk også at eval skal undgås, hvis det er muligt, da den har en elendig performance !-)

-- og listen over hvilke varer, de enkelte pakker indeholder er stadig som den var ?-)
Avatar billede pedepede Nybegynder
23. februar 2005 - 18:04 #26
Ja, jeg har ikke ændret noget på indholdet i pakkerne. Jeg har ændret lidt i scriptet så der nu står:

for(aa=1; aa <= 3; aa++){       
txt += '<tr><td><input type="checkbox" name="pakke' + aa + '" onClick="visBestilling(this)"></td><td>';
txt +=  materials["pakke"+aa][0];
txt += '</td><td align="right">';
txt += materials["pakke"+aa][2] + '</td></tr>';

for(bb=1; bb <= materials.length; bb++){   
txt += '<tr><td><input type="checkbox" name="vare' + bb + '" onClick="visBestilling(this)"></td><td>';
txt += materials["vare"+bb][0];
txt += '</td><td align="right">';
txt += materials["vare"+bb][2] + '</td></tr>';
}

Af en eller anden grund er det mere rigtigt, tror jeg. I hvert fald er det kun den del der udskriver varene der fejler nu. Pakkeudskrivningen fungerer.
Fejlen jeg får er: elments ... er null eller ikke et object. Er der en måde hvor man kan tjekke hvad "this" er?
Avatar billede pedepede Nybegynder
23. februar 2005 - 18:06 #27
Jeg skal osse lige sige at markAll-funktionen fungerer perfekt. Tak for det. Min egen løsning var vist lidt rådden... :O)
Avatar billede roenving Novice
24. februar 2005 - 00:58 #28
-- argh, den skal jo selvfølgelig fejle, for det er samme type fejl, for du har jo pakkerne med i materials-arrayet ...

for(bb=1; bb <= materials.length - 3; bb++){
Avatar billede pedepede Nybegynder
01. marts 2005 - 12:06 #29
Jeg bukker mig i støvet med et tusind tak for hjælpen. Kan jeg tilbyde nogle ekstra points?
Avatar billede roenving Novice
03. marts 2005 - 13:39 #30
Næh, for det er en af de ting, som er explicit forbudt i E*s regler !-)
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