将数据添加到文件中的C程序然后对输入的数据进行排序

时间:2014-03-24 01:34:16

标签: c

这是我到目前为止所得到的......

#include<stdio.h>
#include<string.h>

FILE *fp;

int n,num;
int i,j;
int result,index;
char name[50][50];        
char jar[1024];
char temp[1000];

main()
{     
    clrscr();

    fp=fopen("EXO-KAI.docx","a+");

    printf("\nHow Many Names You Want to Add: ");
    scanf("%d",&num);

    printf("\nEnter Name:\n");
    for(i=0;i<num;i++)
    {
        scanf("%s",&name[i]);
        fprintf(fp,"%s\n",name[i]);
    }

    for(i=0;i<num;i++)
    {
        index=i;                 
        for(j=i+1;j<num;j++)
        {
            result=strcmp(name[index],name[j]);
            if(result>0)                               
                index=j;
        }
        strcpy(temp,name[index]);
        strcpy(name[index],name[i]);
        strcpy(name[i],temp);
    }

    fp=fopen("EXO-LAY.docx","a+");

    printf("\nThe Sorted Names are:\n");
    for(i=0;i<num;i++)
    {
        printf("\n%s",name[i]);
        fprintf(fp,"%s\n", name[i]);
    }

    fclose(fp);
    getch();

}

在第一次运行中,已排序的名称将写入文件中。在第二次运行中,程序应该读取文件中的书面名称并将其与新名称一起排序。但这不起作用。你能帮我吗?

1 个答案:

答案 0 :(得分:0)

您的代码中的问题是您使用冒泡排序来排序所有字符串,但是您将字符串swap放在内部循环之外。因此,当字符串name[j]大于字符串name[index]时,这不会正确更改字符串顺序。所以为了对字符串进行排序,你可以这样做:

for(i=0;i<num;i++) {
    for(j=i+1;j<num;j++) {
        index = i;
        result=strcmp(name[index],name[j]);
        if(result>0) {
            strcpy(temp,name[index]);
            strcpy(name[index],name[j]);
            strcpy(name[j],temp);
            index = j;
        }
    }
}

因此,如果字符串name[j]大于name[index],则执行交换。否则什么都不做。

您使用的冒泡排序方法的复杂度为O(N^2)。因此,更好的方法是使用快速排序,平均复杂度为O(NlogN)。为此,您可以使用C的库函数qsort()来实现此目的。首先,您可以定义自己的字符串比较器:

int my_str_compare(const void * a, const void * b)
{
  return strcmp((char*) a, (char*) b);
}

然后您可以直接调用qsort函数来替换代码中的for循环:

qsort (&name[0], num, 50, my_str_compare);

这将与您的排序相同,但通常更快。