大数据推荐系统C语言实现逻辑bug

大数据推荐系统存在逻辑bug无法得到预期结果
求解答


#include<stdio.h>
#include<math.h>
double x[942][1412]={0};
double score[942][1412];
int top[942][1412];
double list[942][1412];
int result[926][11]={0};
double sim[942][942];
double product(double a[],double b[],int n){
    double result=0;
    for(int i=0;i<n;i++){
        result+=a[i]*b[i];
    }
    return result;
}
double length(double a[],int n){
    double result=0;
    for(int i=0;i<n;i++){
        result+=a[i]*a[i];
    }
    return sqrt(result);
}
double similar(double a[],double b[],int n){
    return product(a,b,n)/(length(a,n)*length(b,n));
}
int main(){
    
    int i,j,m,n,c;
    
    int t,k,q=0;
    FILE *p=fopen("training.txt","r");
    while(fscanf(p,"%d %d %d",&i,&j,&c)!=EOF){
        x[i-1][j-1]=1;
    }
    fclose(p);//将数据转化为二维数组存储 
    for(i=0;i<942;i++){
        for(j=0;j<942;j++){
            sim[i][j]=similar(x[i],x[j],1412);//通过向量方法计算相似度 
        }
    }
    for(i=0;i<942;i++){
        for(j=0;j<1412;j++){
            for(m=0;m<942;m++){
                score[i][j]=score[i][j]+sim[i][m]*x[m][j];//加权计算得分 
            }
        }
    }//计算每个用户对于每件商品可能的喜爱程度
    
    for(i=0;i<942;i++){
        for(j=0;j<1412;j++){
            top[i][j]=j+1;
        }
    }
    
    for(i=0;i<942;i++){
        for(j=0;j<1412;j++){
            list[i][j]=score[i][j];
        }
    }
    for(i=0;i<942;i++){
        for(j=1411;j>=0;j--){
            for(m=0;m<j;m++){
                    if(list[i][m]<list[i][j]){
                        n=list[i][j];
                        list[i][j]=list[i][m];
                        list[i][m]=n;
                        n=top[i][j];
                        top[i][j]=top[i][m];
                        top[i][m]=n;
                }
            }
        }
    }//按照分数对用户可能喜欢的商品进行排序
      
    FILE *fpRead=fopen("test.txt","r");  
    if(fpRead==NULL)  
    {  
        return 0;  
    }  
    for(i=0;i<926;i++)  
    {  
        fscanf(fpRead,"%d ",&result[i][0]);    
    }//读取test数据 
    fclose(fpRead);
    for(i=0;i<926;i++){
        for(j=1;j<11;j++){
            result[i][j]=top[result[i][0]][j-1];
        }
    }//在数组中填入top10商品 
    FILE *fpWrite=fopen("202200271019_result.txt","w");  
    if(fpWrite==NULL){  
        return 0;  
    }  
    for(i=0;i<926;i++){
        for(j=0;j<11;j++){
            fprintf(fpWrite,"%d ",result[i][j]);
        }
        fprintf(fpWrite,"\n");
    }//写入top10推荐 
    fclose(fpWrite);     
    return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7526000
  • 你也可以参考下这篇文章:C语言小bug汇总
  • 您还可以看一下 包东华老师的C语言俄罗斯方块课程中的 最后一个bug,按键粘连小节, 巩固相关知识点
  • 除此之外, 这篇博客: C语言操作符详解(和bug郭一起学C系列)中的 逻辑操作符 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

    逻辑操作符,有逻辑与&&,逻辑或||

    当我们要测试两个表达式结果时,如果要同时满足,使用逻辑与&&只需满足其中一个表达式结果时使用逻辑或||
    我们要区分逻辑操作符和位操作符按位与&,按位或|区别!

    #include<stdio.h>
    int main()
    {
         int a=3;//00000000 00000000 00000000 00000011
    	 int b=1;//00000000 00000000 00000000 00000001
    	printf("%d\n",a&b);
    	printf("%d\n",a|b);
    	printf("%d\n",a&&b);
        printf("%d\n",a||b);
    			
    return 0;
    }
    

    在这里插入图片描述
    位操作符和逻辑操作符截然不同,一个是对整数的二进制进行操作,另一个是对表达式的结果进行判断!
    && 只有当两个表达式结果同时为真,结果才为真!
    || 只有当两个表达式结果同时为假,结果才为假!
    逻辑表达式的特性!

    #include<stdio.h>
    int main()
    {
     int a=3,b=5,c=6,i=0;
     i=a++&&++b;
     printf("%d %d\n",a,b);
     i=a++||++b;
     printf("%d %d\n",a,b);
    return 0;
    }
    

    在这里插入图片描述我们可以看到,逻辑或||第二个表达式,并没有执行。
    这是为什么呢!

    总结: 逻辑与&&当执行到表达式结果为假,便停止执行,后面的表达式!
    逻辑或||当执行到表达式结果为真,便停止执行后面的表达式!
    这就是我们常说的逻辑短路特点!


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

这题目是怎样的,然后 training.txt 文件里的数据是怎样的?