estoy intentando de intercambiar la sentencia switch por un if-else anidado y mi problema viene acarreado a la hora de que cada vez se ejecuta una sentencia se ejecuta igualmente el último else
Como ya te indico
MeCraniDOS el problema que tienes es un error logico: al introducir la calificacion seguida de un avance de linea este lo procesas y por supuesto se considerara una entrada no valida. Soluciones hay varias: descartar el resto de la linea mediante un bucle, leer el caracter con scanf utilizando el especificador " %c", etc..
int calificacion;
Lo primero que veo es que declaras calificación como un entero, y luego lo comparas como un carácter
No hay problema con ello ya que el retorno de getchar, la macro EOF y los caracteres literales como 'a', 'b', etc. son todos de tipo int.
Un saludo