指针
#include <stdlib.h>
#include <string.h>
struct Student
{
int stu_no;
char name[20];
char gender;
float score[3];
float ave;
float sum;
};
void input(struct Student *p)
{
char temp[10];
int j;
gets(temp);// 按字符串方式取学号,这样呢将回车吸收掉。
p->stu_no=atoi(temp);// 将上一个字符串,转换成整数;
gets(p->name); //正常取字符串,上一个回车已经吸收了。
p->gender=getchar(); //正常取字符。
for(j=0;j<3;j++) //读三门课程成绩,并计算总成绩和平均分;
{
scanf("%f",&p->score[j]);
p->sum+=p->score[j];
}
p->ave=p->sum/3;
getchar();getchar();//正常处理最后一个回车,为下一次数据读入做清理
//锐格系统需要处理2个符号。
}
void output(struct Student *p,int n) //输出p开始的地址,n个数据;
{
int i,j;
for(i=0;i<n;i++)
{
printf("%5.2f %5.2f ",p->sum,p->ave);
for(j=0;j<3;j++)
printf("%5.2f ",p->score[j]);
printf("%-10d %c %s\n",p->stu_no,p->gender,p->name);
p++;
}
}
struct Student * Modify(struct Student*p,int n,int stu_no,int x ,float y,struct Student * old)
{
//write your code
int i;
for(i=0;i<n;i++)
if((p+i)->stu_no==stu_no)
{
*old=*(p+i);//如果是地址相等,那么之后改变值,两者都会改变:但如果只改变值,old中就能保留改变前的p中的值
break;
}
(p+i)->score[x]=y;
(p+i)->sum=(p+i)->score[0]+(p+i)->score[1]+(p+i)->score[2];
(p+i)->ave=(p+i)->sum/3.00;
return p+i;
//end
}int main()
{
struct Student *t,*q,old;
float y;
int n,i,x,stu_no;
while(scanf("%d",&n)!=EOF)
{
getchar();getchar(); //这个地方比较特殊,是锐格系统独有的。
q=t=(struct Student *)calloc(n,sizeof(struct Student));
if(t!=NULL)
{
for(i=0;i<n;i++) //依次输入n个学生的信息;
input(t++);
}
//数据输入结束,对t开始的内存单元进行处理,注意q,t和p的关系,
scanf("%d%d%f",&stu_no,&x,&y);
q=Modify(q,n,stu_no,x,y,&old);
if(q!=NULL)
{ output(&old,1);
output(q,1);
}
else
printf("%d",0);
}
return 0;