关于子函数中结构体交换的问题
#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编辑过]