#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <memory.h>
#include <string.h>#include "4TRMUL.c"int m, n, k;
double a[], b[], c[];main()
{
    int i, j, k, m, n;
    double p[3][3], x[3][1], g[3][1], p0[3][3];

    double y[14] = {0.1199,0.2354,0.3440,0.4283,0.5365,0.8354,1.4179,1.8630,1.6040,0.9234,0.5490,0.5818,0.5953,0.3904};

    static double h[3][1], hs[1][3];
    static double t1[3][1], t2[1][1], t3[3][3];
    static double r = 0.000001;
    static double I[3][3] = {{1,0,0}, {0,1,0}, {0,0,1}};
    static double x0[3][1] = {0,0,0};
    static double ht[14][3] =
{
{0.5817,0.0000,0.0000}, {1.1368,0.0001,0.0000},
{1.6729,0.0028,0.0001}, {2.0286,0.0326,0.0024},
{2.0711,0.2218,0.0226}, {1.7145,0.8916,0.1277},
{1.1095,2.1201,0.4276}, {0.5523,2.9823,0.8514},
{0.2105,2.4817,1.0446}, {0.0614,1.2217,0.9803},
{0.0137,0.3558,1.2173}, {0.0023,0.0613,1.8266},
{0.0003,0.0062,1.9631}, {0.0000,0.0004,1.2843}
};

    double del = 0.08734; FILE * file;
char data[200];
file = fopen("C:\\data.txt", "w");    for (i = 0; i <= 2; i++)
    {
for (j = 0; j <= 2; j++)
{
p0[i][j] = I[i][j] * del;
}
}

/*************************  start  ***************************/

    for(k = 0; k <= 13; k++)
{
for (i = 0; i <= 2; i++)
{
h[i][0] = ht[k][i];
}

trmul(p0, h, 3, 3, 1, t1);

for (i = 0; i <= 2; i++)
{
hs[0][i] = h[i][0];
}

trmul(hs, t1, 1, 3, 1, t2);

for(i = 0; i <= 2; i++)
{
g[i][0] = t1[i][0] / (t2[0][0] + r);
}

trmul (g, hs, 3, 1, 3, t3);

for (i = 0; i <= 2; i++)
{
for (j = 0; j <= 2; j++)
{
t3[i][j] = I[i][j] - t3[i][j];
}
}

trmul (t3, p0, 3, 3, 3, p);

trmul (hs, x0, 1, 3, 1, t2);

t2[0][0] = y[k] - t2[0][0];

for (i = 0; i <= 2; i++)
{
x[i][0] = x0[i][0] + (g[i][0] * t2[0][0]);
}

for (i = 0; i <= 2; i++)
{
x0[i][0] = x[i][0];
}

for (i = 0; i <= 2; i++)
{
for(j = 0; j <= 2; j++)
{
p0[i][j] = p[i][j];
}
}

printf ("    %e    %e    %e\n", x0[0][0], x0[1][0], x0[2][0]);
printf("\n");

memset(data, NULL, sizeof(data));

sprintf(data, "%d\t%e\t%e\t%e\n", k+1, x0[0][0], x0[1][0], x0[2][0]);

fwrite(data, strlen(data), 1, file);
}

fclose(file);

printf("\n\n");
}
//////////////////////////////
//4TRMUL.c
void trmul(a, b, m, n, k, c)
int m, n, k;
double a[], b[], c[];
{
int i, j, l, u;
for(i = 0; i <= m - 1; i++)
{
for(j = 0; j <= k - 1; j++)
{
u = i * k + j;
c[u] = 0.0; for(l = 0; l <= n - 1; l++)
{
c[u] = c[u] + a[i * n + l] * b[l * k + j];
}
}
}

return;
}

解决方案 »

  1.   

    是啊,多定义一个.h文件,然后把.c文件放到.cpp就可以了呀
      

  2.   

    1.程序用标准的K&R C语法.用VC的C方式编译没问题
    2.程序中没有复杂的语法,除了double指针的隐式转换,其它没有难点(只是计算而已)
    3.如果真要用C++编译,改成以下的就可以了(VC下与原结果相同)
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <memory.h>
    #include <string.h>void trmul(double *a, double *b,int m, int n, int k, double *c)
    {
    int i, j, l, u;
    for(i = 0; i <= m - 1; i++)
    {
    for(j = 0; j <= k - 1; j++)
    {
    u = i * k + j;
    c[u] = 0.0; for(l = 0; l <= n - 1; l++)
    {
    c[u] = c[u] + a[i * n + l] * b[l * k + j];
    }
    }
    }

    return;
    }
    //int m, n, k;
    //double a[], b[], c[];main()
    {
        int i, j, k, m, n;
        double p[3][3], x[3][1], g[3][1], p0[3][3];

        double y[14] = {0.1199,0.2354,0.3440,0.4283,0.5365,0.8354,1.4179,1.8630,1.6040,0.9234,0.5490,0.5818,0.5953,0.3904};

        static double h[3][1], hs[1][3];
        static double t1[3][1], t2[1][1], t3[3][3];
        static double r = 0.000001;
        static double I[3][3] = {{1,0,0}, {0,1,0}, {0,0,1}};
        static double x0[3][1] = {0,0,0};
        static double ht[14][3] =
    {
    {0.5817,0.0000,0.0000}, {1.1368,0.0001,0.0000},
    {1.6729,0.0028,0.0001}, {2.0286,0.0326,0.0024},
    {2.0711,0.2218,0.0226}, {1.7145,0.8916,0.1277},
    {1.1095,2.1201,0.4276}, {0.5523,2.9823,0.8514},
    {0.2105,2.4817,1.0446}, {0.0614,1.2217,0.9803},
    {0.0137,0.3558,1.2173}, {0.0023,0.0613,1.8266},
    {0.0003,0.0062,1.9631}, {0.0000,0.0004,1.2843}
    };

        double del = 0.08734; FILE * file;
    char data[200];
    file = fopen("C:\\data.txt", "w");    for (i = 0; i <= 2; i++)
        {
    for (j = 0; j <= 2; j++)
    {
    p0[i][j] = I[i][j] * del;
    }
    }

    /*************************  start  ***************************/

        for(k = 0; k <= 13; k++)
    {
    for (i = 0; i <= 2; i++)
    {
    h[i][0] = ht[k][i];
    }

    trmul((double *)p0, (double *)h, 3, 3, 1, (double *)t1);

    for (i = 0; i <= 2; i++)
    {
    hs[0][i] = h[i][0];
    }

    trmul((double *)hs, (double *)t1, 1, 3, 1, (double *)t2);

    for(i = 0; i <= 2; i++)
    {
    g[i][0] = t1[i][0] / (t2[0][0] + r);
    }

    trmul ((double *)g, (double *)hs, 3, 1, 3, (double *)t3);

    for (i = 0; i <= 2; i++)
    {
    for (j = 0; j <= 2; j++)
    {
    t3[i][j] = I[i][j] - t3[i][j];
    }
    }

    trmul ((double *)t3, (double *)p0, 3, 3, 3,(double *) p);

    trmul ((double *)hs, (double *)x0, 1, 3, 1, (double *)t2);

    t2[0][0] = y[k] - t2[0][0];

    for (i = 0; i <= 2; i++)
    {
    x[i][0] = x0[i][0] + (g[i][0] * t2[0][0]);
    }

    for (i = 0; i <= 2; i++)
    {
    x0[i][0] = x[i][0];
    }

    for (i = 0; i <= 2; i++)
    {
    for(j = 0; j <= 2; j++)
    {
    p0[i][j] = p[i][j];
    }
    }

    printf ("    %e    %e    %e\n", x0[0][0], x0[1][0], x0[2][0]);
    printf("\n");

    memset(data, NULL, sizeof(data));

    sprintf(data, "%d\t%e\t%e\t%e\n", k+1, x0[0][0], x0[1][0], x0[2][0]);

    fwrite(data, strlen(data), 1, file);
    }

    fclose(file);

    printf("\n\n");
    }
      

  3.   

    早年的K&R C就是这样,K&R风格的C代码最典型的特征就是函数的参数放在函数块和函数名之间……
      

  4.   

    不习惯这种写法而以
    不清晰
    偶C学得不好
    一般都是stan的C++那种写法