查找类试题:知识补充结构体初始化,PAT系列1011人口普查,1011 World Cup Betting ,1006 Sign In and Sign Out,1036 Boys vs Girls,

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构造函数初始化:
  • 构造函数的特点:
  1. 不需要写返回类型,其函数名与结构体名相同。
  2. 对于普通定义的结构体,其内部会自己生成一个构造函数,这也是上面为什么会自定初始化的原因之一。
  • 使用构造函数注意事项:
  1. 如果你自己重新了构造函数,则不能不经过初始化就定义结构体变量,因为你自己定义的构造函数会把初始的覆盖,因为想要享用自动初始化的便捷,最好自己加上一个没有参数的构造函数。

构造函数初始化,可以让代码更加的简单,直观并且可读性强

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 ̄)づ╭❤~
关注我和我一起共勉加油吧!
如果文章有错误,还望不吝指教!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值