Hay varios problemas en el código. Uno de ellos es el siguiente:
if ($_POST){
$nombre = $_POST["nombre"];
$clave = $_POST["clave"];
$sexo = $_POST["sexo"];
$hobbie1 = $_POST["hobbie1"];
$hobbie2 = $_POST["hobbie2"];
$hobbie3 = $_POST["hobbie3"];
$hobbie4 = $_POST["hobbie4"];
Aquí hay un if que se supone evalúa una condición, pero lo cierto es que si estando vacío el formulario pulsamos validar y lo enviamos por get obtenemos esto:
nombre=&clave=&prof=2&coment=&guarde=no
El nombre está vacío, la clave vacía, el profesor vacío, sexo ni aparece, comentario vacía y guarde trae un valor.
¿Qué ocurre entonces? Que aunque esté vacío el formulario vienen algunas variables por POST con lo que $_POST siempre existe y ese if siempre se cumple. Si siempre se cumple, entra dentro del if y ejecuta lo que hay dentro, por ejemplo
$sexo = $_POST["sexo"];
Pero como $_POST["sexo"] no viene definido viene como NULL, después tratas de usar esa variable pero como esa variable vale NULL te dice que no está definida y por eso te salta el SCREAM error (o al menos eso creo)