binaeres teilen (funktions-schreibweise)



  • Hallo erstmal! Hab da ein Problem, da ich ein Programm schreiben soll aber nicht dahinter komme, wie 😃 !

    Wertebereich eingeben -> Eingabe von n
    Wertebereich=pow(2,n);

    gesuchte Zahl eingeben:

    Ausgabe nach jeder "Teilung", ob gefunden oder nicht!

    Bsp: gesuchteZahl=5;
    n=4 -> 2^n=16 (=Wertebereich)

    Programm soll folgendes machen:
    gesuchteZahl überprüfun ob größer oder kleiner als 16/2;
    (im Fall gesuchte Zahl=5):
    16/2 - 16/4
    printf("Zahl 0 mal gefunden");
    16/2 - 16/4 + 16/8 - 16/16
    -> = 5
    printf("Zahl 1 mal gefunden");

    Also verallgemeinert: Die Zahl wird geteilt, dann überprüft ob die gesuchteZahl größer, kleiner oder gleich der Zahl enstpricht (bei gleich = Ausgabe bzw. Ergebnis). Falls die Zahl>gesuchteZahl -> Zahl wird nochmals addiert und hinzugezählt.

    Das klingt jetzt alles sehr verwirrend:
    Schema:

    16 ->(16/2) 8
    -> größer: 8 + 4 (=12)
    größer: 8 + 4 + 2 (=14)
    größer: 8+4+2+1 (=15)
    kleiner:8+4+2-1 (=13)

    kleiner:8 + 4 - 2 (=10)
    größer: 8+4-2+1 (=11)
    kleiner:8+4-2-1 (=9)

    -> kleiner: 8 - 4 (4)
    größer: 8 - 4 + 2 (=6)
    größer: 8-4+2+1 (=7)
    kleiner:8-4+2-1 (=5)

    kleiner:8 - 4 - 2 (=2)
    größer: 8-4-2+1 (=3)
    kleiner:8-4-2-1 (=1)

    Das ganze soll in Form einer Funktion geschrieben werden und genau da habe ich dsa Problem! Für jeden Tip, jede noch so kleine Hilfe wäre ich sehr dankbar!

    brni



  • sorry, aber nach 2maligen durchlesen des textes weis ich immernoch nicht, was du machen willst^^

    //edit grammatikalischer Sargnagel entfernt



  • @otze 😃 sorry

    also nochmal:

    (Erklärung anhand eines Beispiels):

    ich gebe Wert für "n" ein ->
    Wertebereich=pow(2,n); // Wertebereich=2^n
    ich gebe eine Zahl ein, die gesucht werden muss: (zb)5

    folgender Lösungsweg soll sein:
    Der Wertebereich wird durch 2 geteilt und dann überprüft, ob er (16/2) größer/kleiner als die zu suchende Zahl ist! Ist sie größer/kleiner, so wird nochmals die Hälfte (16/4)addiert/subtrahiert.
    <- also wird bei jedem Schritt der Nenner mit 2 multipliziert (nächster Wert, der addiert/bzw abgezogen wurde wäre dann 16/8 - weiter 16/16...)

    ... bis die Zahl gefunden wurde! - > Dann Ausgabe!

    vielleicht so 🤡?



  • Hallo,

    du meinst nicht zufällig 'binary sort' ?
    http://www.wachtler.de/informatik_2/node53.html#SECTION00822200000000000000

    MfG



  • EdiRitter schrieb:

    du meinst nicht zufällig 'binary sort' ?

    doch ... danke für den Link



  • Danke für die bisherige Hilfe!

    #include <stdio.h>
    #include <conio.h>
    #include <math.h>
    #include <stdlib.h>

    // Verlinkung zu "teilen"-Funktion
    int teilen();

    // Hauptprogramm
    void main()
    {
    clrscr();
    int iGesucht;
    int iWertebereich;
    int iStart;
    int iEnde;
    int iX;
    int iN;

    printf("n eingeben: ");
    scanf("%d",&iN);
    randomize();
    iWertebereich=pow(2,iN);
    printf("\nDer Wertebereich ist %d groá!", iWertebereich);

    iGesucht=random(iWertebereich);
    printf("\ngesuchte Zahl: %d", iGesucht);

    iX=iWertebereich/2; // iX=2^n/2 -> n= "iN"
    iStart=iWertebereich-iX;

    iEnde=teilen(int iGesucht,int iStart,int iX);

    printf("...: %d", iEnde);
    printf("Startwert: %d", iStart);

    getch();
    }

    // Funktion "teilen"
    int teilen(int iGesucht,int iStart,int iX)
    {
    int iAktuell;
    iAktuell=iStart;

    for(;iAktuell!=iGesucht;)
    {
    printf("Ueberpruefung: iAktuell = %d", iAktuell) ;
    iX=iX/2;

    if(iAktuell<iGesucht)
    {
    iAktuell=iAktuell+iX;
    }
    if(iAktuell>iGesucht)
    {
    iAktuell=iAktuell-iX;
    }

    }
    return(iAktuell);

    }

    Fehler: Expression Syntaxin der Hauptfunktion bei "iEnde=teilen(....);"! arg ich komm nicht drauf 🙂



  • 1. benutz bitte bitte die c++ streams.
    2.
    // Verlinkung zu "teilen"-Funktion
    int teilen();
    iEnde=teilen(int iGesucht,int iStart,int iX)

    wo ist der fehler?^^

    //edit
    3. die ungarische notation is zwar schön und gut, aber nichtmehr wirklich hilfreich 😉



  • 1. hä :D?
    2. ajo ... nach nem kurzen Spaziergang, wurden mir die Augen geöffnet, Danke
    3. ich bin eben noch von der alten Schule </ausredeaus> 🤡



  • brni schrieb:

    1. hä :D?

    bei dir steht das:

    printf("n eingeben: "); 
    scanf("%d",&iN); 
    randomize(); 
    iWertebereich=pow(2,iN); 
    printf("\nDer Wertebereich ist %d groá!", iWertebereich); 
    
    iGesucht=random(iWertebereich); 
    printf("\ngesuchte Zahl: %d", iGesucht); 
    
    iX=iWertebereich/2; // iX=2^n/2 -> n= "iN" 
    iStart=iWertebereich-iX; 
    
    iEnde=teilen(int iGesucht,int iStart,int iX); 
    
    printf("...: %d", iEnde); 
    printf("Startwert: %d", iStart);
    

    bei mir würde das stehen:

    cout<<"n eingeben";
    cin>>iN;
    iWertebereich=iN*iN;//pow is hier echt die kanone auf den spatzen
    cout<<endl<<"der wertebereich ist "<<iWertebereich<<" groß!"<<endl;
    
    randomize();//hier ist randomize übersichtlicher
    iGesucht=random(iWertebereich);
    cout<<"gesuchte Zahl:"<<iGesucht<<endl;
    
    iStart=iWertebereich-iWertebereich/2;//ix kann man sich sparen
    
    cout<<"...:"<<teilen(iGesucht,iStart,iWertebereich/2)
    <<endl<<"Startwert:"<<iStart<<endl;
    


  • @brni
    Zudem solltest du die richtigen Header verwenden, also cmath statt math.h etc.


Anmelden zum Antworten