2015-10-14 2 views
-3
#include <stdio.h> 
#include <math.h> 

#define TRUE 1 
#define FALSE 0 
#define GRAVITY 9.8 

double mag(double x, double y, double z); 
double metersFallen(double fallTime); 
double velocity (double v, double t1, double t2, double magAcc); 
double position (double x, double v, double t1, double t2); 

int main() 
{ 
    printf("Ok, I'm now receiving data.\n"); 

    int running = TRUE; 
    double secFall = 0;; 
    double distance = 0; 
    int counter = 0; 
    int programStartTime = 0; 
    double currentTime = 0; 
    int time = 0; 
    int start = 0, end = 0; 
    double x, y, z, v, p; 
    double seconds; 

    scanf("%d,%lf,%lf,%lf", &time, &x, &y, &z); 
    printf("I'm Waiting"); 
    programStartTime = time; 
    seconds = time; 

    while(running){ 

     scanf("%d,%lf,%lf,%lf", &time, &x, &y, &z); 

     if((time - programStartTime) >= 1000){ 

      printf("."); 
      programStartTime = time; 

     } 

     if(mag(x, y, z) < .75){ 

      start = time; 
      printf("Help me! I'm falling"); 

      while(end == 0){ 

       if((time - programStartTime) >= 1000){ 

        printf("!"); 
        programStartTime = time; 
       } 

       scanf("%d,%lf,%lf,%lf", &time, &x, &y, &z); 

       v = velocity(v, time, seconds, mag(x,y,z)); 
       p = position(x, v, time, seconds); 
       seconds = time; 

       if(mag(x, y, z) > .95){ 

        end = time; 
        running = FALSE; 
       } 
       fflush(stdout); 
      } 
     } 
     fflush(stdout); 
    } 
    secFall = ((end - start)/1000.0); 
    distance = metersFallen(secFall); 
    //percent = ; 

    printf("\nTime falling was %6.3lf seconds\n", secFall); 
    printf("Distance fallen was %6.3lf meters\n", distance); 
    printf("Compensating for air resistance, the fall was %lf meters.\n", p); 
    //printf("This is %lf less than computed before\n", percent); 
    printf("%lf\n", mag(x,y,z)); 

    return 0; 

} 

double metersFallen(double fallTime) 
{ 

    return(.5*GRAVITY*fallTime*fallTime); 

} 
double mag(double x, double y, double z) 
{ 

    return sqrt(x*x+y*y+z*z); 

} 
double velocity (double v, double t1, double t2, double magAcc) 
{ 
    int numVelocity = v + GRAVITY*(1-magAcc)*(t1 - t2)/1000; 
    return numVelocity; 
} 
double position (double x, double v, double t1, double t2) 
{ 
    double p = x + v*(t1 - t2)/1000; 
    return p; 
} 

Запуск с этой выборки данных http://www.filedropper.com/lab6sampledata20131Почему скорость возвращается к нулю? В C

Мне нужна функция положения для работы, но со скоростью возвращения к нулю, я не могу. Для этого мы используем устройство с акселерометром. FYI Я студент, который довольно новичок в программировании, будьте терпеливы.

+9

'INT numVelocity' - изменения в' двойной numVelocity'. –

+3

'#define TRUE 1 ...' ** Do not! ** Используйте правильные логические типы и значения. См. 'Stdbool.h'! – Olaf

+0

Мой скелетный код моего профессора включал '#define TRUE 1', поэтому я должен оставить его на данный момент. – MikeG

ответ

2

Ваша скоростная функция почти наверняка возвращает 0, потому что вы определили numVelocity как int.

В C, при выполнении вычислений по целым числам, ответ всегда округляется до ближайшего целого числа, а так как ваши временные шаги составляют порядка 5, ваш второй член будет близок к 0. Добавляя это к что-то близкое к 0 будет округлить до 0.

вы также не инициализирован v, насколько я могу сказать, и вы передаете v (unitialised) в вашей функции скорости для вычисления v, которая даст вам неопределенные результаты (наиболее вероятно 0 ...).

Кроме того, при выполнении вычислений с двойной точностью вы должны писать константы с десятичной точкой 0 I.e. 1000.0. Программа интерпретируется как двойная по программе, а не 1000, которая является int.

Точно так же время является целочисленной переменной, и вы просили, чтобы она была двойной в вашей функции. Вы можете сделать это, пройдя (double)time вместо time.

Попробуйте изменить эти вещи в вашем коде (инициализирует V, установив его на начальную скорость) и посмотреть, какие изменения :)

+0

У меня есть 'v' инициализирован как двойной. – MikeG

+1

Да, который определяет тип, но в настоящее время он не имеет значения: D! говорить двойной v; не дает v значение. Что происходит, если вы попытаетесь добавить 1 к нему? Мы не знаем, потому что мы не знаем, что мы добавляем 1 к. Это может быть что угодно. Вам нужно написать double v = 0; для начала (или независимо от вашей начальной скорости), мы можем добавить 1 к нему (например), потому что теперь мы знаем, что мы добавляем 1 к – Samidamaru

+0

О, получилось, спасибо! – MikeG

Смежные вопросы