结构体:
在储存处理大量不同类型的数据时,数组一般很难直接实现,此时就可以用结构体来解决问题。
语法知识:
struct 结构体
struct tag {//struct为结构体关键字, tag为结构体的标志
member-list//member-list为结构体成员列表
} variable-list ; //variable-list为此结构体声明的变量
也可将变量声明写在主函数内
#include <stdio.h>
#include <string.h>
struct Books
{[
](https://blog.csdn.net/we1meng/article/details/70208708)
char title[50];
char author[50];
char subject[100];
int book_id;
};
int main( )
{
struct Books Book1; /* 声明 Book1,类型为 Books */
struct Books Book2; /* 声明 Book2,类型为 Books */
另一种定义方法: typedef struct 定义
类似于这种
typedef struct stu
{ int xuehao;
int chengji;
}stu;
具体用法以及两者区别请参见
C/C++语法知识:typedef struct 用法详解
结构体定义 typedef struct 用法详解和用法小结
struct和typedef struct彻底明白了
排序
1.sort 排序
2.cmp 函数排序
举个例子
struct sa{
int num;
double cj;
}a[200];
int cmp(const struct sa &a,const struct sa &b)
{
return a.cj>b.cj;//按成绩从高到低排
}
练习:
NEFU OJ 1481 谁考了第k名-排序
#include <bits/stdc++.h>
#include<algorithm>
using namespace std;
struct sa{
int num;
double cj;
}a[200];
int cmp(const struct sa &a,const struct sa &b)
{
return a.cj>b.cj;
}
int main()
{
int k,n;
cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>a[i].num>>a[i].cj;
sort(a+1,a+1+n,cmp);
printf("%d %g\n",a[k].num,a[k].cj);
return 0;
}
NEFU OJ 1482 奇数单增序列
#include <bits/stdc++.h>
#include <algorithm>
using namespace std;
int a[600],b[600];
int main()
{
int n,i,j;
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
j=1;
for(i=1;i<=n;i++)
if(a[i]%2!=0)
{
b[j]=a[i];
j++;
}
sort(b+1,b+j);
for(i=1;i<j;i++)
{printf("%d",b[i]);
if(i!=j-1)
printf(",");}
return 0;
}
NEFU OJ 1659 没必要的排序1
#include <bits/stdc++.h>
#include <algorithm>
using namespace std;
int a[2000];
int main()
{
int n,k,s;
cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+1+n,greater<int>());
s=0;
for(int i=1;i<=k;i++)
s=s+a[i];
cout<<s;
return 0;
}
NEFU OJ 1650 没必要的排序2
#include <bits/stdc++.h>
#include <algorithm>
using namespace std;
const int maxn=1e7+10;
const int maxk=1e5+10;
int a[maxn];
int main()
{
ios::sync_with_stdio(false);
int n,k,x,ans,num;
cin>>n>>k;
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++)
{cin>>x;
a[x]++;}
num=ans=0;
for(int i=1e5;i>1;i--)
{
if(a[i]>0)
{
ans=ans+a[i]*i;
num=num+a[i];
}
if(num>k)
{
ans=ans-(num-k)*i;
break;
}
}
cout<<ans;
return 0;
}
NEFU OJ 554 老和尚的导员
这题写的有点麻烦了,可以直接定义数组,过程参见戏说三国。
#include <bits/stdc++.h>
using namespace std;
struct sa{
int c;
int xd;
int gs;
int e;
int sum;
int xh;
} a[200];
bool cmp(const struct sa &a,const struct sa &b)
{
{
if(a.sum!=b.sum)
return a.sum>b.sum;
else if(a.c!=b.c)
return a.c>b.c;
else if(a.xd!=b.xd)
return a.xd>b.xd;
else if(a.gs!=b.gs)
return a.gs>b.gs;
else if(a.e!=b.e)
return a.e>b.e;
}
}
int main()
{
int n,i;
while(scanf("%d",&n)!=-1)
{
memset(a,0,sizeof(a));
for(i=1; i<=n; i++)
{
a[i].xh=i;
cin>>a[i].c>>a[i].xd>>a[i].gs>>a[i].e;
a[i].sum=a[i].c+a[i].xd+a[i].gs+a[i].e;
}
sort(a+1,a+n+1,cmp);
for(i=1; i<=n; i++)
printf("%d %d\n",a[i].xh,a[i].sum);
}
return 0;
}
NEFU OJ 556 健忘的老和尚
#include <bits/stdc++.h>
#include <string.h>
using namespace std;
struct sa{
char name[200];
int f;
};
int cmp(sa a,sa b)
{
return a.f<b.f;
}
int main()
{
sa a[200];
int n,i,m,o;
while(cin>>n>>m>>o)
{
memset(a,0,sizeof(a));
for(i=1;i<=n;i++)
cin>>a[i].name>>a[i].f;
sort(a+1,a+1+n,cmp);
for(i=n-m+1;i<=n;i++)
printf("%s\n",a[i].name);
for(i=1;i<=o;i++)
printf("%s\n",a[i].name);
}
return 0;
}
NEFU OJ 873 戏说三国
这是一个神坑的点!
#include <bits/stdc++.h>
using namespace std;
struct sa{
char name[30];
int b[5];
double c[5];
double s;
} a[1100];
bool cmp(const struct sa &m,const struct sa &n)
{
if(m.s!=n.s)
return m.s>n.s;
else if(m.b[1]!=n.b[1])
return m.b[1]>n.b[1];
else if(m.b[2]!=n.b[2])
return m.b[2]>n.b[2];
else if(m.b[3]!=n.c[3])
return m.b[3]>n.b[3];
}
int main()
{
int n,i,k,x;
double d,z,t;
cin>>n;
for(k=1;k<=n;k++)
{
memset(a,0,sizeof(a));
scanf("%d %lf %lf %lf",&x,&d,&z,&t);
for(i=1; i<=x; i++)
{
cin>>a[i].name>>a[i].b[1]>>a[i].b[2]>>a[i].b[3];
a[i].c[1]=(a[i].b[1]*z)/100;
a[i].c[2]=(a[i].b[2]*d)/100;
a[i].c[3]=(a[i].b[3]*t)/100;
a[i].s=a[i].c[1]+a[i].c[2]+a[i].c[3];
}
sort(a+1,a+1+x,cmp);
printf("Case #%d:\n",k);
for(i=1; i<=x; i++)
printf("%s %.4lf %.4lf %.4lf %.4lf\n",a[i].name,a[i].s,a[i].c[1],a[i].c[2],a[i].c[3]);
}
return 0;
}
NEFU OJ 1147 谁不及格?
这个题的输出格式一点要看清!是一堆名字,一堆学号,一堆成绩输出的,不是按一个人一个人输出的。
#include <bits/stdc++.h>
#include <string.h>
using namespace std;
struct sa
{
char name[30];
char xh[20];
double cj;
}a[20];
int main()
{
int n,i,j,k,b[20];
while(scanf("%d",&n)!=-1)
{
j=1;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(i=1; i<=n; i++)
{
scanf(" %[^\n] %s %lf",a[i].name,a[i].xh,&a[i].cj);
if(a[i].cj<60)
{
b[j]=i;
j++;
}}
if(j==1)
{printf("They are Great!!");
printf("\n");
continue;}
if(j>1)
{
printf("%d\n",j-1);
for(k=1; k<j; k++)
printf("%s\n",a[b[k]].name);
for(k=1; k<j; k++)
{printf("%s\n",a[b[k]].xh);}
for(k=1; k<j; k++)
printf("%.2lf\n",a[b[k]].cj);
}
}
return 0;
}
NEFU OJ 1637 身高问题
#include <bits/stdc++.h>
using namespace std;
struct sa
{
char name[20];
int h;
long int xh;
} a[200];
bool cmp(const struct sa &m,const struct sa &n)
{
if(m.h!=n.h)
return m.h>n.h;
else return m.xh<n.xh;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1; i<n; i++)
scanf("%s%d%ld",a[i].name,&a[i].h,&a[i].xh);
sort(a+1,a+1+n,cmp);
printf("%s %d %ld",a[1].name,a[1].h,a[1].xh);
return 0;
}
NEFU OJ 1483 成绩排序
#include <bits/stdc++.h>
using namespace std;
struct sa
{
char name[20];
int cj;
} a[200];
int cmp(const struct sa &a,const struct sa &b)
{
if(a.cj!=b.cj)
return a.cj>b.cj;
else
return strcmp(a.name,b.name)<0;
}
int main()
{
int n;
cin>>n;
for(int i=1; i<=n; i++)
cin>>a[i].name>>a[i].cj;
sort(a+1,a+1+n,cmp);
for(int i=1; i<=n; i++)
printf("%s %d\n",a[i].name,a[i].cj);
return 0;
}
NEFU OJ 1683 成绩统计
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,p,s,q,i;
char x,a[10];
while(cin>>n)
{
p=s=0;
for(i=1;i<=n;i++)
{
cin>>x;
if(x=='C')
{cin>>a; p++;}
if(x=='N')
{
cin>>q;
s+=q;
}
}
printf("%d %d\n",p,s/(n-p));
}
return 0;
}
NEFU OJ 874 相约摩洛哥
#include <bits/stdc++.h>
using namespace std;
struct sa
{
char name[20];
int p[5],t[5];
int sum;
int gs;
} a[100001];
int cmp(const struct sa &m,const struct sa &n)
{
if(m.gs!=n.gs)
return m.gs>n.gs;
else
return m.sum<n.sum;
}
int main()
{
int n,i;
while(cin>>n)
{
memset(a,0,sizeof(a));
for(i=1; i<=n; i++)
{
cin>>a[i].name>>a[i].p[1]>>a[i].p[2]>>a[i].p[3];
if(a[i].p[1]!=-1)
a[i].gs++;
if(a[i].p[2]!=-1)
a[i].gs++;
if(a[i].p[3]!=-1)
a[i].gs++;
}
for(i=1; i<=n; i++)
{
cin>>a[i].t[1]>>a[i].t[2]>>a[i].t[3];
if(a[i].p[1]!=-1)
{
if(a[i].t[1]==1)
a[i].sum+=a[i].p[1];
else
a[i].sum+=a[i].p[1]+20*(a[i].t[1]-1);
}
if(a[i].p[2]!=-1)
{
if(a[i].t[2]==1)
a[i].sum+=a[i].p[2];
else
a[i].sum+=a[i].p[2]+20*(a[i].t[2]-1);
}
if(a[i].p[3]!=-1)
{
if(a[i].t[3]==1)
a[i].sum+=a[i].p[3];
else
a[i].sum+=a[i].p[3]+20*(a[i].t[3]-1);
}
}
sort(a+1,a+1+n,cmp);
for(i=1; i<=n; i++)
printf("%s %d %d\n",a[i].name,a[i].gs,a[i].sum);
}
return 0;
}
NEFU OJ 1297 结构体排序题一
思想:分类讨论
#include <bits/stdc++.h>
using namespace std;
struct sa
{
int x,y;
} a[110];
bool cmp0x0y(const struct sa &m,const struct sa &n)
{
if(m.x!=n.x)
return m.x>n.x;
else if(m.y!=n.y)
return m.y>n.y;
}
bool cmp0x1y(const struct sa &m,const struct sa &n)
{
if(m.x!=n.x)
return m.x>n.x;
else if(m.y!=n.y)
return m.y<n.y;
}
bool cmp1x0y(const struct sa &m,const struct sa &n)
{
if(m.x!=n.x)
return m.x<n.x;
else if(m.y!=n.y)
return m.y>n.y;
}
bool cmp1x1y(const struct sa &m,const struct sa &n)
{
if(m.x!=n.x)
return m.x<n.x;
else if(m.y!=n.y)
return m.y<n.y;
}
int main()
{
int p,q,n;
while(cin>>p>>q>>n)
{
for(int i=1; i<=n; i++)
cin>>a[i].x>>a[i].y;
if(p==0&&q==0)
sort(a+1,a+1+n,cmp0x0y);
if(p==0&&q==1)
sort(a+1,a+1+n,cmp0x1y);
if(p==1&&q==0)
sort(a+1,a+1+n,cmp1x0y);
if(p==1&&q==1)
sort(a+1,a+1+n,cmp1x1y);
for(int i=1; i<=n; i++)
printf("(%d,%d)\n",a[i].x,a[i].y);
}
return 0;
}
NEFU OJ 1186 优秀学生
#include <iostream>
#include <cstdio>
using namespace std;
struct student
{
char name[20],num[8];
int c;
};
int main()
{
int x,i,k;
student stu[100];
while(scanf("%d",&x)!=-1)
{
for(i=0; i<x; i++)
{
scanf("%s %s %d",stu[i].num,stu[i].name,&stu[i].c);
}
k=0;
for(i=0; i<x; i++)
{
if(stu[i].c>=90)
{
printf("%s %s %d\n",stu[i].num,stu[i].name,stu[i].c);
k++;
}
}
printf("%d\n",k);
}
return 0;
}
NEFU OJ 1053 cc-test9-01结构体应用
#include <iostream>
#include <cstdio>
using namespace std;
struct student
{
char name[20],numb[8];
double num;
};
int main()
{
int x,i;
while(scanf("%d",&x)!=-1)
{
student stu[100];
for(i=0; i<x; i++)
scanf("%s %[^\n] %lf",stu[i].numb,stu[i].name,&stu[i].num);
for(i=0; i<x; i++)
{
printf("%s %s %.2lf",stu[i].numb,stu[i].name,stu[i].num);
printf("\n");
}
}
return 0;
}
acm虐我千百遍,我待acm如初恋。