查找类试题PAT
1.1028 人口普查 (20分)
题目链接:
PAT乙级 1028
注意:
可能会出现格式错误的问题,忘记了一点就是当所有的数据都是不合理的时候,只能输出0
上代码1
#include <cstdio>
#include <string>
typedef struct person{
char name[6];
int yy,mm,dd;
person(){}
person(int _yy,int _mm,int _dd){
yy = _yy;
mm = _mm;
dd = _dd;
}
}PER;
PER oldest(2014,9,6),youngest(1814,9,6),left(1814,9,6),right(2014,9,6),temp;
int n,couter;
bool more(PER a,PER b){
if(a.yy!=b.yy) return a.yy>b.yy;
else{
if(a.mm!=b.mm) return a.mm>b.mm;
return a.dd>=b.dd;
}
}
bool less(PER a,PER b){
if(a.yy!=b.yy) return a.yy<b.yy;
else{
if(a.mm!=b.mm) return a.mm<b.mm;
return a.dd<=b.dd;
}
}
int main(){
scanf("%d",&n);
couter = 0;
while(n--){
scanf("%s %d/%d/%d",&temp.name,&temp.yy,&temp.mm,&temp.dd);
if(more(temp,left)&&less(temp,right)){
if(less(temp,oldest)) oldest = temp;
if(more(temp,youngest)) youngest = temp;
couter++;
}
}
if(couter){
printf("%d %s %s\n",couter,oldest.name,youngest.name);
}
else printf("0\n");
return 0;
}
2.1011 World Cup Betting (20分)
题目链接:
PAT 1011
上代码1
#include <cstdio>
using namespace std;
typedef struct wcup{
char gm;
double pf;
}WCP;
WCP w[3],t[3],l[3];
char ans[3]; double result,pmax[3];
char mMax(WCP a,WCP b,WCP c){
if(a.pf>b.pf) return (a.pf>c.pf)? a.gm:c.gm;
return (b.pf>c.pf)? b.gm:c.gm;
}
double cMax(WCP a,WCP b,WCP c){
if(a.pf>b.pf) return (a.pf>c.pf)? a.pf:c.pf;
return (b.pf>c.pf)? b.pf:c.pf;
}
int main(){
for(int i=0;i<3;i++){
w[i].gm = 'W';t[i].gm='T';l[i].gm='L';
scanf("%lf%lf%lf",&w[i].pf,&t[i].pf,&l[i].pf);
ans[i] = mMax(w[i],t[i],l[i]);
pmax[i] = cMax(w[i],t[i],l[i]);
}
for(int i=0;i<3;i++) {
printf("%c ",ans[i]);
}
result = (pmax[0]*pmax[1]*pmax[2]*0.65-1)*2;
printf("%.2f",result);
return 0;
}
3.1036 Boys vs Girls (25分)
题目链接:
PAT 1002
上代码1
#include <cstdio>
#include <string>
typedef struct stud{
char name[11],id[11],gender;
int grade;
stud(){}
stud(int _grade){
grade = _grade;
}
}STD;
STD t,high(-1),low(101);
int main(){
int n,ans;
scanf("%d",&n);
while(n--){
scanf("%s %c %s %d",&t.name,&t.gender,&t.id,&t.grade);
if(t.gender=='M') if(t.grade<low.grade) low = t;
else{
if(t.grade>high.grade) high = t;
}
}
if(high.grade==-1) printf("Absent\n");
else printf("%s %s\n",high.name,high.id);
if(low.grade!=101) printf("%s %s\n",low.name,low.id);
else printf("Absent\n");
if(high.grade==-1||low.grade==101) printf("NA\n");
else printf("%d\n",high.grade-low.grade);
return 0;
}
上代码2
NOTE:
细想你会发现,其实定义结构体的时候,可以直接不用定义gender,由于gender变量是固定名称的,因此可以直接让其成为变量,修改后的代码:
#include <cstdio>
#include <string>
typedef struct stud{
char name[11],id[11];
int grade;
stud(){}
stud(int _grade){
grade = _grade;
}
}STD;
STD t,F(-1),M(101);
int main(){
int n,ans;
scanf("%d",&n);
while(n--){
scanf("%s %c %s %d",&t.name,&gender,&t.id,&t.grade);
if(gender=='M'){
if(t.grade<low.grade) M = t;
}
else{
if(t.grade>high.grade) F = t;
}
}
if(high.grade==-1) printf("Absent\n");
else printf("%s %s\n",high.name,high.id);
if(low.grade!=101) printf("%s %s\n",low.name,low.id);
else printf("Absent\n");
if(high.grade==-1||low.grade==101) printf("NA\n");
else printf("%d\n",high.grade-low.grade);
return 0;
}
4.1006 Sign In and Sign Out (25分)
题目链接:
PAT甲级 1006
上代码1
#include <cstdio>
#include <cstring>
typedef struct person{
char id[16];
int fh,fm,fs;
int lh,lm,ls;
person(){}
person(int _fh,int _fm,int _fs,int _lh,int _lm,int _ls){
fh = _fh; fm = _fm; fs = _fs;
lh = _lh; lm = _lm; ls = _ls;
}
}PER;
PER temp,first(23,59,59,23,59,59),last;
bool unlock(PER a,PER b){
if(a.fh!=b.fh) return a.fh<b.fh;
else{
if(a.fm!=b.fm) return a.fm<b.fm;
else return a.fs<b.fs;
}
}
bool lock(PER a,PER b){
if(a.lh!=b.lh) return a.lh>b.lh;
else{
if(a.lm!=b.lm) return a.lm>b.lm;
else return a.ls>b.ls;
}
}
int main(){
int m;
scanf("%d",&m);
while(m--){
scanf("%s %d:%d:%d %d:%d:%d",&temp.id,&temp.fh,&temp.fm,&temp.fs,&temp.lh,&temp.lm,&temp.ls);
if(unlock(temp,first)) first = temp;
if(lock(temp,last)) last = temp;
}
printf("%s %s\n",first.id,last.id);
return 0;
}
上代码2
NOTE:
老实说,当初写那个老长的sacnf输入的时候就感觉不对劲,细想,其实定义结构体的时候,输出的判断条件有两个,并且这个条件的数值不同,但是其值属性相同,并且两个互不干涉都是合法的数据,因此可以这样修改:
#include <cstdio>
#include <cstring>
typedef struct person{
char id[16];
int h,m,s;
person(){}
person(int _h,int _m,int _s){
h = _h; m = _m; s = _s;
}
}PER;
PER temp,first(23,59,59),last;
bool judgement(PER a,PER b){
if(a.h!=b.h) return a.h<b.h;
else{
if(a.m!=b.m) return a.m<b.m;
else return a.s<b.s;
}
}
int main(){
int m;
scanf("%d",&m);
while(m--){
scanf("%s %d:%d:%d",&temp.id,&temp.h,&temp.m,&temp.s);
if(judgement(temp,first)) first = temp;
scanf("%d:%d:%d",&temp.h,&temp.m,&temp.s);
if(judgement(last,temp)) last = temp;
}
printf("%s %s\n",first.id,last.id);
return 0;
}
5总结:
知识点补充:
5.1结构体的初始化:
5.1.1自动初始化
结构体在创建变量的时候,就会自动进行初始化,对于整型初始化为0,对于字符型初始化为空:
#include <cstdio>
#include <cstring>
const int mMax = 10010;
typedef struct cjb{
int num;
char alp;
}CJB;
CJB a[3];
int main(){
for(int i=0;i<3;i++){
printf("num=%d alp=%c\n",a[i].num,a[i].alp);
}
return 0;
}
5.1.2构造函数初始化:
- 构造函数的特点:
- 不需要写返回类型,其函数名与结构体名相同。
- 对于普通定义的结构体,其内部会自己生成一个构造函数,这也是上面为什么会自定初始化的原因之一。
- 使用构造函数注意事项:
- 如果你自己重新了构造函数,则不能不经过初始化就定义结构体变量,因为你自己定义的构造函数会把初始的覆盖,因为想要享用自动初始化的便捷,最好自己加上一个没有参数的构造函数。
构造函数初始化,可以让代码更加的简单,直观并且可读性强
typedef struct person{
char name[6];
int yy,mm,dd;
person(){}
person(int _yy,int _mm,int _dd){
yy = _yy;
mm = _mm;
dd = _dd;
}
}PER;
思路理清
在创建结构体中的变量时,仔细思考下,哪些变量不需要定义,哪行变量的属性是相似可否用同一个变量表示,尽量减少结构体数组的使用。
勉励:
打卡第九天,加油ヾ(◍°∇°◍)ノ゙
追求完美,注重细节
如果觉得我的文章对你有所帮助与启发,点赞给我个鼓励吧(づ ̄3 ̄)づ╭❤~
关注我和我一起共勉加油
吧!
如果文章有错误,还望不吝指教!