tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von Matthias Reitinger
ERLEDIGT
JA
ANTWORTEN
5
ZUGRIFFE
829
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Registriert seit
    Mar 2004
    Beiträge
    1.854
    Blog-Einträge
    2
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    int a, b; 
    ...  // Definition der Inhalte von a und b 
    while (a != b) {  
      if (a > b) 
        a = a - b; 
      else 
        b = b - a; 
    }
    System.out.println(a);
    Terminiert diese Schleife bei allen int-Eingabewerten?

    Meine Annahme: Selbst wenn a=MAX_INTEGER und b=-1 wird aus a durch overflow MIN_INTEGER, der sicherlich wieder bei genügender Addition b=-1 trifft.
    Ist a allerdings beliebig ungerade und b beliebig gerade so kann die Schleife nicht terminieren.

    Bei beiden Annahmen bin ich mir sehr unsicher wüsste aber nicht wie ich das zeigen kann. Am besten natürlich ohne Beispiel, ganz allgemein.
     
    Gebe keine Hilfe per PN, Mail, Instant Messenger etc.
    und keine Copy&Paste-Lösungen - ein bisschen selbst nachdenken sollte drin sein. Konstruktivismus 4tw!


    MfG, Zod

    __________________
    rpd Framework: Rapid Web-Engineering in PHP (Manual | Google Code)

  2. #2
    Kai008 Kai008 ist offline Mitglied Brillant
    Registriert seit
    May 2008
    Ort
    Brunn/Geb. (Niederösterreich)
    Beiträge
    944
    Blog-Einträge
    1
    Nein, sie beendet nicht, solange beide Zahl negativ sind. Wenn man eine Negative subtrahiert wird sie addiert, wodurch sich b von a wegbewegt.
    Wenn man dem Overflow ignoriert und a bspw. "-5" und b -1 ist, tritt die else in Kraft, wodurch b - a ist, also 4, dann 9 usw ist.
    Beachtet man den Overflow, wird a zu "-2147483648", welches zu b addiert wird, und dadurch einen Overflow in b auslöst. Danach wird es nocheinmal addiert, wodurch es wieder -1 ist.
     

  3. #3
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.805
    Blog-Einträge
    5
    Zitat Zitat von ZodiacXP Beitrag anzeigen
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    int a, b; 
    ...  // Definition der Inhalte von a und b 
    while (a != b) {  
      if (a > b) 
        a = a - b; 
      else 
        b = b - a; 
    }
    System.out.println(a);
    Terminiert diese Schleife bei allen int-Eingabewerten?
    Diese Schleife terminiert nur für a>0 && b>0 (Überläufe außer acht gelassen).

    Zitat Zitat von ZodiacXP Beitrag anzeigen
    Meine Annahme: Selbst wenn a=MAX_INTEGER und b=-1 wird aus a durch overflow MIN_INTEGER, der sicherlich wieder bei genügender Addition b=-1 trifft.
    Die Überlegung ist falsch. Sobald a MIN_INTEGER ist, gilt b > a, also wird die Zuweisung b = b - a; durchgeführt.

    Zitat Zitat von ZodiacXP Beitrag anzeigen
    Ist a allerdings beliebig ungerade und b beliebig gerade so kann die Schleife nicht terminieren.
    Wie kommst du darauf? Für a=1 und b=2 terminiert die Schleife doch beispielsweise.

    Zitat Zitat von ZodiacXP Beitrag anzeigen
    Bei beiden Annahmen bin ich mir sehr unsicher wüsste aber nicht wie ich das zeigen kann. Am besten natürlich ohne Beispiel, ganz allgemein.
    Für Programm-Verifikation allgemein verwendet man z.B. das wp-Kalkül oder das Hoare-Kalkül.

    Grüße, Matthias
    ZodiacXP bedankt sich. 
    „Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
    “For every complex problem, there is an answer that is short, simple and wrong.”
    “Pessimism is safe, but optimism is a lot faster!”


    Aktuelles Coding Quiz: #17 - Wörter kreuz und quer

  4. #4
    Registriert seit
    Mar 2004
    Beiträge
    1.854
    Blog-Einträge
    2
    Gut. Danke!
    Damit wären die Sachen bei denen ich mir ganz unsicher war auch gegessen.

    Demnach terminiert die Schleife unter Berücksichtigung vom Overflow immer.

    (Korrigiert mich wenns falsch ist - bin so schon fitter als die Klausur es fordern wird aber liebe halt so besondere Sachen )
     
    Gebe keine Hilfe per PN, Mail, Instant Messenger etc.
    und keine Copy&Paste-Lösungen - ein bisschen selbst nachdenken sollte drin sein. Konstruktivismus 4tw!


    MfG, Zod

    __________________
    rpd Framework: Rapid Web-Engineering in PHP (Manual | Google Code)

  5. #5
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.805
    Blog-Einträge
    5
    Zitat Zitat von ZodiacXP Beitrag anzeigen
    Demnach terminiert die Schleife unter Berücksichtigung vom Overflow immer.
    Ähm… nein? Niemand hier hat das behauptet. Überleg dir einfach für den Fall a=INT_MAX und b=-1 mal was nacheinander passiert.
     
    „Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
    “For every complex problem, there is an answer that is short, simple and wrong.”
    “Pessimism is safe, but optimism is a lot faster!”


    Aktuelles Coding Quiz: #17 - Wörter kreuz und quer

  6. #6
    Registriert seit
    Mar 2004
    Beiträge
    1.854
    Blog-Einträge
    2
    Grob jeweils Schleifenanfang:
    Durchgang 1, a=MAX und b=-1
    Durchgang 2, a=MIN und b=-1
    Durchgang 3, a=MIN und b=MAX
    2, 3 wiederholt sich ab hier

    Woah. Ich sollte vielleicht ein bisschen weiterdenken und nicht so vorschnell seien bei meinen Überlegungen. Sorry, übelst dummer Fehler
    Alles klar. Danach hab ich gesucht Danke!!
    Geändert von ZodiacXP (14.02.09 um 00:22 Uhr)
     
    Gebe keine Hilfe per PN, Mail, Instant Messenger etc.
    und keine Copy&Paste-Lösungen - ein bisschen selbst nachdenken sollte drin sein. Konstruktivismus 4tw!


    MfG, Zod

    __________________
    rpd Framework: Rapid Web-Engineering in PHP (Manual | Google Code)

Ähnliche Themen

  1. Antworten: 0
    Letzter Beitrag: 05.10.10, 08:18
  2. [C]Arrays von Strukturen terminieren!
    Von Bexx im Forum C/C++
    Antworten: 2
    Letzter Beitrag: 04.03.09, 15:11
  3. Antworten: 1
    Letzter Beitrag: 29.05.08, 15:53
  4. Antworten: 12
    Letzter Beitrag: 17.01.05, 18:34
  5. Antworten: 0
    Letzter Beitrag: 15.04.04, 22:39