P1104生日

P1104生日涉及结构体数组交换

题目

在这里插入图片描述


分析

运用到的知识呢

首先结构体补充下知识

然后排序嘛

简单看下冒泡解决

PS:虽然但是这道题看起来简单

(可能大佬一眼秒了)

​ 但对我这样的(菜鸡)初学者

​ 条件那里是真的卡住了很久。。。

1. 条件的选取 判断月要确保年相同,日要确保年月相同!!(别直接分开比。。。)

2. 如果用的是结构体数组,交换时不要傻傻地只交换名字。。

3. 日期相同先输入的后输出


坑1

下面这样的写法大错特错!!!

(stu[j].y == stu[j + 1].y && stu[j].m == stu[j + 1].m && stu[j].d >= stu[j + 1].d)) 

最终获得
在这里插入图片描述

!!! 因为排序时换来换去一不小心先输入的可能就跑到后输入后面去了

相同值的交换不要直接加在第一次排序中

正确写法

(stu[j].y == stu[j + 1].y && stu[j].m == stu[j + 1].m && stu[j].d > stu[j + 1].d)) 

排完顺序之后再弄相同值


坑2来咯

既然前后交换

我直接这样不超级简单

for(i=0;i<n;i++){
	if(a[i]==a[i+1]){
		temp=a[i];
		a[i]=a[i+1];
		a[i+1]=temp;
	}
}

好样的再次错误

没有考虑到多个值都相同的情况

so正确的还是再冒泡一次

for(i = 0; i < n - 1; i++) {
	    for(j =0; j < n-1-i; j++) {
	    	if(stu[j].y == stu[j+1].y && stu[j].m == stu[j+1].m && stu[j].d == stu[j+1].d){
	    		temp = stu[j];
		        stu[j] = stu[j+1];
		        stu[j+1] = temp;
			}
		}
	}

完整代码如下

使用语言:c

#include <stdio.h>
#define N 20

int main() {
	int n,sum;
	scanf("%d",&n);
	
	struct student{
		char s[N];
		int y;
		int m;
		int d;
	};
	struct student stu[101],temp;
	
	int i,j,t;
	for(i=0;i<n;i++){
		scanf("%s %d %d %d",&stu[i].s,&stu[i].y,&stu[i].m,&stu[i].d);
		if(stu[i].y<1960||stu[i].y>2020) return 0;
	}
	
	for(i = 0; i < n - 1; i++) {
	    for(j = 0; j < n - i-1; j++) {
	        if((stu[j].y > stu[j + 1].y)||
			   (stu[j].y == stu[j + 1].y && stu[j].m >stu[j + 1].m)||
			   (stu[j].y == stu[j + 1].y && stu[j].m == stu[j + 1].m && stu[j].d > stu[j + 1].d)) {
		        temp = stu[j];
		        stu[j] = stu[j + 1];
		        stu[j + 1] = temp;
	        }
	    }
	}
	for(i = 0; i < n - 1; i++) {
	    for(j =0; j < n-1-i; j++) {
	    	if(stu[j].y == stu[j+1].y && stu[j].m == stu[j+1].m && stu[j].d == stu[j+1].d){
	    		temp = stu[j];
		        stu[j] = stu[j+1];
		        stu[j+1] = temp;
			}
		}
	}


	for(i=0;i<n;i++){
		printf("%s\n",stu[i].s);
	}
	
	
	return 0;
}

over~


给我自己看的

结构体数组交换 一组的全部元素和另一组的交换

首先 定义

struct student stu[101],temp

然后这样

temp = stu[j];
stu[j] = stu[j+1];
stu[j+1] = temp;

结束

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JaneHan_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值