标题:以结构体指针作为函数的参数处理,结果程序出错!
只看楼主
S140131022
Rank: 2
来 自:重庆邮电大学
等 级:论坛游民
帖 子:205
专家分:35
注 册:2014-10-9
结帖率:90.24%
 问题点数:0 回复次数:2 
以结构体指针作为函数的参数处理,结果程序出错!
//以结构体指针作为函数的参数处理

#include<stdio.h>

struct Lesson
{
    float math;
    float art;
};

struct Student
{
    char name[5];
    struct Lesson grade;  
};

int main()
{
    void convert(struct Student *p,int k);
    int i;
    struct Student stu[5];
    struct Student *p;
    p=stu;
    for(i=0;i<5;i++)
    {
        scanf("%f,%f,%s",&((*p).grade.art),&((*p).grade.math),&((*p).name));   //注意结构体数组指针的写法问题,因为涉及到符号优先级的问题!
        p++;
    }
    puts("The Information data is: ");
    p=stu;
    for(i=0;i<5;i++)
    {
        printf("%s %.1f %.1f\n",(*p).name,(*p).grade.art,(*p).grade.math);
        p++;
    }
    p=stu;
    convert(p,5);
    puts("The converted array is:");
    for(i=0;i<5;i++)
    {
        printf("%s %.1f %.1f\n",(*p).name,(*p).grade.art,(*p).grade.math);
        p++;
    }
    return 0;
}

void convert(struct Student *p,int k)
{
    struct Student exo;
    int i,j;
    for(i=0;i<k-1;i++)
    {
        k=i;
        for(j=1;j<k;j++)
        {
            if(*(p+j).grade.math<*(p+k).grade.math)
            k=j;
        }
        if(k!=i)
        {
            exo=*(p+k);
            *(p+k)=*(p+i);
            *(p+i)=exo;
        }        
    }
}


/*
报错信息提醒如下:请问如何修改
Compiling...
Cpp指针.cpp
D:\C语言设计\结构体进行的数组处理\Cpp指针.cpp(56) : error C2228: left of '.grade' must have class/struct/union type
D:\C语言设计\结构体进行的数组处理\Cpp指针.cpp(56) : error C2228: left of '.math' must have class/struct/union type
D:\C语言设计\结构体进行的数组处理\Cpp指针.cpp(56) : error C2228: left of '.grade' must have class/struct/union type
D:\C语言设计\结构体进行的数组处理\Cpp指针.cpp(56) : error C2228: left of '.math' must have class/struct/union type
*/
搜索更多相关主题的帖子: convert include 结构体 优先级 
2015-04-09 14:02
S140131022
Rank: 2
来 自:重庆邮电大学
等 级:论坛游民
帖 子:205
专家分:35
注 册:2014-10-9
得分:0 
我找到错误了噢

既然还有不甘心
就还没到放弃的时候~
2015-04-09 14:25
AleTiff
Rank: 3Rank: 3
等 级:论坛游侠
威 望:4
帖 子:64
专家分:157
注 册:2015-3-30
得分:0 
看这句:
    if(*(p+j).grade.math<*(p+k).grade.math)

要把解引用用括号括起来:
    if( (*(p + j)).grade.math < (*(p + k)).grade.math )

而且,你那个取名叫 convert() 的排序函数,让人看得心惊胆颤,能不能改成下面那样,踏踏实实的呢?

void Bubble_sort(struct Student *p, int k)
{  
    int i = k - 1;  
    while ( i > 0) {   
        int pos = 0;        // 每趟开始时, 记录下开始位置  
        for (int j = 0; j < i; j++){
            if( (*(p+j)).grade.math < (*(p+j+1)).grade.math )
            {  
                pos = j;    // 记录交换后, 记录交换点位置

                struct Student tmp = *(p + j);
                *(p + j) = *(p + j + 1);
                *(p + j + 1) = tmp;  
            }
        }
        i = pos;        // 为下一趟排序作准备  
     }   
}
2015-04-10 09:47



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-443745-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.177027 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved