背景;第二次比赛b题,感觉就是代码题,对结构体数组按不同元素排序,自然就写了三个快速排序,第一次尝试这么长的代码,感觉hold不足,单步调试了很多次终于过了。以前看过某位大牛说:每个人的一次调过代码行数是不断增长的,他曾经过了200行的代码就容易出问题,说明他当时的代码能力在200行,那我现在大概100行吧。
学习:1.主要是对结构体数组和快速排序的巩固。
2.我250行代码,结果会长40行代码搞定,sort和cmp要掌握。从会长这段代码里可以看出cmp写法
会长代码:
#include <stdio.h> #include <algorithm> #include <string.h> int n, c; struct Student{ int no, grade; char name[10]; }st[100009];/*学生信息结构体数组*/ bool cmp1(Student s0, Student s1){ return s0.no < s1.no;/*学号升序排列*/ } bool cmp2(Student s0, Student s1){ if(strcmp(s0.name, s1.name) == 0) return s0.no < s1.no;/*如果名字相同,就按学号升序排列*/ return strcmp(s0.name, s1.name) == -1;/*这里设置比较巧妙,s1字典序高于s0就返回真*/ } bool cmp3(Student s0, Student s1){ if(s0.grade == s1.grade) return s0.no < s1.no; return s0.grade < s1.grade; } int main(){ int cas = 0; while(scanf("%d %d", &n, &c) == 2 && (n|c)){/*n,c同时为零就退出*/ for(int i=0;i<n;i++) scanf("%d %s %d", &st[i].no, st[i].name, &st[i].grade);/*输入n组数据*/ if(c == 1) std::sort(st, st+n, cmp1);/*algorithm中的文件就是要用using namespace std;否则每次应用都要std::*/ else if(c == 2) std::sort(st, st+n, cmp2); else std::sort(st, st+n, cmp3); printf("Case %d:\n", ++cas); for(int i=0;i<n;i++) printf("%06d %s %d\n", st[i].no, st[i].name, st[i].grade); } }
#include<stdio.h> #include<string.h> struct student { int xh; char name[9]; int score; }s[100009]; void qsort(struct student str[],int n); void qsortscore(struct student str[],int n); void qsortstr(struct student str[],int n); void qsort(struct student str[],int n) { int p1=0,p2=n-1,keyxh=str[p1].xh,keyscore=str[p1].score; char key[9]; for(int i=0;i<9;i++) { key[i]=str[p1].name[i]; } if(p1<p2) { while(p1<p2) { for(;p2>p1;p2--) { if(keyxh>str[p2].xh) { for(int i=0;i<9;i++) { str[p1].name[i]=str[p2].name[i]; } str[p1].xh=str[p2].xh; str[p1].score=str[p2].score; p1++; break; } } for(;p2>p1;p1++) { if(str[p1].xh>keyxh) { for(int i=0;i<9;i++) { str[p2].name[i]=str[p1].name[i]; } str[p2].xh=str[p1].xh; str[p2].score=str[p1].score; p2--; break; } } } str[p1].score=keyscore; str[p1].xh=keyxh; for(int i=0;i<9;i++) { str[p1].name[i]=key[i]; } qsort(str,p1); qsort(str+p1+1,n-p1-1); } } void qsortstr(struct student str[],int n) { int p1=0,p2=n-1,keyxh=str[p1].xh,keyscore=str[p1].score; char key[9]; for(int i=0;i<9;i++) { key[i]=str[p1].name[i]; } if(p1<p2) { while(p1<p2) { for(;p2>p1;p2--) { if(strcmp(key,str[p2].name)>0) { for(int i=0;i<9;i++) { str[p1].name[i]=str[p2].name[i]; } str[p1].xh=str[p2].xh; str[p1].score=str[p2].score; p1++; break; } else if(strcmp(key,str[p2].name)==0) { if(keyxh>str[p2].xh) { for(int i=0;i<9;i++) { str[p1].name[i]=str[p2].name[i]; } str[p1].xh=str[p2].xh; str[p1].score=str[p2].score; p1++; break; } } } for(;p2>p1;p1++) { if(strcmp(key,str[p1].name)<0) { for(int i=0;i<9;i++) { str[p2].name[i]=str[p1].name[i]; } str[p2].xh=str[p1].xh; str[p2].score=str[p1].score; p2--; break; } else if(strcmp(key,str[p1].name)==0) { if(keyxh<str[p1].xh) { for(int i=0;i<9;i++) { str[p2].name[i]=str[p1].name[i]; } str[p2].xh=str[p1].xh; str[p2].score=str[p1].score; p2--; break; } } } } str[p1].score=keyscore; str[p1].xh=keyxh; for(int i=0;i<9;i++) { str[p1].name[i]=key[i]; } qsortstr(str,p1); qsortstr(str+p1+1,n-p1-1); } } int main(void) { int n,c; int x=0; while(scanf("%d %d",&n,&c)!=EOF&&n&&c) { ++x; for(int i=0;i<n;i++) { scanf("%d %s %d",&s[i].xh,s[i].name,&s[i].score); } if(c==1) { qsort(s,n); } else if(c==2) { qsortstr(s,n); } else { qsortscore(s,n); } printf("Case %d:\n",x); for(int k=0;k<n;++k) { printf("%06d %s %d\n",s[k].xh,s[k].name,s[k].score); } } } void qsortscore(struct student str[],int n) { int p1=0,p2=n-1,keyxh=str[p1].xh,keyscore=str[p1].score; char key[9]; for(int i=0;i<9;i++) { key[i]=str[p1].name[i]; } if(p1<p2) { while(p1<p2) { for(;p2>p1;p2--) { if(keyscore>str[p2].score) { for(int i=0;i<9;i++) { str[p1].name[i]=str[p2].name[i]; } str[p1].xh=str[p2].xh; str[p1].score=str[p2].score; p1++; break; } else if(keyscore==str[p2].score) { if(keyxh>str[p2].xh) { for(int i=0;i<9;i++) { str[p1].name[i]=str[p2].name[i]; } str[p1].xh=str[p2].xh; str[p1].score=str[p2].score; p1++; break; } } } for(;p2>p1;p1++) { if(keyscore<str[p1].score) { for(int i=0;i<9;i++) { str[p2].name[i]=str[p1].name[i]; } str[p2].xh=str[p1].xh; str[p2].score=str[p1].score; p2--; break; } else if(keyscore==str[p1].score) { if(keyxh<str[p1].xh) { for(int i=0;i<9;i++) { str[p2].name[i]=str[p1].name[i]; } str[p2].xh=str[p1].xh; str[p2].score=str[p1].score; p2--; break; } } } } str[p1].score=keyscore; str[p1].xh=keyxh; for(int i=0;i<9;i++) { str[p1].name[i]=key[i]; } qsortscore(str,p1); qsortscore(str+p1+1,n-p1-1); } }