2

プログラムで、定義から二項定理を数えなければならない解決策(エラーの修正)を見つけようとしています。まず、" factorial " - "silnia" の定義を作成しました。

1) アルゴリズムは、定義の SN1 (n,k) の値を決定します。(ニュートン関数)

2) アルゴリズムは、式によって再帰的に SN3 (n,k) の値を決定します。( newton_rek関数)。

入力: ファイル名: In0101.txt

OUTPUT: ファイル名: Out0101.txt このファイルには、数式から計算された値を保存したいと思います。

例: In0101.txt

8 2// n k 

Out0101.txt

n=8 k=2
SN1 = 28; count= 14

そして、私が修正できないエラーがあります。誰でもこれで私を助けることができますか?

私のコード:

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

long silnia(int a)
{
    long s;
    if (a == 0 || a == 1)
    {
        return 1;
    }
    else
    {
        s = 1;
        for (int i = 1; i <= a; i++)
        {
            s *= i;
        }
    }
    return s;
}

long newton(int n, int k)
{
    return silnia(n)/(silnia(k)*silnia(n-k));
}

unsigned long int newton_rek(long int n ,long int k)
{
    if ( n == k || k == 0 )
    {
        return 1;
    }

    if (k > n)
    {
        return 0;
    }

    else return newton_rek(n-1,k-1) + newton_rek(n-1,k);
}

int main()
{
    int n = 0;
    int k = 0;
    long funkcja1 = 0;
    long funkcja2 = 0;

    FILE *f = fopen("In0101.txt", "r+");    
    if (f == NULL)
    {
        printf("Nie udalo sie otworzyc pliku In0101.txt\n");
        return 1;
    }
    fread(n, sizeof(long), 1 , f);
    fread(k, sizeof(long), 1 , f);
    fclose(f);

    FILE *ff = fopen("Out0101.txt", "w+");    

    if (ff == NULL)
    {
        printf("Nie udalo sie otworzyc pliku Out0101.txt\n");
        return 1;
    }

    funkcja1 = newton(n,k);
    funkcja2 = newton_rek(n,k);
    fwrite(funkcja1, sizeof(long), 1 , ff);
    fwrite(funkcja2, sizeof(long), 1 , ff);
    fclose(f);

    return 0;
}
4

1 に答える 1

4

あなたの計算は両方ともパスカルの三角形を生成します。簡単なテストを行いました: http://ideone.com/jHA8EJ

あなたの問題は、正しく出力されていないことだと思います。質問で抱えている問題について述べていないため、説明が不足しているため、人々はアルゴリズムの問​​題であると疑っていました。

問題は実際にはここにあると思います:

fwrite(funkcja1, sizeof(long), 1 , ff);
fwrite(funkcja2, sizeof(long), 1 , ff);

次の 2 つの点が間違っています。

  1. 書いている変数のアドレスを取得していません。それはクラッシュを引き起こす可能性があります(おそらくあなたが言及したかもしれません)。
  2. それらをバイナリとして書き込もうとしていますが、テキストを期待しているようです。

これらの呼び出しを次のように置き換える必要があります。

fprintf( ff, "%d %d\n", funkcja1, funkcja2 );

ダニエル・フィッシャーが指摘したように:

アドレスの問題は入力ファイル (およびバイト/テキスト表現の問題) の読み取りにも適用され、さらに fread は間違ったサイズ パラメータを取得します。

あれは:

fread(n, sizeof(long), 1 , f);
fread(k, sizeof(long), 1 , f);

同じ 2 つの原則が適用されます。バイナリ値を読み取っていて、間違っています。代わりに、テキストを読んでください:

int nvals = fscanf( f, "%d%d", &n, &k );

それが 2 であることをテストしてnvals、両方の値が正常に読み取られたことを示す必要があります。

于 2012-10-29T23:16:26.257 に答える