if(strcmp(a[i].name,a[j].name)>0) 用自定义函数cmp写成什么?
时间: 2024-12-14 12:23:25 浏览: 16
if(strcmp(a[i].name,a[j].name)>0) 这行代码是比较两个结构体变量a[i]和a[j]的name成员的字符串值,如果a[i].name的字典序大于a[j].name,则条件成立。如果要用自定义函数cmp来实现这种比较,你可以创建一个接受两个指针作为参数并返回整数的函数,如int cmp(const char* a, const char* b),然后调用这个函数:
```c
if(cmp(&a[i].name, &a[j].name) > 0)
```
cmp函数的具体实现取决于你如何定义了字符串的字典序比较规则,例如按字母顺序、忽略大小写等。下面是简单的例子,假设我们按字母顺序升序排序:
```c
int cmp(const char* str1, const char* str2) {
while (*str1 && *str2 && *str1 == *str2) {
str1++;
str2++;
}
return (*str1 > *str2) ? 1 : (*str1 < *str2) ? -1 : 0;
}
```
相关问题
解释一下这段代码void sort(STU stu[], int n) { int select,i,j; int (*cmp)(STU a,STU b); int ScoreAsc( STU a, STU b); int ScoreDsc( STU a, STU b); int NameAsc( STU a, STU b); printf("1 按总分升序排列\n"); printf("2 按总分降序排列\n"); printf("3 按姓名排序\n"); scanf("%d",&select); switch(select) { case 1: cmp=ScoreAsc; break; case 2: cmp=ScoreDsc; break; case 3: cmp=NameAsc; break; default: return ; } for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) if((*cmp)(stu[i],stu[j])>0) { STU temp; temp=stu[i]; stu[i]=stu[j]; stu[j]=temp; } output(stu,n); } int ScoreAsc(STU a, STU b) { if(a.total>b.total) return 1; else return -1; } int ScoreDsc(STU a, STU b) { if(a.total<b.total) return 1; else return -1; } int NameAsc(STU a, STU b) { return strcmp(a.name,b.name); }
这段代码实现了一个排序函数,可以对一个学生的结构体数组进行排序。函数的参数包括一个学生的结构体数组和数组的长度。排序的方式可以通过用户输入进行选择,包括按照总分升序排列、按照总分降序排列和按照姓名排序。具体的排序方式是通过函数指针来实现的,将排序方式对应的函数指针赋值给变量cmp,然后在排序过程中调用cmp函数指针即可实现不同的排序方式。在排序过程中,采用冒泡排序的方式,如果cmp函数指针返回值大于0,则交换两个元素的位置。最后,调用output函数输出排序后的结果。其中,函数ScoreAsc实现了按总分升序排序,ScoreDsc实现了按总分降序排序,NameAsc实现了按姓名排序,都是通过返回值来实现排序的。
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <algorithm> #include <set> #include <map> using namespace std; #define maxn 1000005 struct node { char name[10]; int time; }dz[maxn]; set<string> data; bool cmp(node a,node b) { int flag = strcmp(a.name,b.name); if(flag < 0) return 1; else return 0; //else if(a.time!=b.time) //return a.time>b.time; } int main() { int n; scanf("%d",&n); char ss[10]; for(int i = 0; i < n ; i++) { scanf("%s",ss); data.insert(ss); } int k; scanf("%d",&k); long long sum = 0; for(int i = 0; i < k ; i++) { int d; char s[10]; scanf("%s %d",dz[i].name,&d); dz[i].time = d; sum += d; } sort(dz,dz+k,cmp); long long pj = sum/k; int flag = 0; for(int i = 0; i < k; i++) { int mark = 1; if(dz[i].time <= pj) continue; if(data.count(dz[i].name)) mark = 0; if(mark) { flag = 1; printf("%s\n",dz[i].name); } } if(flag == 0) printf("Bing Mei You\n"); return 0; }改错
该代码存在以下问题:
1. 在 cmp 函数中,只有在 a.name < b.name 时返回 true,而没有考虑 a.name > b.name 的情况,应该改为:
```
bool cmp(node a, node b) {
int flag = strcmp(a.name, b.name);
if (flag < 0)
return true;
else if (flag == 0 && a.time > b.time) // 名字相同时按时间从大到小排序
return true;
else
return false;
}
```
2. 在读入数据时,应该用 `fgets` 函数读入字符串,以防止输入的字符串长度超过数组长度,改为:
```
fgets(ss, 10, stdin);
ss[strlen(ss) - 1] = '\0'; // 去掉字符串末尾的换行符
data.insert(ss);
```
3. 在输出结果时,如果没有符合条件的记录应该输出 "Bei Mei You" 而不是 "Bing Mei You",改为:
```
if (flag == 0)
printf("Bei Mei You\n");
```
修改后的代码如下:
阅读全文