创建,消除重复项并对int数组C

时间:2018-10-27 17:39:51

标签: c

我对C语言很陌生,我正在学习它是我上学的原因,我可以说我开始理解为什么大多数语言都基于此语言。

我正在尝试创建一个程序,该程序创建一个包含100个随机数字的int数组,将其保存到文件中,然后消除重复的数字并按升序对其进行排序。

我的解决方案将所需的效果带到同一文件中,但是对于应该执行的操作来说感觉太复杂了。

我敢肯定,有99%的方法可以做到这一点。

我要使用3个功能:

  1. 用于保存文件
  2. 用于消除重复项,
  3. 用于排序

最后我做了2次,因为我在解决方案中遇到了一些问题。

ex:问题之一是,删除重复项后,我在数组中留下了很多地方,里面充斥着我不希望的值,就像在变量中得到的那种值一样, t初始化。因此,我使用的计数器变量最终使用的不是全局变量,而是全局变量。

我很确定您可以在其中找到一些疯狂的东西。

如果有任何建议,我欢迎您提出任何建议,在此先感谢大家尝试帮助我找到自己的困境的终点。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int cnt;

void *save(int *pin)
{
    FILE *dat;
    int i=0;
    dat = fopen("data.txt","w");
    while(pin[i])
    {
    if(i==cnt){break;}
    fprintf(dat,"\n%d",pin[i]);
    i++;
    }
    fclose(dat);
    return 0;
}

void del_sort()
{
    FILE *dat;
    int pin[100];
    int i=0,j,k,sw=0,temp;
    dat=fopen("data.txt","r");
    while(!feof(dat))
    {
        fscanf(dat,"%d",&pin[i]);
        i++;
    }
    fclose(dat);

    //Eliminate duplicate numbers
    for(i=0;i<cnt;i++)
    {
        sw++;
        if (pin[i]>100)
            {
                sw--;
                break;
            }
        for(j=i+1;j<cnt;j++)
        {
            if (pin[i]==pin[j])
        {
            for(k=j;k<cnt;k++)
            {
                pin[k]=pin[k+1];
            }
        }
    }
}

int pin2[sw];
for(i=0;i<sw;i++)
{
    pin2[i]=pin[i];
}
//Sort number in Ascending order
for(i=0;i<sw-1;i++)
{
    for(j=0;j<sw-i-1;j++)
    {
        if(pin2[j]>pin2[j+1])
        {
            temp=pin2[j];
            pin2[j]=pin2[j+1];
            pin2[j+1]=temp;
        }
    }
}
printf("\n\n\n");
for(i=0;i<sw;i++)
{
    printf("%d\t",pin2[i]);
}
cnt = sw;
save(pin2);
}

int main()
{
srand(time(0));
int pin[100];
int i;

cnt=0;
for(i=0;i<100;i++)
{
    pin[i]=rand()%100+1;
    printf("%d\t",pin[i]);
    cnt++;
}
printf("\n");

save(pin);
del_sort();

return 0;
}

1 个答案:

答案 0 :(得分:2)

void *save(int *pin)
{
   while(pin[i])
   {
       if(i==cnt){break;}
       ...
   }
   return 0;
}

不建议测试值pin[i]。您正在传递一个未知大小的数组,程序不知道该数组的结尾,可能会导致缓冲区溢出。

您确实检查了i==cnt,因此实际上节省了时间,并且可以防止缓冲区溢出。但是最好基于cnt重写循环。并将void*更改为void

代码中的主要问题是消除重复的循环。只需检查是否存在重复值(如果存在),然后跳至下一个迭代。

int cnt;
const char* filename = "data.txt";

void save(int *pin)
{
    FILE *dat = fopen(filename, "w");
    for(int i = 0; i < cnt; i++)
        fprintf(dat, "%d\n", pin[i]);
    fclose(dat);
}

void del_sort()
{
    FILE *dat;
    int pin[100];
    int i = 0, j, k, sw, temp;
    dat = fopen(filename, "r");
    while(fscanf(dat, "%d\n", &pin[i]) == 1)
    {
        i++;
        if(i == cnt)
            break;
    }
    fclose(dat);

    int pin2[100];
    sw = 0;
    //Eliminate duplicate numbers
    for(i = 0; i < cnt; i++)
    {
        int duplicate = 0;
        for(j = i + 1; j < cnt; j++)
        {
            if(pin[i] == pin[j])
            {
                duplicate = 1;
                break;
            }
        }
        if(duplicate)
            continue;
        pin2[sw] = pin[i];
        sw++;
    }

    //Sort number in Ascending order
    for(i = 0; i < sw - 1; i++)
    {
        for(j = 0; j < sw - i - 1; j++)
        {
            if(pin2[j] > pin2[j + 1])
            {
                temp = pin2[j];
                pin2[j] = pin2[j + 1];
                pin2[j + 1] = temp;
            }
        }
    }

    printf("sort\n");
    for(i = 0; i < sw; i++)
        printf("%d, ", pin2[i]);

    cnt = sw;
    save(pin2);
}

int main(void)
{
    srand((unsigned int)time(0));
    int pin[100] = { 0 };
    int i;

    cnt = 100;
    for(i = 0; i < cnt; i++)
    {
        pin[i] = rand() % 100 + 1;
        printf("%d, ", pin[i]);
    }
    printf("\n");

    save(pin);
    del_sort();

    return 0;
}

要在pin中删除重复项而不分配pin2,请使用以下方法(类似于您自己的方法,但计算sw除外)

sw = cnt;
for(i = 0; i < sw - 1; i++)
{
    for(j = i + 1; j < sw; j++)
    {
        if(pin[i] == pin[j])
        {
            //duplicate found
            for(k = j; k < sw - 1; k++)
            {
                pin[k] = pin[k + 1];
            }
            sw--;

            //decrement so we can check for consecutive duplicates
            i--;
        }
    }
}
相关问题