ugrás a tartalomhoz

Zárójelek

Damarth · 2012. Jún. 2. (Szo), 22.05
Sziasztok JavaScriptben kellene egy olyat csinálnom hogy van egy adott matematikai képlet amiben vannak záró jelek pl.: ((1+1)*(1+1)), akkor megnézze a program hogy a zárójelek jól vannak-e.

Ügyebár ezt úgy lehetne hogy balról olvasva ha látok egy nyitójelet "(" akkor az hozzá adjon egy alap értékhez 1-et ha viszont látok egy zárójelet ")" akkor kivonjon 1-et.

Az alap érték nem mehet 0 alá mert akkor ilyen esetekben lennénk pl.: )(, ())( és egyebek ami egyértelmű hogy nem jó.

Abban kérném a segítségeteket hogy ezt hogyan lehet megvalósítani ciklussal, mert én akár hogy is próbálkozom nem megy..
 
1

értékeld ki, ha nem jók a

Karvaly84 · 2012. Jún. 2. (Szo), 22.13
értékeld ki, ha nem jók a zárójelek akkor úgy is hibát kapsz. try catch blokkban eval-al.
2

Nem JavaScript értelmezőt ír.

Joó Ádám · 2012. Jún. 2. (Szo), 22.57
Nem JavaScript értelmezőt ír. Az eval() használatát lehetőleg profikon kívül senkinek se javasoljuk; ők pedig javaslat nélkül is felismerik azon ritka esetet, amikor szükségük van rá.
4

Persze csak frappáns ötletnek

Karvaly84 · 2012. Jún. 2. (Szo), 23.07
Persze csak frappáns ötletnek tűnt :D De jobbat nem tudtam, mert nem igazán értettem mi a cél, hogy hány zárójel pár van? Vagy, hogy milyen mélyen van? Vagy mi?

Egyébként, ebben az esetben mi a gond az eval-al? Teszem azt string típusú képletet eredményét akarom számszerűsítve?
5

Az a baj vele, hogy az eval()

Joó Ádám · 2012. Jún. 2. (Szo), 23.18
Az a baj vele, hogy az eval() egy JavaScript értelmezőt hív, ő pedig a saját matematikai nyelvét szeretné feldolgozni. Amellett, hogy egy teljes JavaScript értelmezőt hívni ehhez pocsékolás, nem is az ő nyelve szabályai szerint fog működni. Mi van, ha ő csak a négy alapműveletet, zárójeleket és konstansokat enged használni, és minden mást hibának szeretne értelmezni?

A másik része pedig az, hogy a kérdező nyilvánvalóan nem biztoskezű programozó, és veszélyes eredménnyel járhat, ha beveszi az eszközkészletébe, és más körülmények közt is használja az eval()-t, ahol esetleg már biztonsági kockázatot is rejt.
3

var i; var open = 0; for (i

Joó Ádám · 2012. Jún. 2. (Szo), 23.05

var i;
var open = 0;

for (i = 0; i < expression.length; i++) {
    if (expression[i] === '(') {
        open += 1;
    }
    
    if (expression[i] === ')') {
        open -= 1;
    }
    
    if (open < 0) {
        break;
    }
}

if (open != 0) {
    alert("Unbalanced parentheses");
}
6

Ez már nagyon nagy segítség

Damarth · 2012. Jún. 3. (V), 08.08
Ez már nagyon nagy segítség de nekem úgy kéne hogy ez az egész(amiért elnézést kérek és nem írtam fent) hogy ez HTML-ben kellen és az egyenletet vagy prompt segítségével bekérni vagy alapként egy ilyet megadni pl egyenlet = "(1+1)";

én valahogy így képzeltem el
<script>

darab = 0;
egyenlet = "((1+1)*(1+1))"; // vagy a bekért egyenlet

/* itt kellene az beállítani hogy csak a zárójeleket számolja a többit figyelmen kívül hagyja*/

if ( db == 0) {
document.write("Az egyenlet helyes");
}
if ( db != 0) {
document.write("Az egyenlet helytelen");
}

</script>

és akkor ez így lehet hogy rossz témakörbe is ment amiért ismét elnézést.
7

Az "/* itt kellene..."

eddig bírtam szó nélkül · 2012. Jún. 3. (V), 08.17
Az "/* itt kellene..." helyére tedd a fenti kódot, csak az "expression"-t cseréld "egyenlet"-re!
Ha jól értem, mit szeretnél...
(hogy hogyan lehet JS-ből bekérni adatokat, arra én is kíváncsi lennék, bár a kíváncsiságom tárgya picit túlmutat egyetlen szövegmező bevitelén :-))
8

Szerintem erre a dologra

Karvaly84 · 2012. Jún. 3. (V), 08.22
Szerintem erre a dologra gondolt: window.prompt() :)
10

Ő...

eddig bírtam szó nélkül · 2012. Jún. 3. (V), 09.28
Igen, ő valószínűleg, de...
Múltkoriban valakitől elkértem egy "házifeladatot", amit a cégük által hirdetett JS fejlesztői állásra jelentkezőknek adtak ki.
Volt benne egy olyan, hogy egy több oszlopból álló HTML táblázatba új sort beszúrni.
No az új sor felvétele meghaladta a képességeimet. Én úgy képzelnék egy ilyet, hogy tisztességes formot dobok fel, nem egyetlen stringként kérem be az egyes mezőket. No ezt szerettem volna tisztán JS-ből megoldani és nem találtam használható megoldást rá.
11

Mi okozott problémát?

Poetro · 2012. Jún. 3. (V), 11.46
És mi okozott problémát ebben?
12

A popup form létrehozása.

eddig bírtam szó nélkül · 2012. Jún. 3. (V), 11.54
A popup form létrehozása. Tehát egy komplett HTML oldal generálása 0-ról, úgy, hogy mindez egy új ablakban nyíljon meg, OK-ra záródjon és még fel is dolgozzam a benne megadott értékeket.
Mondjuk időre próbáltam összerakni és amikor láttam, hogy nem fog menni, akkor félre is toltam.
Valószínűleg rossz irányban indultam a leírásokban.
13

A DOM függvényeknek nézz

Joó Ádám · 2012. Jún. 3. (V), 15.16
A DOM függvényeknek nézz utána.
14

Köszi! Csak fél oldallal

eddig bírtam szó nélkül · 2012. Jún. 3. (V), 16.16
Köszi! Csak fél oldallal kellett volna lejjebb lapoznom a múltkor. :-)
Ha itt: http://www.w3schools.com/jsref/met_win_open.asp tovább lapozok, akkor meglátom az example2-t és nem töröm tovább a fejem, hogy miképp lehetne elérni az újonnan nyitott ablakot.
15

Megoldás

Poetro · 2012. Jún. 3. (V), 17.46
Csináltam egy nem túl kidolgozott megoldást, de legalább működik :)
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title>Page Title</title>
</head>
<body>
  <table class="expandable" summary="Sample table">
    <caption>Sample</caption>
    <thead>
      <tr>
        <th scope="col">Column 1</th>
        <th scope="col">Column 2</th>
        <th scope="col">Column 3</th>
        <th scope="col">Column 4</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>Value 01</td>
        <td>Value 02</td>
        <td>Value 03</td>
        <td>Value 04</td>
      </tr>
    </tbody>
  </table>
  <script type="text/javascript">
    var lastTable;

    function processFields(values) {
      var body = lastTable.tBodies[0],
          row = document.createElement('tr'),
          cell,
          i = 0,
          l = values.length;

      for (; i < l; i += 1) {
        cell = document.createElement('td');
        cell.appendChild(document.createTextNode(values[i]));
        row.appendChild(cell);
      }
      body.appendChild(row);
    }

    (function () {
      var popup;
      function getHeaders(table) {
        var row = table.tHead.rows[0],
            cells = (row && row.cells) || [],
            i = 0,
            l = cells.length,
            headers = [];

        for (; i < l; i += 1) {
          headers.push(cells[i].textContent || cells[i].innerText);
        }
        return headers;
      }

      function createInputs(headers) {
        var i = 0,
            l = headers.length,
            output = '';

        for (; i < l; i += 1) {
          output += '<div class="form-item"><label>' + headers[i] +
            ': <input name=field-' + i + ' /></label></div>';
        }

        output += '<input type="submit" />';
        output += '<script type="text/javascript">' +
          'document.getElementsByTagName("form")[0].onsubmit=function () { ' +
          '  var fields = document.getElementsByTagName("input"), ' +
          '      i = fields.length, values = [];' +
          '  while (i--) { if (fields[i].name) values[i] = fields[i].value; }' +
          '  window.opener && window.opener.processFields(values);' +
          '  window.close();' +
          '  return false;' +
          '};' +
          '<\/script>';
        return output;
      }

      function addRow(table, headers) {
        return function () {
          var doc;
          if (popup && popup.close) {
            popup.close();
          }
          popup = window.open('about:blank', 'addRow', 'width=320,height=240,menubar=yes,location=no,resizable=no,scrollbars=no,status=no');

          lastTable = table;
          doc = popup.contentDocument || popup.document;
          doc.open('text/html', 'replace');
          doc.write('<!DOCTYPE html><form><div>' + createInputs(headers) + '</div></form>');
          doc.close();

          return false;
        };
      }

      function addExpander(table, headers) {
        var footer = table.tFoot,
            row = document.createElement('tr'),
            cell = document.createElement('td'),
            link = document.createElement('a');

        link.appendChild(document.createTextNode('Add new row'));
        link.setAttribute('href', '#');
        link.onclick = addRow(table, headers);
        cell.appendChild(link);
        cell.setAttribute('colspan', headers.length);
        row.appendChild(cell);
        if (!footer) {
          footer = document.createElement('tfoot');
          table.appendChild(footer);
        }
        footer.appendChild(row);

        return link;
      }

      function prepareTable(table) {
        var headers = getHeaders(table);
        addExpander(table, headers);
      }

      (function (className) {
        var tables = document.getElementsByTagName('table'),
            table,
            expandable = [],
            i = tables.length;
        while (i--) {
          table = tables[i];
          if (table.className.match(className)) {
            prepareTable(table);
          }
        }
      }(/\bexpandable\b/));
    }());
  </script>
</body>
</html>
16

Köszi, bár ezért lehet, hogy

eddig bírtam szó nélkül · 2012. Jún. 3. (V), 20.25
Köszi, bár ezért lehet, hogy valaki leszedi a fejem... (nem tudom, találtak-e már megfelelő embert)
9

Nagyon szépen Köszönöm

Damarth · 2012. Jún. 3. (V), 09.13
Nagyon szépen Köszönöm mindenkinek aki segített. sikerült össze hozni az egészet. így néz ki az eredmény

darab = 0;
egyenlet = prompt("Add meg az egyenletet!"); 
	
	for (i = 0; i < egyenlet.length; i++) {  
    if (egyenlet[i] === '(') {  
        darab += 1;  
    }  
      
    if (egyenlet[i] === ')') {  
        darab -= 1;  
    }  
      
    if (darab < 0) {  
        break;  
    }  
	}
	if ( darab == 0) {
	document.write("Az egyenlet helyes");
	}
	if ( darab != 0) {
	document.write("Az egyenlet helytelen");
	}
17

Megjegyzés

Karvaly84 · 2012. Jún. 3. (V), 21.11
Csak megjegyzésként:

Ezt a részt optimalizálnám:

    if (egyenlet[i] === '(') {    
        darab += 1;    
    }    
        
    if (egyenlet[i] === ')') {    
        darab -= 1;    
    } 
Itt az a probléma ha tegyük fel bonyolult erőforrásigényes számításokat végeznél, nagyon lassítaná a rendszert, mert mind a 2 feltételt vizsgálod.

A 2 feltételből csak az egyik lehet igaz vagy egyik sem, amiből az következik, hogy ha az első feltétel igaz akkor a másodikat nem kell vizsgálni mert az hamis (ebben az esetben), vagy ha az első hamis akkor még a második lehet igaz, de nem biztos. Ahhoz, hogy ne vizsgáld feleselgessen a dolgot, így kell írni:

    if (egyenlet[i] === '(') { // Ha a kifejezés igaz, lefut a blokk, de az utána lévő nem.
        darab += 1;    
    } else if (egyenlet[i] === ')') { // Ez a blokk csak akkor fut le ha az előző hamis volt.    
        darab -= 1;    
    }