目录
题面
2514. 我找还是你找
描述
某公司仓库从有很多刚生产出来的棍子,小Y要从仓库中找到这样一根棍子,这根棍子的要求如下(优先级1>2>3):
1、 这根棍子一定要是仓库中最长的;
2、 这根棍子一定要是最长的棍子中最细的;
3、 这根棍子一定要是符合前两条的棍子中编码最大的(每根棍子都有一个互不相同的编码,越大表示生产日期越近)。
相关的资料到是有,可是,手工从几百份棍子材料中选出符合要求的那根……
要不,还是请你编写个程序来帮他解决这个问题吧。
输入
第一行是一个整数N(N<=10)表示测试数据的组数)
每组测试数据的第一行 有一个整数m(m<=1000),表示仓库中所有棍子的数量,
之后m行,每行三个整数,分别表示一根棍子的长度(以毫米为单位)、直径(以毫米为单位)和编码(一个9位整数)。
输出
对应每组测试数据的输出只有一个9位整数,表示选出的那根钢管的编码,
每个输出占一行
输入样例 1
2 2 2000 30 123456789 2000 20 987654321 4 3000 50 872198442 3000 45 752498124 2000 60 765128742 3000 45 652278122
输出样例 1
987654321 752498124
思路
创建结构体bar,保存棍子的属性。
通过qsort(<stdlib.h>)排序,输出首位。
重点
掌握qsort,结构体的使用。
在C语言中,qsort
函数要求比较函数cmp
接收两个const void*
类型的参数,这两个参数实际上是qsort
函数内部将要比较的两个元素的地址。由于void*
是一种通用指针类型,它不包含任何类型信息,因此在cmp
函数内部不能直接将其解引用为特定类型的变量。
这是因为void*
指针可以被指向任何类型的数据,而编译器不知道这个指针在运行时具体指向哪种类型的数据。直接解引用可能会导致类型不匹配,进而导致未定义行为,比如读取错误的内存区域,这可能会引发程序崩溃或其他安全问题。
因此,你需要做的是将传入的void*
指针强制转换为正确的类型指针,在本例中就是sb*
类型的指针。通过这种方式,你可以确保在比较函数中有正确的类型信息,并且可以安全地访问结构体sb
的成员。
代码
#include<ctype.h>
#include<limits.h>
#include<math.h>
#include<stdbool.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define sb struct bar //方便后续定义
struct bar{
int len;
int dia;
char s[10];
};
sb a[100];
// 返回值大于0表示交换,小于0表示不交换
int cmp(const void *a, const void *b){
sb *pa = (sb*)a;
sb *pb = (sb*)b;
if (pa->len != pb->len) return (pa->len < pb->len) ? 1 : -1; // 比较长度(降序)
if (pa->dia != pb->dia) return (pa->dia > pb->dia) ? 1 : -1; // 比较直径(升序)
return (strcmp(pb->s,pa->s)); // 比较编号(降序)
}
void solve(){
int n;scanf("%d",&n);
for (int i = 0; i < n; i++){
scanf("%d %d %s",&a[i].len,&a[i].dia,a[i].s);
}
qsort(a,n,sizeof(sb),cmp);
printf("%s\n",a[0].s);
return ;
}
int main(){
int t;scanf("%d",&t);
while(t--){
solve();
}
return 0;
}
标签:ZJGSU,int,void,dia,棍子,工商大学,2514,sb,include
From: https://blog.csdn.net/Kyrie_xiang/article/details/144552757