在当前目录有文件“case1.in”,文件里存放有多个(总个数不超过10000个)英文单词(每个英文单词不会超过10个字文字符), 每行一个,单词未排序。现要求,将文件中的所有单词按字典顺序排序,然后将排序好的单词写入新建的文件answer.txt中(注:文件存放于当前目录)。 请完成程序,实现该功能,(注意,填空题,请不要使用return 0结束,否则会影响评判而判错)
(如case1.in文件中原内容如下)
hello
bye
yes
(程序执行后,在文件answer.txt中内容如下)
bye
hello
yes
整体思路:将文件 “case1.in" 中的单词一个一个读出来,用插入排序存入数组中,再循环写入 “answer.txt” 中。
#include "stdio.h"
#include "string.h"
main()
{
char origin[10000][11], temp[11];
FILE *fp, *fp2;
fp=fopen("“case1.in", "r");
if(fp==NULL)return 1; //文件打开方式是"r",如果文件打开失败程序运行完
fgets(origin[0], 11, fp); //控制台上会显示Process return 1,
int n=1, i, j; //可以以此来判断文件是否正常打开
while((fgets(origin[n], 11, fp))!=NULL)//每次读取一个单词,且这个单词存在数组的最后一行
{
i=0;
if(strcmp(origin[n], origin[i])<0)//如果这个单词排在数组中第一个单词的前面
{
for(j=n;j>=0;j--)
{
strcpy(origin[j+1],origin[j]);//把现有的所有单词都往后移一行
}
strcpy(origin[0],origin[n+1]);//把读到的单词放到数组第一个
}
if(strcmp(origin[n], origin[n-1])>0)//如果读到的单词排在最后,不用管,n++继续读取下一个单词
{
n++;continue;//
}
if(strcmp(origin[n], origin[i])>0)//读到的单词要放在中间
{
while(strcmp(origin[n], origin[i])>0)
{
i++;//找到要插入的位置
}
for(j=n;j>=i;j--)//把要插入的位置之后的所有单词都往后移一行
{
strcpy(origin[j+1],origin[j]);
}
strcpy(origin[i],origin[n+1]);//再把读到的单词放到相应位置
}
n++;//读取下一个单词
}
fp2=fopen("answer.txt", "w");
for(i=0;i<n;i++)//因为第n个是读取失败时的值,所以不能等于n
{
fputs(origin[i], fp2);//把单词循环写入到"answer.txt"中
}
fclose(fp);
fclose(fp2);
}