指针


include <stdio.h>

#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,tp的关系,

         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;

}
------------------------------------------------------------------------出现问题--------------------------------------------------------------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值