Syntaxtest (Algorithmen)
Syntaxvorschriften können mithilfe von Syntaxdiagrammen dargestellt werden:
Dieses vereinfachte Syntaxdiagramm beschreibt eine Gleitkommazahl(z.B. -3,141)
Um nun zu prüfen ob eine vorliegende Zeichenkette diesem Syntaxdiagramm entspricht, benutzt man Zustandsdiagramme aus UML (siehe Bild unten).
Man durchläuft nun Zeichen für Zeichen die Zeichenkette und springt anhand der Zeichen von Zustand zu Zustand. Wenn ein Zeichen nicht dem Zustandsdiagramm entspricht, fällt die Prüfung auf den Fehlerzustand.
Zustand 3 und 5 markieren hierbei den Endzustand, was bedeutet, das nur diese beiden Zustände zum Ziel führen.
Entwickeln Sie einen Algorithmus (den Sie als Programm umsetzen), um mit obigem Zustandsdiagramm eine Eingabe dahingehend zu prüfen, ob es sich um eine Gleitkommazahl handelt:
Eingabe: String
Ausgabe: Entweder a) ist Gleitkommazahl oder b) ist keine Gleitkommazahl
(Beachten Sie, dass in dieser Repräsentation ein Komma und kein Dezimalpunkt verwendet werden soll!)
4 Kommentare
8 Lösung(en)
program Syntaxpruefung;
uses sysutils;
var Zeichenkette:String;
Zustand:Integer;
i:integer;
Zeichen:char;
Ergebnis:boolean;
begin
Writeln('Programm zum Pruefen einer Gleitkommazahl');
Write('Bitte geben Sie eine zu prüfende Zeichenkette ein: ');
readln(Zeichenkette);
//
Zustand := 1;//Startzustand
i := 1;
while (Zustand > 0) and (i<=length(Zeichenkette)) do
begin
Zeichen := Zeichenkette[i];
case Zustand of
1:
case Zeichen of
'-','+':Zustand := 2;
'0'..'9':Zustand := 3;
else
Zustand := 0;
end;
2:if Zeichen in ['0'..'9'] then
Zustand := 3
else
Zustand := 0;
3:case Zeichen of
'0'..'9':Zustand := 3;
',':Zustand := 4;
else
Zustand := 0;
end;
4:if Zeichen in ['0'..'9'] then
Zustand := 5
else
Zustand := 0;
5:if Zeichen in ['0'..'9'] then
Zustand := 5
else
Zustand := 0;
end;
Ergebnis := (Zustand = 3) or (Zustand = 5);
inc(i);
end;
if Ergebnis then
Writeln('Ihre eingetragene Zeichenkette ist eine Zahl')
else
Writeln('Ihre eingetragene Zeichenkette ist keine Zahl');
(* Optional*)
if Zustand = 0 then
Writeln('Der Fehler ist im Zeichen: ',i-1);
readln;
end.
Lösung von: Maximilian Schädlich (BSZ Vogtland)
//Eingabe der Zeichenkette
println "Eingabe Zeichenkette"
zeichenkette = System.in.newReader().readLine()
zeichenkette_laenge = zeichenkette.length()
//Zustandsermittlung
zustand = 1
zeichenkette_laenge.times{
def ist_ziffer = zeichenkette[it] =~ /\d/
if (it == 0 && (zeichenkette[it] == "+" || zeichenkette[it] == "-"))
zustand = 2
else if ((zustand == 1 || zustand == 2 || zustand == 3) && ist_ziffer.matches())
zustand = 3
else if (zustand == 3 && zeichenkette[it] == ",")
zustand = 4
else if ((zustand == 4 || zustand == 5) && ist_ziffer.matches())
zustand = 5
}
//Ergebnisermittlung
if (zustand != 3 && zustand != 5)
ergebnis = "keine"
else
ergebnis = "eine"
println "Die Zeichenkette ${zeichenkette} ist " + ergebnis + " Gleitkommazahl."
Lösung von: Name nicht veröffentlicht
# Author: Bastel Bach
ziffern="1234567890"
def Zahl(eingab):
eingabe=eingab
komma=""
cancel=""
if eingabe[0] == "-" or eingabe[0] == "+" or eingabe[0] in ziffern:
for i in xrange(1,len(eingabe)):
if komma=="true":
if eingabe[i] not in ziffern:
print str(eingab) + " ist keine Zahl"
cancel="true"
break
else:
if eingabe[i] == ",":
komma="true"
elif eingabe[i] not in ziffern:
print str(eingab) + " ist keine Zahl"
cancel="true"
break
if cancel != "true":
print str(eingab) + " ist eine Zahl"
else:
print str(eingab) + " ist keine Zahl"
string1= raw_input("Geben sie einen String ein: ")
Zahl(string1)
Lösung von: Name nicht veröffentlicht
function isCommaSeparatedFloat(input) {
var pos = 0;
// ist die stelle im string eine ziffer?
function isDigit(char) { return !isNaN(parseInt(char)) }
// vorzeichen prüfen
if (input.charAt(pos) == "-") pos++;
// vorrücken bis zum komma
while (isDigit(input.charAt(pos))) pos++;
if (input.charAt(pos) == ",") pos++;
// vorrücken bis ans ende
while (isDigit(input.charAt(pos))) pos++;
// endprüfung
if (pos == input.length) return true;
return false;
}
console.log(isCommaSeparatedFloat(prompt("Überprüfung der Zahl:")));
//lissalanda@gmx.at
Lösung von: Lisa Salander (Heidi-Klum-Gymnasium Bottrop)
using System;
public class Program
{
public static void Main()
{
test("42");
test("3,1415");
test("-1,234");
test("+1,234");
test("+-1,234");
test("-354.6");
test("1,");
test("77,66,77");
}
//Parsen der Zeichenkette
static bool isDecimal(string dec)
{
int i = 0;
int length = dec.Length - 1;
// erstes Zeichen
if (dec[i].Equals('+') || dec[i].Equals('-') || Char.IsDigit(dec[i]) )
i++;
else
return false;
// bis zum möglichen Komma
while ( !dec[i].Equals(',') && i < length)
{
if (Char.IsDigit(dec[i]) )
i++;
else
return false;
}
// Ende nach Komma?
i++;
if ( dec[i-1].Equals(',') && i > length)
return false;
// Weiter nach dem Komma
while ( i < length )
{
if (Char.IsDigit(dec[i]) )
i++;
else
return false;
}
return true;
}
static void test(string str)
{
if (isDecimal(str))
Console.WriteLine("{0} true",str);
else
Console.WriteLine("{0} false",str);
}
}
Lösung von: Name nicht veröffentlicht
public class Programmieraufgaben_ch{
public static void main (String [] Args) {
System.out.println(istGleitkommazahl("-23,5"));
System.out.println(istGleitkommazahl("3,1415926"));
System.out.println(istGleitkommazahl("42"));
System.out.println(istGleitkommazahl("+-5,43"));
System.out.println(istGleitkommazahl("-354.6"));
System.out.println(istGleitkommazahl("543,54,65"));
}
public static boolean istGleitkommazahl (String Zahl) {
//prüfe ob String Buchstabe enthält
for (int k = 0; k < Zahl.length(); k++) {
if (Zahl.charAt(k) >= 'a' && Zahl.charAt(k) <='z'
|| Zahl.charAt(k) >= 'A' && Zahl.charAt(k) <='Z') {
return false;
}
}
//Prüfe ob Punkt anstatt Komma verwendet wurde
if (Zahl.contains(".")) {
return false;
}
//Prüfe ob am Anfang mehr als ein Vorzeichen steht
for (int i = 0; i < Zahl.length(); i++) {
if (Zahl.charAt(i) == '+' || Zahl.charAt(i) == '-') {
if (Zahl.substring(i+1,Zahl.length()-1).contains("+")
|| Zahl.substring(i+1,Zahl.length()-1).contains("-")) {
return false;
}
}
}
//Prüfe ob Komma zweimal vorkommt, wenn ja Return false
for (int j= 0; j < Zahl.length(); j++) {
if (Zahl.charAt(j)== ',') {
if (Zahl.substring(j+1,
Zahl.length()-1).contains(",")) {
return false;
}
}
}
return true;
}
Lösung von: Thomas Anderson (Freie Universität Berlin)
REPORT zsyntaxtest_gleitkommazahl.
PARAMETERS: pa_z TYPE string. " Usereingabe eines Strings.
DATA: lv_error TYPE i,
lt_zahl TYPE STANDARD TABLE OF string,
ls_zahl LIKE LINE OF lt_zahl.
" Am Komma wird gesplittet und in die Tabelle geschrieben.
SPLIT pa_z AT ',' INTO TABLE lt_zahl. " Tabelle enthält also 2 Einträge.
LOOP AT lt_zahl INTO ls_zahl.
IF ls_zahl CO '0123456789+-'. " Test ob der String ungewünschte Zeichen enthält.
IF ls_zahl >= 0 OR ls_zahl <= 0.
lv_error = 0.
ENDIF.
* Error wird beim ersten Ziffernblock auf 1 gesetzt,
* um zu gewährleisten, dass noch ein Ziffernblock kommt.
IF sy-tabix <= 1.
lv_error = 1.
ENDIF.
ELSE. " Falls Eingabe ungewünschte Zeichen enthält.
lv_error = 1.
EXIT. " Beendigung der Schleife.
ENDIF.
IF sy-tabix > 2. " Falls mehr als 1 Komma in der Eingabe enthalten ist -> Fehler.
lv_error = 1.
ENDIF.
ENDLOOP.
* Ausgabe.
IF lv_error = 0.
WRITE: / pa_z,
'Ist eine Gleitkommazahl.'.
ELSEIF lv_error = 1.
WRITE: / pa_z,
'Ist keine Gleitkommazahl.'.
ENDIF.
Lösung von: Alexander S. (msg systems)
// NET Core 3.x
// Syntaxprüfung ist ohne Zweifel ein elementarer Baustein in der Programmierung.
// Aber es ist nicht mehr zeitgemäß antiquarisch durch den String zu iterieren.
// Besser sind hier "Reguläre Ausdrücke":
static string IsFloatingNumber(string s) => $"{s} ist " + (new Regex(@"^[\+\-]?\d+[\,]?\d*$").IsMatch(s) ? "" : "k") + "eine Gleitkommazahl";
Lösung von: Jens Kelm (@JKooP)
Verifikation/Checksumme:
Gültig:
- -23,5
- 3,1415926
- 42
Ungültig:
- +-5,43
- -354.6
- 543,54,65
Aktionen
Neue Lösung hinzufügen
Bewertung
Durchschnittliche Bewertung:
Kommentare (4)
Ebenso habe ich den Text am Schluss (die eigentliche Aufgabenstellung) noch etwas klarer formuliert. Ehrlich gesagt, gefällt mir die jetzige Formulierung auch nicht perfekt, aber ich denke (bis uns was besseres einfällt) es ist so immerhin klar verständlich.
Danke für Ihr Feedback.
a) Als ich über dem dazugehören Pascal-Programm saß ist mir dieser Fehler dann auch aufgefallen.
b)Der letzte Satz war durchaus schlecht formuliert, da muss ich Ihnen Recht geben.
ich sehe es auch genau so! Nach Ihrer Bemerkung weiß man jetzt worum es geht, danke!
Dennoch würde ich zwei Kleinigkeiten ändern.
a) In der ersten Grafik besteht eine Gleitkommazahl aus Zahlen. Besser wäre es hier von Ziffern zu sprechen.
b) Es geht in der Aufgabe wohl nicht darum, das Zustandsdiagramm zu prüfen, sondern mittels Zustandsdiagramm eine Gleitkommazahl zu prüfen.
Ich würde schreiben:
Etwickeln Sie einen Algorithmus (den Sie als Programm umsetzen), um mit obigem Zustandsdiagramm eine Eingabe dahingehend zu prüfen, ob es sich um eine Gleitkommazahl handelt: Eingabe String / Ausgabe a) ist Gleitkommazahl b) ist keine Gleitkommazahl