创建、消除重复并对int数组C进行排序
我是C语言的新手,我学习C语言是因为我的学校,我可以说我开始理解为什么大多数语言都是基于C语言的 我试图制作一个程序,创建一个包含100个随机数的整数数组,将其保存到一个文件中,然后消除重复的数字,并按升序排序 我的说服力给同一个文件带来了想要的效果,但对于它应该做的事情来说,感觉太复杂了 我99%确信有一种更微妙或更简单的方法可以做到这一点 我打算使用3个函数:创建、消除重复并对int数组C进行排序,c,C,我是C语言的新手,我学习C语言是因为我的学校,我可以说我开始理解为什么大多数语言都是基于C语言的 我试图制作一个程序,创建一个包含100个随机数的整数数组,将其保存到一个文件中,然后消除重复的数字,并按升序排序 我的说服力给同一个文件带来了想要的效果,但对于它应该做的事情来说,感觉太复杂了 我99%确信有一种更微妙或更简单的方法可以做到这一点 我打算使用3个函数: 用于保存文件 消除重复和 用于分类 最后我做了2个,因为我在解决方案中遇到了一些问题 e、 x:问题之一是,在删除重复项后,我的数组
#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;
}
#包括
#包括
#包括
int-cnt;
void*保存(int*pin)
{
文件*dat;
int i=0;
dat=fopen(“data.txt”,“w”);
while(pin[i])
{
如果(i==cnt){break;}
fprintf(数据,“\n%d”,引脚[i]);
i++;
}
fclose(dat);
返回0;
}
void del_sort()
{
文件*dat;
int引脚[100];
int i=0,j,k,sw=0,温度;
dat=fopen(“data.txt”,“r”);
而(!feof(dat))
{
fscanf(dat、%d、&pin[i]);
i++;
}
fclose(dat);
//消除重复的数字
对于(i=0;i100)
{
西南--;
打破
}
对于(j=i+1;j
不建议测试值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[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;
}
阅读。你可以使用likewhile(fscanf(dat,“%d”)和&pin[i])==1{}
而不是feof()
。这是一篇很好的文章,感谢你向我展示了这一点,但这与代码的实际问题相去甚远。我已经看到了foef()的问题在之前的while循环中,但在此循环中,只需在%d之前添加\n即可处理,因此fscanf()的输出良好。如果先排序,则可以通过按顺序遍历数组并比较以前的元素和当前元素来轻松删除重复项。“我正在学习它,因为我的学校”
-然后你就上了一所好学校。不要把它看作一种负担。如果你想学习“编程”,那么你需要学习C(或汇编)。无论你最终使用哪种语言,它都会让你成为一名更好的程序员。任何人都能学一门语言,很少有人能学会“编程”。我只是说,这不是一个负担。我选择python有很多原因,但这并不意味着我不喜欢C。而且我要说的是,它不是儿童学校。它是一本科技学校读物。你可以使用likewhile(fscanf(dat),%d,&pin[I])==1{}
而不是feof()
。这是一篇很好的文章,感谢您向我展示了这一点,但与这段代码的实际问题仍然相去甚远。我以前在while循环中看到过foef()的问题,但在这篇文章中,只需将\n添加到%d之前,然后将fscanf()的输出很好。如果您先排序,然后可以通过按顺序遍历数组并比较以前的元素和当前元素来轻松删除重复项。“我正在学习它是因为我的学校”
-然后您就去了一所好学校。不要将其视为负担。如果您想学习“编程”,那么您需要学习C(或汇编)。无论你最终使用哪种语言,它都会使你成为一名更好的程序员。任何人都能学会一种语言,很少有人能学会“编程”。我只是说,这不是一个负担。我选择python有很多原因,但这并不意味着我不喜欢C。而且,记录在案的是,这不是一所儿童学校。这是一所科技学校,所以你基本上说要避免从pin中删除,只需将所有唯一的值放在pin2中。这完全不是一个坏主意!同时你也是对的。cnt var随后出现了w当我试着调试它的时候,我还有一个问题,除了在pin2中传递唯一的值外,是否有可能在没有某种malloc函数的情况下操作pin删除值?比如e.x。不知何故,在空白处放置一个null。@BarmakShemirani-hmm。如果我理解你的评论,“null
只是零”,请小心从技术上讲,这并不完全正确。ASCII nul字符的值仅为零,但NULL
的值是一个指针(通常零转换为void*
,例如(void*)0
)所以从技术上讲,NULL
是一个指针,0
是一个整数。@DavidC.Rankin你是对的,我试着用几句话和
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--;
}
}
}