c - 使用指针函数对结构的成员进行排序
问题描述
我正在尝试通过调用交换函数来完成大部分工作。程序的重点是在main函数中初始化week数组,然后使用swap函数对数组的结构成员'temp'进行从小到大的排序。最终结果应该从最小到最大对 temp 的数组值进行排序(并将日期名称与相应的 temp 保持一致)。
我已经尝试了各种语法(不正确)并且不确定我做错了什么。我正在尝试学习将结构成员作为指针访问并使用外部函数操作它们的正确方法。
struct weather {
char day[10];
float temp;
};
void swap (struct weather *p);
int main()
{
struct weather week[7] = {
{ "Sunday", 72.5 },
{ "Monday", 68.4 },
{ "Tuesday", 75.0 },
{ "Wednesday", 73.8 },
{ "Thursday", 65.1 },
{ "Friday", 72.8 },
{"Saturday", 75.2 }
};
swap(week);
int x;
puts("This week's forecast from coldest to warmest:");
for(x=0;x<7;x++)
printf("%10s %.1f degrees\n",
week[x].day,
week[x].temp);
return(0);
}
void swap (struct weather *p){
int x;
int t;
for (x=0;x<7;x++){
if (p[x+1].temp < p[x].temp){
t = p[x+1].temp;
p[x+1].temp = p[x].temp;
p[x].temp = t;
}
}
}
我希望结构的第二个成员数组(temp)按升序排列。不是,星期六列出的温度为 0。我的问题的目的是确保我正确地操作内存中数组的值。
解决方案
好吧,您对此有些倒退。swap
是一种操作,您只需交换数组的两个元素,并且sort
是一种单独的操作,您可以迭代数组中的元素,测试每个元素应按排序顺序放置,swap
用于更改元素在数组中的位置大批。
您的数组是您的结构数组(例如week
)。因此,当您对数组进行排序时,您将需要swap
元素。要交换 type 的元素struct weather *
,您只需要:
void swap (struct weather *a, struct weather *b)
{
struct weather tmp = *a;
*a = *b;
*b = tmp;
}
排序操作是一个单独的操作(您应该编写一个简单的比较函数和排序调用qsort
)。但是,出于教育目的和小型数组,您可以选择任何您想要的排序算法,例如简单的插入排序week
以按temp
成员(按升序)对数组进行排序,例如
void sorttemp (struct weather *p, int nmemb)
{
for (int i = 0; i < nmemb; i++)
for (int j = i; j > 0 && p[j].temp < p[j-1].temp; j--)
swap (&p[j], &p[j-1]);
}
(注意:上面,swap
通过提供每个元素的地址swap (&p[j], &p[j-1]);
(例如指针)来调用, )
总而言之,您可以这样做:
#include <stdio.h>
struct weather {
char day[10];
float temp;
};
void swap (struct weather *a, struct weather *b)
{
struct weather tmp = *a;
*a = *b;
*b = tmp;
}
void sorttemp (struct weather *p, int nmemb)
{
for (int i = 0; i < nmemb; i++)
for (int j = i; j > 0 && p[j].temp < p[j-1].temp; j--)
swap (&p[j], &p[j-1]);
}
int main (void)
{
struct weather week[7] = {{ "Sunday", 72.5 },
{ "Monday", 68.4 },
{ "Tuesday", 75.0 },
{ "Wednesday", 73.8 },
{ "Thursday", 65.1 },
{ "Friday", 72.8 },
{ "Saturday", 75.2 }};
sorttemp (week, 7);
puts ("This week's forecast from coldest to warmest:");
for (int x = 0; x < 7; x++)
printf ("%10s %.1f degrees\n", week[x].day, week[x].temp);
}
示例使用/输出
$ ./bin/sort_week_temp
This week's forecast from coldest to warmest:
Thursday 65.1 degrees
Monday 68.4 degrees
Sunday 72.5 degrees
Friday 72.8 degrees
Wednesday 73.8 degrees
Tuesday 75.0 degrees
Saturday 75.2 degrees
如果您还有其他问题,请查看并告诉我。
推荐阅读
- python - 如何根据标签将 DataFrame 分成多个 DataFrame,然后为每个 DataFrame 进行计算?
- .htaccess - 在 htaccess 中使用 Rewriterule 的问题
- json - 请求 Json
- c# - devexpress xtra 报告中的自定义组排序
- ansible - ansible不能使用变量
- python - 不同操作系统下OpenCV/Python中Camera的曝光
- gitlab - 仅限 Gitlab:变量多个
- android - Android 从 Activity 和 Fragment 隐藏或显示标题栏
- python - Tkinter:我无法在文本小部件中突出显示文本
- react-native - 如何使用“react-native-android-pip”?