2017-02-02 4 views
2
#include <stdio.h> 
#include <math.h> 
#define G 9.81 

typedef struct 
{ 
    double weight; 
    double drag; 
    double time; 
} USER_INPUT; 

double calculateVelocity(USER_INPUT); 

int main(int argc, char **argv) 
{ 
    USER_INPUT userInput; 
    double velocity; 

    printf("Please enter weight, drag and time: "); 
    scanf("%lf %lf %lf", &userInput.weight, &userInput.drag, &userInput.time); 

    velocity = calculateVelocity(userInput); 

    printf("At t = %f , the parachutist with weight %d kg\nand a drag coefficient %8.2f kg/s \n will have a velocity of %8.2f m/s^2", &userInput.time, &userInput.weight, &userInput.drag, velocity); 

    return 0; 
} 

double calculateVelocity(USER_INPUT data) 
{ 
    double velocity; 
    // TODO compute velocity 
    return velocity; 
} 

In der Hauptfunktion möchte ich das Ergebnis anzeigen. Wie kann ich Variablen drucken, die in der Struktur definiert sind? Ich versuchte %f, die 0.000000 zurückgibt, und %d gibt eine Zufallszahl zurück.Wie man Variablen in einer Struktur druckt?

+0

Aus dem Code, sehe ich, dass die variable Geschwindigkeit in keiner Weise berechnet oder zugewiesen wird. Sie erhalten 0,000, wenn Sie es mit% f und einen Müllwert drucken, wenn Sie es mit% d drucken. Können Sie Ihre Formel teilen, um die Geschwindigkeit zu berechnen? –

+1

Benutze 'userInput.time, userInput.weight, ... etc.' vielleicht? Beachten Sie, dass Ihre 'calculateVelocity' einen unbestimmten Wert zurückgibt, dessen Ergebnis nicht definiert ist. – greatwolf

Antwort

1

Sie machen Fehler beim Drucken

Bitte beachten Sie: '&' wird verwendet, um die Adresse einer Variablen zu erhalten, nicht den Wert.Also, wenn Sie drucken:

printf("At t = %f , the parachutist with weight %d kg\nand a drag coefficient %8.2f kg/s \n will have a velocity of %8.2f m/s^2", &userInput.time, &userInput.weight, &userInput.drag, velocity); 

Sie drucken tatsächlich die adderss von Variablen:

& userInput.time (Adresse (userInput.time)), & userInput.weight (Adresse (userinput .weight)), & userInput.drag (Adresse von (userInput.drag)).

Sie wollen, dass ihre Werte drucken, nicht ein, daher entfernen '&' beim Drucken:

ie;

printf("At t = %f , the parachutist with weight %d kg\nand a drag coefficient %8.2f kg/s \n will have a velocity of %8.2f m/s^2", userInput.time, userInput.weight, userInput.drag, velocity); 
0

Nun, ich bin mir nicht sicher über all die Physik oder welche Gleichung, also habe ich das gefälscht, aber ich habe dein Programm kompilieren und laufen lassen, also sollte es ziemlich einfach für dich sein, es von hier aus zu reparieren. Fühlen Sie sich frei, Fragen über das Pointer-Zeug und warum Adressen wurden und wurden nicht an verschiedenen Orten verwendet.

#include <stdio.h> 
#include <math.h> 

#define G 9.81 
#define P 1.00 // ? 
#define A 1.00 // ? 

typedef struct { 
    double weight; 
    double drag; 
    double time; 
} userInput_t; 

double calculateVelocity(userInput_t *); // Terminal velocity? 

double calculateVelocity(userInput_t *data) { 
    return sqrt((2 * data->weight * G)/(P * A * data->drag)); 
} 

int main(void) { 

    userInput_t userInput; 

    printf("Please enter weight, drag and time: "); 
    scanf("%lf %lf %lf", &userInput.weight, &userInput.drag, &userInput.time); 


    double velocity = calculateVelocity(&userInput); 

    printf("\nAt t = %f, the parachutist with weight %f kg\n" 
      "and a drag coefficient %f kg/s\n" 
      "will have a velocity of %f m/s^2\n", 
       userInput.time, userInput.weight, userInput.drag, velocity); 
} 
1

int printf(const char *format, ...); ist NICHT int scanf(const char *format, ...);

scanf Arbeiten mit Speicheradressen von Variablen, während printf mit Variablen itselves.

Es versucht UB zu printf ("%d", memory_addres_of_variable);

weil der richtige Weg, Speicheradressen zu drucken ist mit %zu von C99 beginnen und später, und %lu mit ANSI C 90.

Deshalb sollten Sie aree eine Zufallszahl zu sehen .

+1

* "weil der richtige Weg zum Drucken von Speicheradressen mit% zu Beginn ab C99 und später ist, und% lu mit ANSI C 90." * Nein. '% zu' dient zum Ausdrucken von' size_t' und 'lu' für' unsigned long'. Mit den Speicheradressen haben sie nichts zu tun. Für 'void *' benutze '% p', oder für' uintptr_t' verwende '"% "PRIuPTR" u "'. – user694733

1

Das Problem steht nicht im Zusammenhang mit struct. Sie übergeben Adressen der Variablen anstelle ihrer Werte zu printf. So ist die Lösung einfach: Entfernen Sie die & vor Variablennamen im printf Aufruf.

Dies ist ein häufiger Fehler: scanf benötigt die Adressen von Variablen, um ihre Werte ändern zu können, während printf nur die Werte übernimmt. Leider auch die Prototypen machen es nicht evident:

int printf(const char *format, ...); 
int scanf(const char *format, ...); 

Und brauchen Sie %f für double Variablen verwenden (vom f loat genannten Typ abgeleitet) wird %d für int (d ecimal) verwendet.

Das Ergebnis:

printf("At t = %f , the parachutist with weight %f kg\nand a drag coefficient %8.2f kg/s \n will have a velocity of %8.2f m/s^2", userInput.time, userInput.weight, userInput.drag, velocity); 

Referenzen:

Verwandte Themen