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
  1. var i;  
  2. var open = 0;  
  3.   
  4. for (i = 0; i < expression.length; i++) {  
  5.     if (expression[i] === '(') {  
  6.         open += 1;  
  7.     }  
  8.       
  9.     if (expression[i] === ')') {  
  10.         open -= 1;  
  11.     }  
  12.       
  13.     if (open < 0) {  
  14.         break;  
  15.     }  
  16. }  
  17.   
  18. if (open != 0) {  
  19.     alert("Unbalanced parentheses");  
  20. }  
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 :)
  1. <!DOCTYPE html>  
  2. <html>  
  3. <head>  
  4.   <meta charset="utf-8" />  
  5.   <title>Page Title</title>  
  6. </head>  
  7. <body>  
  8.   <table class="expandable" summary="Sample table">  
  9.     <caption>Sample</caption>  
  10.     <thead>  
  11.       <tr>  
  12.         <th scope="col">Column 1</th>  
  13.         <th scope="col">Column 2</th>  
  14.         <th scope="col">Column 3</th>  
  15.         <th scope="col">Column 4</th>  
  16.       </tr>  
  17.     </thead>  
  18.     <tbody>  
  19.       <tr>  
  20.         <td>Value 01</td>  
  21.         <td>Value 02</td>  
  22.         <td>Value 03</td>  
  23.         <td>Value 04</td>  
  24.       </tr>  
  25.     </tbody>  
  26.   </table>  
  27.   <script type="text/javascript">  
  28.     var lastTable;  
  29.   
  30.     function processFields(values) {  
  31.       var body = lastTable.tBodies[0],  
  32.           row = document.createElement('tr'),  
  33.           cell,  
  34.           i = 0,  
  35.           l = values.length;  
  36.   
  37.       for (; i < l; i += 1) {  
  38.         cell = document.createElement('td');  
  39.         cell.appendChild(document.createTextNode(values[i]));  
  40.         row.appendChild(cell);  
  41.       }  
  42.       body.appendChild(row);  
  43.     }  
  44.   
  45.     (function () {  
  46.       var popup;  
  47.       function getHeaders(table) {  
  48.         var row = table.tHead.rows[0],  
  49.             cells = (row && row.cells) || [],  
  50.             i = 0,  
  51.             l = cells.length,  
  52.             headers = [];  
  53.   
  54.         for (; i < l; i += 1) {  
  55.           headers.push(cells[i].textContent || cells[i].innerText);  
  56.         }  
  57.         return headers;  
  58.       }  
  59.   
  60.       function createInputs(headers) {  
  61.         var i = 0,  
  62.             l = headers.length,  
  63.             output = '';  
  64.   
  65.         for (; i < l; i += 1) {  
  66.           output += '<div class="form-item"><label>' + headers[i] +  
  67.             ': <input name=field-' + i + ' /></label></div>';  
  68.         }  
  69.   
  70.         output += '<input type="submit" />';  
  71.         output += '<script type="text/javascript">' +  
  72.           'document.getElementsByTagName("form")[0].onsubmit=function () { ' +  
  73.           '  var fields = document.getElementsByTagName("input"), ' +  
  74.           '      i = fields.length, values = [];' +  
  75.           '  while (i--) { if (fields[i].name) values[i] = fields[i].value; }' +  
  76.           '  window.opener && window.opener.processFields(values);' +  
  77.           '  window.close();' +  
  78.           '  return false;' +  
  79.           '};' +  
  80.           '<\/script>';  
  81.         return output;  
  82.       }  
  83.   
  84.       function addRow(table, headers) {  
  85.         return function () {  
  86.           var doc;  
  87.           if (popup && popup.close) {  
  88.             popup.close();  
  89.           }  
  90.           popup = window.open('about:blank', 'addRow', 'width=320,height=240,menubar=yes,location=no,resizable=no,scrollbars=no,status=no');  
  91.   
  92.           lastTable = table;  
  93.           doc = popup.contentDocument || popup.document;  
  94.           doc.open('text/html', 'replace');  
  95.           doc.write('<!DOCTYPE html><form><div>' + createInputs(headers) + '</div></form>');  
  96.           doc.close();  
  97.   
  98.           return false;  
  99.         };  
  100.       }  
  101.   
  102.       function addExpander(table, headers) {  
  103.         var footer = table.tFoot,  
  104.             row = document.createElement('tr'),  
  105.             cell = document.createElement('td'),  
  106.             link = document.createElement('a');  
  107.   
  108.         link.appendChild(document.createTextNode('Add new row'));  
  109.         link.setAttribute('href', '#');  
  110.         link.onclick = addRow(table, headers);  
  111.         cell.appendChild(link);  
  112.         cell.setAttribute('colspan', headers.length);  
  113.         row.appendChild(cell);  
  114.         if (!footer) {  
  115.           footer = document.createElement('tfoot');  
  116.           table.appendChild(footer);  
  117.         }  
  118.         footer.appendChild(row);  
  119.   
  120.         return link;  
  121.       }  
  122.   
  123.       function prepareTable(table) {  
  124.         var headers = getHeaders(table);  
  125.         addExpander(table, headers);  
  126.       }  
  127.   
  128.       (function (className) {  
  129.         var tables = document.getElementsByTagName('table'),  
  130.             table,  
  131.             expandable = [],  
  132.             i = tables.length;  
  133.         while (i--) {  
  134.           table = tables[i];  
  135.           if (table.className.match(className)) {  
  136.             prepareTable(table);  
  137.           }  
  138.         }  
  139.       }(/\bexpandable\b/));  
  140.     }());  
  141.   </script>  
  142. </body>  
  143. </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
  1. darab = 0;  
  2. egyenlet = prompt("Add meg az egyenletet!");   
  3.       
  4.     for (i = 0; i < egyenlet.length; i++) {    
  5.     if (egyenlet[i] === '(') {    
  6.         darab += 1;    
  7.     }    
  8.         
  9.     if (egyenlet[i] === ')') {    
  10.         darab -= 1;    
  11.     }    
  12.         
  13.     if (darab < 0) {    
  14.         break;    
  15.     }    
  16.     }  
  17.     if ( darab == 0) {  
  18.     document.write("Az egyenlet helyes");  
  19.     }  
  20.     if ( darab != 0) {  
  21.     document.write("Az egyenlet helytelen");  
  22.     }  
17

Megjegyzés

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

Ezt a részt optimalizálnám:
  1. if (egyenlet[i] === '(') {      
  2.     darab += 1;      
  3. }      
  4.       
  5. if (egyenlet[i] === ')') {      
  6.     darab -= 1;      
  7. }   
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:
  1. if (egyenlet[i] === '(') { // Ha a kifejezés igaz, lefut a blokk, de az utána lévő nem.  
  2.     darab += 1;      
  3. else if (egyenlet[i] === ')') { // Ez a blokk csak akkor fut le ha az előző hamis volt.      
  4.     darab -= 1;      
  5. }