关于#c语言#的问题:输入某班30人的学号及C语言课程成绩,计算输出课程的总分和平均分

程序设计,输入某班30人的学号及C语言课程成绩,计算输出课程的总分和平均分;然后将按成绩从高到低给出排名表。我这么编出来的毛病很大,求帮助。
#include <stdio.h>
void main() {
float a[30][4];
float b[7];
int i,j,k;
for(i=0;i<30;i++){
scanf("%f %f",&a[i][0],&a[i][1]);
a[i][2]+=a[i][1];
a[i][3] = a[i][2]/30; }
for(i=1;i<30;i++) {
for(j=2 ;j>=i;j--) {
if(a[j][2]>a[j-1][2]){
for(k=0;k<2;k++){
b[k]=a[j][k]; }
for(k=0;k<2;k++){
a[j][k]=a[j-1][k]; }
for(k=0;k<2;k++){
a[j-1][k]=b[k]; } } } } printf("学号\tC语言\t总分\t平均分\n");
for(i=0;i<30;i++){
printf("%.0f\t%.0f\t%.0f\t%.2f\n",a[i][0],a[i][1],a[i][2],a[i][3]); } }

为啥要定义成二维数组呢??学号用浮点型么?

#include <stdio.h>

typedef struct _student
{
    int id;
    float s;
}student;

void sorts(student *p,int n)
{
    int i,j;
    student k;
    for(i=0;i<n-1;i++)
      for(j=0;j<n-i-1;j++)
      {
          if(p[j].s < p[j+1].s)
          {
              k = p[j];
              p[j] = p[j+1];
              p[j+1] = k;
          }
      }
}

int main()
{
    student stu[30];
    int i;
    float sum=0;
    for(i=0;i<30;i++)
    {
        scanf("%d%f",&stu[i].id,&stu[i].s);
        sum += stu[i].s;
    }
    sorts(stu,30);
    printf("总分:%.1f,平局分:%.1f\n",sum,sum/30);
    for(i=0;i<30;i++)
        printf("学号:%d,成绩:.1f\n",stu[i].id,stu[i].s);
    return 0;
}