我对C语言很陌生,我正在学习它是我上学的原因,我可以说我开始理解为什么大多数语言都基于此语言。
我正在尝试创建一个程序,该程序创建一个包含100个随机数字的int数组,将其保存到文件中,然后消除重复的数字并按升序对其进行排序。
我的解决方案将所需的效果带到同一文件中,但是对于应该执行的操作来说感觉太复杂了。
我敢肯定,有99%的方法可以做到这一点。
我要使用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;
}
答案 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--;
}
}
}