Zum Inhalt springen

Problem mit aufabe


SaschaL

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen



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 ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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**B)==(*c**c) || (*b**B)+(*c**c)==(*a**a) || (*a**a)+(*c**c)==(*b**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;

}

Link zu diesem Kommentar
Auf anderen Seiten teilen


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.
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ab
Hast du die & entfernt?
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...