写一下注意事项凑凑字数:
1. 注意空瓶子-- t,的类型,它的类型要与交换对象的类型相同(这是在sort(排序函数)内用的)
2.输入,必须是:gets(),并且前面要有一个操作读入消耗掉第一次输入后的换行符
(回车=提交+换行),也就是提交下面这一行产生的换行符
scanf("%d",&p->num);
达到这个目的--在" gets() "前吞掉换行符,有下面两种方法:
scanf("%*c");//读入一个字符并扔掉
getchar();//读入一个字符
//这种方法我没在学习通上用,感觉他应该是算在输入流中加入了一个换行符
//说不定会过不去
3.给你们复习一个知识点:
在C语言中,为了使用方便和使之直观,可以把 (*p).num 改用 p->num 来代替,它表示 *p 所指向的结构体变量中的 num 成员,同样,(*p).name 等价于 p->name。
也就是说以下三种形式等价:
- a. 结构体变量.成员名 例如:stu.age
- b. (*p).成员名 例如:(*p).age
- c. p-> 成员名 例如:p->age
#include<stdio.h>
#include<stdlib.h>
struct stu
{
int num;
char name[20];
char sex;
int age;
float score;
}t;
void input(struct stu *p,int n)
{
while(n--)
{
scanf("%d",&p->num);
scanf("%*c");
//读入一个字符并扔掉,这里读入提交时的换行符并把它扔掉
gets(p->name);
//fflush(stdin);
scanf("%c",&p->sex);
scanf("%d",&p->age);
scanf("%f",&p->score);
p++;
}
}
void sort(struct stu *p,int n)
{
int i,j,k;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if((p+k)->score < (p+j)->score) k=j;
}
if(k!=i) t=*(p+i),*(p+i)=*(p+k),*(p+k)=t;
}
}
void put(struct stu *p,int n)
{
while(n--)
{
printf("%6d%12s%3c%6d%8.2f",p->num,p->name,p->sex,p->age,p->score);
if(n!=0) printf("\n");
p++;
}
}
int main()
{
struct stu *p;
int n;
scanf("%d",&n);
p=(struct stu *)malloc(n*sizeof(struct stu));
input(p,n);
sort(p,n);
put(p,n);
return 0;
}