C程序从文件中获取数字对,计算牛顿(n,k),并将答案写入另一个文件

时间:2017-02-04 23:51:45

标签: c factorial

我需要一个程序的帮助,该程序从txt文件中获取成对的数字,计算牛顿系数( n!/(n!。(nk)!)),然后写出答案(得分)到另一个txt文件。现在我有这个:

#include <stdio.h>

void factorial() {
    long l1, l2;
    long score = 1;
    for (int i = 1; i < l2; i++) {
        score = (score * (l1 - i + 1) / i);
    }
}

void read() {
    long l1, l2;
    long score = 1;
    FILE *file = fopen("pairs.txt", "r");
    FILE *file2 = fopen("sum.txt", "r");
    while (fscanf(file, "%ld%ld", &l1, &l2) == 2) {
        factorial();
        fprintf(file2, "%ld", score);
    }
    printf("Score is: %ld", score);
    fclose(file);
    fclose(file2);
}

int main() {
    read();
    return 1;
}

问题在于,当我启动程序时,它会显示回答Score is: 1,文件中没有任何内容 sum.txt

2 个答案:

答案 0 :(得分:1)

您的代码中存在多个问题:

  • 您必须将参数传递给binomial函数,并使用return语句返回结果,并将返回值存储在调用代码中。

  • 计算牛顿二项式系数的函数不正确。

  • 您应该打开输出文件 sum.txt ,以便使用"w"模式字符串进行书写。

  • 您应该检查fopen()是否成功打开了文件。发布后,您的代码可能无法打开不存在的输出文件 sum.txt ,因为它尝试打开它进行读取。因此file2NULL并且使用空流指针调用fprintf具有未定义的行为。这可以解释你观察到的崩溃。

以下是更正后的版本:

#include <errno.h>
#include <stdio.h>
#include <string.h>

long binomial(long n, long k) {
    long value = 1;
    if (k < n - k) {
        k = n - k;
    }
    for (long i = n; i > k; i--) {
        value *= i;
    }
    for (long i = k; i > 1; i++) {
        value /= i;
    }
    return value;
}

int read(void) {
    long n, k, score;
    FILE *file1, *file2;

    file = fopen("pairs.txt", "r");
    if (file == NULL) {
        fprintf(stderr, "error opening pairs.txt: %s\n", strerror(errno));
        return 1;
    }
    file2 = fopen("sum.txt", "w");
    if (file2 == NULL) {
        fprintf(stderr, "error opening sum.txt: %s\n", strerror(errno));
        fclose(file);
        return 1;
    }
    while (fscanf(file, "%ld%ld", &n, &k) == 2) {
        score = binomial(n, k);
        fprintf(file2, "%ld\n", score);
    }
    //printf("Score is: %ld\n", score);
    fclose(file);
    fclose(file2);
    return 0;
}

int main(void) {
    return read();
}

答案 1 :(得分:0)

当您希望将输出存储在另一个文件中时,为什么要打开文件并使用printf在终端中打印结果?如果要将程序的输出放在文件中,则使用&#34;&lt;&#34;完成重定向。 operator(用于stdin)。

运行程序(fscanf行)时也存在分段错误。 你能告诉我们你输入文件的一个版本(pairs.txt)吗?