SaschaL Geschrieben 7. November 2005 Geschrieben 7. November 2005 Ihr Programm soll drei ganzzahlige Werte durch den Nutzer abfragen, die für die Seitenlängen eines Dreiecks stehen sollen. Für diese drei Werte a, b, und c werden dann folgende Überprüfungen durchgeführt: Wenn einer der drei Werte nicht größer als Null ist oder aus den Seiten kein Dreieck konstruiert werden kann, erhält der Nutzer einen Hinweis auf das jeweilige Problem. Falls aus den Werten ein Dreieck konstruiert werden kann, werden die Eigenschaften „ist gleichschenklig“ (zwei Seiten gleich lang), „ist gleichseitig“ (alle Seiten gleich lang), „ist rechtwinklig“ (einer der drei Winkel des Dreiecks beträgt 90°) ausgegeben. Das Programm soll solange drei Werte vom Nutzer abfragen, bis er „0 0 0“ eingibt, nutzen Sie zum Einlesen scanf("%d %d %d",<hier folgen Ihre Variablen>). Das Programm soll sinnvoll in Funktionen zerlegt werden. Kann mir jemadn dabei helfen? Vielen dank im vorraus Sascha Zitieren
Guybrush Threepwood Geschrieben 7. November 2005 Geschrieben 7. November 2005 Wie soll denn aus den 3 Zahlen ein Dreieck generiert werden? Womit genau hast du Probleme? Zitieren
bascaro Geschrieben 7. November 2005 Geschrieben 7. November 2005 n paar if sätze 3 Funktionen: 1. SubGleichLang 2. SubGleichSchenkel 3. SubRechtwinkel Speichere die 3 Werte in Arrays, so wirds mit dem vergleichen der ersten beiden Funktionen leichter 1. machst am besten über For schleifen (hier sind die Arrays schonma im vorteil) 2. hier auch einfach mit hilfe von If abfragen und TempVariablen 3. Des geht am besten übern Phytagoras (hoffe hab das richtig geschrieben) Bin jetzt auch noch nicht so vertraut mit C++ aber ich hoffe, konnte dir schon bischen Ideen geben ich geh mal davon aus, dass noch ein winkel eingegeben werden soll? denn wenn ja..., eine Math Bibiothek existiert und somit kannste übern cos oder sin ganz izy das ergebnis rausbekommen Zitieren
Guybrush Threepwood Geschrieben 7. November 2005 Geschrieben 7. November 2005 3. Des geht am besten übern Phytagoras (hoffe hab das richtig geschrieben) Argh stimmt, hab das mit den Seitenlängen überlsen und an Koordinaten der Ecken und so gedacht:rolleyes: Zitieren
SaschaL Geschrieben 8. November 2005 Autor Geschrieben 8. November 2005 so jabe das jetzt bisshen angefangen zu programmieren. aber komme da jetzt nich weiter hier der code: #include<stdio.h> void eingabe(int *seitea, int *seiteb, int *seitec) { printf("Bitte die Seiten eingeben, Abbruch mit 0 0 0: "); fflush(NULL); scanf("%d %d %d",seitea,seiteb,seitec); } void pruefe(int *seitea, int *seiteb, int *seitec) { if((*seitea <=0) || (*seiteb <=0) || (*seitec <=0)) { printf("Nur positive Werte!\n"); eingabe(seitea,seiteb,seitec); } } int main(void) { int seitea; int seiteb; int seitec; while ((seitea !=0) && (seiteb !=0) && (seitec !=0)) { eingabe(&seitea,&seiteb,&seitec); pruefe(&seitea,&seiteb,&seitec); } return 0; } habe da jetzt ne endlosschleife drinne möchte nach der eingabe halt kntrollieren ob eine der eingebeben seiten =0 ist und das man die dann neu eingibt. weiß aber nich wie das jetzt genau machen soll. da hängts grade mit der funktion prufe. vllt kann mir ja jemand helfen. Zitieren
sad_dragon Geschrieben 9. November 2005 Geschrieben 9. November 2005 Mein Vorschlag wäre folgender: while ((seitea ==0) && (seiteb ==0) && (seitec ==0)) { ... } mit dem == überprüfst du ob ob seiteX gleich 0 ist. mfg dragon Zitieren
Manfred.Becker Geschrieben 9. November 2005 Geschrieben 9. November 2005 Hi SaschaL, du musst genauso prüfen wie in deiner Funktion pruefe() while ((seitea <=0) || (seiteb <=0) || (seitec <=0)) { eingabe(&seitea,&seiteb,&seitec); pruefe(&seitea,&seiteb,&seitec); } [/PHP] Zitieren
SaschaL Geschrieben 9. November 2005 Autor Geschrieben 9. November 2005 das hab ich ja aber das funktioniert anscheinden nicht die überprüfung so wie ich sie im mom haben is nich ganz korrekt :(aber wießnich wie dsa sonst machen soll Zitieren
Manfred.Becker Geschrieben 9. November 2005 Geschrieben 9. November 2005 Hi, ich hab gerade gesehen, dass deine Funktion pruefe() nicht nur prüft, sondern auch in Fehlerfall eine neue Eingabe erwartet. Das solltest du nicht machen. Die Eingabe wird doch eh in der While-Schleife gemacht. Das einzige was jetzt noch fehlt, ist die Abbruch-Bedingung zu prüfen. Das machst du am besten in der While-Schleife direkt nach der Eingabe. Zitieren
SaschaL Geschrieben 9. November 2005 Autor Geschrieben 9. November 2005 also in der eingaeb überprüufen ob die werte ==0 sind, meinste? Zitieren
SaschaL Geschrieben 9. November 2005 Autor Geschrieben 9. November 2005 irgendwie geht gard gar nix mehr bei mir. möchte doch nur überprüfen ob die eingebene seiten 0 sind wenn ja soll der sagen das es größer als 0 sien soll udn das das dann eingebene wird Zitieren
TDM Geschrieben 9. November 2005 Geschrieben 9. November 2005 bool eingabe(int& seitea, int& seiteb, int& seitec) //& -> Alias; Zeiger sind Referenzübergaben zu gefährlich... { printf("Bitte die Seiten eingeben, Abbruch mit 0 0 0: "); fflush(NULL); scanf("%d %d %d",&seitea,&seiteb,&seitec); if (seitea != 0 && seiteb != 0 && seitec != 0) //prüfen ob alle 0 return true;//wenn alle 0 sind true -> false <- kein neuer Schleifendurchlauf if (seitea != 0 || seiteb != 0 || seitec != 0) //prüfen ob eine 0 { printf("Falsche Eingabe"); return false; //wenn 0 ist gebe false zurück (wird dann true <- normal Schleife durchlaufen) } return true; //ansonsten true -> false <- kein neuer Schleifendurchlauf } int main(void) { int seitea; int seiteb; int seitec; bool Abbruch = false; while (!Abbruch) //Negation { Abbruch = eingabe(seitea,seiteb,seitec); } return 0; } theoretisch könnte man in der Eingabefunktion auch mit XOR arbeiten aber ich wollte dich nicht komplett verwirren *g* Es sind nur die Grundgedanken kommentiert - wenn du also fragen hast - frag Zitieren
SaschaL Geschrieben 9. November 2005 Autor Geschrieben 9. November 2005 ja wie würd das denn mit XOR aussehen das würd mich interessierertn noch. und was is mit beenden des programms mit 0 0 0? wie bekomme dsa hin? Zitieren
TDM Geschrieben 9. November 2005 Geschrieben 9. November 2005 oops was falsch gemacht: if (seitea == 0 && seiteb == 0 && seitec == 0) //prüfen ob alle 0 return true;//wenn alle 0 sind true -> false <- kein neuer Schleifendurchlauf if (seitea == 0 || seiteb == 0 || seitec == 0) //prüfen ob eine 0 { printf("Falsche Eingabe"); return false; //wenn 0 ist gebe false zurück (wird dann true <- normal Schleife durchlaufen) } return true; //ansonsten true -> false <- kein neuer Schleifendurchlauf hab != und == verwechselt Zitieren
SaschaL Geschrieben 9. November 2005 Autor Geschrieben 9. November 2005 ja ok. und was is mim beenden des programms mit der eingabe 0 0 0?? Zitieren
TDM Geschrieben 9. November 2005 Geschrieben 9. November 2005 also... wenn du 3 mal 0 eingibst springt er in den Zweig: if (seitea == 0 && seiteb == 0 && seitec == 0) //prüfen ob alle 0 return true;//wenn alle 0 sind true -> false <- kein neuer Schleifendurchlauf dadurch bekommt die Variable Abbruch den Wert true da in der Schleifenbedinung eine Negation (true -> false; false -> true) ist, wird dieser Ausdruck als false gewertet Ergebnis - er springt nicht noch mal in die Schleife und beendet (in dem Fall) das Programm Zitieren
SaschaL Geschrieben 9. November 2005 Autor Geschrieben 9. November 2005 acsho ok danke schonmal soweit. dann werd das mal weiter machen noch mit den dreickcken prüfuen... wenn nich meld mich wieder Zitieren
SaschaL Geschrieben 10. November 2005 Autor Geschrieben 10. November 2005 und wie kann ich das ohen bool machen einfach mit funktionen und if anweisungen??? Zitieren
TDM Geschrieben 10. November 2005 Geschrieben 10. November 2005 du brauchst theorethisch auch garkeine funktion... aber du kannst auch schreiben while(!eingabe(seitea,seiteb,seitec)); leere schleifen sind allerdings nicht so mein fall... Zitieren
SaschaL Geschrieben 10. November 2005 Autor Geschrieben 10. November 2005 kannst du mir das mit dem bool abbruch mal erklaren?????? und der negation davon?? da komm nich ganz drauf. Zitieren
SaschaL Geschrieben 10. November 2005 Autor Geschrieben 10. November 2005 so habe das jetzt soweit programmiert doch jetzt hab ich noch einen Fehler der beended bei mir das Programm mit 0 0 0 nicht und ich weiß nicht wieso hier der code: #include<stdio.h> void eingabe(int *a, int *b, int *c) { printf("Bitte die Seiten eingeben, Abbruch mit 0 0 0: "); fflush(NULL); scanf("%d %d %d",a,b,c); if (*a==0 || *b==0 || *c==0) { printf("Nur postitve Werte\n"); return eingabe(a,b,c); } } void dreieck (int *a, int *b, int *c) { if ((*a+*b<*c || *a+*c<*b || *b+*c<*a)) printf("Kein Dreieck\n"); if (*a==*b && *a==*c) printf("Gleichseitiges Dreieck\n"); if ((*a**a)+(*b**==(*c**c) || (*b**+(*c**c)==(*a**a) || (*a**a)+(*c**c)==(*b**) printf("Rechtwinkliges Dreieck\n"); if (*a==*b || *b==*c || *c==*a) printf("Gleichschenkliges Dreieck\n"); } int main(void) { int a; int b; int c; while ((&a!=0) && (&b!=0) && (&c!=0)) { eingabe(&a,&b,&c); dreieck(&a,&b,&c); } return 0; } Zitieren
Klotzkopp Geschrieben 10. November 2005 Geschrieben 10. November 2005 void eingabe(int *a, int *b, int *c) { printf("Bitte die Seiten eingeben, Abbruch mit 0 0 0: "); fflush(NULL); scanf("%d %d %d",a,b,c); if (*a==0 || *b==0 || *c==0) { printf("Nur postitve Werte\n"); return eingabe(a,b,c); } }[/code] Du hast hier eine Rekursion - die Funktion eingabe ruft sich selbst auf. Auch wenn das hier kein echter Fehler ist, so ist das von Design her doch fragwürdig. Eine Rekursion ohne echten Grund sollte man nicht benutzen, eine Schleife hätte es hier auch getan. [code]void dreieck (int *a, int *b, int *c) Da diese Funktion a, b und c nicht ändert, brauchst du hier keine Zeiger zu übergeben. In dieser Funktion kannst du dir die ganzen Sternchen sparen - bis auf die für die Multiplikation natürlich while ((&a!=0) && (&b!=0) && (&c!=0))Hier ist der Grund, warum dein Programm nicht abbricht. &a ist die Adresse von a. Die wird nie 0 sein. Die Adress-& müssen hier weg. Davon abgesehen, bricht diese Schleife ab, sobald mindestens einer der Werte Null ist. Wenn das erst passieren soll, wenn alle drei Null sind, musst du || statt && benutzen. Zitieren
SaschaL Geschrieben 10. November 2005 Autor Geschrieben 10. November 2005 und wie kann das mit der funktion einageb mache als schleife??? Zitieren
SaschaL Geschrieben 10. November 2005 Autor Geschrieben 10. November 2005 hab das && in || geändetr aber der bricht das bei mir imemr noch nicht ab Zitieren
Klotzkopp Geschrieben 10. November 2005 Geschrieben 10. November 2005 und wie kann das mit der funktion einageb mache als schleife??? Zum Beispiel so: void eingabe(int *a, int *b, int *c) { printf("Bitte die Seiten eingeben, Abbruch mit 0 0 0: "); while(true) { scanf("%d %d %d",a,b,c); if (*a>0 && *b>0 && *c>0) { break; } printf("Nur postitve Werte\n"); } }[/code] hab das && in || geändetr aber der bricht das bei mir imemr noch nicht abHast du die & entfernt? Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.