Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Pascal: Delphi: Käyttäjän lausekkeen laskeminen

Pilari [20.05.2008 19:17:26]

#

Kuinka onnistuisi yksinkertaisen laskun suorittajan tekeminen?
Yritin tehdä silmukan, joka katsoisi seuraavan merkin ja tekisi sen perusteella laskutoimituksen, mutta se ei oikein toiminut.
Esimerkiksi: Ohjelmalle annettaisiin lasku 5+5*2, ja ohjelma palauttaisi luvun 20.

Blaze [20.05.2008 19:58:32]

#

http://en.wikipedia.org/wiki/Shunting_yard_algorithm

tgunner [20.05.2008 21:48:24]

#

Ai ohjelman pitäis laskee väärin? 8D

User137 [21.05.2008 03:14:26]

#

Jos etsit jotain valmista "tulkkia" vai mikskä tuota nyt sanois niin DelphiWebScript 2 on ainakin vaihtoehto:
http://sourceforge.net/projects/dws/
Tein sillä joku vuos sitten graafisen laskimen joka siis erittäin nopeasti laskee jopa pascal kielen muodossa annetun koodin annetuilla parametreilla ja sijoittaa vastauksen muuttujaan/muuttujiin kunkin tarpeen mukaan. Päivä tai pari voi vierähtää tuota opetellessa.

Mutta joo ehkä tuo on sama kun ampus kärpästä tykillä tässä tapauksessa?

Metabolix [21.05.2008 10:53:47]

#

Tuon pyytämäsi väärin laskevan version saa aikaan vaikkapa näin:

program Viallinen_Laskin;

function Laske(s: String): Integer;
var
  tulos, luku: Integer;
  toimitus: Char;
  i: Integer;
begin
  (* Lasku alkaa nyt leikisti '0+', tuloshan on sama *)
  tulos := 0;
  toimitus := '+';

  (* Käsitellään koko teksti *)
  i := 1;
  while i <= Length(s) do begin
    (* Luetaan kokonaisluku *)
    luku := 0;
    while
      (i <= Length(s)) and
      (Ord('0') <= Ord(s[i])) and
      (Ord(s[i]) <= Ord('9')) do
    begin
      luku := 10 * luku + Ord(s[i]) - Ord('0');
      Inc(i)
    end;
    (* Lasketaan aiemmin selvinnyt toimitus *)
    case toimitus of
      '+': tulos := tulos + luku;
      '-': tulos := tulos - luku;
      '*': tulos := tulos * luku;
      '/': tulos := tulos div luku;
      '%': tulos := tulos mod luku
    end;
    (* Jos tekstiä on vielä, luetaan uusi toimitus *)
    if i <= Length(s) then begin
      toimitus := s[i];
      Inc(i)
    end
  end;
  (* Palautetaan tulos *)
  Laske := tulos
end;

var
  lauseke: String;

begin
  lauseke := '15+24+33+42+51';
  Writeln(lauseke, ' = ', Laske(lauseke))
end.

Pilari [21.05.2008 16:25:23]

#

Ups. Tuon lausekkeen arvohan olisi 15, en kiiressä ehtinyt katsoa. Ja kiitos vastauksista. Tarkoitushan oli että se laskisi oikein. :S

Mazzimo [21.05.2008 21:58:36]

#

Jos intoa riittää väkerrellä ja haluat oppia kunnolla niin suosittelen tutustumaan Reverese Polish notation:iin. ;)
http://en.wikipedia.org/wiki/Reverse_Polish_notation
http://en.wikipedia.org/wiki/Shunting_yard_algorithm

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta