[C] Log(x/100)=0???

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von p90, 2. Oktober 2006 .

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 2. Oktober 2006
    Hi,
    als erstes ist woll zu sagen das ich ein kompletter Anfänger inC bin.
    Hab mir also deshalb gedacht, das ich einfach mal mit einem einfachen Programm anfange.
    Zum üben habe ich mir die Berechnung von T1/2 einer gedömpften Schwingung ausgesucht.
    Die Formel für T1/2 lautet:

    T1/2=log(0.5)/log(Dämpfungsfaktor)*T

    Also einfach nur den Dämpungsfaktor (im Prog mit df abgekürzt) und T eingeben lassen um T1/2 zu erhalten.
    Leider kommt für T1/2 immer 0 heraus.
    Nehme an, das das Problem irgendwo bei der Variablen Dekleration bzw. mit dem Teilen durch 100 steckt (Log(df/100) ist immer gleich 0, ka warum)
    Hier der Code:

    Code:
    #include <stdio.h>
    #include <conio.h>
    #include <math.h>
    #include <assert.h>
    
    int main()
     {
     float df, time, time2;
     /* 
     df=Daempfungsfaktor
     time=T (Periodendauer)
     time2= T1/2 (Zeit bis Amplitude 1/2*^s0 erreicht wird)
     */
    
     printf ("Berechne T 1/2 bei gedaempften Schwingungen");
     printf ("\n");
    
     printf ("Geben sie bitte den Daempfungsfaktor in Prozent an:");
     fflush(stdin);
     scanf ("%f", &df);
     assert(df<=100);
     assert(df>=0);
     /*
     Fordert zur Eingabe des Daempfungsfaktors auf und schreibt ihn in die Variable df.
     Dabei gilt 0<=df<=100.
     */
    
     printf ("\nGeben sie bitte die Periodendauer in Sekunden ein:");
     fflush(stdin);
     scanf ("%f", &time);
     fflush(stdin);
     assert(time>0);
     /*
     Fordert zur Eingabe der Periodendauer in Sekunden auf und schreibt den Wert in die Variable time
     Dabei gilt 0<time
     */
     time2=log(0.5)/log((df/100))*time;
     /*
     Berechung von T1/2 und weist den berechneten Wert time2 zu
     Dabi gilt T1/2=log(0.5)/log(df/100)*time
     Hier ist vermutlich der Fehler versteckt
     */
    
     printf ("\nT=%f", time);
     printf ("\nDF=%f\n", df);
     printf ("T 1/2=%f", time2);
    
     getch();
     /*
     Sorgt dafür, das die Werte auch Abgelesen werden können bevor sich das Programm beended
     */
     
     return 0;
     /*
     Sollte klar sein
     */
     
     }
    
    
    Würde mich sehr freuen, wenn mir jemand helfen könnte.
    bis denne
    p90

    [EDIT]
    Habe jetzt mal den bisher berichtigten Code mal aktualisiert.

    [EDIT2]
    Problem gelöst. Oben steht die aktuelle Version des Programmes.
    Bewertungen and die Helfer sind raus und vielen Dank nochmal!
    Werd jetzt einfach mal das Thema schliesen. Wegen des Screen Clear Befehls könnt ihr mir ja noch ne PN schreiben!
     
  2. 2. Oktober 2006
    AW: [C] Log(x/100)=0???

    Erstmal vorweg:
    Dein Programmierstil ist schlichtweg miserabel.
    Alles hingekritzelt, ohne Einrueckungen oder sonstwas, man kann dienen Text nur schlecht lesen.

    fflush kommt immer nach scanf, aber beim einlesen von Zahlen ist fflush() nicht noetig.
    long wird mit %ld eingelesen (long dezimal).
    getch() ? Wofuer getchar ? Du kannst aus long auch nicht einfach float oder dezimal machen.

    Kauf dir am besten ein Buch (z.B. ,,C von A bis Z'').
    Und aendere dein Stil, wenn du so Programmierst dann kommst nicht weit.
     
  3. 2. Oktober 2006
    AW: [C] Log(x/100)=0???

    Hi,
    erstmal Danke für deine Antwort.
    Leider muss ich dir mitteilen, das ich nicht vorhabe meinen Programmierstyle zu ändern.
    Hab mit diesem Style bereits mehere größere VB, PHP und HTML Projekte erfolgreich gecoded.
    Solange in einem Code keine Vergleiche oder Schleifen vorkommen sind Einrückungen nur störend.
    Ich stimme dir zu, das ich mehr Kommentare einfügen könnte, aber für soclh ein simples Programm empfand ich das nicht als notwenig.

    Habe auch den Fehler mit dem %d und %f berichtigt. Hab leider keine Tabelle in der diese Parameter für alle Variablentypen aufgelistet sind. (Hatte auf %l getipped, hatte aber nicht gefunzt).
    Nachdem ich diese korrekturen durchgeführt habe gibt mir das Porgramm jetzt auch eine schöne Fehlerbeschreibung aus:
    "log: SING error"
    bis denne
    p90


    PS: Das getch steht da, damit ich das Ergebnis auch lesen kann. Wäre es nicht da, würde sich das Programm sofort nach der Eingabe schliesen.
     
  4. 2. Oktober 2006
    AW: [C] Log(x/100)=0???

    Ja, genau, es kann zwar gehen, aber es kann keine sau lesen.
    Ich knall ja kienem einen 300-Zeilen Code vor die Nase ohne Einrueckungen und Kommentare.

    Deine Einstellung gegenueber kleine Programme ist auch schlecht, gerade da
    faengt es an. Eigne dir gleich einen guten Stil an.

    VB, PHP oder HTML(was nichtmal eine Programmiersprache ist), kannst du nicht mit einer
    solchen Sprache vergleichen.

    Und nochmal fuer dich: Eine Variable vom typ Long gibst du mit %ld und nicht mit %f oder %d aus.

    PS: system("pause"); tut es auch
    EDIT1: http://www.ba-stuttgart.de/~boehm/NoBugs/Rules/10_C_Regeln.html
     
  5. 2. Oktober 2006
    AW: [C] Log(x/100)=0???

    So, hab oben gerade mal den Code aktualisiert

    Hoffe doch, das mit jetzt jeman sagen kann, warum ich einen log: SING error bekomme?
    Vermutlich hängt das doch mit dem df/100 zusammen oder?
    Muss ich etwas besonderes beim Teilen unter C beachten? Vieleicht runden? Wenn ja, wie mache ich das? Oder geht es nicht, weil ich einfach den rahmen von long sprenge?
    Hoffe auf Antworten.
    bis denne
    p90
     
  6. 2. Oktober 2006
    AW: [C] Log(x/100)=0???

    Also in C++ hätte ich es so geschrieben:
    Code:
    #include <cstdlib>
    #include <iostream>
    #include <stdio.h>
    #include <math.h>
    
    using namespace std;
    
    int main(void)
    {
     cout << "Bitte geben sie den Daempfungsfaktor an: ";
     float f_DaempfungsFaktor;
     cin >> f_DaempfungsFaktor; // cin ist zur eingabe ^^
     cout << "\nBitte geben Sie die Periodendauer in Sekunden an: ";
     float f_Periodendauer;
     cin >> f_Periodendauer;
     float f_Ergebnis = ((log(0.5))/(log(f_DaempfungsFaktor))*f_Periodendauer)*0.5; // keine Ahnung ob ich das so richtig verstanden hab... ich kenn deine komische rechnung da nicht...
     cout << "\nHier das Ergebnis: " << f_Ergebnis << endl;
     cin >> f_DaempfungsFaktor; // nur damit man noch das ergebnis sieht... 
     return 0;
    }
    
    hättest vll mal nen Beispiel hinschreiben können was so ca. rauskommen sollte also das du sagst wenn der Dämpfungsfaktor 9 ist und Periodendauer 5 was dann rauskommen soll..

    @Fallen Angel oder wer das war mit "system("PAUSE");" die Lösung ist noch unsauberer! Allein schon deshalb weil das nicht Plattformübergreifend ist...

    mfg thecoolman4rr

    PS: Dein "Stil" ist wirklich beschissen... da hab ich auch kein bock das zu lesen... und mit was für nem Prog schreibst du die Sachen? ich meine jedes einigermaßen gutes Programm dafür hat Syntax highlighting und rückt sowas automatisch raus!? und comments kann man auch // machen ^^
     
  7. 2. Oktober 2006
    AW: [C] Log(x/100)=0???

    Ich weiss dsa system("pause"); Plattform abhaengig ist, ich denke aber das er Windows nutzt ..

    @p90: Du musst nicht unbedingt ueberall ein Kommentar machen ..
     
  8. 2. Oktober 2006
    AW: [C] Log(x/100)=0???

    Hi,
    also erstmal das Beispiel:
    Wie oben wird einfach die Formel angewand:
    T1/2=log(0.5)/log(Dämpfungsfaktor)*T

    Sagen wir einfach mal, Dämpfungsfaktor=0,85 und T=5
    => T1/2=log(0.5)/log(0.85)*5=21.32512141

    Desweiteren benutze ich momentan als Compiler Turbo C und als Editor, weil der Turbo C Editor voll für den Ar**** ist (Keine Diskussionen, wenn es keinen unterschied zwischen ( und < gibt kann ein editor nicht gut sein, oder bin ich einfach nur zu doof?) Notepad2.

    Hoffe, das hilft euch mir zu helfen
    p90


    PS:
    @thecoolman4rr
    Ähm. Blöde Frage, aber wo ist der unterschied zwischen deinem Stil und meinem? Oder hast du extra einfach geschrieben um micht net zu überlasten?
     
  9. 2. Oktober 2006
    AW: [C] Log(x/100)=0???

    Sein Code ist Eingerueckt, das ist sehr wichtig wenn du groessere Projekte hast, damit ist das lesen einfacher, vor allem bei Schleifen, if-else abfragen, etc.

    B2T: Devcpp ist ein ziehmlich guter Editor - such in google nach Devcpp oder Bloodshed, da findest sofort was
     
  10. 2. Oktober 2006
    AW: [C] Log(x/100)=0???

    Code:
    #include <stdio.h>
    #include <math.h>
    #include <assert.h>
    
    int main()
    {
     /*
     variablen deklarieren
     */
     float df, time, time2;
    
     /*
     einlesen der variablen
     */
     printf ("Dämpfungsfaktor [0.85]: ");
     scanf ("%f", &df);
     fflush(stdin);
     printf ("Periodendauer in Sekunden [5]: ");
     scanf ("%f", &time);
     fflush(stdin);
    
     /*
     berechnung
     */
     time2=log(0.5)/log(df)*time;
    
     /*
     ausgabe
     */
     printf ("\nT=%2.2f\n", time);
     printf ("DF=%2.2f\n", df);
     printf ("T 1/2=%f\n", time2);
    
     /*
     warte auf tastendruck (besser als getch()
     */
     getchar();
    return 0;
    }
    
    float für Kommazahlen
     
  11. 2. Oktober 2006
    AW: [C] Log(x/100)=0???

    JUHU!
    Es funktioniert!
    Das ich long verwended habe war das Prob. Dachte, das hätte auch kommazahlen. Scheint aber net wer Fall zu sein. Mit float geht es jetzt.
    Vielen Dank an alle nochmal!

    @Fallen Angle: Werd mir mal Devcpp ansehen. Und das man auch die einzioge Funktion eines Progarmms einrückt wusste ich noch net. Hab bisher nur Funktionen, Schleifen und Ifs eingerückt (es sei den es gab meherer Funktionen, dann wurden alle eingerückt, auch die erste )

    @thecoolman4rr: Auch hier nochmal Danke für die Hilfe, aber man kann leider keine Komments mit // machen. Notepad2 sagt zwar, das es gehen würde, der Borland C Compiler versucht es aber trotzdem zu compilen.

    Werd jetzt gearde noch oben die neueste Version reinkopieren.

    PS: Weis jamnd gearde noch den Befehl um den Screen wieder zu clearen?
    hatte irgendwie noch cls im kopf, geht aber net.
     
  12. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.