仿照他人程序编写程序时遇到了问题

所编写的问题:某班级12名学生分为3组,每组4名同学。按要求完成以下任务:
                     (1)随机产生全部同学成绩,60~100分;
                     (2)计算每组同学的平均成绩并输出;
                     (3)计算全班同学的平均成绩并输出;
                     (4)对每组同学成绩进行排序并输出;
                     (5)对全班成绩进行排序并输出;
用代码块功能插入代码,请勿粘贴截图
#include 
#include 
#include
#define Y 3
#define X 4

void out(int a[Y][X])
{
    int i,j;
    for(i=0;ifor(j=0;jprintf("%d",a[i][j]);
        printf("\n");
    }
}

double ave(int *a,int n)
{
    int i,j;
    double sum;
    sum=0;
    for(i=0;ireturn sum/n;
}

void BubbleSort(int a[],int n,int flag)
{
    int i,j,t;
    for(j=n-1;j>0;j--)
    {
        for(i=0;iif(a[i]>a[i+1]&&flag||a[i]1]&&!flag)
            {
                t=a[i];
                a[i]=a[i+1];
                a[i+1]=t;
            }
        }
    }
}

int main()
{
    int a[Y][X];
    srand((unsigned)time(NULL));
    int i,j;
    for(i=0;ifor(j=0;jrand()%41+60;
    }
    out(a);
    for(i=0;iprintf("第%d组的平均成绩:%lf\n",i+1,ave(a[i],X));
    }
    printf("全班的平均成绩:%lf\n",ave(a,Y*X));
    for(i=0;iBubbleSort(a[i],X,0);
    }
    printf("各组的成绩排序为:\n");
    out(a);
    BubbleSort(a,Y*X,0);
    printf("全班的成绩排序为:\n");
    out(a);
    return 0;
}


我在模仿编写以及运行程序所遇到的问题:

1、为什么define Y、X后需要分别加3、4?只要这样加3、4就能分别代表组和名了吗?
2、第一个函数out我是按照别人的程序写的,这个函数的逻辑语言是什么呢?在整个程序中又扮演着什么样的角色呢?
3、为什么double ave(int a,int n)的a前要加“”,否则就会出现"subscripted value is neither array nor pointer nor vector“的字样?且为什么是return sum/n呢?
4、为什么在代码中字符i可以跟数组Y进行比较?
5、第53行中为什么rand()后要加%41+60?
6、第58行调用ave为什么参数是(a[i],X)?第60行调用ave参数为什么是(a,Y*X)?
7、如何让输出的各成绩结果之间加入空格便于观看?