| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 786 人关注过本帖
标题:作业中参数传递与结构体的问题,不懂,求解
只看楼主 加入收藏
云飞aini
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2011-5-27
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:6 
作业中参数传递与结构体的问题,不懂,求解
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STUDENT_COUNT 2//为方便测试写了两个人
#define NAME_LENGTH 10

typedef struct Student

{
    char name[NAME_LENGTH];
    int studentId;
    double mathScore;
    double computerScore;
    double sumScorce;
}Student;

void show(Student (*students)[STUDENT_COUNT])//Student (*students)与(Student *)students的区别是什么?
{
    int i;
    Student *p = (Student *)students;//为什么强制转换?是为了方便控制操作数吗?
    printf("  姓名:\t学号:\t数学成绩:\t计算机成绩:\t\n");
    for (i = 0;i<STUDENT_COUNT;i++)
    {
        printf("%10s",(p+i)->name);//这里为什么是(p+i)->name儿不是students[i]->?
        printf("\t%d",(p+i)->studentId);
        printf("     \t%g",(p+i)->mathScore);
        printf("   \t\t%g\n",(p+i)->computerScore);
    }
}

void seek(Student (*students)[STUDENT_COUNT],char name[NAME_LENGTH])
{
    int i;
    Student *p = (Student *)students;
    for (i = 0;i<STUDENT_COUNT;i++)
    {
        if (0==strcmp(name,(p+i)->name))
        {
            printf("  姓名:\t学号:\t数学成绩:\t计算机成绩:\t\n");
            printf("%10s",(p+i)->name);
            printf("\t%d",(p+i)->studentId);
            printf("     \t%g",(p+i)->mathScore);
            printf("   \t\t%g\n",(p+i)->computerScore);
            return 0;
        }
    }
    printf("查无此人!\n");
}

void sort(Student (*students)[STUDENT_COUNT])
{
    int i,j;
    Student tmpStu;
    Student*p = (Student * )students;
    for (i = 0;i<STUDENT_COUNT;i++)
    {
        (p+i)->sumScorce = (p+i)->mathScore + (p+i)->computerScore;
    }
    for (i = 0;i<STUDENT_COUNT-1;i++)
    {
        for (j = 0;j<STUDENT_COUNT-1-i;j++)
        {
            if ((p+j)->sumScorce<(p+j+1)->sumScorce)
            {
                strcpy(tmpStu.name,(p+j)->name);
                tmpStu.studentId = (p+j)->studentId;
                tmpStu.mathScore = (p+j)->mathScore;
                 = (p+j)->computerScore;
                tmpStu.sumScorce = (p+j)->sumScorce;
                strcpy((p+j)->name,(p+j+1)->name);
                (p+j)->studentId = (p+j+1)->studentId;
                (p+j)->mathScore = (p+j+1)->mathScore;
                (p+j)->computerScore = (p+j+1)->computerScore;
                (p+j)->sumScorce = (p+j+1)->sumScorce;
                strcpy((p+j+1)->name,tmpStu.name);
                (p+j+1)->studentId = tmpStu.studentId;
                (p+j+1)->mathScore = tmpStu.mathScore;
                (p+j+1)->computerScore =  (p+j+1)->sumScorce = tmpStu.sumScorce;
            }
        }
    }
}

int main(void)
{
    int choice;
    int i;
    char name[NAME_LENGTH]="";
    Student students[STUDENT_COUNT];
    for (i = 0;i<STUDENT_COUNT;i++)
    {
        printf("请输入第%d个学生的姓名:",i+1);
        scanf("%s",&students[i].name);
        printf("请输入第%d个学生的学号:",i+1);
        scanf("%d",&students[i].studentId);
        printf("请输入第%d个学生的数学成绩:",i+1);
        scanf("%lf",&students[i].mathScore);
        printf("请输入第%d个学生的计算机成绩:",i+1);
        scanf("%lf",&students[i].computerScore);
    }
    printf("\n");
    printf("----------------------------------\n");
    printf("* 1.输出学生信息                  *\n");
    printf("* 2.查找学生信息(按姓名查找)    *\n");
    printf("* 3.对学生按总成绩排序输出        *\n");
    printf("---------------------------------\n");
    printf("\n");
    printf("请输入你的选择(1-3):");
    scanf("%d",&choice);
    switch (choice)
    {
    case 1:
        show(&students);
        break;
    case 2:
        printf("请输入要查询人的姓名:");
        scanf("%s",name);
        seek(&students,name);
        break;
    case 3:
        sort(&students);
        printf("  姓名:\t学号:\t数学成绩:\t计算机成绩:\t总成绩:\n");
        for (i = 0;i<STUDENT_COUNT;i++)
        {
            printf("%10s",students[i].name);
            printf("\t%d",students[i].studentId);
            printf("     \t%g",students[i].mathScore);
            printf("   \t\t%g",students[i].computerScore);
            printf("\t\t%g\n",students[i].sumScorce);
        }
        break;
    default:
        printf("你选错了=_=!\n");
    }

    system("pause");
    return 0;
}
//虽然程序是我写的,是看书上临摹的,很多不懂,写的也不好,见谅
搜索更多相关主题的帖子: 结构体 
2011-05-29 16:14
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:10 
1、如 int ar[3][4]; 如果你想把a赋值给一个变量,说白了就是想把它当作参数传递,那么你得使用一个和ar作用等价的指针。
   int (* p)[4]; p 就和 ar的作用等价了,书上说它们都指向4个整形大小的空间,其实我认为就是为了为实现数组的计算寻址使
   ar + 1 == p + 1 == (char)ar + sizeof(int) * 4 == (char)p + sizeof(int) * 4,至于为什么在* p的两边加上括号是因为[]优先级更高,不加括号就变成
   int * p[4]; 这样p就成了一个指针数组了,每一个元素都是整形指针。
2、void show(Student (*students)[STUDENT_COUNT]) 可以改为 void show(Student * students) , 这样在调用时就可以用数组名作参数,也可以不强制转换,不知道你书上为什么用一个二维数组指针作参数,多此一举。
3、[]是变址运算符如:int * p = (int *)0xB0000000; p[4] = *(p + 4) = (char)p + sizeof(int) * 4; ->的左操作数必须是结构指针,stduent[i]就是一个结构体对象了,就不能用->,得用一个句点 '.' 来引用一个成员。

My life is brilliant
2011-05-30 12:48
云飞aini
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2011-5-27
收藏
得分:0 
回复lz1091914999
以下是引用lz1091914999在2011-5-30 12:48:38的发言:

1、如 int ar[3][4]; 如果你想把a赋值给一个变量,说白了就是想把它当作参数传递,那么你得使用一个和ar作用等价的指针。
   int (* p)[4]; p 就和 ar的作用等价了,书上说它们都指向4个整形大小的空间,其实我认为就是为了为实现数组的计算寻址使

   ar + 1 == p + 1 == (char)ar + sizeof(int) * 4 == (char)p + sizeof(int) * 4,至于为什么在* p的两边加上括号是因为[]优先级更高,不加括号就变成
   int * p[4]; 这样p就成了一个指针数组了,每一个元素都是整形指针。
2、void show(Student (*students)[STUDENT_COUNT]) 可以改为 void show(Student * students) , 这样在调用时就可以用数组名作参数,也可以不强制转换,不知道你书上为什么用一个二维数组指针作参数,多此一举。
3、[]是变址运算符如:int * p = (int *)0xB0000000; p[4] = *(p + 4) = (char)p + sizeof(int) * 4; ->的左操作数必须是结构指针,stduent就是一个结构体对象了,就不能用->,得用一个句点 '.' 来引用一个成员。
先谢谢您了,就是“void show(Student (*students)[STUDENT_COUNT]) 可以改为 void show(Student * students)”您能帮我改一下吗?我总是改不对还有int * p = (int *)0xB0000000这个我看不懂您能给我一点资料吗?
再次感谢您
2011-05-30 20:01
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:5 
程序代码:
void show(Student * students)//Student (*students)与(Student *)students的区别是什么?
{
    int i;
    printf("  姓名:\t学号:\t数学成绩:\t计算机成绩:\t\n");
    for (i = 0;i<STUDENT_COUNT;i++)
    {
        printf("%10s",(students+i)->name);//这里为什么是(students+i)->name儿不是students[i]->?
        printf("\t%d",(students+i)->studentId);
        printf("     \t%g",(students+i)->mathScore);
        printf("   \t\t%g\n",(students+i)->computerScore);
    }
}
我这台本本是32位的,所以整形为4字节,如int x; 这里假设x的地址(&x) == 0xB0000000; int * p = &x; p + 1 == 0xB0000004; p + 2 == 0xB0000008; *p == x; p[0] == x;
*(p + 0) == x;

My life is brilliant
2011-05-30 20:14
云飞aini
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2011-5-27
收藏
得分:0 
回复 4楼 lz1091914999
程序代码:
void seek(Student (*students)[STUDENT_COUNT],char name[NAME_LENGTH])//这里用改吗?
{
    int i;
    Student *p = (Student *)students;//这里的强制类型转换有必要吗?
    for (i = 0;i<STUDENT_COUNT;i++)
    {
        if (0==strcmp(name,(p+i)->name))
        {
            printf("  姓名:\t学号:\t数学成绩:\t计算机成绩:\t\n");
            printf("%10s",(p+i)->name);
            printf("\t%d",(p+i)->studentId);
            printf("     \t%g",(p+i)->mathScore);
            printf("   \t\t%g\n",(p+i)->computerScore);
            return 0;
        }
    }
    printf("查无此人!\n");
}
//学的不扎实,还是不懂
//之前您讲的我懂了,在此谢过
2011-05-30 20:54
mobiqiliang
Rank: 2
等 级:论坛游民
帖 子:9
专家分:46
注 册:2011-5-29
收藏
得分:5 
"defaut "那句后面加个 goto loop   (loop:printf("请输入你的选择(1-3):");)才像个使用的查询菜单啊 呵呵 虽然goto不规范 可以改进
2011-05-30 22:15
云飞aini
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2011-5-27
收藏
得分:0 
回复 6楼 mobiqiliang
菜单我改了
程序代码:
while (0==flag)
    {
        printf("请输入你的选择(1-3):");
        scanf("%d",&choice);
        switch (choice)
        {
        case 1:
            show(&students);
            break;
        case 2:
            printf("请输入要查询人的姓名:");
            scanf("%s",name);
            seek(&students,name);
            break;
        case 3:
            sort(&students);
            break;
        case 4:
            flag = 1;
            break;
        default:
            printf("你选错了=_=!\n");
            flag = 1;
        }
建议提得很好,谢啦

2011-05-31 10:32
快速回复:作业中参数传递与结构体的问题,不懂,求解
数据加载中...
 
   



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

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