C Einfach oder nicht Einfach? Syntaxbäume

dudenschnorz

Newbie
Registriert
Apr. 2009
Beiträge
4
Code:
Aufgabe 2: Zeichnen Sie die Syntaxbäume der folgenden Ausdrücke und machen Sie sich die
Bedeutung der Ausdrücke klar. Überprüfen Sie Ihre Erkenntnisse anhand kurzer C-
Programme.
   1) *--j=0
   2) fabs(x)<fabs(y)? fabs(y)*sqrt(1+(x/y)*(x/y)): x==0? 0:
      fabs(x)*sqrt(1+(y/x)*(y/x))
   3) i==0?++z,++z:--z,--z


hallo, ich habe kein ahnung von dieser aufgabe.
Kann mir jemand helfen?

Mein Professor konnte mir auch nicht helfen, aber wir kriegen Bonuspunkte für die Klausur auf diese Aufgabe.
 
ich glaub das du da nich im richtigen forum bist, gibt spezielle c foren, da kannste auf mehr hilfe hoffen
 
ein syntaxbaum ist einfach die abfolge von der evaluierung der einzelnen elemente. als anhang hab ich die 2. aufgabe kurz hochgeladen (einmal als png und in der 7z datei liegt die svg dazu, falls es so schlecht lesbar sein sollte), da kannst du das sehen. nur kann ich dir nicht mit der if-abfrage weiterhelfen. entweder kommt dann noch ein if() als verbindung dahin oder sie sind selbstständig und die bedingungen werden nicht mit eingebunden. aber das kannst du ja im nachhinein noch hinzufügen. ist ja auch nur ein beispiel. ;)

edit: gib bei wikipedia einfach mal syntaxbaum ein, dort wird auch alles erklärt, obwohl ich das beispiel ein wenig doof finde. falls du nicht weißt, wie du hier vorgehen sollst, dann nimm dir eine operator prioritätenliste von c(++) hervor, dann weißt du was zuerst kommt und was hinten anstehen muss, bis das vorherige evaluiert wurde.
 
Zuletzt bearbeitet:
Super. Vielen Dank, claW.

Die if Abfrage ist zwar eigentlich mein größtes Problem, aber so weiß ich zumindest, dass ich da nicht alleine ratlose dastehe :D
 
na wenn verknüpf diese doch einfach. immerhin kannst du nur den punkt dafür bekommen, wenn du etwas geschrieben hast. wenn es falsch ist, wird dir ja nun kein punkt abgezogen. ;) ich würde es wenn so machen:
 
Zuletzt bearbeitet:
hm, da fehlen aber die Bedingungen...
Muss ich noch mal mit meinem Professor reden.

Danke für deine Schönen Grafiken :)
 
dudenschnorz schrieb:
hm, da fehlen aber die Bedingungen...
nein, die bedingungen sind doch vorhanden?! sieh dir mal den c-standard richtig an. die aufgabe 2
Code:
fabs( x ) < fabs( y ) ?
  fabs( y ) * sqrt( 1 + (x / y) * (x / y) ) :
  x == 0 ?
    0 :
    fabs( x ) * sqrt( 1 + (y / x) * (y / x))
könnte man auch als
Code:
if( fabs( x ) < fabs( y ) ) return fabs( y ) * sqrt( 1 + (x / y) * (x / y) );
else
{
  if( x == 0 ) return 0;
  else return fabs( x ) * sqrt( 1 + (y / x) * (y / x));
}
schreiben. hinter dem ? steht der dann-zweig, hinter dem : der sonst-zweig. dies dient eig nur der übersichtlichkeit und teilweise auch der einfachheit (z.b. wenn du in einer variablen viel shiften musst). beispiel:
Code:
reg = RegisterHotKey( WallpaperFusionMain->Handle, WallpaperFusionMain->ghkBringToFront,
                        (State.Contains( ssAlt ) ? MOD_ALT : 0) |
                        (State.Contains( ssCtrl ) ? MOD_CONTROL : 0) |
                        (State.Contains( ssShift ) ? MOD_SHIFT : 0) |
                        (cbBringToFrontWindowsKeyModifier->Checked ? MOD_WIN : 0),
                        Key );
// oder
Menu = (mi->Checked ? menuMain : NULL);
// oder
FileSize = (Item->SubItems->Strings[5] == EmptyStr ? 0 : STI(Item->SubItems->Strings[5]));
// oder
AspectRatio.setNumerator( (Item->SubItems->Strings[8] == "" ? 0 : STI(Item->SubItems->Strings[8]) ));
 
Zurück
Oben