#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;
}
在main函数中,我想显示结果。
如何打印结构中定义的变量?
我尝试%f
,返回0.000000,%d
返回一个随机数。
答案 0 :(得分:0)
我不确定所有的物理或哪个等式,所以我有点伪造,但我得到你的程序编译和运行所以你应该很容易从这里修复它。随意询问有关指针内容的问题,以及为什么地址在不同的地方都没有使用过。
#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 :(得分:0)
int printf(const char *format, ...);
不
int scanf(const char *format, ...);
scanf
使用变量的内存地址,而printf则使用变量本身。
这是UB试图
printf ("%d", memory_addres_of_variable);
因为打印内存地址的正确方法是使用%zu
从C99及更高版本开始,而%lu
使用ANSI C 90。
这就是你看到随机数的原因。
答案 2 :(得分:0)
该问题与struct
无关。您将地址变量而不是值传递给printf
。所以解决方案很简单:在&
调用中删除变量名前的printf
。
这是一个常见的错误:scanf
需要变量的地址才能改变它们的值,而printf
只需要取值。不幸的是,即使原型也没有明显:
int printf(const char *format, ...);
int scanf(const char *format, ...);
您需要将%f
用于double
个变量(源自 f loat的类型),%d
用于int
(的 d 强> ecimal)。
结果:
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);
参考文献:
答案 3 :(得分:0)
打印时出错,
请注意&#39;&amp;&#39;用于获取任何变量的地址,而不是值。因此,当您打印时:
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);
您实际上正在打印变量的加法器:
&amp; userInput.time((userInput.time)的地址), &amp; userInput.weight((userInput.weight)的地址)和&amp; userInput.drag((userInput.drag)的地址)。
你想要打印他们的价值,而不是地址,因此删除&#39;&amp;&#39;打印时:
即;
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);