分別實現選擇排序和冒泡排序(在上上篇文章)對以下檔案進行排序。
支援如下形式調用: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;25 char str[200];26 char *input,*output,flag;27 char tempOne[200];28 char tempTwo[200];29 //char *str[N];30 31 if(argc<4){32 input="input.txt";33 output="output.txt";34 flag='0';35 }36 else{37 input=*(argv+1);38 output=*(argv+2);39 flag=**(argv+3);40 }41 42 /*讀檔案*/43 if((fp1=fopen("input.txt","r"))==NULL){44 printf("can not open.");45 exit(0);46 }47 sum=0;48 printf("the File '演算法設計點名冊' is :\n");49 50 for(i=0;(fgets(str,200,fp1))!= NULL;i++,sum++) {51 strcpy(st[i].num,strtok(str,","));52 strcpy(st[i].name,strtok(NULL,","));53 //printf("%s",st[i].num);54 //printf("%s",st[i].name);55 }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 /*寫入新檔案*/80 if((fp2=fopen("output.txt","wb"))==NULL){81 printf("can not open.");82 exit(0);83 }84 for(j=0;j<sum;j++){85 strcpy(st_New[j].num,strcat(st[j].num,","));//得到學號和逗號86 //printf("%s",st_New[j].num);87 strcpy(st_New[j].name,strcat(st_New[j].num,st[j].name));//合并num和學生姓名88 printf("%s",st_New[j].name);//輸出排序後的點名冊89 fputs(st_New[j].name,fp2);90 }91 92 /*關閉所有檔案*/93 fclose(fp1);94 fclose(fp2);95 /*NOUSe*/96 scanf("%d",i);97 }