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

C程序,它从一个文件中提取成对的数字,计算牛顿(n,k),并将答案写入另一个文件,c,factorial,C,Factorial,我需要一个程序的帮助,该程序从一个txt文件中获取成对的数字,计算牛顿系数(n!/(n!(n-k)!)),并将答案(分数)写入另一个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); }

我需要一个程序的帮助,该程序从一个txt文件中获取成对的数字,计算牛顿系数(n!/(n!(n-k)!)),并将答案(分数)写入另一个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;
}
#包括
空阶乘(){
长l1,l2;
长分数=1;
对于(int i=1;i

问题是,当我启动程序时,它会向我显示答案
分数为:1
,并且文件sum.txt中没有任何内容

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

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

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

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

  • 您应该检查
    fopen()
    打开文件是否成功。如前所述,您的代码可能无法打开不存在的输出文件sum.txt,因为它试图打开该文件进行读取。因此
    file2
    NULL
    ,使用NULL流指针调用
    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();
}
#包括
#包括
#包括
长二项式(长n,长k){
长值=1;
if(kk;i--){
值*=i;
}
对于(长i=k;i>1;i++){
值/=i;
}
返回值;
}
整型读取(无效){
长n,k,分数;
文件*file1,*file2;
file=fopen(“pairs.txt”,“r”);
if(file==NULL){
fprintf(stderr,“打开pairs.txt时出错:%s\n”,strerror(errno));
返回1;
}
file2=fopen(“sum.txt”,“w”);
if(file2==NULL){
fprintf(stderr,“打开sum.txt时出错:%s\n”,strerror(errno));
fclose(文件);
返回1;
}
而(fscanf(文件“%ld%ld”、&n和&k)==2){
分数=二项式(n,k);
fprintf(文件2,“%ld\n”,分数);
}
//printf(“分数为:%ld\n”,分数);
fclose(文件);
fclose(文件2);
返回0;
}
内部主(空){
返回read();
}

当您希望输出存储在另一个文件中时,为什么要打开一个文件并使用printf在终端中打印结果?如果要将程序的输出放在文件中,重定向是使用“
长l1,l2;
阶乘
处完成的。这些未初始化。即使使用了它。您(
读取
)将
l1
l2
作为参数传递给
factorial
。将
factorial
返回
long
作为
score
。您以只读模式打开了
file2
;因此,您无法对其进行写入,也没有检查是否发生错误,因此即使在调用fprintf时,您也可以愉快地继续进行操作失败。另外-请编辑您的问题并包括
pairs.txt
文件的内容。谢谢。您还应该打开
file2
进行写作,是吗?