Hola! mirando lo que dijo cada uno te respondo:
Cita: que hace este while solo sin do ni sentencias dentro???
Cita: el scanf no consume la entrada si no puede detectar el formato que desea. Es decir si vos le pedis un entero y lo primero que encuentra es una letra, esa letra la deja en el buffer y sale con error. Asi que agregue un pequeña linea que vacia el buffer(la linea es el while, lo que hace el getchar es tomar todos esos datos del bufer; digamos que "limpia" el bufer) para evitar ese pegado
Cita: este while por que le da una condicion de que a sea distinto de 1 si ya esta incluido en la segunda condicion !( 0 < opcion && opcion < 5)?????
Cita: La funcion scanf retorna el número de datos de entrada asignados y si hubo algun error en la asignacion retorna cero
Una cosa es lo que
retorna scanf y otra es el valor que se
almacena en opcion, son dos cosas distintas. Si a!=1 es porque hubo un error en el ingreso del dato. La otra condicion valida que opcion tenga un valor entre 1 y 5
Saludos