c 实现对文件操作:冒泡排序
分别实现选择排序(在下下一篇文章)和冒泡排序对以下文件进行排序。
支持如下形式调用:BubbleSort.exe input.txt output.txt 0
BubbleSort.exe input.txt output.txt 1
(0:从小到大,1:从大到小)。
注意中文处理(若无法处理可以只对学号排序,需要在文档中说明)
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 5 #define N 200 6 struct student{ 7 char num[200]; 8 char name[200]; 9 float ave; 10 }st[N],temp1; 11 12 struct Newstudent{ 13 char num[200]; 14 char name[200]; 15 char row[200]; 16 float ave; 17 }st_New[N],temp2; 18 19 //void SelectionSort(); 20 21 22 void main(int argc,char **argv){ 23 FILE *fp1,*fp2; 24 int i,j,sum,min,k; 25 char str[200]; 26 char *input,*output,flag; 27 char tempOne[200],tempTwo[200],tempThree[200],tempFour[200]; 28 //char *str[N]; 29 30 if(argc<4){ 31 input="input.txt"; 32 output="output.txt"; 33 flag='0'; 34 } 35 else{ 36 input=*(argv+1); 37 output=*(argv+2); 38 flag=**(argv+3); 39 } 40 41 /*读文件*/ 42 if((fp1=fopen("input.txt","r"))==NULL){ 43 printf("can not open."); 44 exit(0); 45 } 46 sum=0; 47 printf("the File '算法设计点名册' is :\n"); 48 49 for(i=0;(fgets(str,200,fp1))!= NULL;i++,sum++) { 50 strcpy(st[i].num,strtok(str,",")); 51 strcpy(st[i].name,strtok(NULL,",")); 52 //printf("%s",st[i].num); 53 //printf("%s",st[i].name); 54 } 55 printf("%d",flag); 56 printf("如果希望从小到大排列请输入0,如果希望从大到小排列请输入1:\n"); 57 scanf("%d",&flag); 58 /*选择排序*/ 59 // for(i=0;i<193;i++){ 60 //min=i; 61 //for(j=i+1;j<194;j++) 62 // if(flag){ 63 // if(strcmp(st[j].num,st[min].num)>0) 64 // min=j; 65 // } 66 // else{ 67 // if(strcmp(st[j].num,st[min].num)<0) 68 // min=j; 69 // } 70 //strcpy(tempOne,st[i].num); 71 //strcpy(st[i].num,st[min].num); 72 //strcpy(st[min].num,tempOne);//互换值 73 // 74 //strcpy(tempTwo,st[i].name); 75 //strcpy(st[i].name,st[min].name); 76 //strcpy(st[min].name,tempTwo);//互换值 77 // } 78 /*冒泡排序*/ 79 for(i=0;i<193;i++) 80 { 81 for(j=0;j<193-i;j++){ 82 if(flag){ 83 if(strcmp(st[j].num,st[j+1].num)<0){ 84 strcpy(tempThree,st[j].name); 85 strcpy(st[j].name,st[j+1].name); 86 strcpy(st[j+1].name,tempThree); 87 88 strcpy(tempFour,st[j].num); 89 strcpy(st[j].num,st[j+1].num); 90 strcpy(st[j+1].num,tempFour); 91 } 92 } 93 else{ 94 if(strcmp(st[j].num,st[j+1].num)>0){ 95 strcpy(tempThree,st[j].name); 96 strcpy(st[j].name,st[j+1].name); 97 strcpy(st[j+1].name,tempThree); 98 99 strcpy(tempFour,st[j].num); 100 strcpy(st[j].num,st[j+1].num); 101 strcpy(st[j+1].num,tempFour); 102 } 103 } 104 } 105 } 106 /*写入新文件*/ 107 if((fp2=fopen("output.txt","wb"))==NULL){ 108 printf("can not open."); 109 exit(0); 110 } 111 for(j=0;j<sum;j++){ 112 strcpy(st_New[j].num,strcat(st[j].num,","));//得到学号和逗号 113 //printf("%s",st_New[j].num); 114 strcpy(st_New[j].name,strcat(st_New[j].num,st[j].name));//合并num和学生姓名 115 printf("%s",st_New[j].name);//输出排序后的点名册 116 fputs(st_New[j].name,fp2); 117 } 118 119 /*关闭所有文件*/ 120 fclose(fp1); 121 fclose(fp2); 122 /*NOUSe*/ 123 scanf("%d",i); 124 }