Lecture (9)包含以下五道编程题,可以在上面的OJ提交。
054:成绩排序
#include <iostream>
using namespace std;
#include <algorithm>
#include <cstring>
struct Student
{
char name[25];
int score;
};
#define N 20
Student s[N+10];
struct Rule{
bool operator()(const Student& s1,const Student& s2) const{
if(s1.score != s2.score)
return s1.score>s2.score;
else
return strcmp(s1.name, s2.name)<0;
}
};
int main(int argc, const char * argv[]) {
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>s[i].name>>s[i].score;
sort(s,s+n,Rule());
for(int i=0;i<n;i++)
cout<<s[i].name<<" "<<s[i].score<<endl;
return 0;
}
055:分数线划定
#include <iostream>
using namespace std;
#include <algorithm>
#include <cmath>
struct Volunteer
{
int id;
int score;
};
struct Rule{
bool operator()(const Volunteer& v1,const Volunteer& v2) const{
if(v1.score != v2.score)
return v1.score>v2.score;
else
return v1.id<v2.id;
}
};
#define N 5000
Volunteer vol[N+10];
int main(int argc, const char * argv[]) {
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++)
cin>>vol[i].id>>vol[i].score;
int rank = floor(m*1.5);
sort(vol, vol+n, Rule());
int score = vol[rank-1].score;
Volunteer r;
r.id = 10000;
r.score = score;
int count = upper_bound(vol,vol+n,r, Rule())-vol;
cout<<score<<" "<<count<<endl;
for(int i=0;i<count;i++)
cout<<vol[i].id<<" "<<vol[i].score<<endl;
return 0;
}
056:病人排队
#include <iostream>
using namespace std;
#include <algorithm>
struct Patient
{
char ID[15];
int num;
int age;
};
#define N 100
Patient p[N+10];
struct Rule
{
bool operator()(const Patient& p1,const Patient& p2) const{
if(p1.age>=60&&p2.age>=60)
{
if(p1.age!=p2.age)
return p1.age > p2.age;
else
return p1.num<p2.num;
}
else if(p1.age<60&&p2.age<60)
return p1.num<p2.num;
else
return p1.age>p2.age;
}
};
int main(int argc, const char * argv[]) {
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>p[i].ID>>p[i].age;
p[i].num = i;
}
sort(p, p+n, Rule());
for(int i=0;i<n;i++)
cout<<p[i].ID<<endl;
return 0;
}
057:mysort
#include <iostream>
using namespace std;
struct A {
int nouse1;
int nouse2;
int n;
};
void mysort(void* a,int num,int size,int (*f)(const void *,const void *))
{
char* c = (char*) a;
for(int i=num-1;i>0;i--)
{
for(int j=0;j<i;j++)
{
char *p1 = c+j*size;
char *p2 = c+(j+1)*size;
if(f(p1,p2)>0)
{
for(int k=0;k<size;k++)
{
char tmp = *(p1+k);
*(p1+k) = *(p2+k);
*(p2+k) = tmp;
}
}
}
}
}
int MyCompare1( const void * e1,const void * e2)
{
int * p1 = (int * ) e1;
int * p2 = (int * ) e2;
return * p1 - * p2;
}
int MyCompare2( const void * e1,const void * e2)
{
int * p1 = (int * ) e1;
int * p2 = (int * ) e2;
if( (* p1 %10) - (* p2 % 10))
return (* p1 %10) - (* p2 % 10);
else
return * p1 - * p2;
}
int MyCompare3( const void * e1,const void * e2)
{
A * p1 = (A*) e1;
A * p2 = (A*) e2;
return p1->n - p2->n;
}
int a[20];
A b[20];
int main ()
{
int n;
while(cin >> n) {
for(int i = 0;i < n; ++i) {
cin >> a[i];
b[i].n = a[i];
}
mysort(a,n,sizeof(int),MyCompare1);
for(int i = 0;i < n; ++i)
cout << a[i] << "," ;
cout << endl;
mysort(a,n,sizeof(int),MyCompare2);
for(int i = 0;i < n; ++i)
cout << a[i] << "," ;
cout << endl;
mysort(b,n,sizeof(A),MyCompare3);
for(int i = 0;i < n; ++i)
cout << b[i].n << "," ;
cout << endl;
}
return 0;
}
058:从字符串中取数
#include <iostream>
#include <iomanip>
using namespace std;
double GetDoubleFromString(char * str)
{
static char *start;
if(str)
start = str;
for(;*start&&!isdigit(*start);start++);
char *q;
if(!*start)
return -1;
q = start;
for(;*start&&(isdigit(*start)||*start=='.');start++);
if(*start)
{
*start = 0;
start++;
}
return atof(q);
}
int main()
{
char line[300];
while(cin.getline(line,280)) {
double n;
n = GetDoubleFromString(line);
while( n > 0) {
cout << fixed << setprecision(6) << n << endl;
n = GetDoubleFromString(NULL);
}
}
return 0;
}