Question

I'm trying to find a solution(fix errors) in my programme which must count the binomial theorem from definition. Firstly I created the definition of "factorial" - "silnia".

1) The algorithm determines the value of SN1 (n,k) of the definition. (newton function)

2) The algorithm determines the value of SN3 (n,k) recursively by the formula. (newton_rek function).

INPUT: File name: In0101.txt

OUTPUT: File name: Out0101.txt In this file I want to save the values ​​calculated from the formulas.

EXAMPLE: In0101.txt

8 2// n k 

Out0101.txt

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

And there is an error I can't fix. Does anybody can help me with this ?

MY CODE:

#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;
}
Was it helpful?

Solution

Your calculations both generate Pascal's triangle. I have done a short test: http://ideone.com/jHA8EJ

I think your problem is that you are not outputting correctly. You did not state the problem you were having in your question, so people suspected it was algorithmic due to your lack of description.

I believe the problem is actually here:

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

There's two things wrong:

  1. You are not taking the address of the variables you are writing. That's likely to cause a crash (which perhaps you might have mentioned);
  2. You are trying to write them as binary, but you seem to be expecting text.

You should replace those calls with something like this:

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

As Daniel Fischer pointed out:

The address thing also applies to reading the input file (and also the byte/text representation thing), furthermore fread gets the wrong size parameter.

That is:

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

Same two principles apply. You are reading binary values and you are doing it incorrectly. Instead, read text:

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

You should test that nvals is 2, indicating that both values were read successfully.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top