Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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

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.

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

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]

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

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.

also in der eingaeb überprüufen ob die werte ==0 sind, meinste?

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



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

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?

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

ja ok. und was is mim beenden des programms mit der eingabe 0 0 0??

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

acsho ok danke schonmal soweit. dann werd das mal weiter machen noch mit den dreickcken prüfuen... wenn nich meld mich wieder ;)

und wie kann ich das ohen bool machen einfach mit funktionen und if anweisungen???

du brauchst theorethisch auch garkeine funktion...

aber du kannst auch schreiben while(!eingabe(seitea,seiteb,seitec));

leere schleifen sind allerdings nicht so mein fall...

kannst du mir das mit dem bool abbruch mal erklaren?????? und der negation davon?? da komm nich ganz drauf.

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;

}


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.

und wie kann das mit der funktion einageb mache als schleife???

hab das && in || geändetr aber der bricht das bei mir imemr noch nicht ab :(

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?

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.