背景;第二次比赛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);
}
}