Buch Cover Buch Cover Buch Cover Buch Cover

Web-Code: - Webcode Help

Syntaxtest (Algorithmen)

Syntaxvorschriften können mithilfe von Syntaxdiagrammen dargestellt werden:

Syntaxdiagramm einer Dezimalzahl

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

Bitte melde dich an um einen Kommentar abzugeben

Kommentare (4)

gressly 10. November 2015 08:57   reply report
Ich habe mir erlaubt, das erste Diagramm etwas zu verändern: Es heißt nun Ziffer (also 0..9) und nicht mehr Zahl.

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.
DDKFM 19. Oktober 2015 19:38   reply report
gressly
Sehr schöne Aufgabe.
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

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.
gouchi4th 19. Oktober 2015 05:52   reply report
Herr Gressly ,
ich sehe es auch genau so! Nach Ihrer Bemerkung weiß man jetzt worum es geht, danke!
gressly 18. Oktober 2015 23:16   reply report
Sehr schöne Aufgabe.
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

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

Bewertung

Durchschnittliche Bewertung:

Eigene Bewertung:
Bitte zuerst anmelden

Meta

Zeit: 0.5
Schwierigkeit: Mittel
Webcode: qref-kf3p
Autor: ()

Download PDF

Download ZIP

Zu Aufgabenblatt hinzufügen