Function 为什么我的程序(排序功能)没有排序?

Function 为什么我的程序(排序功能)没有排序?,function,pointers,structure,Function,Pointers,Structure,这是我的第一篇文章。我四处搜索,但找不到任何有助于解决问题的特定问题。当我尝试取消对指针的引用或在函数中应用指针数学时,事情并没有达到预期的效果 例如:*(ptr+a)在技术上应该将指针前进到我设置为的任何值。相反,我只是得到了一个错误,上面写着“在非结构或联合中请求成员‘name’”。这没有意义,因为我已经声明并将结构指针传递给函数。如果我使用: “start_ptr->name.last+a”样式,它编译但不排序任何内容。我知道第二个版本在指针数学方面也不正确 所以基本上,似乎错误的是编译,

这是我的第一篇文章。我四处搜索,但找不到任何有助于解决问题的特定问题。当我尝试取消对指针的引用或在函数中应用指针数学时,事情并没有达到预期的效果

例如:*(ptr+a)在技术上应该将指针前进到我设置为的任何值。相反,我只是得到了一个错误,上面写着“在非结构或联合中请求成员‘name’”。这没有意义,因为我已经声明并将结构指针传递给函数。如果我使用:

“start_ptr->name.last+a”样式,它编译但不排序任何内容。我知道第二个版本在指针数学方面也不正确

所以基本上,似乎错误的是编译,似乎正确的不是,也不是对任何东西进行排序

这是密码

#include <stdio.h>
#include <string.h> 
#include <ctype.h>

/* Structure definition */
/* -------------------- */

struct split
{
    char last[10];
    char first[10];
};

struct info
{
    struct  split name;
    char    address[20];
    char    city[15];
    char    state[3];
    long    zip;
    int     age;
    char    gender;
};  /* end struct info */


void sort_them(struct info *, char); // sort prototype

int main(void)  
{
/* Declare variables */
/* ----------------- */

struct info     people[] =
{

    {"Asimov", "Isaac", "15 Main St", "Worcestor", "MA", 01555, 23, 'M'},
    {"Smith", "Jane", "17 Make Peace", "Wallham", "ND", 10102, 28, 'F'},
    {"De Rippa", "Jack", "18 Able Way ", "Boston", "MA", 50503, 74, 'M'},
    {"Cobb", "Jim", "55 Elm St", "Ware", "MO", 61555, 65, 'M'},
    {"Kapone", "Al", "15 Morin Ave", "Idunno", "MN", 31333, 34, 'M'},
    {"Seigel", "Myron", "44 Wing Blvd West", "Sandwich", "WA", 02537,     21, 'M'},
    {"Thymes", "Mary", "88 Same Place", "Washington", "DC", 90555, 44, 'F'}

};

int             bad_sort;
int             num_people = sizeof(people) / sizeof(people[0]); //this will be the count of how many people there are!
char            sort_order;
char            big_name[22];





struct info *start_ptr = &people[0];
struct info *nums_ptr, *nums_end_ptr = &people[6];
char *big_ptr = &big_name[0];







printf ("\nWelcome to the People Structure Data Report Program\n");



do
{
        bad_sort = 1;

        printf ("\nEnter the sort order for the report: ");
        printf ("\n(N=Name, A=Age, S=State, Z=Zip code ' '=no sort)\n ");

/*               blank or return is allowed for no sorting of the data */

        sort_order = getchar();

        if(sort_order == '\n' || sort_order == ' ') break; 

        sort_order = toupper(sort_order);

        if ((sort_order == 'N') || (sort_order == 'A') || 
                    (sort_order == 'S') || (sort_order == 'Z'))
            bad_sort = 0;
        else
            printf("\nIncorrect Sort order selected, please re-enter:  ");

} while (bad_sort == 1);



switch (sort_order)
{
    case 'N':
        printf("Sort by Name  %i People.\n", num_people); 
        break;
    case 'A':
        printf("Sort by Age  %i People.\n", num_people); 
        break;
    case 'S':
        printf("Sort by State  %i People.\n", num_people); 
        break;
    case 'Z':
        printf("Sort by Zip  %i People.\n", num_people); 
        break;
    default:
        printf("No Sort selected  %i People.\n", num_people); 
        break;
}  /* end cases */

if(sort_order != ' ')
    sort_them (start_ptr, sort_order);


/* Print Report */
/* ------------ */

printf("\n\n                 The People Report\n\n");

printf ("\n\n%-20s%-20s %-15s %-5s %-6s %-3s %-6s", 
        "Name", "Address","City","State","Zip","Age","Gender");

printf ("%-20s%-20s %-15s %-5s %-6s %-3s %-6s\n", 
        "----", "------","----","-----","---","---","------");


for (nums_ptr = start_ptr; nums_ptr <= nums_end_ptr; nums_ptr++, start_ptr++)
{

    strcpy(big_ptr, start_ptr->name.last);
    strcat(big_ptr, ", ");
    strcat(big_ptr,start_ptr->name.first);



    printf ("%-20s%-20s %-15s  %-4s%.5ld    %-3i  %c\n", 
                                                                           big_ptr,start_ptr->address,start_ptr->city,start_ptr->state,start_ptr->zip,
            start_ptr->age,start_ptr->gender);      

} /* end for loop */



printf("\n\n");

return 0;

} /* end main */

void sort_them(struct info *start_ptr, char sort_by)
{
int a,b;
struct info temp;


for(a = 0; a < 6; a++)

    for(b = a + 1; b < 7; b++)
    {
        if(    (sort_by == 'N' && strcmp(start_ptr->name.last + a, start_ptr->name.last + b) > 0)
            || (sort_by == 'A' && start_ptr->age + a > start_ptr->age + b )
            || (sort_by == 'S' && strcmp(start_ptr->state + a, start_ptr->state + b) > 0)
            || (sort_by == 'Z' && (start_ptr->zip + a) > (start_ptr->zip + b) )  
          )


        {
            temp = *(start_ptr + a);
            *(start_ptr + a) = *(start_ptr + b);
            *(start_ptr + b) = temp;

        } /* end if  */


    } /* end inner for loop  */





};









/* end of sort them 
#包括
#包括
#包括
/*结构定义*/
/* -------------------- */
结构拆分
{
最后一个字符[10];
字符优先[10];
};
结构信息
{
结构拆分名称;
字符地址[20];
查尔城[15];
半焦态[3];
长拉链;
智力年龄;
性别;
};  /* 结束结构信息*/
无效排序(结构信息*,字符);//排序原型
内部主(空)
{
/*声明变量*/
/* ----------------- */
结构信息人员[]=
{
{“阿西莫夫”,“艾萨克”,“主大街15号”,“伍斯特”,“马”,01555,23,'M'},
{“史密斯”、“简”、“17缔造和平”、“沃勒姆”、“ND”、10102、28、“F”},
{“De Rippa”,“Jack”,“18 Able Way”,“Boston”,“MA”,50503,74,'M'},
{“Cobb”,“Jim”,“Elm街55号”,“Ware”,“MO”,61555,65,'M'},
{“Kapone”、“Al”、“Morin Ave 15”、“Idunno”、“MN”、31333、34、'M'},
{“Seigel”,“Myron”,“Wing Blvd West 44”,“Sandwich”,“WA”,02537,21,'M'},
{“百里香”,“玛丽”,“88同一个地方”,“华盛顿”,“哥伦比亚特区”,90555,44,'F'}
};
int坏_排序;
int num_people=sizeof(people)/sizeof(people[0]);//这将是有多少人的计数!
字符排序顺序;
char big_name[22];
结构信息*start_ptr=&people[0];
结构信息*nums\u ptr,*nums\u end\u ptr=&人[6];
char*big_ptr=&big_name[0];
printf(“\n帮助进入人员结构数据报告程序\n”);
做
{
坏排序=1;
printf(“\n输入报告的排序顺序:”);
printf(“\n(n=姓名,A=年龄,S=州,Z=邮编“”=无排序)\n”);
/*不允许对数据进行排序时为空或返回*/
排序顺序=getchar();
如果(排序顺序=='\n'| |排序顺序=='')中断;
排序顺序=toupper(排序顺序);
如果((排序顺序='N')| |(排序顺序='A')| |
(排序顺序='S')| |(排序顺序='Z'))
坏的排序=0;
其他的
printf(“\n选择的排序顺序不正确,请重新输入:”;
}while(bad_sort==1);
开关(排序顺序)
{
案例“N”:
printf(“按名称排序%i人。\n”,num_人);
打破
案例“A”:
printf(“按年龄排序%i人。\n”,num_人);
打破
案例S:
printf(“按状态%i人排序。\n”,num_人);
打破
案例“Z”:
printf(“按邮政编码%i人排序。\n”,num_人);
打破
违约:
printf(“未选择排序%i人。\n”,num_人);
打破
}/*结案*/
如果(排序顺序!='')
对它们进行排序(开始、排序顺序);
/*打印报告*/
/* ------------ */
printf(“\n\n人员报告\n\n”);
printf(“\n\n%20s%20s%15s%5s%6s%3s%6s”,
“姓名”、“地址”、“城市”、“州”、“邮编”、“年龄”、“性别”);
printf(“%-20s%-20s%-15s%-5s%-6s%-3s%-6s\n”,
"----", "------","----","-----","---","---","------");
for(nums_ptr=start_ptr;nums_ptr name.last);
strcat(大字体,“,”);
strcat(big\u ptr,start\u ptr->name.first);
printf(“%-20s%-20s%-15s%-4s%.5ld%-3i%c\n”,
大城市,开始城市->地址,开始城市->城市,开始城市->州,开始城市->邮政编码,
开始->年龄,开始->性别);
}/*循环结束*/
printf(“\n\n”);
返回0;
}/*端干管*/
无效排序(结构信息*开始、字符排序依据)
{
INTA,b;
结构信息温度;
对于(a=0;a<6;a++)
对于(b=a+1;b<7;b++)
{
如果((排序依据='N'&&strcmp(开始\u ptr->name.last+a,开始\u ptr->name.last+b)>0)
||(排序依据=='A'&开始时间->年龄+A>开始时间->年龄+b)
||(排序依据=='S'&&strcmp(开始\u ptr->state+a,开始\u ptr->state+b)>0)
||(排序依据=='Z'&&(开始\u ptr->zip+a)>(开始\u ptr->zip+b))
)
{
温度=*(启动温度+a);
*(启动ptr+a)=*(启动ptr+b);
*(启动ptr+b)=温度;
}/*如果结束*/
}/*内环的端部*/
};
/*别再理他们了

我认为以下几行

 strcmp( start_ptr->name.last + a, start_ptr->name.last + b) > 0  
应该像下面这样改变

strcmp( (start_ptr + a)->name.last,  
        (start_ptr + b)->name.last  
      ) > 0  

等等与其他比较。

我认为以下几行

 strcmp( start_ptr->name.last + a, start_ptr->name.last + b) > 0  
应该像下面这样改变

strcmp( (start_ptr + a)->name.last,  
        (start_ptr + b)->name.last  
      ) > 0  

等等。首先,没有理由不在C中使用数组表示法:

for(a = 0; a < 6; a++)
for(b = a + 1; b < 7; b++)
{
    if(    (sort_by == 'N' && strcmp(start_ptr[a].name.last, start_ptr[b].name.last) > 0)
        || (sort_by == 'A' && start_ptr[a].age > start_ptr[b].age )
        || (sort_by == 'S' && strcmp(start_ptr[a].state, start_ptr[b].state) > 0)
        || (sort_by == 'Z' && (start_ptr[a].zip) > (start_ptr[b].zip) )  
      )


    {
        temp = start_ptr[a];
        start_ptr[a] = start_ptr[b];
        start_ptr[b] = temp;

    } /* end if  */

例如。

首先,没有理由不在C中使用数组表示法:

for(a = 0; a < 6; a++)
for(b = a + 1; b < 7; b++)
{
    if(    (sort_by == 'N' && strcmp(start_ptr[a].name.last, start_ptr[b].name.last) > 0)
        || (sort_by == 'A' && start_ptr[a].age > start_ptr[b].age )
        || (sort_by == 'S' && strcmp(start_ptr[a].state, start_ptr[b].state) > 0)
        || (sort_by == 'Z' && (start_ptr[a].zip) > (start_ptr[b].zip) )  
      )


    {
        temp = start_ptr[a];
        start_ptr[a] = start_ptr[b];
        start_ptr[b] = temp;

    } /* end if  */
比如说