标题:关于子函数中结构体交换的问题
只看楼主
育帝
Rank: 2
来 自:黑龙江哈尔滨
等 级:论坛游民
帖 子:75
专家分:43
注 册:2016-10-16
结帖率:87.5%
已结贴  问题点数:20 回复次数:1 
关于子函数中结构体交换的问题
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define PASS 123
int i,j;
struct student
{
    int num;
    char name[11];
    char sex[5];
    int age;
    double score[5];
    double total;
};
typedef struct student ST;
//void menu(ST *st,int tail);//菜单
//int  password();//密码
void type(ST *st,int tail);//录入
void query(ST *st,int tail);//输出
void chart(ST *st,int tail);//排行榜
//void check(ST *st,int *prt);//查询
//void Del(ST *st,int *prt);//删除
int main()
{
    ST *st;
    int tail=5,*prt;
    prt=&tail;
    st=(ST*)malloc(tail*sizeof(ST));
    printf("请输入学生管理系统的密码\n");
         type(st,tail);
       query(st,tail);

       chart(st,tail);
       //check(st,&tail);
       //Del(st,&tail)  ;
    //if (password())

}



/*void menu(ST *st,int tail)//菜单
{
    int n;
    int flag=1;
    while(flag){
    printf("\n1------成绩录入\n");
    printf("2------成绩输出\n");
    printf("3------排行榜\n");
    printf("4------查询\n");
    printf("5------删除\n");
    printf("6------退出\n");
    scanf("%d",&n);
    system("cls");
    switch(n)
    {
        case 1:type(st,&tail);break;
        case 2:query(st,&tail);break;
        case 3:chart(st,&tail);break;
        case 4:check(st,&tail);break;
        case 5:Del(st,&tail)  ;break;
        case 6:flag=0;break;
    }
    }
}*/
/*
int  password()//密码
{
    int pass,n = 3;
    char ch;
    do
    {
        pass = 0;
        for (i = 1; (i <= 6) && ((ch = getch()) != '\r');i++)
        {
               putcha*prtr('*');
               pass = pass * 10 + ch - '0';
        }
        if (pass == PASS)
            break;
        else
        {
            n--;
                printf("密码错误,还有%d次机会!\n", n);
        }
    } while (n>0);
    if (pass == PASS)
        return 1;
    else
        return 0;
}*/

void type(ST *st,int tail)//录入
{
    printf("请依次录入学生的:\n");
    printf("  学号    姓名   性别   年龄     高数   线代    英语    C语言   军理\n");
    for(i=0;i<tail;i++){
        scanf("%d%s%s%d",&st[i].num,st[i].name,st[i].sex,&st[i].age);
    for(j=0;j<5;j++)
        scanf("%lf",&st[i].score[j]);
    }
}
void query(ST *st,int tail)//输出
{
    for(i=0;i<tail;i++)
     st[i].total=0;
     for(i=0;i<tail;i++)
     for(j=0;j<5;j++)
     st[i].total+=st[i].score[j];
   printf("  学号   | 姓名  |性别 | 年龄  |  高数 | 线代  | 英语  | C语言 | 军理   |  总成绩  |\n");
   printf("____________________________________________________________________________________\n");
    for(i=0;i<tail;i++){
        printf("%d | %s  | %s  |  %d",st[i].num,st[i].name,st[i].sex,st[i].age);
    for(j=0;j<5;j++)
        printf("   | %.1lf",st[i].score[j]);
        printf("    |  %.1lf    |",st[i].total);
        printf("\n____________________________________________________________________________________\n");
    }
}
void chart(ST *st,int tail)//排行榜
{
     int z,k;
     ST temp;

     for(k=0;k<tail-1;k++)
        for(z=0;z<tail-k;z++)
        if(st[z].total<st[z+1].total){
        temp=st[z];
        st[z]=st[z+1];
        st[z+1]=temp;
        }
       printf("  学号   | 姓名  |性别 | 年龄  |  高数 | 线代  | 英语  | C语言 | 军理   |  总成绩  |\n");
   printf("____________________________________________________________________________________\n");
    for(i=0;i<tail;i++){
        printf("%d | %s  | %s  |  %d",st[i].num,st[i].name,st[i].sex,st[i].age);
    for(j=0;j<5;j++)
        printf("   | %.1lf",st[i].score[j]);
        printf("    |  %.1lf    |",st[i].total);
        printf("\n____________________________________________________________________________________\n");
    }
}
/*
void check(ST *st,int *prt)//查询
{
    bool flag=0;
    int k=3;
    char ch;
    int Student_NO;
    do
    {
        flag=1;
        printf("请输入要查询的学号:");
        scanf("%d",&Student_NO);
    for(i=0;i<(*prt)&&flag;){
    if(Student_NO==st[i].num){
        printf("  学号    姓名   性别   年龄    高数    线代    英语    C语言   军理      总成绩\n");
       printf("%d  %s   %s     %d ",st[i].num,st[i].name,st[i].sex,st[i].age);
      for(j=0;j<5;j++)
        printf("     %.1lf",st[i].score[j]);
        printf("        %.1lf",st[i].total);
        printf("\n");
        flag=0;
    }
    else
        i++;
     }
    if(i==(*prt)){
        printf("此人不存在!\n你还剩余查错机会(%d)\n",k);
        k--;
        flag=0;
    }

        printf("是否继续查询(y/任意键退出(except\"y\")\n");
        getchar();
        scanf("%c",&ch);
    if(ch=='y')
        flag=0;
    else if(ch=='n')
        flag=1;
        else flag=1;
}while(flag==0&&k>=0);
}
void Del(ST *st,int *prt)//删除
{
    int id;
    int flag=1;
    printf("请输入要删除学生的学号(每次仅限删除一个学生信息):\n");
    scanf("%d",&id);
    printf("你删除的学生信息为:\n");
    for(i=0;i<(*prt)&&flag;){
    if(id==st[i].num){
        printf("  学号    姓名   性别   年龄    高数    线代    英语    C语言   军理      总成绩\n");
       printf("%d  %s   %s     %d ",st[i].num,st[i].name,st[i].sex,st[i].age);
      for(j=0;j<5;j++)
        printf("     %.1lf",st[i].score[j]);
        printf("        %.1lf",st[i].total);
        printf("\n");
        flag=0;
        printf("删除完成\n");
        for(;i<(*prt);i++)
            st[i]=st[i+1];
        (*prt)--;
    }
    else
        i++;
     }
     if(i==(*prt))
        printf("信息错误,此人不存!自动退出!\n");

}
*/
如上代码,我在全局定义了结构体st,ST是结构体的类型,我想用指针地址访问排序后的顺序但不改变原数据顺序,为什么这样改不了呢?其中tail为学生数量为5,共有5科科目

[此贴子已经被作者于2016-12-6 17:51编辑过]

搜索更多相关主题的帖子: include password 排行榜 double 结构体 
2016-12-04 08:39
xufan
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:232
专家分:804
注 册:2008-10-20
得分:20 
p[tail]只是st的指针副本,交换p[z]、p[z+1]没有改变st[z]与st[z+1]的地址值

~~~~~~我的明天我知道~~~。
2016-12-04 08:50



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




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

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