信息学奥赛一本通T1183-病人排队-题解(C语言代码)

原题:

【信奥赛⼀本通】病⼈登记看病,编写⼀个程序,将登记的病⼈按照以下原则排出看病的先后顺序:

1.⽼年⼈(年龄>= 60岁)⽐⾮⽼年⼈优先看病。

2.年⼈按年龄从⼤到⼩的顺序看病,年龄相同的按登记的先后顺序序。

3.⾮⽼年⼈按登记的先后顺序看病。

 

我的思路是:

输入:在输入数据的同时 分开两组 一组是老人 另一组是其他人

处理:然后对老人组进行排序

输出:先输出老人组 再输出其他

#include<stdio.h> 
#include<string.h>

struct bingren{
	char name[10];
	int age;
};

int main()
{
	struct bingren a[100],old[100];
	void swap(struct bingren *a,struct bingren *b);
	int n;
	scanf("%d",&n);
	struct bingren *p,*q;
	q=old;
	p=a; 
	int count=0;
	int t;
	
	for(t=0;t<n;t++) {
		scanf("%s %d",p->name,&p->age);
		if(p->age>=60) {              //老人组分组处理 
			strcpy(q->name,p->name);
			q->age=p->age;
			q++;
			count++;
		}
		else p++;
	}
	struct bingren *i;
	for(q=old+count-1;q>old;q--){       //老人组排序 
		for(i=old;i<=q-1;i++){
			if(q->age > i->age) {
				struct bingren temp;
				temp=*q;
				*q=*i;
				*i=temp;
			} 
		}
	} 
	printf("\n输出结果如下:\n");      //先输出老人组 再输出其他的 
	for(q=old;q<old+count;q++){
		printf("%s\n",q->name);
	}
	for(q=a;q<a+n-count;q++){
		printf("%s\n",q->name);
	}
	return 0; 
}

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值