c18720373913 2023-07-25 22:42 采纳率: 0%
浏览 3

大数据推荐系统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;
}
  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-07-26 08:41
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 这有个类似的问题, 你可以参考下: 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;
      }
      

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

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


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

报告相同问题?

问题事件

  • 创建了问题 7月25日