Erklärung eines Programms

BasicC

Erfahrenes Mitglied
Hi Leute ,

hab eine Frage ich würde gerne wissen wie dieses Programm läuft wie ich die einzelnen Werte berechne.

C:
#include <stdio.h>



int main ()

{

    int i = 0;

    int n = 21;

    while ( n > 2 ) {

        if ( n % 2 != 0 )

            n /= 2;

        else n = n * 3 - 5;

        i++;

        printf("%2d: %2d\n",i,n);

    }

    return 0;

}
C:
#include <stdio.h>



int main ()

{

    int i = 0;

    int n = 42;

    while ( n > 2 ) {

        if ( n % 3 == 0 )

            n /= 2;

        else n = ( n - 1) * 2;

        if ( n % 4 == 0 ) continue;

        i++;

        printf("%2d: %2d\n",i,n);

    }

    return 0;

}

Einfach nur eine kurze Erklärung der Berechnung von beiden Codes
wäre sehr lieb
danke.
 
Zuletzt bearbeitet:

cwriter

Erfahrenes Mitglied
Einfach nur eine kurze Erklärung der Berechnung von beiden Codes
wäre sehr lieb
Wäre es sicher. Bekommst du aber auch sicher nicht.
Ich gebe dir eine Anleitung und führe es am Beispiel des ersten Codes aus. Den zweiten machst du selbst.

Zuerst die Initialisierung:
int i = 0;
int n = 21;

Dann führt das Programm folgende Schritte aus:

Code:
1. Falls n > 2:
    Falls n ungerade:
        n = n / 2
    sonst (falls n gerade)
        n = n * 3 -5

    i = i + 1

    Ausgabe(i, n)
    gehe zu 1.
sonst
    Ende

Nun siehst du schon, dass i für die Berechnung eigentlich irrelevant ist, sondern nur für die Ausgabe eine Bedeutung hat (i kommt sonst nirgends vor).

Dann kannst du den Code Schritt für Schritt durchgehen:

Code:
n = 21

n == 21
n > 2 ? => Ja
    n ungerade ? => Ja
        n = n / 2 = 10 (Abrundung!)
    gehe zu 1.
n == 10
n > 2 ? => Ja
    n ungerade ? => Nein
        n = n * 3 - 5 = 25
    gehe zu 1

n == 25
n > 2 ? => Ja
    n ungerade ? => Ja
        n = n / 2 = 12
    gehe zu 1

n == 12
n > 2 ? => Ja
    n ungerade ? => Nein
        n = n * 3 - 5 = 31
    gehe zu 1.

n == 31
n > 2 ? => Ja
    n ungerade ? => Ja
        n = n / 2 = 15
    gehe zu 1

n == 15
n > 2 ? => Ja
    n ungerade ? => Ja
        n = n / 2 = 7
    gehe zu 1

n == 7
n > 2 ? => Ja
    n ungerade ? => Ja
        n = n / 2 = 3
    gehe zu 1

n == 3
n > 2 ? => Ja
    n ungerade ? => Ja
        n = n / 2 = 1
    gehe zu 1

n == 1
n > 2 ? => Nein
    Ende.

Entsprechend wird die Ausgabe sein:
0: 10
1: 25
2: 12
3: 31
4: 15
5: 7
6: 3
7: 1

Die Folge ist relativ schwierig vorauszusehen (was der Sinn dieser Übung sein dürfte).
Einzig offensichtlich ist, dass ein gerades n immer auf ein n: n % 6 == 1 gebracht wird (n gerade mal 3 => durch 6 teilbar, -5 => Rest 1).

Den Zweiten Code darfst du nun selbst nach diesem Schema durchgehen.

(Ich würde andere Forummitglieder bitten, die Lösung nicht zu servieren, da Tikorz eine gewisse Lernfaulheit an den Tag legt, die zu fördern sehr abträglich wäre).

Gruss
cwriter
 

cwriter

Erfahrenes Mitglied
Dieses falls n ungerade wie findet man dies heraus ? durch diese Zeichen != ?
Wir hatten das ja schon ein paar Mal, aber: GRUNDLAGEN!
!= heisst nur "ungleich", a != b ist also dasselbe wie !(a == b). (Zumindest in C)
Eine Zahl ist ungerade, wenn sie nicht durch 2 teilbar ist. Und eine Zahl ist nicht durch 2 teilbar, wenn eine Division durch 2 einen Rest von 1 gibt (einen grösseren Rest kann es nicht geben).
Umgekehrt ist eine Zahl gerade, wenn sie durch 2 teilbar ist, es also keinen Rest gibt.

In C ist die Operation, die den Rest bestimmt ("modulo"), mit '%' dargestellt.

Also z.B.

In Mathe:
5 / 2 = 2 Rest 1
In C:
5 / 2 = 2
5 % 2 = (Rest) 1 = 1

(2 * 2 + 1 = 5) <- Umkehrung

Bei diesem Code wird nun if( n % 2 != 0) geprüft, also eigentlich if(n % 2 == 1). Und das heisst: Falls n ungerade ist.

Gruss
cwriter
 

BasicC

Erfahrenes Mitglied
Ich habe dasselbe angewandt und bin beim zweiten stehen geblieben
ich hab 0: 21
1: 18
2: hätte ich 34 aber ich denke dies ist falsch 18 gerade somit ?
 

BasicC

Erfahrenes Mitglied
Also bei der 21 wird ja /2 geteilt dann kommt 10 raus. 10 ist gerade wird da nicht dann die else funktion ausgeführt?