Supportnet Computer
Planet of Tech

Supportnet / Forum / Anwendungen(Java,C++...)

Verständnisfrage Studium (Java programmieren)





Frage

Ich habe hier in meinen Studium ne Aufgabe bekommen, die ich nicht ganz verstehe. Mir geht es jetzt nicht um die Java Lösung, sondern nur darum, was hier eigentlich zu machen ist. Folgende Aufgabe: Schreiben Sie ein Programm, das die in dem nachfolgendem Körper T liegenden Gitterpunkte mit ganzzahligen Koordinaten i, j, k ausgibt. Je Zeile wird ein Punkt (i,j,k) ausgegeben. Die Punkte sollen entsprechend der Relation "<=" in aufsteigender Reihenfolge ausgegeben werden. Die Gitterpunkte dürfen innherhalb von T und damit auch auf begrenzenden Flächen von T liegen. Die ganzzahlige Würfellänge n , 0<=n, ist Eingabe in das Programm. a) lexikographische Ordnung: (i1, j1, k1) <= (i2, j2, k2) genau dann, wenn (i1<i2) oder ((i1=i2) und (j1<j2)) oder ((i1=i2) und (j1=j2) und (k1<=k2)) b) T ist ein Teil eines Würfels mit Kantenlänge n. T ist der Tetraeder, der durch die Eckpunkte (0,0,0), (n,0,0), (n,n,0), (n,0,n) gebildet wird. Kann mir jemand die Aufgabe erklären? Ich brauch keine technische erklärung, wenn ich weiß, wie es geht, kann ich es selbst programmieren

Antwort 1 von disco

moin

bin mir nicht ganz sicher welche punkte du da ausgeben musst, aber ich denke mal da da nix davon steht, sollst du alle gitterpunkte des körpers ausgeben.

ein körper (hier ein würfel) lässt sich durch die höhe,breite und tiefe beschreiben. in deinem fall i,j,k.

du musst nun ein prog schreiben in dem du die kantenlänge des würfels angeben kanst und dir dann alle punkte in dem würfel ( im abstand von 1) ausgegeben werden.

bsp mit kantenlänge 1:

hier hast du einen einfachen würfel in der länge der grundeinheit 1, so das es insg. 8 punkte (4 unten und 4 oben) gibt, die die ausmasse des würfels beschreiben. (kannst es dir ja auch mal in einem kooridnatensystem aufmalen):

unten:
1,1,1
1,2,1
2,1,1
2,2,1
oben:
1,1,2
1,2,2
2,1,2
2,2,2

das ist natürlich nur für den würfel mit der kantenlänge 1, die menge der möglichen koordinaten steigt da exponentiell zur kantenlänge, dewegen war ich schon zu faul die koordinaten für die kantenlänge 2 aufzuschreiben.

du musst jetzt halt nen algorithmus schreiben der dir die koordinaten (in der gewünschten reihenfolge geordnet) für einen würfel und nen tetraeder ausgibt.

g,
disco

Antwort 2 von disco

moin

mir ist gerade wieder eingefallen, dass man ja in enem koordinatensystem bei 0 anfäng (ist alles schon ein bisschen her). musst also bei 0,0,0 angangen und nicht bei 1,1,1.

hast bis jetzt trotzdem geholfen es zu verstehen?

g,
disco

Antwort 3 von TheRealWhistler

Hallo,

wenn ich die Aufgabe richtig interpretiert habe ist es einfacher als es klingt. Zuerst musst du die Menge aller ganzzahligen Koordinaten bilden und in einer Liste (z.B: in einem eindimenstionalem Array) ablegen. Z.B. in einer 3 Fach geschachtelten schleife. wobei i, j und k ganzahlig von 0 bis n zählen. Die Anzahl aller Punkte ist ((int)n * (int)n * (int)n): (Die mathematischen Spielereien wie z.B. rotation, brauchst du nicht, da der würfel im Koordinatenursprung verankert ist.)

Gegeben:
double n = ???; (Welches den Würfel T präsentiert)


Lösungsanzatz:


class Punkt
{
    double x, y, z;

    public Punkt ( double x, double y, double z)
    {
      x = aX; y = aY; z = aZ;
    }
}


Jetzt sortierst du, wie gefordert, die Menge aller ganzzahligen Punkte im Würfel T


int i, j, k;
Punkt [] liste = new Point[((int)n * (int)n * (int)n)+1];
Punkt tmp;
int anzahlPunkte = 0;

for( i = 0; i < (int)n; i++)
{
   for( j = 0; j < (int)n; j++)
   {
      for( k = 0; k < (int)n; k++)
      {
       liste[anzahlPunkte] = new Punkt( i, j, k);
       anzahlPunkte++;
      }
   }
}

// jetzt sortieren mit Bubblesort (ist zwar langsam,
// aber einfach)

for(int obergrenze = anzahlPunkte-1;obergrenze > 0;--obergrenze)
   {
      for( int pos = 0;pos < obergrenze; ++pos)
      {
         // Punkt liste[pos] größer als Punkt liste[post + 1] ??
         if(  ((liste[pos].x <  liste[ pos + 1].x) || 
              (liste[pos].x = liste[ pos + 1].x &&  liste[pos].y < liste[ pos + 1].y) ||
              (liste[pos].x = liste[ pos + 1].x &&  liste[pos].y = liste[ pos + 1].y && liste[pos].z < liste[ pos + 1].z)) == false ) 
         {
            // Ja dann tausch!
            tmp = liste[pos];
            liste[pos] = liste[pos + 1];
            liste[pos + 1] = tmp;
         }
      };
   };

 




Fertig :-)

Ich habe die Codefragmente zwar nicht getestet... müsste aber funktionieren.

Ciao

Andreas (www.codinghelp.de)

Antwort 4 von TheRealWhistler

Ich bins nochmal,

leider hat der Programmcode nicht mit dem BCode
"code"

eingerückt, schade.

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: