ZahlenDeutsch.rb

zahlenDeutsch.rb — HTML, 2 kB (2.990 bytes)

Dateiinhalt

# Definition der benoetigten Arrays (in Ruby-Arrays ist der
# kleinste Index immer 0):

@kleiner20 = ["Null", "ein", "zwei", "drei", "vier", "fuenf", 
              "sechs", "sieben", "acht", "neun", "zehn", "elf", 
              "zwoelf", "dreizehn", "vierzehn", "fuenfzehn", 
              "sechzehn", "siebzehn", "achtzehn", "neunzehn"]
			
@zehner = ["Null", "zehn", "zwanzig", "dreissig", "vierzig", 
           "fuenfzig", "sechzig", "siebzig", "achtzig", "neunzig"]
			
@singular = ["s", "tausend", "e Million", "e Milliarde", 
             "e Billion", "e Billiarde", "e Trillion", "e Trilliarde",
             "e Quadrillion", "e Quadrilliarde"]

@plural =   [" ", "tausend", " Millionen", " Milliarden", 
             " Billionen", " Billiarden", " Trillionen", " Trilliarden",
             " Quadrillionen", " Quadrilliarden"]
             
# Definition der drei Unterprogramme
# "sprichDreier", "sprich" und "prompt":

def sprichDreier(zahl,singular,plural)
  # Sonderfaelle 0 und 1:
	if zahl == 0 then
		return ""
	elsif zahl == 1 then
		return "ein" + singular
	end
  # Ergebnisstring anfangs leer:
	erg = ""
  # Erste Ziffer h abspalten:
	h = zahl / 100
	r = zahl % 100
  # Hunderteranteil aussprechen:
	if h > 0 then
		erg += @kleiner20[h] + "hundert"
	end
  # Rest aussprechen, wenn nicht leer:
	if r > 0 then
    # Sonderfall: Zahl endet auf 01,
    # ist aber ungleich 1
		if r == 1 then
			erg += "eins"
		elsif r < 20 then
      # Rest < 20 behandeln:
			erg += @kleiner20[r]
		else
      # zweite Ziffer z und
      # dritte Ziffer rr abspalten:
			z = r / 10
			rr = r % 10
      # Eineranteil aussprechen:
			if rr > 0 then
				erg += @kleiner20[rr] 
			end
      # sage "und", wenn es Einer-
      # und Zehneranteile vorhanden
			if rr > 0 and z > 0 then
				erg += "und"
			end
      # Zehneranteil aussprechen:
			if z > 0 then
				erg += @zehner[z]
			end
		end
	end	
	return erg + plural
end

def sprich(zahl)
	if zahl < 1 or zahl >= 10**(3*(@singular.length)) then
		return "unzulaessige Zahl!"
	end
  # Zahl in Dreiergruppen aufspalten:
	gruppe = []
	i = -1
	while zahl > 0
		stellen = zahl % 1000
		zahl = zahl / 1000
		i += 1
		gruppe[i] = stellen
	end
  # Dreiergruppen von links nach rechts aussprechen:
	erg = "\n"
	while i >= 0 
		erg += sprichDreier(gruppe[i], @singular[i], @plural[i]) + "\n"
		i -= 1
	end
	erg 
end

def prompt
  puts "Welche Zahl? (Abbruch mit 0)"
  return gets.to_i
end

# Anweisungen des Hauptprogramms.
# Dabei zuerst den gueltigen Zahlenbereich
# angeben (drei Ziffern je Gruppe; Gruppen
# hoechstens soviele wie Endungen):
puts "Kann Zahlen von 1 bis: 10**(" +
       (3*(@singular.length)).to_s + 
       ")-1 aussprechen!\n"
# Solange Zahlen anfordern und aussprechen,
# bis die Zahl 0 als Endesignal eingegeben
# wird:
v = prompt
while v != 0
  puts(v.to_s + " wird gesprochen als: "+ sprich(v))
  v = prompt
end

Bild von Lothar Schmitz
Priv.-Doz. Dr. rer. nat. habil. Lothar Schmitz


Adresse
Institut für Softwaretechnologie
Fakultät für Informatik
Universität der Bundeswehr München
85577 Neubiberg

Büro: Gebäude 41/400, Raum 0324

Tel.: +49 89 6004-2140 (-3352, -2263)
Fax: +49 89 6004-2448
E-Mail: Lothar.Schmitz@unibw.de