In C: Dreieck auf Rechtwinkligkeit prüfen
-
Hallo Leute
Ich finde das C-Forum irgendwie nicht, darum schreib ich hier im C++.
Ich möchte Dreieche auf Rechtwinkligkeit prüfen. Also einfach drei Werte (Seitenlängen) entgegennehmen und prüfen. Dafür habe ich zwei Dateien erstellt, einmal triangle.cc und testeRect.h
Hier der Code:
/****************************************************** * File: triangle.cc * Autor: S. Benz * Datum: 22.02.2008 ******************************************************/ #include <stdio.h> #include "testeRect.h" /*****************************************************/ int main(void) { printf("Bitte 3 Zahlen getrennt durch Leerzeichen eingeben:\n\n"); scanf("%f %f %f", &a, &b, &c); flag = testeRect(a,b,c); if (flag == 1) { printf("Das Dreieck ist rechtwinklig\n"); } else { printf("Das Dreieck ist nicht rechtwinklig\n"); } } /*****************************************************/
/****************************************************** * File: testeRect.h * Autor: S. Benz * Datum: 22.02.2008 ******************************************************/ int a, b, c, flag; /*****************************************************/ int testeRect(int a, int b, int c) { flag = 0; int aS = a*a; int bS = b*b; int cS = c*c; if ((a*a + b*b) == c*c) { flag = 1; } else if ((c*c - a*a) == b*b) { flag = 1; } else if ((c*c - b*b) == a*a) { flag = 1; } if ((a == 0) && (b == 0) && (c == 0)) { flag = 0; } return flag; }
Leider stimmt die Funktion noch nicht ganz. Werte 0 0 0 oder 23 23 289 sind zwar nicht rechtwinklig, aber wenn ich 2 2 8 oder 2 2 9 oder 23 24 25 eingebe wird Rechtwinkligkeit ausgegeben.
Seht ihr wo mein Fehler bzw. meine Fehler liegen?
Danke schonmal im Voraus.
Gruss belimo
-
C Forum ist eins über dem C++ Forum!
-
das c-forum ist eins über dem c++-forum.
kenne mcih mit scanf nciht aus, aber ist %f nicht float einlesen?
geh doch mal mitm debugger drüber.
und mach a,b,c,flag lokal und niht global
-
Wow, dieses Forum behalt ich im Auge. Das ging ja wahnsinnsschnell
at Maxi: Genau, das wars. f durch d ersetzt und alles prima. Danke für die schnelle Hilfe.
Gruss belimo
-
Ich nochmals. Ich soll nun die oben genannte Aufgabe abändern, so dass die einzelnen Werte mittels getchar() und nicht via scanf() eingelesen werden.
Ich bin mal wie folgt gestartet:
int c[50]; int zaehler = 0; int result = 0; /*****************************************************/ int read(void) { while ((c = getchar()) != EOF) { putchar(c[zaehler]); ++zaehler; } }
So habe ich zumindest mal die eingegebenen Zahlen in einem Array gespeichert. Wie mache ich aber nun weiter?
Ich muss ja jetzt die hinterste Zahl im Array ein mal nehmen, dazu 10 mal die zweithinterste addieren, und dazu 100 mal die dritthinterste. Und so weiter. Wie mache ich das?
Danke für eure Tipps.
Gruss belimo
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum ANSI C verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
mhm... warum änderst du denn jetzt deinen ganzen Code. Ich weiß nicht, ob ichs richtig verstanden habe aber was willst du mit den 100?
int main(void) { int zaehler = 0; do { getchar(); zaehler++; } while(zaehler != 3 && getchar() != EOF); flag = testeRect(a,b,c); if (flag == 1) { printf("Das Dreieck ist rechtwinklig\n"); } else { printf("Das Dreieck ist nicht rechtwinklig\n"); } }
Srry, ich verzweifel gerade auch (haben gestern auch getchar angefangen) bin also noch noob...
halt einfach versuchen. Du bekommst das schon irgendwie hin (www.gidf.de)
-
Techniker schrieb:
mhm... warum änderst du denn jetzt deinen ganzen Code. Ich weiß nicht, ob ichs richtig verstanden habe aber was willst du mit den 100?
Naja, das ist halt eine Schulaufgabe. Der Dozent meinte wir sollen auch noch eine Lösung mit getchar und ohne scanf. Einfach so zur Uebung
Ich erklär noch kurz was ich jetzt alles habe und was ich genau will:
/****************************************************** * File: triangle.cc * Autor: S. Benz * Datum: 22.02.2008 ******************************************************/ #include <stdio.h> #include <math.h> #include "testeRect.h" #include "read.h" /*****************************************************/ int main(void) { printf("Bitte Seitenlänge a angeben:\n\n"); a = read(); printf("Bitte Seitenlänge b angeben:\n\n"); b = read(); printf("Bitte Seitenlänge c angeben:\n\n"); c = read(); flag = testeRect(a,b,c); if (flag == 1) { printf("Das Dreieck ist rechtwinklig\n"); } else { printf("Das Dreieck ist nicht rechtwinklig\n"); } } /*****************************************************/
/****************************************************** * File: testeRect.h * Autor: S. Benz * Datum: 22.02.2008 ******************************************************/ int a, b, c, flag; /*****************************************************/ int testeRect(int a, int b, int c) { flag = 0; int aS = a*a; int bS = b*b; int cS = c*c; if ((a*a + b*b) == c*c) { flag = 1; } else if ((c*c - a*a) == b*b) { flag = 1; } else if ((c*c - b*b) == a*a) { flag = 1; } if ((a == 0) && (b == 0) && (c == 0)) { flag = 0; } return flag; }
/****************************************************** * File: read.h * Autor: S. Benz * Datum: 22.02.2008 ******************************************************/ int cA[50]; int zaehler = 0; int result = 0; int laenge = 0; char temp; /*****************************************************/ int read(void) { while ((temp = getchar()) != EOF)/* Eingegebene Zahlen in Array abspeichern */ { putchar(cA[zaehler]); ++zaehler; } laenge = sizeof(cA) / sizeof(int); /* Länge der eingelesenen Zahl bestimmen */ zaehler = 0; /* Zähler rücksetzen */ while (zaehler < laenge) { result = result + (pow(10,zaehler)*cA[zaehler]); ++zaehler; } return result; }
Die Aufgabe: Ich soll ein Programm machen, in welchem man 3 Werte eingeben kann. Das Programm prüft dann, ob es sich um ein rechtwinkliges Dreieck handelt.
Ich habe nun meine Hauptdatei, die triangle.cc, wo ich zuerst die Methode read aufrufe, und danach die Werte teste (Aufruf von testeRect - dies funktioniert).
Das Problem dürfte in der read-Methode liegen oder allenfalls sogar im Aufruf der Read-Methode. In dieser read-Methode versuch ich nun, die eingegebenen Zahlen mit getchar zu lesen. Zahlenweise werfe ich diese in ein Array.
Eingegebene Zahl: 456
Array: cA[0]=4 cA[1]=5 cA[2]=6
Auslesen:
resultat = 4*100 + 5*10 + 6*1
So sollte das rauskommen. Zurzeit kommt aber beim Programmaufruf nur:
"Bitte Seitelänge a angeben:" Dann kann ich eine Zahl eingeben. Drücke ich Enter passiert gar nichts...
Könnt ihr mir weiterhelfen? Danke schonmal
Gruss belimo
-
Wenn ihr oben geposteten Code einfach mal kompiliert und testet, so gibt es bei der Eingabe schonmal ein Problem.
Wenn man die Seite a eingeben möchte, muss man den getchar() mit CTRL+D abbrechen... Probiert das bitte mal kurz. Bei der Seite b wirds dann ganz komisch
Es wäre mir schon sehr geholfen, wenn ihr mir für dieses Problem einen Tipp hättet
Vielen Dank. Gruss belimo
-
Hallo belima,
ich habe mir mal deinen Code angesehen und versucht dein Problem zu lösen.
Hier mal min Vorschlag:triangle.c
/****************************************************** * File: triangle.c * Autor: S. Benz * Datum: 22.02.2008 ******************************************************/ #include <stdio.h> #include <ctype.h> /*****************************************************/ int testeRect(int a, int b, int c) { if ((a == 0) || (b == 0) || (c == 0)) return 0; if ((a*a + b*b == c*c) || (c*c - a*a == b*b) || (c*c - b*b == a*a)) return 1; return 0; } int read(void) { int cA[50]; int zaehler = 0, i, result; while ((i = getchar()) != EOF) { if (i == '\n') break; if (isdigit(i)) cA[zaehler++] = i - '0'; else { printf("(E) %c ist keine Ziffer!\n", i); return -1; } } result = 0; for (i=0; i<zaehler; ++i) result = result*10 + cA[i]; return result; } int main(void) { int a, b, c; printf("Bitte Seitenlänge a angeben:\n\n"); a = read(); if (a == -1) { printf("(E) Fehlerhafte Eingabe. Abbruch!\n"); return 0; } printf("A = %d\n", a); printf("Bitte Seitenlänge b angeben:\n\n"); b = read(); if (b == -1) { printf("(E) Fehlerhafte Eingabe. Abbruch!\n"); return 0; } printf("B = %d\n", b); printf("Bitte Seitenlänge c angeben:\n\n"); c = read(); if (c == -1) { printf("(E) Fehlerhafte Eingabe. Abbruch!\n"); return 0; } printf("C = %d\n", c); if (testeRect(a, b, c)) printf("Das Dreieck ist rechtwinklig\n"); else printf("Das Dreieck ist nicht rechtwinklig\n"); return 0; }
Gruß mcr
-
Hi mcr*
Danke für deine Hilfe. Folgende Dinge sind mir allerdings noch unklar:
mcr schrieb:
if (i == '\n') break; if (isdigit(i)) cA[zaehler++] = i - '0';
Gruß mcr
- Warum dieses break bzw. Test auf \n?
- Das i - '0' versteh ich überhaupt nicht. Kannst du mir das näher erklären?Vielen Dank
Gruss belimo
-
belimo schrieb:
- Warum dieses break bzw. Test auf \n?
Nun, üblicherweise enden Eingaben mit der Entertaste (Newline).
belimo schrieb:
- Das i - '0' versteh ich überhaupt nicht. Kannst du mir das näher erklären?
In einem normalen Zeichensatz (ASCII) sind die Zahlen hintereinander angeordnet sodass 'Ziffer' - '0' == Ziffer. Also zB:
'4' - '0' == 4; '7' - '0' == 7;
Gruß
Don06
-
belimo schrieb:
- Warum dieses break bzw. Test auf \n?
getchar() liest ein Zeichen vom stdin (normalerweise die Tastatur) ein
und speichert dieses in einem unsigned int. Normalerweise möchtest du
ja die Schleife nach Eingabe einer Zahl abbrechen. Dies habe ich mit
'\n' gelöst. Dieses Symbol wird bei einem Enter ausgelöst.belimo schrieb:
- Das i - '0' versteh ich überhaupt nicht. Kannst du mir das näher erklären?
Da man mit getchar() Zeichen zurückbekommt und du eigentlich die Zahl und
nicht das Zeichen haben möchtest, bekommst du mit i - '0' die Zahl an sich.
Ok, diese Rechnung ist nicht immer richtig, aber auf den Systemen paßt das.Gruß mcr