检查源代码相似性

#####################
Hash.h

typedef struct Hash{
    char key[100];
    int sd;
    int cont;
}Hs;

######################
main.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "Hash.h"
//第一个文件
int Check1(int a[])
{


    Hs hatb[30];//哈希表的长度
    FILE *ky;
    FILE *fp;
    int adr=0;
    int len=0,i=0,j=0,n=0;
    int g=13;//关键字的数量
    char s[50];
    char str[15][15];
    fp=fopen("D:\\1.txt","r+");
    ky=fopen("D:\\3.txt","r+");
    //***关键字文件 导入 二维数组
    for(i=0;i<g;i++)
    {
        a[i]=0;
    }
    i=0;
    while(!feof(ky))
    {
        fscanf(ky,"%s",str[i]);
//*************************//
//***********猜测范围板块**************//
//***因为要考虑到哈希表的长度、关键字的数量***********//

    len=0;//得到每个串的长度所以要置零
    len=strlen(str[i]);
    len=(str[i][0]+str[i][(len-1)/2]+1+len);//构造哈希函数:开头第一个和中间一个之和除以三
    adr=len%9;//在这里我是用9 作为一个素数,来求模取余
    printf("关键字的地址值:%d ",adr);
//******在设计过程中逐渐增加关键字的数量,要不然运行时间太长了*****************//
        puts(str[i]);
        i++;
    }

    //板块一:哈希表的初始化
    for(i=0;i<30;i++)
    {
        strcpy(hatb[i].key,"NULLKEY");
        hatb[i].sd=0;
        hatb[i].cont=0;
    }
    printf("\n");
    //printf("11111\n");板块一结束


//       ###################***********************************########################
板块二:检查程序中的代码
    while(!feof(fp))
    {
        fscanf(fp,"%s",s);

        for(i=0;i<g;i++)
        {

            if(strcmp(s,str[i])==0)//是否匹配
            {
                j++;


//********板块二结束

//板块三:
//当 找到 关键字后将其放入哈希表 更新哈希表的 关键字,试探次数,值
//****************生成哈希表*******************
//
//
                int f=1;//作为标记
                len=0;//得到每个串的长度所以要置零
                len=strlen(s);
                len=(s[0]+s[(len-1)/2]+len+1);//构造哈希函数
                adr=len%9;//在这里我是用9 作为一个素数求模
                //printf("aa");
                if(strcmp(hatb[adr].key,"NULLKEY")==0)
                {

                    strcpy(hatb[adr].key,s);
                    hatb[adr].sd=1;//试探的次数
                    hatb[adr].cont=1;//关键字第一次出现;
                }
                else
                {

                    if(strcmp(hatb[adr].key,s)==0)
                    {
                        hatb[adr].cont++;
                    }
                    else
                    {
                        while(strcmp(hatb[adr].key,"NULLKEY")!=0)
                        {

                            adr=(adr+1)%9;//新址
                            if(strcmp(hatb[adr].key,s)==0)
                            {
                                hatb[adr].cont++;
                                f=0;
                                break;
                            }

                        }
                        if(f==1)
                        {
                            strcpy(hatb[adr].key,s);
                            hatb[adr].cont++;
                        }
                    }
                }
                a[i]=hatb[adr].cont;
                printf("%d,%d  ",i,a[i]);


    //第一次是没被占用所以 数量和次数 变成一else不执行;
    //而如果位置被占用 第一个if是不执行的,执行else,被占用分两种情况:一种是和这个被占用的匹配
    //执行if 将数目加一 但是 试探次数不变,否则要线性试探,找新地址一直到新地址可用,这个过程中
    //如果新地址的关键字和程序匹配,那么该地址下的次数就加一,直接break退出;在不是已经匹配的关键字的前提下
    //他还会继续找新地址直到找到为止。
//板块三结束*************************
                memset(s,'0',sizeof(s));
                break;
            }
        }
    }
    printf("\n");
//      #####################***********************************#######################

//板块四:这里能看出来确实是正确的,但是我不敢使用太长的程序 和 太多的关键字来测试
//输出 未被 占用的哈希表

    for(i=0;i<30;i++)
    {
        if(strcmp(hatb[i].key,"NULLKEY")!=0)
        {
            puts(hatb[i].key);
            printf("位置:%d,试探:%d,次数:%d\n",i,hatb[i].sd,hatb[i].cont);
        }
    }
//板块四结束
    printf("文件一共%d处匹配\n",j);

    fclose(fp);//关闭文件
    fclose(ky);
    printf("                          打印分界线                           \n");
    for(i=0;i<1;i++)
    {
        for(j=0;j<60;j++)
        {
            printf("*");
        }
        printf("\n");
        for(j=0;j<60;j++)
        {
            printf("#");
        }
        printf("\n");
    }
    system("pause");
    return 0;
}




//第二个文件///^^^^^^^^^^^^^^^^^^^^^********************#############**********************
int Check2(int b[])
{
    Hs hatb[30];//哈希表的长度
    FILE *ky;
    FILE *fp;
    int adr=0;
    int len=0,i=0,j=0,n=0;
    int g=13;//关键字的数量
    char s[50];
    char str[15][15];
    fp=fopen("D:\\2.txt","r+");
    ky=fopen("D:\\3.txt","r+");
    //***关键字文件 导入 二维数组
    for(i=0;i<g;i++)
    {
        b[i]=0;
    }
    i=0;
    while(!feof(ky))
    {
        fscanf(ky,"%s",str[i]);
//*************************//
//***********猜测范围板块**************//
//***因为要考虑到哈希表的长度、关键字的数量***********//

    len=0;//得到每个串的长度所以要置零
    len=strlen(str[i]);
    len=(str[i][0]+str[i][(len-1)/2]+1+len);//构造哈希函数:开头第一个和中间一个之和除以三
    adr=len%9;//在这里我是用9 作为一个素数,来求模取余
    printf("关键字的地址值:%d ",adr);
//******在设计过程中逐渐增加关键字的数量,要不然运行时间太长了*****************//
        puts(str[i]);
        i++;
    }

    //板块一:哈希表的初始化
    for(i=0;i<30;i++)
    {
        strcpy(hatb[i].key,"NULLKEY");
        hatb[i].sd=0;
        hatb[i].cont=0;
    }
    printf("\n");
    //printf("11111\n");板块一结束


//       ###################***********************************########################
板块二:检查程序中的代码
    while(!feof(fp))
    {
        fscanf(fp,"%s",s);


        for(i=0;i<g;i++)
        {
            if(strcmp(s,str[i])==0)//是否匹配
            {
                j++;

//********板块二结束

//板块三:
//当 找到 关键字后将其放入哈希表 更新哈希表的 关键字,试探次数,值
//****************生成哈希表*******************
//
//
                int f=1;//作为标记
                len=0;//得到每个串的长度所以要置零
                len=strlen(s);
                len=(s[0]+s[(len-1)/2]+len+1);//构造哈希函数
                adr=len%9;//在这里我是用9 作为一个素数求模
                //printf("aa");
                if(strcmp(hatb[adr].key,"NULLKEY")==0)
                {

                    strcpy(hatb[adr].key,s);
                    hatb[adr].sd=1;//试探的次数
                    hatb[adr].cont=1;//关键字第一次出现;
                }
                else
                {

                    if(strcmp(hatb[adr].key,s)==0)
                    {
                        hatb[adr].cont++;
                    }
                    else
                    {
                        while(strcmp(hatb[adr].key,"NULLKEY")!=0)
                        {

                            adr=(adr+1)%9;//新址
                            if(strcmp(hatb[adr].key,s)==0)
                            {
                                hatb[adr].cont++;
                                f=0;
                                break;
                            }

                        }
                        if(f==1)
                        {
                            strcpy(hatb[adr].key,s);
                            hatb[adr].cont++;
                        }
                    }
                }
                b[i]=hatb[adr].cont;
    //第一次是没被占用所以 数量和次数 变成一else不执行;
    //而如果位置被占用 第一个if是不执行的,执行else,被占用分两种情况:一种是和这个被占用的匹配
    //执行if 将数目加一 但是 试探次数不变,否则要线性试探,找新地址一直到新地址可用,这个过程中
    //如果新地址的关键字和程序匹配,那么该地址下的次数就加一,直接break退出;在不是已经匹配的关键字的前提下
    //他还会继续找新地址直到找到为止。
//板块三结束*************************

                memset(s,'0',sizeof(s));
                break;
            }
        }
    }
//      #####################***********************************#######################

//板块四:这里能看出来确实是正确的,但是我不敢使用太长的程序 和 太多的关键字来测试
//输出 未被 占用的哈希表
    int k=0;
    for(i=0;i<30;i++)
    {
        if(strcmp(hatb[i].key,"NULLKEY")!=0)
        {
            puts(hatb[i].key);
            printf("位置:%d,试探:%d,次数:%d\n",i,hatb[i].sd,hatb[i].cont);
        }
    }
//板块四结束
    printf("文件一共%d处匹配\n",j);

    fclose(fp);//关闭文件
    fclose(ky);
    return 0;
}


int main()
{
    FILE *ky;
    int i=0,j=0;
    int g=13;//关键字个数
    int k1=0,k2=0,len=0;
    int a[13];
    int b[13];
    char str[30][30];
    Check1(a);
    Check2(b);
    ky=fopen("D:\\3.txt","r+");
    while(!feof(ky))
    {
        fscanf(ky,"%s",str[i]);
        len=strlen(str[i]);
        printf("%7s",str[i]);
        printf(" ");
    }

    printf("\n");
    printf("程序一:\n");
    for(i=0;i<g;i++)
    {
        printf("%7d ",a[i]);
    }
    printf("\n");
    printf("程序二:\n");
    for(i=0;i<g;i++)
    {
        printf("%7d ",b[i]);
    }printf("\n");
    double sum=0.0;
    double t=0;
    for(i=0;i<g;i++)
    {
        t=(a[i]-b[i])*(a[i]-b[i]);
        sum=t+sum;
    }
    sum=sqrt(sum);
    printf("程序相似性:%lf",sum);
    return 0;
}

期末小作业

使用哈希表来看代码相似性 使用了线性试探来解决冲突

 

 

  • 7
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 模糊c均值聚类是一种经典的图像处理算法,该算法可以有效地对图像进行模糊分类和分割。其主要原理是根据数据点间的相似性将它们聚类到不同的类别,以获得更清晰的图像边缘和纹理。 以下是模糊c均值聚类的matlab源代码示例: ```matlab % 读取原始图像 image = imread('image.jpg'); % 图像灰度化 gray_image = rgb2gray(image); % 对图像进行模糊c均值聚类 num_clusters = 4; % 设置聚类的类别数 max_iterations = 100; % 设置聚类的最大迭代次数 fuzzy_exponent = 2; % 设置聚类算法中的模糊指数 options = [fuzzy_exponent, max_iterations, 1e-5, 0]; [cluster_image, cluster_centers] = fcm(gray_image(:), num_clusters, options); % 将聚类结果重新映射到图像 cluster_image = reshape(cluster_image, size(image, 1), size(image, 2)); % 显示聚类结果 figure; imagesc(cluster_image); colormap jet; title('聚类结果'); % 显示聚类中心 figure; for i = 1:num_clusters subplot(2, 2, i); imshow(uint8(cluster_centers(i))); title(['聚类中心 ', num2str(i)]); end % 保存聚类结果 imwrite(cluster_image, 'cluster_image.jpg'); ``` 上述代码中,首先读取原始图像并将其灰度化,然后通过设置聚类的类别数、最大迭代次数和模糊指数等参数,使用fcm函数进行模糊c均值聚类。聚类结果被重新映射到图像后进行显示,并将结果保存为一张新的图像文件。 ### 回答2: 图像处理中的模糊c均值聚类算法是一种基于隶属度的聚类方法,它可以将图像中的像素点分成若干类别,并计算每个像素点属于每个类别的隶属度。这种方法主要用于图像分割、图像压缩和图像挖掘等方面。 算法的步骤如下: 1. 初始化聚类中心:随机选择k个像素点作为初次的聚类中心。 2. 计算隶属度矩阵:计算每个像素点属于每个类别的隶属度值,通过迭代计算更新隶属度矩阵。 3. 计算聚类中心:根据隶属度矩阵,重新计算每个类别的聚类中心。 4. 判断迭代结束条件:检查聚类中心是否发生变化,如果发生变化,则进行下一轮迭代;若未发生变化,则停止迭代。 5. 根据隶属度矩阵重新分割图像:根据隶属度矩阵,将图像中的像素点重新分为k个类别。 接下来是MATLAB中的模糊c均值聚类算法源代码的一个示例: ```matlab function [U, centers] = fuzzyCMeansClustering(image, k, m, max_iter) % 参数说明: % image:输入图像 % k:聚类的类别数量 % m:隶属度的模糊度(通常为2) % max_iter:最大迭代次数 % 将图像转化为矩阵 image = double(image); [row, col] = size(image); data = reshape(image, row * col, 1); % 随机初始化聚类中心 centers = rand(k, 1) * 256; % 初始化隶属度矩阵 U = rand(row * col, k); for iter = 1:max_iter % 更新隶属度矩阵 for i = 1:row * col for j = 1:k dist = abs(data(i) - centers(j)); U(i, j) = 1 / sum((dist ./ dist) .^ (2 / (m - 1))); end end % 更新聚类中心 for j = 1:k centers(j) = sum((U(:, j) .^ m) .* data) / sum(U(:, j) .^ m); end % 判断迭代结束条件 if iter > 1 && norm(U - U_prev) < 1e-5 break; end U_prev = U; end % 根据隶属度矩阵重新分割图像 [~, labels] = max(U, [], 2); segmented_image = reshape(labels, row, col); % 返回隶属度矩阵和聚类中心 U = reshape(U, row, col, k); end ``` 以上就是模糊c均值聚类算法以及MATLAB源代码的简要介绍。这段代码实现了模糊c均值聚类算法,并可以将图像进行分割。 注意:为了使源代码更易读,可能省略了部分细节和参数校验的代码,请使用时根据需要进行相应的修改和完善。 ### 回答3: 模糊c均值聚类(FCM)是一种经典的图像处理算法,用于将图像中的像素点划分到不同的聚类中。它通过迭代计算每个像素点属于每个聚类的隶属度来实现图像的聚类。 FCM算法的主要步骤如下: 1. 初始化聚类中心:随机选择或者根据先验知识设置聚类中心的数量和位置。 2. 计算隶属度:对于每个像素点,计算其到每个聚类中心的隶属度。这里使用的是欧几里得距离作为距离度量。 3. 更新聚类中心:根据隶属度更新聚类中心的位置。 4. 重复步骤2和3,直到达到迭代停止的条件,如聚类中心不再改变或达到最大迭代次数。 根据以上算法描述,可以通过MATLAB实现FCM算法的源代码。以下为一个简单的MATLAB源代码示例: ```matlab function [membership, centers] = fuzzyCMeans(image, num_clusters, fuzziness, max_iteration) % image: 输入图像 % num_clusters: 聚类中心数量 % fuzziness: 模糊系数 % max_iteration: 最大迭代次数 % 初始化聚类中心 img_size = size(image); num_pixels = img_size(1) * img_size(2); centers = rand(num_clusters, 1) * 255; % 迭代更新 for iter = 1:max_iteration membership = zeros(num_clusters, num_pixels); for i = 1:num_clusters for j = 1:num_pixels dist = sqrt((image(j) - centers(i))^2); membership(i, j) = 1 / sum((dist / (dist)).^(2/(fuzziness-1))); end end membership = membership ./ sum(membership); % 更新聚类中心 for i = 1:num_clusters centers(i) = sum((membership(i,:).^fuzziness) .* image) / sum(membership(i,:).^fuzziness); end % 判断是否达到停止条件 if max(abs(centers - prev_centers)) < 1e-5 break; end prev_centers = centers; end end ``` 以上代码是一个基本的FCM算法实现,可以根据输入的图像、聚类中心数量、模糊系数和最大迭代次数执行模糊c均值聚类,并返回隶属度和最终的聚类中心。 需要注意的是,这只是一个简单的示例代码,并没有考虑到一些优化和改进的细节。在实际应用中,可能需要进一步对代码进行调整和改进,以适应具体问题的要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值