Exemple #1
0
 public function __construct($syotehtml, $yksirivinen)
 {
     parent::__construct($yksirivinen);
     $this->syotehtml = $syotehtml;
     $this->osoittaja = "";
     $this->nimittaja = "";
     if (!$yksirivinen) {
         // Tänne kootaan Yksiriviset, Supistajat, Laventajat, Neliojuuret
         // ja Murtolukumuodot -oliot:
         $kaavaelementtitaulukko = Kaavaeditori::etsi_kaavaelementit($this->syotehtml);
         // Haetaan vain murtolukumuodot, yksiriviset ja yksiriviset
         // neliöjuuret. Ellei kuitenkaan yhtään murtolukua löydy,
         // välitetään tieto siitä, että olio onkin yksirivinen. Muuten
         // erotellaan elementit:
         if (!Kaava::syote_on_monirivinen($kaavaelementtitaulukko)) {
             $this->set_on_yksirivinen(true);
         } else {
             foreach ($kaavaelementtitaulukko as $elementti) {
                 if ($elementti instanceof Murtolukumuoto) {
                     $this->osoittaja = $elementti->get_osoittaja_soluton();
                     $this->nimittaja = $elementti->get_nimittaja();
                     $this->ylarivi .= Html::luo_tablesolu($this->osoittaja, array(Attr::rowspan(1), Attr::classs(Kaava::$class_neliojuuri_kaavarivi)));
                 } else {
                     if ($elementti instanceof Yksirivinen) {
                         $this->ylarivi .= Html::luo_tablesolu($elementti->get_syotehtml(), array(Attr::rowspan(2), Attr::classs(Kaava::$class_neliojuuri_kaavarivi)));
                     } else {
                         if ($elementti instanceof Neliojuuri) {
                             // Pakotetaan yksirivinen, ettei ihan sekoa.
                             $elementti->set_on_yksirivinen(true);
                             $this->ylarivi .= Html::luo_tablesolu(Html::luo_span(Merkit::$neliojuuri, array(Attr::classs(Kaava::$class_neliojuurimerkki_pieni))) . Html::luo_span($elementti->get_syotehtml(), array(Attr::classs(Kaava::$class_neliojuuri_kaavarivi))), array(Attr::rowspan(2), Attr::classs(Kaava::$class_neliojuuri_kaavarivi)));
                         }
                     }
                 }
             }
         }
     }
 }
$muotoiltu_kaava = Kaavaeditori::muotoile_kaavat($toisen_asteen_kaava);
$tuplajuuri = "{@x=(rad2_alku)[@A<sub>nelioö</sub>+(rad1_alku)4(rad1_loppu)##(rad1_alku)P<sup>4</sup>(rad1_loppu)@]+(rad1_alku)45(rad1_loppu)(rad2_loppu)@}";
$muotoiltu_tuplajuuri = Kaavaeditori::muotoile_kaavat($tuplajuuri);
$isojuuriosoittaja = "{@A=[@A+(rad2_alku)[@3##4@](rad2_loppu)##4+(rad1_alku)c(rad1_loppu)@]@}";
$muotoiltu_isojuurios = Kaavaeditori::muotoile_kaavat($isojuuriosoittaja);
$ypari = "<table><tr><td class='aaltosulku1'>{</td><td>{@ y+4x=1 @}{@ x=1 @}</td></tr></table>";
$muotoiltu_ypari = Kaavaeditori::muotoile_kaavat($ypari);
$murtoluku = "{@2x<sup>3</sup>=[@45-r##x<sup>2</sup>@]-(rad1_alku)45(rad1_loppu)=[@3##x@]@}";
$muotoiltu_murtoluku = Kaavaeditori::muotoile_kaavat($murtoluku);
//==============================================================================
$murtoluku1 = new Murtolukumuoto("3+4x<sup>5</sup>", "x-6");
$yksirivinen1 = new Yksirivinen("=");
$yksirivinen2 = new Yksirivinen("3x<sup>5</sup>+2");
$rivi = new Kaava(array($murtoluku1, $yksirivinen1, $yksirivinen2));
$rivi2 = new Kaava(array(new Yksirivinen("("), new Murtolukumuoto("1", "2"), new Yksirivinen(")<sup>3</sup>"), new Yksirivinen("+"), new Laventaja("4"), new Murtolukumuoto("2", "3"), new Yksirivinen("="), new Murtolukumuoto("5", "6"), new Supistaja("5")));
$rivi3 = new Kaava(array(new Murtolukumuoto("1", $rivi->nayta_rivi()), new Yksirivinen("="), new Yksirivinen("3x+4")));
$laskuri = new Laskuri();
/***************************************************************************/
$sisalto = "********************* Kaavaeditoritesti *********************<br/>";
$sisalto .= "Kaavaeditorille viety merkkijono (2. asteen yht&auml;l&ouml;n ratkaisukaava):<br/><br/>";
$sisalto .= $toisen_asteen_kaava;
$sisalto .= "<br/><br/>Kaavaeditorin lopullinen muokattu html:<br/><br/>";
$sisalto .= $muotoiltu_kaava;
$sisalto .= "<br/><br/>Kaavaeditorille viety merkkijono (sis&auml;kk&auml;iset juuret):<br/><br/>";
$sisalto .= $tuplajuuri;
$sisalto .= "<br/><br/>Kaavaeditorin lopullinen muokattu html:<br/><br/>";
$sisalto .= $muotoiltu_tuplajuuri;
$sisalto .= "<br/><br/>Kaavaeditorille viety merkkijono (osoittajassa iso juuri):<br/><br/>";
$sisalto .= $isojuuriosoittaja;
$sisalto .= "<br/><br/>Kaavaeditorin lopullinen muokattu html:<br/><br/>";
$sisalto .= $muotoiltu_isojuurios;
Exemple #3
0
 /**
  * Testaa murtolukuluokan Sievennä-metodia, jolla on seuraavia ominaisuuksia:
  *
  * Palauttaa murtoluvun sievennettynä sekaluku-, murtoluku- tai
  * kokonaislukumuodossa. Vastaus supistetaan yksinkertaisimpaan muotoonsa.
  *
  * Jos murtoluvun osoittaja on nimittäjää pienempi, palautetaan
  * murtoluku.
  *
  * Jos murtoluvun voi muuttaa kokonaisluvuksi, palautetaan sellainen.
  *
  * Palauttaa Sekaluku-, Murtoluku- tai Kokonaisluku-luokan
  * olion, joka on yhtä suuri kuin alkuperäinen murtoluku (this).
  *
  * Yllämainittuja ominaisuuksia testataan tässä metodissa.
  * @author Jukka-Pekka Kerkkänen, 28.9.09
  *
  */
 public function testaa_laskuri_murtoluku_sievenna()
 {
     $sieva_koodi1 = "";
     // Apumuuttuja.
     $sieva_koodi2 = "";
     // Apumuuttuja.
     $ok = false;
     // Sievennöksen laskennallisen tarkistuksen tulos.
     $vast = "<h2>Testataan Murtoluku-luokan sievenna-metodia.</h2>";
     $testiluvut = array(new Murtoluku("-", 3, 6), new Murtoluku("+", 2, 6), new Murtoluku("+", 'piip', -6), new Murtoluku("+", 1, 5), new Murtoluku("-", 4, 5), new Murtoluku("+", 9, 3), new Murtoluku("-", 38, 8), new Murtoluku("+", 2346, 17), new Murtoluku("-", 38, 5), new Murtoluku("+", 24, 9), new Murtoluku("+", 13, 3), new Murtoluku("-", 36, 24), new Murtoluku("+", 198628, 3456));
     for ($i = 0; $i < sizeof($testiluvut); $i++) {
         $nro = $i + 1;
         // Sievennöksen nro
         $sievennetty = $testiluvut[$i]->sievenna();
         if (get_class($sievennetty) == 'Kokonaisluku') {
             $sieva_koodi1 = new Yksirivinen($sievennetty->get_arvo());
             $sieva_koodi2 = "";
             if ($testiluvut[$i]->get_osoittaja() / $testiluvut[$i]->get_nimittaja() == $sievennetty->get_arvo() && $testiluvut[$i]->get_etumerkki() == $sievennetty->get_etumerkki()) {
                 $ok = true;
                 $vast .= "Sievennys nro {$nro} l&auml;p&auml;isi\n                            laskennallisen tarkastuksen";
             } else {
                 $vast .= "<span style='color: red;'>Sievennyksess&auml; nro {$nro}\n                        on ilmeisesti jokin virhe!!</span>";
             }
         } else {
             if (get_class($sievennetty) == 'Murtoluku') {
                 $sieva_koodi1 = new Murtolukumuoto($sievennetty->get_osoittaja(), $sievennetty->get_nimittaja());
                 $sieva_koodi2 = "";
                 if ($testiluvut[$i]->get_osoittaja() / $testiluvut[$i]->get_nimittaja() == $sievennetty->get_osoittaja() / $sievennetty->get_nimittaja() && $testiluvut[$i]->get_etumerkki() == $sievennetty->get_etumerkki()) {
                     $ok = true;
                     $vast .= "Sievennys nro {$nro} l&auml;p&auml;isi\n                        laskennallisen tarkastuksen";
                 } else {
                     $vast .= "<span style='color: red;'>Sievennyksess&auml;\n                            nro {$nro} on ilmeisesti jokin virhe!!</span>";
                 }
             } else {
                 if (get_class($sievennetty) == 'Sekaluku') {
                     $sieva_koodi1 = new Yksirivinen($sievennetty->get_kokonaisosa());
                     $sieva_koodi2 = new Murtolukumuoto($sievennetty->get_osoittaja(), $sievennetty->get_nimittaja());
                     // Muutetaan sievennös murtolukuna, jolloin tarkistus helpompi:
                     $sievennos_murtolukuna = new Murtoluku("+", $sievennetty->get_kokonaisosa() * $sievennetty->get_nimittaja() + $sievennetty->get_osoittaja(), $sievennetty->get_nimittaja());
                     $sievennos_murtolukuna = $sievennos_murtolukuna->supista_yksinkert_muot();
                     // Supistetaan alkuperäinen murtoluku:
                     $alkup_murtoluku = $testiluvut[$i]->supista_yksinkert_muot();
                     if ($alkup_murtoluku->get_osoittaja() == $sievennos_murtolukuna->get_osoittaja() && $alkup_murtoluku->get_nimittaja() == $sievennos_murtolukuna->get_nimittaja() && $testiluvut[$i]->get_etumerkki() == $sievennetty->get_etumerkki()) {
                         $ok = true;
                         $vast .= "Sievennys nro {$nro} l&auml;p&auml;isi\n                        laskennallisen tarkastuksen";
                     } else {
                         $vast .= "<span style='color: red;'>Sievennyksess&auml;\n                            nro {$nro} on ilmeisesti jokin virhe!!</span>";
                     }
                 }
             }
         }
         $rivi = new Kaava(array(new Yksirivinen("{$nro}: Luotu murtoluku:"), new Yksirivinen($testiluvut[$i]->get_etumerkki()), new Murtolukumuoto($testiluvut[$i]->get_osoittaja(), $testiluvut[$i]->get_nimittaja()), new Yksirivinen("Sievennetty muoto:"), new Yksirivinen($sievennetty->get_etumerkki()), $sieva_koodi1, $sieva_koodi2));
         $vast .= $rivi->nayta_rivi();
     }
     $vast .= "<p><b>Sievenn&auml;-metodin testaus p&auml;&auml;ttyi</b></p>";
     return $vast;
 }
Exemple #4
0
 /**
  * Palauttaa murtoluvun sievennettynä sekaluku-, murtoluku- tai
  * kokonaislukumuodossa. Vastaus supistetaan yksinkertaisimpaan muotoonsa.
  *
  * Jos murtoluvun osoittaja on nimittäjää pienempi, palautetaan
  * murtoluku tai sitten kokonaisluku, jos jako menee tasan.
  *
  * Jos murtoluvun voi muuttaa kokonaisluvuksi, palautetaan sellainen.
  *
  * @param Murtoluku $mluku sievennettänä murtoluku
  * @param bool $nayta_lasku totuusarvo: jos true, niin palautetaan
  * laskun html-esitys, muuten pelkkä vastausmurtoluku.
  * @param bool $etuplussa_nakyviin totuusarvo: true->etuplussa kirjoitetaan
  * näkyviin silloin, kun $nayta_lasku = true.
  * @return Sekaluku Palauttaa Sekaluku-, Murtoluku- tai Kokonaisluku-luokan
  * olion, joka on yhtä suuri kuin alkuperäinen murtoluku (this).
  * @author Jukka-Pekka Kerkkänen, 28.9.09
  */
 public function sievenna_murtoluku($mluku, $nayta_lasku, $etuplussa_nakyviin)
 {
     $vast = 0;
     if ($mluku instanceof Murtoluku) {
         // Jos sekaluvussa ei ole ideaa:
         if ($this->osoittaja < $this->nimittaja) {
             $vast = $this->supista_yksinkert_muot($mluku, false);
         } else {
             // Jos murtoluvusta saa kokonaisluvun:
             $jakojaannos = $this->osoittaja % $this->nimittaja;
             if ($jakojaannos == 0) {
                 $vast = new Kokonaisluku($this->get_etumerkki(), $this->osoittaja / $this->nimittaja);
             } else {
                 $kokonaiset = floor($this->osoittaja / $this->nimittaja);
                 //$murto_osa = new Murtoluku()
                 $vast = new Sekaluku($this->get_etumerkki(), $kokonaiset, $jakojaannos, $this->get_nimittaja());
                 //Nimittäjä
                 // Supistetaan murto-osa:
                 $vast->set_murto_osa($vast->get_murto_osa()->supista_yksinkert_muot());
             }
         }
         if ($nayta_lasku) {
             // Määritellään ensimmäinen etumerkki, joka joskus plussana
             // jätetään pois:
             if ($mluku->on_negatiivinen()) {
                 $ekaetumerkki = $mluku->get_miinusmerkki();
             } else {
                 if ($etuplussa_nakyviin) {
                     $ekaetumerkki = "+";
                 } else {
                     $ekaetumerkki = "";
                 }
             }
             //Supistetaan:
             $supistaja = $this->etsi_syt($os, $nim);
             $uusi_os = $os / $supistaja;
             $uusi_nim = $nim / $supistaja;
             /**************************************************************/
             // Tapaus 1: Ei voi supistaa:
             if ($supistaja == 1) {
                 // Ei voi muuttaa seka- eikä
                 // kokonaisluvuksi eli palautetaan murtoluku:
                 if ($os < $nim) {
                     $vastausolio = new Kaava(array(new Murtolukumuoto($os, $nim), new Yksirivinen(" Murtolukua ei\n                                                        voi supistaa.")));
                     $vastaus = $vastausolio->nayta_rivi();
                 } else {
                     if ($os % $nim == 0) {
                         $tulos = $os / $nim;
                         $vastausolio = new Kaava(array(new Murtolukumuoto($os, $nim), new Yksirivinen("=" . $tulos)));
                         $vastaus = $vastausolio->nayta_rivi();
                     } else {
                         $vastausolio = new Kaava(array(new Murtolukumuoto($os, $nim), new Supistaja($supistaja), new Yksirivinen("="), new Murtolukumuoto($uusi_os, $uusi_nim)));
                         $vastaus = $vastausolio->nayta_rivi();
                     }
                 }
             } else {
             }
             $vastausolio = new Kaava(array(new Yksirivinen($ekaetumerkki), new Murtolukumuoto($mluku->get_osoittaja(), $mluku->get_nimittaja()), new Yksirivinen("&middot;"), $this->piirra_tarv_vasen_sulku($murto2), new Yksirivinen($etumerkki2), new Murtolukumuoto($murto2->get_osoittaja(), $murto2->get_nimittaja()), $this->piirra_tarv_oikea_sulku($murto2), new Yksirivinen("="), new Yksirivinen($tulos->get_etumerkki()), new Murtolukumuoto($murto1->get_osoittaja() . " &middot; " . $murto2->get_osoittaja(), $murto1->get_nimittaja() . " &middot; " . $murto2->get_nimittaja()), new Yksirivinen("="), new Yksirivinen($etumerkki_tulos), new Murtolukumuoto($tulos->get_osoittaja(), $tulos->get_nimittaja())));
             $vast = $vastausolio->nayta_rivi();
         }
     }
     return $vast;
 }
Exemple #5
0
 /**
  * Hakee annetusta tekstistä kaavat eli merkkijonot, jotka ovat
  * merkkijonojen $kaavan_alku ja $kaavan_loppu välissä, ja muotoilee kaavat
  * html:n avulla.
  *
  * Hyödyntää metodia php_yleinen/php_yleismetodit.php:
  * 'hae_merkkijonot($teksti, $alkumj, $loppumj, $hae_kaikki)'
  *
  * Jos tekstistä löytyy $kaavan_alku mutta ei $kaavan_loppu, ei kyseistä
  * merkkijonoa muokata.
  *
  * Ellei mitään kaavaa löydy, tai tapahtuu muuta kummaa, palautetaan sama teksti.
  * Muuten palautetaan saatu teksti, jossa kaavamerkinnät on korvattu html-
  * muotoiluilla.
  *
  * @param <type> $teksti
  * @param <type> $kaavan_alku
  * @param <type> $kaavan_loppu
  * @param <type> $jako_alku
  * @param <type> $jako_loppu
  * @return string muotoiltu html-koodi
  */
 static function muotoile_kaavat($teksti)
 {
     $palautus = $teksti;
     // Haetaan tekstistä kaavat taulukkoon:
     $alkumj = Kaavaeditori::$kaavan_alku;
     $loppumj = Kaavaeditori::$kaavan_loppu;
     $hae_kaikki = true;
     $raakakaavat = Yleismetodit::hae_merkkijonot($teksti, $alkumj, $loppumj, $hae_kaikki);
     /* Tarkempaan työhön aletaan vain, jos kaavoja löytyy */
     if (!empty($raakakaavat)) {
         $valmiit_kaavat = array();
         // Käydään läpi jokainen raakakaava: HUOM katso metodi
         // muotoile_merkit() tiedostossa yhteiset/php_yhteismetodit.php!
         foreach ($raakakaavat as $kaava) {
             // Muotoillaan merkkejä hiukan. Miinusmerkit on kiva olla
             // pitkiä (ja hiukan tekstistä erillään). Yhdysviivat kaavoissa
             // merkitsevät käytännössä aina miinusmerkkiä, joten muutetaan ne
             // oikeiksi. Tehdään se täällä, koska
             // tekstissä väliviivaa tarvitaan kuitenkin.
             // NÄIN EI TOIMI MIKSI?? $kaava = str_replace("-",Merkit::$miinusmerkki,$kaava);
             $kaava = str_replace("-", "−", $kaava);
             // Näin taas toimii!
             $kaava = str_replace("+", "<span class='erillaan'>+</span>", $kaava);
             // Kompleksiluvun liittolukuongelma:
             //$kaava = str_replace("*","<span class='erillaan'>⋅</span>", $kaava);
             // Tämäkin aiheuttaa sen ongelman, ettei kaavaan voi lisätä
             // esimerkiksi css-määrettä font-style väliviivan takia..
             $kaava = str_replace("−", "<span class='erillaan'>−</span>", $kaava);
             // Tämä täällä, koska muualla pitää olla mahis laittaa
             // esim. merkki => (ohjelmointi tms.)
             // Huom! =-merkkiin ei voi lisätä yleensä html-koodia, koska merkkiä käytetään
             // html:n sisällä (attribuutit)"
             $kaava = str_replace("=", " = ", $kaava);
             // Sama kuin yllä:
             $kaava = str_replace(":", " : ", $kaava);
             //================ Kokeillaan toimiiko==========================
             $kaava = str_replace("⋅", "<span class='erillaan'>⋅</span>", $kaava);
             $kaava = str_replace("≈", "<span class='erillaan'>≈</span>", $kaava);
             $kaava = str_replace("≠", "<span class='erillaan'>≠</span>", $kaava);
             $kaava = str_replace("║", "<span class='erillaan'>║</span>", $kaava);
             //================ Kokeillaan toimiiko loppu ===================
             // Tehdään kursivoinnin poisto ennen varsinaista kaavamuotoilua.
             $kaava = str_replace("(ioff_b)", "<span class='ital_off'>", $kaava);
             $kaava = str_replace("(ioff_e)", "</span>", $kaava);
             // Tänne kootaan Yksiriviset, Supistajat, Laventajat, Neliöjuuret
             // ja Murtolukumuodot yms -oliot:
             $kaavaelementtitaulukko = Kaavaeditori::etsi_kaavaelementit($kaava);
             $muotoiltu_kaava = new Kaava($kaavaelementtitaulukko);
             $kaavahtml = "<div class='kaavaboxi'>" . $muotoiltu_kaava->nayta_rivi() . "</div>";
             array_push($valmiit_kaavat, $kaavahtml);
         }
         // Lisätään jokaiseen raakakaavaan alku- ja
         // loppumerkit, jotta myös kyseiset merkit poistuvat:
         $kaavojen_lkm = sizeof($raakakaavat);
         for ($i = 0; $i < $kaavojen_lkm; $i++) {
             $raakakaavat[$i] = Kaavaeditori::$kaavan_alku . $raakakaavat[$i] . Kaavaeditori::$kaavan_loppu;
             // Käydään vielä läpi valmiit kaavat ja suoristetaan vielä sulut.
             // Huomaa, ettei tätä voi tehdä aiemmin, koska sulut ovat osa
             // monia erikoismerkintöjä.
             $valmiit_kaavat[$i] = str_replace("(", "<span class='ital_off'>(</span>", $valmiit_kaavat[$i]);
             $valmiit_kaavat[$i] = str_replace(")", "<span class='ital_off'>)</span>", $valmiit_kaavat[$i]);
         }
         // Korvataan tekstin raakakaavat valmiilla kaavoilla:
         $palautus = str_replace($raakakaavat, $valmiit_kaavat, $teksti);
     }
     return $palautus;
 }