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älö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äkkä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;
/** * 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äpäisi\n laskennallisen tarkastuksen"; } else { $vast .= "<span style='color: red;'>Sievennyksessä 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äpäisi\n laskennallisen tarkastuksen"; } else { $vast .= "<span style='color: red;'>Sievennyksessä\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äpäisi\n laskennallisen tarkastuksen"; } else { $vast .= "<span style='color: red;'>Sievennyksessä\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ä-metodin testaus päättyi</b></p>"; return $vast; }
/** * 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("·"), $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() . " · " . $murto2->get_osoittaja(), $murto1->get_nimittaja() . " · " . $murto2->get_nimittaja()), new Yksirivinen("="), new Yksirivinen($etumerkki_tulos), new Murtolukumuoto($tulos->get_osoittaja(), $tulos->get_nimittaja()))); $vast = $vastausolio->nayta_rivi(); } } return $vast; }
/** * 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; }