|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
有些语句我看不懂求大佬给程序加上注释,感激不尽
[题目]
两个班的成绩分别存放在两个班的成绩分别存放在两个文件当中。 每个文件有多行, 每行都是由空格分隔的学号、姓名和成绩。现在要将两个班的成绩合并到一起进行排序按照成绩从高到低,如果相同则按学号由小到大排序。将结果输出一个文件当中。两个输入文件名与输出文件名使用命令行参数指定。
请你编写一个程序完成上述功能
主要考查的是结构体排序和命令行参数的用法
代码:
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #define MAXN 200
- struct stuNode
- {
- char stuID[20];
- int score;
- };
- typedef struct stuNode stuType;
- int myCompare(stuType m,stuType n)
- {
- if(m.score!=n.score)
- return n.score-m.score;
- else
- return strcmp(m.stuID,n.stuID);
- }
- int cmp(const void *a,const void *b)
- {
- stuType m=*(stuType*)a, n=*(stuType*)b;
- return myCompare(m,n);
- }
- void loadData(FILE* fp,stuType *m)
- {
- int i=0;
- while(fscanf(fp,"%s",m[i].stuID)!=EOF)
- {
- fscanf(fp,"%d",&m[i].score);
- i++;
- }
- qsort(m,i,sizeof(stuType),cmp);
- m[i].score=-1; // set -1 as bounder
- }
- void merge(stuType *a,stuType *b)
- {
- stuType tmp[MAXN];
- int i=0,j=0,index=0;
- while(a[i].score>0 && b[j].score>0)
- {
- if(myCompare(a[i],b[j])<0)
- tmp[index++]=a[i++];
- else
- tmp[index++]=b[j++];
- }
- while(a[i].score>0)
- tmp[index++]=a[i++];
- while(a[i].score>0)
- tmp[index++]=b[j++];
- tmp[index].score=-1;
- for(i=0;i<index;i++)
- a[i]=tmp[i];
- }
- int main(int argc,char* argv[])
- {
- stuType a[MAXN],b[MAXN];
- FILE *fin1,*fin2,*fout;
- int i;
- fin1=fopen(argv[1],"r");
- fin2=fopen(argv[2],"r");
- fout=fopen(argv[3],"w");
- loadData(fin1,a);
- loadData(fin2,b);
- merge(a,b);
- for(i=0;a[i].score>0;i++)
- {
- fprintf(fout,"%s %d\n",a[i].stuID,a[i].score);
- }
- return 0;
- }
复制代码 |
|