Hackerboard WikiHaboBlog

[HaBo]

 
Programmieraufgaben Hier wird regelmäßig eine neue Programmieraufgabe gestellt, die dann gelöst werden soll und in Zusammenarbeit mit den Moderatoren auch besprochen werden kann.

Römische Zahlen

Diskussion: Römische Zahlen im Forum Programmieraufgaben, in der Kategorie Code Kitchen; Danke. Fehler beseitigt....

Antwort
Alt 10.08.06, 15:02   #16 (permalink)
 
Registriert seit: 20.11.05
CraHack Leistung: Facit NTK
Likes: 0
Standard


Danke. Fehler beseitigt.

CraHack ist offline   Mit Zitat antworten
Alt 13.08.06, 17:11   #17 (permalink)
 
Registriert seit: 02.08.06
Jon2 Leistung: Facit NTK
Likes: 0
Standard

schaut mal hier.

mfg jon2

edit: wie ist das eigentlich mit zahle über 19999 dann sind ja 4 A hintereinander?
Jon2 ist offline   Mit Zitat antworten
Alt 13.08.06, 17:44   #18 (permalink)
Member of Honour
 
Benutzerbild von ivegotmail
 
Registriert seit: 28.05.03
ivegotmail Leistung: Z3
Likes: 1
Standard

@Jon2

Zitat:
Original von boppy
...im übrigen geht es darum den SourceCode zu veröffentlichen. Gerne werden auch Binärdateien angenommen, aber SourceCode ist pflicht, schließlich soll das ganze auch für andere User einen Sinn ergeben.
siehe Erklärung zu diesem Forum
__________________
http://livehabo.hackerboard.de | http://livebb.sourceforge.net
ivegotmail ist offline   Mit Zitat antworten
Alt 14.08.06, 13:18   #19 (permalink)
mig
 
Registriert seit: 12.08.06
mig Leistung: Facit NTK
Likes: 0
Standard

hi,
hier mal ne Java-Version:

Java   
Code:
import Prog1Tools.IOTools;
public class rom {
	public static void main(String [] args) {
		int eingabe = IOTools.readInteger();
		abfrage(eingabe,false); //Einfache Umrechnung
		abfrage(eingabe,true);	//Subtraktionsregel
	}

	public static void abfrage (int eingabe2,boolean b){
		String sub = "";
		boolean a = true;
		while(a){	
			if(eingabe2 >= 1000) {
				eingabe2 = eingabe2 - 1000;
				sub = sub + 'M';
			}
			else if(eingabe2 >=900 && b){
				eingabe2 = eingabe2 - 900;
				sub = sub+"CM";
			}
			else if(eingabe2 >= 500) {
				eingabe2 = eingabe2 - 500;
				sub = sub + 'D';
			}
			else if(eingabe2 >=400 && b){
				eingabe2 = eingabe2 - 400;
				sub =sub+"CD";
			}				
			else if(eingabe2 >= 100) {
				eingabe2=eingabe2 - 100;
				sub = sub + 'C';
			}
			else if(eingabe2 >=90 && b){
				eingabe2 = eingabe2 - 90;
				sub = sub+"XC";
			}
			else if(eingabe2 >= 50) {
				eingabe2=eingabe2 - 50;
				sub = sub + 'L';
			}
			else if(eingabe2 >=40 && b){
				eingabe2 = eingabe2 - 40;
				sub = sub+"XL";
			}
			else if(eingabe2 >= 10) {
				eingabe2=eingabe2 - 10;
				sub = sub + 'X';
			}
			else if(eingabe2 >=9 && b){
				eingabe2 = eingabe2 - 9;
				sub = sub+"IX";
			}
			else if(eingabe2 >= 5) {
				eingabe2=eingabe2 - 5;
				sub = sub + 'V';
			}
			else if(eingabe2 >=4 && b){
				eingabe2 = eingabe2 - 4;
				sub = sub+"IV";
			}
			else if(eingabe2 >= 1) {
				eingabe2=eingabe2 - 1;
				sub = sub + 'I';
			}
			else if(eingabe2 == 0){
				System.out.println(sub);
				a = false;
			}
		}
	}
}
mig ist offline   Mit Zitat antworten
Alt 14.08.06, 13:51   #20 (permalink)
Senior Member
 
Registriert seit: 28.08.05
2Bios Leistung: Facit NTK
Likes: 0
Standard

Eine Variante mit Perl:    
perl -e "use Roman; print roman(@ARGV[0]) . \"\n\"" -- deinezahl
2Bios ist offline   Mit Zitat antworten
Alt 17.08.06, 16:44   #21 (permalink)
 
Registriert seit: 01.11.03
lagalopex Leistung: Facit NTK
Likes: 0
Standard

Lösung in C++   
Code:
#include <iostream>

using namespace std;

const int roemi[] = {5000, 4000, 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
const char roemc[][3]={"A", "MA", "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
const int arraynum = 15;
const int maxnum = 8888;

int main(int argc, char *argv[])
{
	int tmp;
	cout << "arabisch => roemisch" << endl;
	cout << "unter Anwendung der \"Subtraktionsregel\" (1..." << maxnum << ")" << endl;
	for(;;) {
		cout << "Zahl: " << flush;
		cin >> tmp;
		if(!tmp)
			break;
		if(tmp < 1 || tmp > maxnum)
			cout << "Ungueltige Zahl" << endl;
		else {
			cout << "roemisch: ";
			for(int i = 0 ; i < arraynum ; i++) {
				while(tmp >= roemi[i]) {
					tmp -= roemi[i];
					cout << roemc[i];
				}
			}
			cout << endl;
		}
	}
	return(0);
}
lagalopex ist offline   Mit Zitat antworten
Alt 20.11.06, 16:14   #22 (permalink)
 
Benutzerbild von Eydeet
 
Registriert seit: 14.04.06
Eydeet Leistung: Facit NTK
Likes: 4
Standard

Lösung in PHP incl. Subtraktions- und Rahmenregel   
PHP-Code:
<?php
$zahl_dez 
$zahl_dez_backup 1999;
$zahl_rom '';

$arrRoemisch = array('A' => 5000,
                     
'M' => 1000,
                     
'CM'=>  900,
                     
'D' =>  500,
                     
'CD'=>  400,
                     
'C' =>  100,
                     
'XC'=>   90,
                     
'L' =>   50,
                     
'XL'=>   40,
                     
'X' =>   10,
                     
'IX'=>    9,
                     
'V' =>    5,
                     
'IV'=>    4,
                     
'I' =>    1
                    
);
                    
$arrRomLetter array_keys($arrRoemisch);
$arrRomNumber array_values($arrRoemisch);

$i 0;
$multipl 1;
$firstrun true;
while(
$zahl_dez 0) {
   if(
$zahl_dez >= 100000) { // Schreibweise mit Rahmen, siehe Wikipedia
      
$multipl 100000;
      if(
$firstrun) {$zahl_rom .= '|';}
   }elseif(
$multipl == 100000) {
      
$multipl 1;
      
$zahl_rom .= '|';
      
$i 0;
   }
   
   if(
$zahl_dez >= ($arrRomNumber[$i]*$multipl)) {
      
$zahl_rom .= $arrRomLetter[$i];
      
$zahl_dez -= $arrRomNumber[$i]*$multipl;
   }
   if(
$zahl_dez $arrRomNumber[$i]*$multipl) {
      
$i++;
   }
   
$firstrun false;
}
if(
$multipl == 100000) { // Beseitigt Fehler: Am Ende kein Rahmen
   
$zahl_rom .= '|';
}
echo 
$zahl_dez_backup.' ist in r&ouml;mischen Zahlen '.$zahl_rom;
?>
Eydeet ist offline   Mit Zitat antworten
Alt 04.12.06, 21:01   #23 (permalink)
 
Registriert seit: 04.12.06
tannerli Leistung: Facit NTK
Likes: 0
Standard

Meine Lösung in VBA, berücksichtigt die Subtraktionsregel

(Allerdings werden bei Zahlen über 19999 einfach noch mehr "A" eingefügt)


Code:
 Public Sub numbers()


MsgBox "Römische Zahl:" & vbCrLf & vbCrLf & convert((InputBox("Dezimalzahl:", "Dez > Röm Converter";)))

End Sub


Public Function convert(value As Integer)

Dim result, roman(14) As String
roman(0) = "A"
roman(1) = "MA"
roman(2) = "M"
roman(3) = "CM"
roman(4) = "D"
roman(5) = "CD"
roman(6) = "C"
roman(7) = "XC"
roman(8) = "L"
roman(9) = "XL"
roman(10) = "X"
roman(11) = "IX"
roman(12) = "V"
roman(13) = "IV"
roman(14) = "I"

Dim dez(14) As Integer
dez(0) = 5000
dez(1) = 4000
dez(2) = 1000
dez(3) = 900
dez(4) = 500
dez(5) = 400
dez(6) = 100
dez(7) = 90
dez(8) = 50
dez(9) = 40
dez(10) = 10
dez(11) = 9
dez(12) = 5
dez(13) = 4
dez(14) = 1

For i = 0 To 14
While (value / dez(i)) >= 1
result = result & roman(i)
value = value - dez(i)
Wend
Next

convert = result
End Function
tannerli ist offline   Mit Zitat antworten
Alt 01.04.07, 20:16   #24 (permalink)
 
Benutzerbild von Stein
 
Registriert seit: 10.10.05
Stein Leistung: Facit NTK
Stein eine Nachricht über ICQ schicken
Likes: 0
Standard

Habe das ganz mla in C++ gezaubert:
C++   
#include <iostream>

using namespace std;
int main() {
/*Dieses Programm soll eine normale Zahl in eine römische Zahl umwandeln*/
int zahl;
cin >> zahl;
cout << "Römsiche zahl von: " << zahl << endl;
string romzahl;
for(int i =1;zahl>=1000;i++)
{
if(i == 3)
{
break;
}
romzahl = romzahl + 'M';
zahl = zahl - 1000;
}
for(int j=1;zahl>=500;j++)
{
if(j == 3)
{
break;
}
romzahl = romzahl + 'D';
zahl = zahl - 500;
}
for(int k=1;zahl>=100;k++)
{
if(k == 3)
{
break;
}
romzahl = romzahl + 'C';
zahl = zahl - 100;
}
for(int l=1;zahl>=50;l++)
{
if(l == 3)
{
break;
}
romzahl = romzahl + 'L';
zahl = zahl - 50;
}
for(int m=1;zahl>=10;m++)
{
if(m == 3)
{
break;
}
romzahl = romzahl + 'X';
zahl = zahl - 10;
}
for(int n=1;zahl>=5;n++)
{
if( n== 3)
{
break;
}
romzahl = romzahl + 'V';
zahl = zahl - 5;
}
for(int o=1;zahl>=1;o++)
{
if(o == 3)
{
break;
}
romzahl = romzahl + 'I';
zahl = zahl - 1;
}
cout << romzahl << endl;
}


Das mit den break, kann man zwar auch durch
for-varitante   
for(int o=1;zahl>=1 && i<=3;o++)

, aber ich wollte schon immer mla break ausprobieren.

gruß stein
__________________
Steinhagelvoll
Stein ist offline   Mit Zitat antworten
Alt 05.04.07, 12:10   #25 (permalink)
 
Registriert seit: 05.04.07
MaddinMV Leistung: Facit NTK
Likes: 0
Standard

Zitat:
Original von 2Bios
Eine Variante mit Perl:    
perl -e "use Roman; print roman(@ARGV[0]) . \"\n\"" -- deinezahl
original die beste variante
MaddinMV ist offline   Mit Zitat antworten
Alt 05.06.07, 14:30   #26 (permalink)
 
Registriert seit: 30.05.07
J.U.B. Leistung: Facit NTK
J.U.B. eine Nachricht über ICQ schicken
Likes: 0
Standard

Hier meine Version in PVX:

Code:
PRINT "Bitte geben Sie eine ganze Dezimalzahl ein,"
PRINT "f",CHR(252),"r die berechnung ins R",CHR(246),"mische Zahlensystem."
INPUT "Eingabe: ",E
E=INT(E)

Dim rz$(29),dez(29)
rz$(1) = "A"
rz$(2) = "MA"
rz$(5) = "M"
rz$(6) = "CM"
rz$(9) = "D"
rz$(10) = "CD"
rz$(13) = "C"
rz$(14) = "XC"
rz$(17) = "L"
rz$(18) = "XL"
rz$(21) = "X"
rz$(22) = "IX"
rz$(25) = "V"
rz$(26) = "IV"
rz$(29) = "I"

dez(1) = 5000
dez(2) = 4000
dez(5) = 1000
dez(6) = 900
dez(9) = 500
dez(10) = 400
dez(13) = 100
dez(14) = 90
dez(17) = 50
dez(18) = 40
dez(21) = 10
dez(22) = 9
dez(25) = 5
dez(26) = 4
dez(29) = 1

result$=""
I=1
WHILE I<>29
WHILE E-dez(I)>=0.0000
IF MOD(I,2)=1 THEN {
	result$ = result$+rz$(I,1)
} ELSE {
	result$ = result$+rz$(I,2)
}
E = E - dez(I)
WEND
IF MOD(I,2)=0 THEN {
	I+=3
} ELSE {
	I++
}
WEND

PRINT result$
Diese Aufgabe ist mit der Subtraktion, allerdings werden bei zahlen höher als "19999" das A öfter als 4 mal hintereinander eingesetzt also zum beispiel
20000 = AAAA
J.U.B. ist offline   Mit Zitat antworten
Alt 12.06.07, 16:34   #27 (permalink)
Stibitzki
Guest
 
Likes:
Standard

Gibt es hier eigentlich jemanden, der sich mit der Programmiersprache Oberon 2 auskennt und dazu ein entsprechendes Programm zum Umrechnen ins römische Zahlensystem schreiben kann?
  Mit Zitat antworten
Alt 12.06.07, 16:51   #28 (permalink)
CDW
Moderator
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
CDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: Opteron
Likes: 156
Standard

Dein Link zeigt auf eine Entwicklungsumgebung für Oberon-2/Java/C++, keine eigentständige Programmiersprache.
__________________
Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.
CDW ist offline   Mit Zitat antworten
Alt 12.06.07, 20:00   #29 (permalink)
Stibitzki
Guest
 
Likes:
Standard

OBERON-2 meine ich.
  Mit Zitat antworten
Alt 21.11.07, 21:13   #30 (permalink)
 
Registriert seit: 05.05.07
Punky Duck Leistung: Facit NTK
Likes: 0
Standard

Obwohl der letzte Post schon ziehmlich lange her ist dachte ich mir ich veröffentliche auch mal meine Variante. Man möge es mir verzeihen.

Ich habe es in Java geschrieben. Zusätzlich habe ich auch noch die Möglichkeit eingebaut römische Ziffern in Dezimalzahlen umzuwandeln.
Bei der Umrechnung dezimal auf römisch wird die Subtraktionsregel beachtet, nicht aber bei der Umrechnung von römisch auf dezimal. Falls jemand eine einfache Möglichkeit gefunden hat auch bei römisch-dezimal die Subtraktionsregel zu berücksichtigen, möge es mir dieser bitte mitteilen.

Code:
/*Wandelt eingegebene Zahlen in
 roemische Zahlen um*/
 
import java.util.Scanner;

public class romZa
{
[	public static void main(String[] args){
		
		Scanner input=new Scanner(System.in);
		
		
		System.out.println("Please enter number: ");
		int z=input.nextInt();
		
		converter c=new converter(z);
		
		System.out.println(c.convert());
		
		
		System.out.println("Please enter roman number: ");
		input.nextLine();
		String y=input.nextLine();
		
		backConverter b=new backConverter(y);
		
		System.out.println(b.convert());
	}
}
Code:
/*
Zeichen 	I 	V 	X 	L 	C 	D 	M
Wert 		1 	5 	10 	50 	100 	500 	1000
    IV = 4 (statt IIII)
    IX = 9 (statt VIIII)
    XL = 40 (statt XXXX)
    XC = 90 (statt LXXXX)
    CD = 400 (statt CCCC)
    CM = 900 (statt DCCCC) 
*/


public class converter{
	private int number;
	private String rom="";
	
	public converter(int z){
		number=z;
	}
	
	public String convert(){
	
		while(number>0){
			
			if(number>=1000){
				rom=rom+"M";
				number-=1000;
			}
			else if(number==900){
				rom+="CM";
				number-=900;
			}
			else if(number>=500&&number<1000){
				rom+="D";
				number-=500;
			}
			else if(number==400){
				rom+="CD";
				number-=400;
			}
			else if(number>=100&&number<500){
				rom+="C";
				number-=100;
			}
			else if(number==90){
				rom+="XC";
				number-=90;
			}
			else if(number>=50&&number<100){
				rom+="L";
				number-=50;
			}
			else if(number==40){
				rom+="XL";
				number-=40;
			}
			else if(number>=10&&number<50){
				rom+="X";
				number-=10;
			}
			else if(number==9){
				rom+="IX";
				number-=9;
			}
			else if(number>=5&&number<9){
				rom+="V";
				number-=5;
			}
			else if(number==4){
				rom+="IV";
				number-=4;
			}
			else if(number>=1&&number<4){
				rom+="I";
				number-=1;
			}
		}
		return rom;
	}
}
Code:
/*
Zeichen 	I 	V 	X 	L 	C 	D 	M
Wert 		1 	5 	10 	50 	100 	500 	1000
*/

public class backConverter{

	private int number;
	private String rom;
	private int len;
	
	public backConverter(String rom){
		this.rom=rom;
		len=rom.length();
	
	}
	
	public int convert(){
		
		char[] sign=new char[len];
		
		
		for(int i=len-1;i>=0;i--){
			sign[i]=rom.charAt(i);
			
					
		}
		
		while(len>0){
		
			if(sign[len-1]=='I'){
				number+=1;
			}
			else if(sign[len-1]=='V'){
				number+=5;
			}
			else if(sign[len-1]=='X'){
				number+=10;
			}
			else if(sign[len-1]=='L'){
				number+=50;
			}
			else if(sign[len-1]=='C'){
				number+=100;
			}
			else if(sign[len-1]=='D'){
				number+=500;
			}
			else if(sign[len-1]=='M'){
				number+=1000;
			}
		
		
		len--;
		}
		return number;
		
	}
}
Punky Duck ist offline   Mit Zitat antworten
Antwort
   

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » Programmieraufgaben » Römische Zahlen
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Zahlen per SMS Dawen Internet Allgemein 3 06.07.08 01:22
Zahlen ordnen C++ Tux1990 Code Kitchen 3 26.02.07 18:02
C/C++ Römische in Arabische Zahlen konvertieren + Batchkonvertierung Fifilip Code Kitchen 7 13.12.06 07:59
Problem mit Zahlen in PHP! PtB (Web-) Design und webbasierte Sprachen 2 01.02.05 14:12
Zahlen in Excel nook Windows 1 15.06.02 13:47


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61