Gå til innhold

Heltall til romerske tall?


Anbefalte innlegg

Videoannonse
Annonse

http://magikern.sytes.net/code/php/misc/roman.phps

 

Fant det på nettet et sted for ganske lenge siden, men har ikke fått det til å fungere, tror ikke egentlig det er så veldig store feilen har bare ikke sett noe særlig igjennom.

 

demo(ser riktignok bare en feilmelding siden det ikke er helt riktig, skal se om jeg kanskje finner ut av det en dag): http://magikern.sytes.net/code/php/misc/roman.php

Lenke til kommentar

Grunnen til at du får feil er fordi han har implementert en funksjon som han kaller array_search() denne finnes i PHP:

http://www.php.net/manual/en/function.array-search.php

Man kan ikke kalle en funksjon det samme som en som allerede fins.

Derfor error: "Can't redeclare function...."

 

Løsningen blir derfor å kalle funksjonen array_search() noe annet eks:

my_array_search().

Lenke til kommentar

da har jeg fixet det og scriptet kan nå prøves på addressen over,

 

foreløpig har jeg bare fått dec2roman delen til å fungeren feilfritt, roman2dec fungerer den og men det kommer en feilmelding som jeg ikke vet helt hvordan jeg skal få bort,

Parse error: parse error, unexpected ';' in /var/www/html/code/php/misc/roman.php(125) : eval()'d code on line 1

 

da jeg fjernet ";" kom det bare en feilmelding om linja under


Parse error: parse error, unexpected T_RETURN in /var/www/html/code/php/misc/roman.php on line 126

 

og da virker ingenting.

Lenke til kommentar

<?PHP  

echo'<form method="POST" action="';($_SERVER["PHP_SELF"]); 

echo'">

<input type="text" name="number">

<input type="submit" value="dec2roman">

</form>';



echo'<form method="POST" action="';($_SERVER["PHP_SELF"]);

echo'">

<input type="text" name="linje">

<input type="submit" value="roman2dec">

</form>';





function dec2roman ($number) { 



   # Making input compatible with script. 

   $number = floor($number); 

   if($number < 0) { 

       $linje = "-"; 

       $number = abs($number); 

   } 

    

   # Defining arrays 

   $romanNumbers = array(1000, 500, 100, 50, 10, 5, 1); 

   $romanLettersToNumbers = array("M" => 1000, "D" => 500, "C" => 100, "L" => 50, "X" => 10, "V" => 5, "I" => 1); 

   $romanLetters = array_keys($romanLettersToNumbers); 

    

   # Looping through and adding letters. 

   while ($number) { 

       for($pos = 0; $pos <= 6; $pos++) { 

            

           # Dividing the remaining number with one of the roman numbers. 

           $dividend = $number / $romanNumbers[$pos]; 



           # If that division is >= 1, round down, and add that number of letters to the string. 

           if($dividend >= 1) { 

               $linje .= str_repeat($romanLetters[$pos], floor($dividend)); 



               # Reduce the number to reflect what is left to make roman of. 

               $number -= floor($dividend) * $romanNumbers[$pos]; 

           } 

       } 

   } 





   # If I find 4 instances of the same letter, this should be done in a different way. 

   # Then, subtract instead of adding (smaller number in front of larger). 

   $numberOfChanges = 1; 

   while($numberOfChanges) { 

       $numberOfChanges = 0; 



       for($start = 0; $start < strlen($linje); $start++) { 

           $chunk = substr($linje, $start, 1); 

           if($chunk == $oldChunk && $chunk != "M") { 

               $appearance++; 

           } else { 

               $oldChunk = $chunk; 

               $appearance = 1; 

           } 



           # Was there found 4 instances. 

           if($appearance == 4) { 

               $firstLetter = substr($linje, $start - 4, 1); 

               $letter = $chunk; 

               $sum = $firstNumber + $letterNumber * 4; 



               $pos = array_search($letter, $romanLetters); 



               # Are the four digits to be calculated together with the one before? (Example yes: VIIII = IX Example no: MIIII = MIV 

               # This is found by checking if the digit before the first of the four instances is the one which is before the digits in the order 

               # of the roman number. I.e. MDCLXVI. 



               if($romanLetters[$pos - 1] == $firstLetter) { 

                   $oldString = $firstLetter . str_repeat($letter, 4); 

                   $newString = $letter . $romanLetters[$pos - 2]; 

               } else { 

                   $oldString = str_repeat($letter, 4); 

                   $newString = $letter . $romanLetters[$pos - 1]; 

               } 

               $numberOfChanges++; 

               $linje = str_replace($oldString, $newString, $linje); 

            

           } 



       } 



   } 

   return $linje; 

} 



function roman2dec ($linje) { 

   # Fixing variable so it follows my convention 

   $linje = strtoupper($linje); 

    

   # Removing all not-roman letters 

   $linje = ereg_replace("[^IVXLCDM]", "", $linje); 

    

   # Defining variables 

   $romanLettersToNumbers = array("M" => 1000, "D" => 500, "C" => 100, "L" => 50, "X" => 10, "V" => 5, "I" => 1); 



   $oldChunk = 1001; 



   # Looping through line 

   for($start = 0; $start < strlen($linje); $start++) { 

       $chunk = substr($linje, $start, 1); 

        

       $chunk = $romanLettersToNumbers[$chunk]; 

        

       if($chunk <= $oldChunk) { 

           $calculation .= " + $chunk"; 

       } else { 

           $calculation .= " + " . ($chunk - (2 * $oldChunk)); 

       } 

        

    

       $oldChunk = $chunk; 

   } 

    

   # Summing it up 

   //eval('$calculation = $calculation'); 

   return $calculation; 



} 



# Implementation of the array_search function. Works only with numerical arrays. 

function my_array_search($searchString, $array) { 

   foreach ($array as $content) { 

       if($content == $searchString) { 

           return $pos; 

       } 

       $pos++; 

   } 

}



echo dec2roman($_REQUEST['number']);

echo roman2dec($_REQUEST['linje']);

?>  

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...