Hola puedes aprovechar los índices del array para hacer los cálculos.
Por ejemplo si el array de notas los creas como Dim Nota(30, 4) As Double
suponiendo que los índices vayan de 1 a 30 y de 1 a 4 (con esto hay que tener cuidado porque los índices suelen empezar en cero pero aquí los dejo como si empezaran en 1 para simplificar)
Nota(6,3) = 7 lo que significaría es que el alumno 6 en la materia 3 sacó como nota un 7.
El promedio general de todos los alumnos en todas las materías se obtendría así:
numeroAlumnos=30
numeroMaterias=4
suma = 0
for i=1 to numeroAlumnos
for j=1 to numeroMaterias
suma = suma + Nota(i,j)
next j
next i
promedio = suma / (numeroAlumnos*numeroMaterias)
Mostrar "El promedio general del curso es " , promedioEl promedio por materia habría que sacarlo así:
sumaMat1 = 0
for i=1 to numeroAlumnos
sumaMat1 = sumaMat1 + Nota(i,1)
next i
promedioMat1 = sumaMat1 / numeroAlumnos
Mostrar "El promedio en la materia 1 es " , promedioMat1Esto lo puedes hacer para las cuatro materias, o si prefieres puedes generar un bucle que saque los cuatro promedios:
numeroAlumnos=30
numeroMaterias=4
sumaMat = 0
for j=1 to numeroMaterias
for i=1 to numeroAlumnos
sumaMat = sumaMat + Nota(i,j)
next i
promedioMat = sumaMat / (numeroAlumnos)
Mostrar "El promedio en la materia", j , " es " , promedioMat
sumaMat = 0
next jPara la pregunta c) ya depende de cómo trabajes, si trabajas con registros (record) donde un registro lleva los datos de un alumno o si trabajas con arrays correlacionados. Por ejemplo Dim apellidoAlumno(30) que te diera los apellidos del alumno con el número indicado por el índice.
En este curso tienes ejercicios resueltos bastante parecidos,
http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=28&Itemid=59Por ejemplo en "Ejercicios ejemplos resueltos con Desde-Siguiente (for-next) y arrays (arreglos) en pseudocódigo. (CU00154A)" es bastante parecido y otros también
Saludos!