【问题标题】:Loop in basic C program基本 C 程序中的循环
【发布时间】:2020-03-19 07:38:55
【问题描述】:

我无法找到并解决此代码中的错误。
我希望 Parray 和 Tarray 在循环中填充方程的迭代。我尝试了 for 和 while 循环,但似乎只有数组的第一个成员被赋予了正确的值,并且该值在新循环开始时丢失。

#include <stdio.h>
#include <stdlib.h>

int main() {

    int i;
    int j;
    float dt,P_init,t_init,t_end;
    dt = 0.03125;
    P_init = 30;
    t_init = 0;
    t_end = 30;

    int n_steps = 0;
    n_steps = t_end/(float)dt;

    int Parray[n_steps+1];
    int Tarray[n_steps+1];

    for (i=0; i<n_steps+1; i++)
       {
           Parray[i]=0;
           Tarray[i]=0;
       }



    Parray[0] = P_init;
    Tarray[0] = t_init;

    int x;
    float P,t,dpdt;

    x = 1;
    while (x < n_steps+1)
       {

        float s,d;
        P = Parray[x-1];
        t = Tarray[x-1];
        dpdt = 0.7 * P * (1-(P/750)) - 20;
        s = P + (dt * dpdt);
        Parray[x] = s;
        d = t + dt;
        Tarray[x] = d;
        x++;
        printf("%f  %f  ",s,d);

               }



    return(0);
}

【问题讨论】:

    标签: c for-loop while-loop differential-equations


    【解决方案1】:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void) 
    {
        int i, j, x;
        float dt, P_init, t_init, t_end, P, t, dpdt;
    
        dt = 0.03125;
        P_init = 30;
        t_init = 0;
        t_end = 30;
    
        int n_steps = 0;
        n_steps = t_end / (float)dt;
    
        // using float arrays
        float Parray[n_steps+1];
        float Tarray[n_steps+1];
    
        for (i = 0; i < n_steps+1; i++)
               Parray[i] = 0;
    
        for (j = 0; j < n_steps+1; j++)
               Tarray[j] = 0;
    
        Parray[0] = P_init;
        Tarray[0] = t_init;
    
        for (x = 1; x < n_steps + 1; x++) {
            float s , d;
            P = Parray[x-1]; 
            t = Tarray[x-1];
            dpdt = 0.7 * P * (1 - (P / 750)) - 20;
            s = P + (dt * dpdt);
            Parray[x] = s;
            d = t + dt;
            Tarray[x] = d;
            printf("%f  %f\n", s, d);
        }
    
        return(0);
    }
    

    我将 int 数组更改为浮点数组。 你在这里实际计算的是什么?

    【讨论】:

    • 我编译了它,输出再次重复。 dpdt = 0.7 * P * (1 - (P / 750)) - 20; s = P + (dt * dpdt);这两个方程应该计算 Parray 的下一次迭代。
    • 我的输出是在最后两次迭代中 720.240845 29.968750 720.240967 30.000000。我用两个编译器试了一下。
    • 如果 s 和 d 计算正确,请使用调试器检查 for 循环。
    • 我在python中检查了你的计算,它是正确的,所以谢谢。我猜我的 C 编译器有问题。
    • 不太可能。试试这个在线编译器:onlinegdb.com/online_c_compiler
    【解决方案2】:

    这一行

    dpdt = 0.7 * P * (1-(P/750)) - 20;
    

    它似乎有一个浮点值,因此数组必须是浮点类型,并且您放入数组中的所有输入都必须是浮点类型。 改变这个:

    int Parray[n_steps+1];
    int Tarray[n_steps+1];
    

    float Parray[n_steps+1];
    float Tarray[n_steps+1];
    

    P_init = 30;
    t_init = 0;
    t_end = 30;
    

    它们都应该是 30.0, 0.0, 30.0 不要忘记这一点:

     Parray[i]=0;
     Tarray[i]=0;
    

    将其更改为 0.0

    简而言之,C 不擅长区分类型,所以如果你声明一个浮点数组,所有输入都必须是 x.0,而不仅仅是 x,其中 x 是整数。

    【讨论】:

    • 好的。我不认为这是这里的问题。但是,当您使用浮点文字时,请使用类似 30f 的内容。 30.0 表示法适用于双精度值。
    • 我现在得到了正确的结果,只通过 float Parray 初始化而不是 int 来更改原始代码。所以 P_init 和 t_init 不是问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 2020-06-14
    相关资源
    最近更新 更多