Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » kreistest

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
17.11.2005, 20:17 Uhr
Blaufusstoelpel



Hallo,

ich hab ein ähnliches Problem wie der Autor des Primfaktorzerlegungsthreads. Ich soll ein Programm schreiben, das alle Punkte in einem x,y-Koordinatensystem ausgibt, die innerhalb eines Kreises mit dem Radius r liegen. Der Mittelpunkt des Kreises liegt auf (0,0).

cond.h hat die Form: #define cond(a,b,c) (a ? b : c)
a entspricht if, b then und c else.

Schleifen dürfen nicht verwendet werden.

Ich dachte mir jetzt, fang bei (0,0) an zu testen, wenn der Punkt drin liegt, erhöhe den Zähler und y. Wenn nicht, setze y=0 und erhöhe x (erneuter Test).

Leider hab ichs, glaub ich, mit dem rekursivem Aufruf nicht so drauf


C++:
#include <cstdlib>
#include <iostream>
#include "cond.h"


using namespace std;
int n;

int kreistest ( int x, int y, int radius)
{
    
    return cond(x*x+y*y<=radius*radius, (kreistest(x, y++, radius), n=n+1),
            kreistest(x,y++,radius));
}

int ausgabe (int n)
{
    return n=n*4;
}

int jein (int x, int y, int radius)
{
    
    return cond(x && y < radius, cond( y < radius, kreistest(x,y, radius),
                kreistest(x++, y=0, radius)), ausgabe(n));
}

int main(int argc, char *argv[])
{
    cout << jein(0,0,4) << endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}



Ich hoffe mal, dass ihr mir weiter helfen könnt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.11.2005, 09:53 Uhr
imhotep
followed the white rabbit


Im Prinzip musst du doch nur testen, ob ein Punkt in einem Viertelkreis liegt und kannst dann Aussagen treffen über die anderen Viertelkreise, in dem du einfach die Vorzeichen der Koordinaten vertauschst. Wenn nun also der Punkt (1;2) im Viertelkreis ist, so ist auch (-1;2), (-1;-2) und (1;-2) im Kreis. (Genau genommen reicht es sogar nur einen Achtelkreis zu testen und dann x und y zu vertauschen)

Was du machen kannst ist eine Art Füllungsungsproblem. Was du ja auch schon angedacht hast. Einfach zu testen ob der Punkt drin ist, wenn ja den Nachbarn sich testen lassen.

Deine Ausgabe ist aber noch nicht ganz richtig, weil du musst nicht das Ergebnis von jein ausgeben, sondern immer, wenn du einen Punkt gefunden hast.


C++:
#include <cstdlib>
#include <iostream>
#include "cond.h"


using namespace std;
int n; // wozu ist der gut?

int kreistest ( int x, int y, int radius) // nur testen, nix mit Rekursion
{
   cond(x*x+y*y<=radius*radius,
          return 1,
          return 0);
}

void ausgabe (x, y) //Ausgabe der Koordinatenvarianten
{
    cout << x << "," << y << ", ";
    cout << x << "," << -y << ", ";
    cout << -x << "," << y << ", ";
    cout << -x << "," << -y << endl;
}

int jein (int x, int y, int radius) // die eigentliche Rekursive Funktion
{
    if ( x <= radius ) //Abbruchbedingung
             cond (kreistest(x, y, radius) == 1, // test ob im Kreis
                      (ausgabe(x,y), jein(x, y++, radius) ), //wenn ja, x&y ausgeben und weiter
                      jein(x++,0,radius)); //wenn nicht neue Zeile
}

int main(int argc, char *argv[])
{
    cout << "Koordinaten sind: ";
    jein(0,0,4); // Initalisierung
    system("PAUSE");
    return EXIT_SUCCESS;
}


Hab die jetzt nicht auf Funktion getestet, aber hoffe das hilt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: