PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Charles Problem



SaWis1337
30.01.2011, 21:00
drei flaechengleiche, rechtwinklige 3-ecke mit ganzen Seiten

mehrere dieser Paare mit ansteigendem Flächeninhalt in Abhängigkeit wie viele Paare gewünscht.

Ich habe mir diese Aufgabe mehrfach angeschaut, durchgerechnet und komme zu keinem logischem und miteinander Verknüpftem Ergebnis.

Bitte helft mir bei der Lösung.

TobiKa
30.01.2011, 21:07
Ich vertseh dein Problem nicht ganz, die Aufgabenstellung ist doch eindeutig!
Möchtest du jetzt n fertiges Programm präsentiert bekommen oder wie?

SaWis1337
30.01.2011, 21:14
Ich suche seit knappen 3 Tagen nach einem Lösungsansatz und übersehe irgendetwas und ich wollte fragen wo man am besten ansetzt. Ich versteh nämlich nicht ganz wie ich über eine Inkremention von einer Angabe auf eine andere schließen kann bzw. wenn ich mehrere Variablen inkrementiere wie ich die miteinander vergleiche. Also kurz und knapp mir fehlt der Ansatz.

TobiKa
30.01.2011, 21:16
Dann poste doch mal deinen Code, wie du ihn bis jetzt fertig hast.

SaWis1337
30.01.2011, 21:26
Hier ist das Gerüst was ich habe. Wie komme ich denn von dem Ersten Dreieck auf x-weitere die Folgen können? Vor allem weil ich in denen keine Regelmäßigkeit sehe?!

Tut mir leid, wenn ich frage wie ein Neuling, aber ich bin erst seit ca. einem halben Jahr an C dran und alle die in meinem Kurs lernen können mir da noch weniger helfen als ich mir selber.




#include <stdio.h>

main()
{
int a[3]={}, b[3]={}, c[3]={}, n, i=0, flaeche;

printf("Wieviele solche Dreiecke soll das Programm suchen? ");
scanf("%d", &n);

do
{
i++;

printf("\n--%d-------------", i);
printf("\nFlaeche: %d", flaeche);
printf("\nDreieck1 (%d, %d, %d)", a[0], b[0], c[0]);
printf("\nDreieck2 (%d, %d, %d)", a[1], b[1], c[1]);
printf("\nDreieck3 (%d, %d, %d)", a[2], b[2], c[2]);
}while(i!=n);

getch();
}

TobiKa
30.01.2011, 21:31
Benutz bitte die Code Tags, sonst wird es shcnell unübersichtlich.
Dreieck 1, 2 und 3 haben bis auf die Fläche doch garnichts miteinander zu tun, also brauchst du da auch keinen Zusammenhang suchen.

SaWis1337
30.01.2011, 21:46
Alles klar mache ich.
Also muss ich den ersten Wert des Dreieckes in dem Fall mit inkrementiern und den letzten so lange dekrementieren bis dieser mit dem ersten Wert zusammen wieder den Flaecheninhalt ergibt? Richtig?

Wenn das die Lösung dieses Problemes ist habe ich gleich das nächste.
Was haben die folgenden Dreieckspaare für einen Zusammenhang mit dem Ersten? Ich muss ja irgendwie von dem ersten Beispielpaar auf alle folgenden schließen können.

TobiKa
30.01.2011, 21:52
Was haben die folgenden Dreieckspaare für einen Zusammenhang mit dem Ersten? Ich muss ja irgendwie von dem ersten Beispielpaar auf alle folgenden schließen können.
Nochmal, die haben KEINEN zusammenhang.

SaWis1337
30.01.2011, 21:57
Tschludige ich glaub wir reden grad aneinander vorbei.

TobiKa
30.01.2011, 22:01
Nee reden wir nicht.
Also die wollen das so:

Du hast ne Fläche von 1 und guckst ob es dafür drei Lösungen für Dreiecke mit ganzzahligen Seitenlängen gibt.

Gibt es das nicht wird die Fläche um 1 erhöht und es wird wieder geguckt ob es dafür drei Lösungen für Dreiecke mit ganzzahligen Seitenlängen gibt.

Und immer so weiter.

Die erste mögliche Lösung ist halt bei einer Fläche von 840 und die zweite bei 3360.

SaWis1337
30.01.2011, 22:09
Aso okay. Ich probiere mich mit deinem Tipp dran.

Vielen Dank :)

TobiKa
30.01.2011, 22:13
Mach das.

Du musst jetzt nen Algorythmus entwickeln der dir zu einer bestimmten Fläche ein Dreieck findet, welches drei ganzzahlige Seiten hat. Das machst du dann für jede Fläche drei mal.

Der Rest sollte kein Problem sein.

SaWis1337
30.01.2011, 22:30
Alles klar dank dir.
Du hast mir sehr geholfen.

Falls ich noch Fragen habe poste ich sie in nächster Zeit in diesen Thread.

SaWis1337
31.01.2011, 09:30
Hallo noch einmal. Auch so komme ich nicht weiter. Ich hänge in den Schleifen und den Anweisungen darin.

TobiKa
31.01.2011, 09:43
Und wieder gilt, zeig was du bis jetzt hast. Deine Hausaufgaben macht dir hier keiner.
Hast du dir schonmal die Heron'schen Formeln angeschaut?

SaWis1337
31.01.2011, 15:04
Hier mein Code. Wie bereits erwähnt komme ich in den Schleifen an sich nicht weiter. Die Verschachtelung macht mir Probleme.

Ich habe heute unseren Dozenten nach der Aufgabe gefragt und dieser war genau so ratlos, wie ich das komplette Wochenende.



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

main()
{
int a[3]={}, b[3]={}, c[3]={}, n, i=0, A=0;

printf("Wieviele solche Dreiecke soll das Programm suchen? ");
scanf("%d", &n);

do{
i++;
a[0]=0; a[1]=0; a[2]=0;
b[0]=0; b[1]=0; b[2]=0;
c[0]=0; c[1]=0; c[2]=0;

do{
A++;
c[0]=A;

do{
a[0]=a[0]+1;
c[0]=c[0]-1;

if((a[0]*c[0])/2==A)
{
a[1]=a[0];
c[1]=c[0];
do{
a[1]=a[1]+1;
c[1]=c[1]-1;

if((a[1]*c[1])/2==A)
{
a[2]=a[1];
c[2]=c[1];
do{
a[2]=a[2]+1;
c[2]=c[2]-1;

if((a[2]*c[2])/2==A)
{
goto b;
}
}while(c[2]>0);
}
}while(c[1]>0);
}
}while(c[0]>0);


}while((a[0]*c[0])/2!=A && (a[2]*c[1])/2!=A && (a[2]*c[2])/2!=A);

b:;
b[0]=sqrt(pow(c[0],2)-pow(a[0],2));
b[1]=sqrt(pow(c[1],2)-pow(a[1],2));
b[2]=sqrt(pow(c[2],2)-pow(a[2],2));

printf("--%d-------------", i);
printf("Flaeche: %d", A);
printf("%d %d %d", a[0], b[0], c[0]);
printf("%d %d %d", a[1], b[1], c[1]);
printf("%d %d %d", a[2], b[2], c[2]);

}while(i!=n);

getch();
}

SprinterSB
31.01.2011, 18:47
Ganz billig: Nimm das erste Tripel
(15,112,113)
(24,70,74)
(40,42,58)

multipliziere alle Seitenlängen mit 2 --> eine weitere Lösung mit größerem Flächeninhalt

multipliziere alle Seitenlängen mit 3 --> eine weitere Lösung mit größerem Flächeninhalt

usw.

Das findet zar nicht lückenlos alle Möglichkeiten in aufsteigender Reihenfolge, aber das verlangt die Aufgabe auch garnicht :-)

SaWis1337
31.01.2011, 19:24
Auch ne gute Idee eigentlich :D Muss man erstmal drauf kommen ;)

TobiKa
31.01.2011, 21:53
Naja, ich weiss ja nicht wer die Aufgabe kontrolliert, aber ne gute Note dürfte man so nicht bekommen...

SaWis1337
01.02.2011, 04:30
Kontrollieren tut die keiner nur ich wollte die Aufgabe endlich mal gelöst haben, weil ich so lange schon dran hänge.

SaWis1337
01.02.2011, 10:57
Hallo zusammen.

Mittlerweile sieht mein Programmcode so aus:


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

main()
{
int a[3]={}, b[3]={}, c[3]={}, i=0, n, A=0;

printf("Wie viele solche Dreiecke soll das Programm suchen? ");
scanf("%d", &n);

start:;

do{ /* }while(i!=n); */
i++;

do{ /* }while((a[0]*b[0])/2!=A && (a[1]*b[1])/2!=A && (a[2]*b[2])/2!=A); */
A++;

do{ /* }while(b[0]<A); */
b[0]=b[0]+1;
a[0]=0;

do{ /* }while(b[0]>a[0]); */
a[0]=a[0]+1;

if((a[0]*b[0])/2==A)
{
b[1]=b[1]+1;
a[1]=0;

do{ /* }while(b[1]>a[1]); */
a[1]=a[1]+1;

if((a[1]*b[1])/2==A)
{
b[2]=b[2]+1;
a[2]=0;

do{ /* }while(b[2]>a[2]); */
a[2]=a[2]+1;

if((a[2]*b[2])/2==A)
{
goto ausgabe;
}
}while(b[2]>a[2]);
}
}while(b[1]>a[1]);
}
}while(b[0]>a[0]);

ausgabe:;

if((a[0]*b[0])/2==A && (a[1]*b[1])/2==A && (a[2]*b[2])/2==A)
{
c[0]=sqrt(pow(a[0],2)+pow(b[0],2));
c[1]=sqrt(pow(a[1],2)+pow(b[1],2));
c[2]=sqrt(pow(a[2],2)+pow(b[2],2));

if((int)a[0]==a[0] && (int)a[1]==a[1] && (int)a[2]==a[2] && (int)b[0]==b[0] && (int)b[1]==b[1] && (int)b[2]==b[2] && (int)c[0]==c[0] && (int)c[1]==c[1] && (int)c[2]==c[2])
{
printf("\n\n--%d-------------", i);
printf("\nFlaeche: %d", A);
printf("\nDreieck1 (%d, %d, %d)", a[0], b[0], c[0]);
printf("\nDreieck1 (%d, %d, %d)", a[1], b[1], c[1]);
printf("\nDreieck1 (%d, %d, %d)", a[2], b[2], c[2]);
}
}

else
{
goto start;
}

}while(b[0]<A);
}while((a[0]*b[0])/2!=A && (a[1]*b[1])/2!=A && (a[2]*b[2])/2!=A);
}while(i!=n);

getch();
}

Und ich habe immernoch keinen blassen Schimmer was ich falsch mache.
Bitte um hilfreiche Tipps was den Quellcode angeht. Bin wie gesagt noch ziehmlich frisch in Sachen C.

Vielen Dank :)

TobiKa
01.02.2011, 11:02
Ist dein Code wirklich so formatiert?! Wenn ja dann ist es kein wunder wenn du nciht mehr durch blickst.
Muss jetzt gleich leider zur Arbeit, werd mich der Sache heute Nacht mal annehmen.

SaWis1337
01.02.2011, 11:30
Nein so ist es nicht formatiert es hätte sonst hier noch ekelhafter ausgesehen. Vielen Dank dass du mal drauf schaust :)

TobiKa
01.02.2011, 23:28
So, hab jetzt mal was programmiert.
Ich denke es ist alles nachvollziehbar...

Das Programm ermittelt ganzzahlige Hypothenusen zu Kathetenlängen von 1 - 200, ist die Hypothenuse ganzzahlig wird geprüft ob die Fläche auch ganzzahlig ist, wenn ja wird alles ausgegeben.
Die Beispiele aus der Aufgabe kommen jedenfalls drin vor.

Jetzt muss nur noch zu Paaren sortiert werden...

Hoffe ich habe da keinen Denkfehler drin, bin grad etwas müde.



float fhypo=0;
int ihypo=0;

float fflaeche=0;
int iflaeche=0;

int ix=1;
int iy=1;


while(ix<201)
{
while(iy<201)
{
fhypo = sqrt((float)(ix*ix)+(iy*iy)); //hypothenuse errechnen
ihypo = (int)fhypo;

if((fhypo-ihypo) == 0) //prüfen ob hypothenuse eine ganzzahl ist
{
fflaeche = (float)(ix * iy / 2); //fläche errechnen
iflaeche = (int)fflaeche;

if((fflaeche-iflaeche) == 0) //prüfen ob fläche eine ganzzahl ist
{
printf("%d\t%d\t%d\t%d\n", ix, iy, ihypo, iflaeche);
}
}

iy++;
}

iy=1;
ix++;
}

SaWis1337
02.02.2011, 08:54
Hey vielen Dank die richtigen Werte finden sich dort wieder. Gibt es eine C Funktion mit der man Werte nach Größe sortiert bzw nur den größten Wert übernimmt? Dann könnte man doch die Werte in Arrays abspeichern und vergleichen oder? Wo kommen den die ganzen anderen Werte her? Da stehen z.B. mehrere Werte für iy, ihypo und iflaeche bei ix=15. Liegt das an den Bedingungen?

TobiKa
02.02.2011, 09:37
Wo kommen den die ganzen anderen Werte her? Da stehen z.B. mehrere Werte für iy, ihypo und iflaeche bei ix=15. Liegt das an den Bedingungen?
Das liegt daran das es viel mehr Dreiecke mit ganzzahligen Katheten, Hypothenuse und Fläche gibt, ind einer Aufgabe werden aber nur die berücksichtigt, von denen es mindestens drei zu einer Fläche gibt.

SaWis1337
02.02.2011, 09:55
Aso ok hast du eine Idee wie man dir mit dem gleichen Flächeninhalt rausfiltern kann? Würde die Werte in Arrays schreiben und vergleichen. Aber wie soll man das genau umsetzen?

TobiKa
02.02.2011, 10:07
Naja das in das Array schreiben ist doch kein Ding, und dann stumpf das Array jedesmal komplett durchlaufen und die selben raussuchen.
Nicht besoinders schick, aber fürn Anfang...

SaWis1337
02.02.2011, 10:10
Was wäre denn schicker? ;)

TobiKa
02.02.2011, 10:14
Du bist nicht wirklich n Tüfftler oder?!
Was hättest du für ne Idee das Problem zu lösen?

SaWis1337
02.02.2011, 14:50
Naja eigentlich schon, nur mir fällt nix ein außer die Sache mit den Arrays.

TobiKa
02.02.2011, 15:38
Es gibt verschiedene Funktionen zum sortieren. Selbst benutzt hab ich bisher nur BubbleSort,kannst es dir ja mal angucken.
Man kann aber auch anders vorgehen, ich bastel heute Nacht nochmal ne Runde dran rum.

SaWis1337
02.02.2011, 17:26
Ich schau mir das ganze auch nochmal an.
Wenn ich eine Lösung gefunden habe lasse ich dich das Wissen.
Sag bescheid wenn du was findest.

TobiKa
02.02.2011, 23:53
Es hat mich gereizt, deshalb hab ichs jetzt doch gemacht...
Hab einen BubbleSort ähnlichen Sortieralgorythmus implementiert:



float fhypo=0;
int ihypo=0;

float fflaeche=0;
int iflaeche=0;

int ix=1;
int iy=1;

int izaehler=0;
int ifertig=0;

int ergebnisse[400][4];
int ergebnissetemp[1][4];


while(ix<201)
{
while(iy<201)
{
fhypo = sqrt((float)(ix*ix)+(iy*iy)); //hypothenuse errechnen
ihypo = (int)fhypo;

if((fhypo-ihypo) == 0) //prüfen ob hypothenuse eine ganzzahl ist
{
fflaeche = (float)(ix * iy / 2); //fläche errechnen
iflaeche = (int)fflaeche;

if((fflaeche-iflaeche) == 0) //prüfen ob fläche eine ganzzahl ist
{
ergebnisse[izaehler][0]=ix;
ergebnisse[izaehler][1]=iy;
ergebnisse[izaehler][2]=ihypo;
ergebnisse[izaehler][3]=iflaeche;

izaehler++;
}
}

iy++;
}

iy=1;
ix++;
}

while(!ifertig)
{
ifertig=1;

for(int l=0; l<izaehler; l++)
{
if(ergebnisse[l][3]>ergebnisse[l+1][3])
{
ergebnissetemp[0][0]=ergebnisse[l][0];
ergebnissetemp[0][1]=ergebnisse[l][1];
ergebnissetemp[0][2]=ergebnisse[l][2];
ergebnissetemp[0][3]=ergebnisse[l][3];

ergebnisse[l][0]=ergebnisse[l+1][0];
ergebnisse[l][1]=ergebnisse[l+1][1];
ergebnisse[l][2]=ergebnisse[l+1][2];
ergebnisse[l][3]=ergebnisse[l+1][3];

ergebnisse[l+1][0]=ergebnissetemp[0][0];
ergebnisse[l+1][1]=ergebnissetemp[0][1];
ergebnisse[l+1][2]=ergebnissetemp[0][2];
ergebnisse[l+1][3]=ergebnissetemp[0][3];

ifertig=0;
}
}
}

for(int s=0; s<izaehler; s++)
printf("%d\t%d\t%d\t%d\n", ergebnisse[s][0], ergebnisse[s][1], ergebnisse[s][2], ergebnisse[s][3]);

getchar();
return 0;
}

SaWis1337
03.02.2011, 04:54
Das ist auch eine gute Methode so hat man auf jedenfall die, die mindestens 2 mal vorkommen. Jetzt ist es nur daran das ganze für die, die 3 mal vorkommen abzufrage richtig?

SaWis1337
03.02.2011, 14:04
So es läuft ;) Vielen Dank es hat Spaß gemacht :)
Hier der Quellcode.


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

main()
{
int i = 0;
int n;

float fhypo = 0;
int ihypo = 0;

float fflaeche = 0;
int iflaeche = 0;

int ix = 1;
int iy = 1;

int izaehler = 0;
int ifertig = 0;

int ergebnisse[400][4];
int ergebnissetemp[1][4];

printf("Wie viele rechtwinklige und flaechengleiche Dreiecke soll das Programm suchen? ");
scanf("%d", &n);

do
{
do
{
fhypo = sqrt((float)(ix*ix)+(iy*iy));
ihypo = (int)fhypo;

if((fhypo-ihypo) == 0)
{
fflaeche = (float)(ix * iy / 2);
iflaeche = (int)fflaeche;

if((fflaeche-iflaeche) == 0)
{
ergebnisse[izaehler][0] = ix;
ergebnisse[izaehler][1] = iy;
ergebnisse[izaehler][2] = ihypo;
ergebnisse[izaehler][3] = iflaeche;

izaehler++;
}
}

iy++;
}while(iy < 250);

iy = 1;
ix++;
}while(ix < 250);

do
{
ifertig = 1;
int l;
for(l=0; l<izaehler; l++)
{
if(ergebnisse[l][3] > ergebnisse[l+1][3])
{
ergebnissetemp[0][0] = ergebnisse[l][0];
ergebnissetemp[0][1] = ergebnisse[l][1];
ergebnissetemp[0][2] = ergebnisse[l][2];
ergebnissetemp[0][3] = ergebnisse[l][3];

ergebnisse[l][0] = ergebnisse[l+1][0];
ergebnisse[l][1] = ergebnisse[l+1][1];
ergebnisse[l][2] = ergebnisse[l+1][2];
ergebnisse[l][3] = ergebnisse[l+1][3];

ergebnisse[l+1][0] = ergebnissetemp[0][0];
ergebnisse[l+1][1] = ergebnissetemp[0][1];
ergebnisse[l+1][2] = ergebnissetemp[0][2];
ergebnisse[l+1][3] = ergebnissetemp[0][3];

ifertig = 0;
}
}
}while(ifertig != 1);

again:;

int s;

do
{
s++;
if(ergebnisse[s][3] == ergebnisse[s-1][3] && ergebnisse[s][3] == ergebnisse[s-2][3] && i<n-1)
{
i++;
printf("\n--%d-------------", i);
printf("\nFlaeche: %d", ergebnisse[s][3]);
printf("\nDreieck1 (%d, %d, %d)", ergebnisse[s-2][0], ergebnisse[s-2][1], ergebnisse[s-2][2]);
printf("\nDreieck2 (%d, %d, %d)", ergebnisse[s-1][0], ergebnisse[s-1][1], ergebnisse[s-1][2]);
printf("\nDreieck3 (%d, %d, %d)\n", ergebnisse[s][0], ergebnisse[s][1], ergebnisse[s][2]);
s=s+2;
goto again;
}

else if (ergebnisse[s][3] == ergebnisse[s-1][3] && ergebnisse[s][3] == ergebnisse[s-2][3] && i == n-1)
{
i++;
printf("\n--%d-------------", i);
printf("\nFlaeche: %d", ergebnisse[s][3]);
printf("\nDreieck1 (%d, %d, %d)", ergebnisse[s-2][0], ergebnisse[s-2][1], ergebnisse[s-2][2]);
printf("\nDreieck2 (%d, %d, %d)", ergebnisse[s-1][0], ergebnisse[s-1][1], ergebnisse[s-1][2]);
printf("\nDreieck3 (%d, %d, %d)\n", ergebnisse[s][0], ergebnisse[s][1], ergebnisse[s][2]);
break;
}

}while(s < izaehler-1);

getch();
}

TobiKa
05.02.2011, 12:54
Simpel aber ausreichend!
Nur für das goto gehörst du eigentlich gehauen!