Ermittlung ganzzahliger Vektor-Beträge

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Ermittlung ganzzahliger Vektor-Beträge

    Hiho @all,

    Im Rahmen einer 5.Komponente (eine Art optionale Abschlussarbeit fürs Abitur) hab ich beschlossen einen Treiber für meinen Scanner zu programmieren. Bisher hab ich keine Ahnung wie realistisch es ist dies in einem Jahr zu schaffen, aber selbst wenn ich scheitere hab ich auf dem Weg eine Menge gelernt.

    Der erste Schritt ist also sich mit C zu beschäftigen. Damit habe ich angefangen (Buch: C von A bis Z - openbook).

    So nun zu meinem kleinen Programm:

    Mein Mathelehrer erwähnte letztens, dass ihm ein Schüler ein Programm zur Berechnung aller ganzzahligen Vektorenbeträge in einem bestimmten Rahmen geschrieben hat. Da sich die aufgabe interessant anhörte habe ich mich mal rangesetzt und folgendes Programm geschieben...

    Quellcode

    1. /************************
    2. Das Programm dient der Berechnung aller
    3. ganzzahligen Vektor-Beträge (Längen) bis:
    4. "durch den User bestimmt"
    5. by Christian Klopp
    6. ************************/
    7. #include <stdio.h>
    8. #include <math.h>
    9. #include <limits.h>
    10. double berechne(int a, int b, int c);
    11. void Berechnung_Ausgabe();
    12. unsigned int Eingabe();
    13. int main() {
    14. Berechnung_Ausgabe();
    15. return 0;
    16. }
    17. /***********************
    18. berechnet den Betrag eines Vektors
    19. und gibt das Ergebnis zurück
    20. ***********************/
    21. double berechne(int a, int b, int c){
    22. double ergebnis = a*a + b*b + c*c;
    23. ergebnis = sqrt(ergebnis);
    24. return ergebnis;
    25. }
    26. /***********************
    27. Erhöht nacheinander die Variablen a, b und c
    28. und überprüft das Ergebnis auf ganzzahligkeit, d.h.
    29. der durch modf() ermittelte Nachkommateil wird auf Gleichheit mit
    30. 0 überprüft. Wenn das Ergebnis ganzzahlig ist werden die Komponenten des Vektors
    31. zusammen mit dem Ergebnis ausgegeben.
    32. ***********************/
    33. void Berechnung_Ausgabe(){
    34. double fuerModf; //wird nur gebraucht um modf() einen Pointer zu stellen
    35. unsigned int a, b, c, max; //Komponenten des Verktors
    36. max = Eingabe();
    37. for (a = 1; a <= max; a++){
    38. if (modf(berechne(a, b, c),&fuerModf) == 0){
    39. printf("%u - %u - %u = %i\n", a,b,c,(int)berechne(a, b, c));
    40. }
    41. for (b = 1; b <= max; b++){
    42. if (modf(berechne(a, b, c),&fuerModf) == 0){
    43. printf("%u - %u - %u = %i\n", a,b,c,(int)berechne(a, b, c));
    44. }
    45. for (c = 1; c <= max; c++){
    46. if (modf(berechne(a, b, c),&fuerModf) == 0){
    47. printf("%u - %u - %u = %i\n", a,b,c,(int)berechne(a, b, c));
    48. }
    49. } //3. For-Schleife
    50. } //2. For-Schleife
    51. } //1. For-Schleife
    52. }
    53. unsigned int Eingabe(){
    54. unsigned int a;
    55. printf("Bitte den maximalen Wert eingeben: ");
    56. scanf("%u", &a);
    57. return a;
    58. }
    Alles anzeigen


    Zur Erklärung ein Vektor besteht aus 3 Komponenten (Höhe, Breite, Tiefe) und der Betrag (also die Länge) wird mit der Formel

    Länge = wurzel_aus(a²+b²+c²)

    berechnet.

    --------------------------------------------------------------
    So nun kommt auch mal ne Frage^^

    Ich will, dass die Eingabe überprüft wird ob sie den maximalen integer Wert übersteigt oder kleiner Null ist und sollte das der Fall sein so soll die Eingabe Wiederholt werden.

    Folgendes hatte ich probiert und feststellen müssen, dass es nicht funzt (was ich nach 10minütigen starren auf den Bildschirm erst begriffen habe)

    Quellcode

    1. unsigned int Eingabe(){
    2. unsigned int a;
    3. do{
    4. printf("Bitte den maximalen Wert eingeben: ");
    5. scanf("%u", &a);
    6. }while (a > UINT_MAX || a =< 0);
    7. return a;
    8. }


    zusätzlich war dann auch die Header-Datei limits.h eingebunden (für UINT_MAX)

    vlt. kann mir ja einer erklären wie man solch eine Fehlerprüfung durchführt...

    ps: Hoffe das Proggy ist nicht zu poplig um hier gepostet zu werden

    ps2: Wenn ich den Arrayteil in meinem Tutorial durchhab werden auch noch ähnliche Ergebnisse aussortiert. z.B.:

    1 - 2 - 2 = 9
    2 - 1 - 2 = 9
    2 - 2 - 1 = 9

    ps3: Feedback zu meinem Projekt;) ist immer willkommen

    greetz gunn1
    Sprachen: C (Anfänger) und Java (Fortgeschrittener)
  • Also bei deinem Code

    Quellcode

    1. unsigned int Eingabe(){
    2. unsigned int a;
    3. do{
    4. printf("Bitte den maximalen Wert eingeben: ");
    5. scanf("%u", &a);
    6. }while (a > UINT_MAX || a =< 0);
    7. return a;
    8. }


    Sind mir mal 2 Sachen aufgefallen:

    1) a ist ein unsigned int, daher macht es wenig Sinn ihn auf <=0 zu prüfen (er ist immer größer!)
    2) a > UINT_MAX a kann logischerweise auch nicht größer Sein als der Maximale wert den ein unsigned int annehmen kann ;)

    2 Lösungsvorschläge:

    1) Du ließt einen Wert mit größerem Wertebereich ein (z.B. long long falls dein Compiler C99 kann), da long long signed ist sollten deine Überprüfungen wieder funktionieren und auch > UINT_MAX macht wieder Sinn. Du kannst dann trotzdem unsigned int zurückgeben
    2) Ich arbeite primär mit C++ aber scanf() sollte das globale error-flag setzen wenn ein Fehler beim lesen aufgetreten ist, danach könntest du warscheinlich sehen und entsprechend reagieren
    There are only 10 types of people in the world: Those who understand binary, and those who don't.

    Download meines ersten Spiels:HIER
    Über Feedback würde ich mich freuen ;)
  • 1) a ist ein unsigned int, daher macht es wenig Sinn ihn auf <=0 zu prüfen (er ist immer größer!)
    2) a > UINT_MAX a kann logischerweise auch nicht größer Sein als der Maximale wert den ein unsigned int annehmen kann ;)
    Das Waren die zwei Dinge die mir auch, nachdem ich 10min auf den Bildschirm geguckt habe aufgefallen sind^^

    Zu Lösungsvorschlag 1:


    1) Du ließt einen Wert mit größerem Wertebereich ein (z.B. long long falls dein Compiler C99 kann), da long long signed ist sollten deine Überprüfungen wieder funktionieren und auch > UINT_MAX macht wieder Sinn. Du kannst dann trotzdem unsigned int zurückgeben
    Hiermit behebe ich mein Problem ja nicht wirklich. Es wird lediglich dafür gesorgt, dass die Eingabe die zum Programmabbruch führt größer sein muss. Oder irre ich mich, dass das Programm auch abbstürtzt wenn das Longmaximum überschritten (bzw. Minimum unterschritten) wird ?

    Zu Lösungsvorschlag 2:

    Werd ich mir mal ansehen, kann nur @mom nicht viel damit anfangen
    Sprachen: C (Anfänger) und Java (Fortgeschrittener)
  • Also irgendwie weiß ich nicht was du mit einem "globale error-flag" meinst. Wäre duft wann du mir mal nen Denkanstoß geben könntest.

    So ich hab jetzt nochmal versucht etwas auszuprobieren: Da scanf() die Anzahl der eingelesenen Elemente zurückgibt und für den Fall einer falschen Eingabe "0", hab ich mir gedacht, dass ich mein Problem so lösen könnte. Allerdings musste ich schnell feststellen, dass scanf() nur wenn es einen Zahlenwert erwartet und man einen String eingibt "0" returned. Also ist mir damit auch nicht geholfen.
    Sprachen: C (Anfänger) und Java (Fortgeschrittener)