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;
结束