Eso es porque usas condicionales aislados. Es decir, que has utilizado un conjunto de condiciones que son independientes por lo que tu programa las comprueba todas. En estos casos en los que una coincidencia en un <if> excluye que pueda ser verdadera otra coincidencia se usa <if - else if - else if - ... - else>.
Aquí tienes un código sencillo que funciona correctamente pero que no es muy eficiente ya que se compara el valor de <numero> con 1 y coincida o no, se compara con 2 y coincida o no se comprueba que el número sea distinto de 1 y de 2:
(Sé que el código es un poco absurdo pero me parecía un buen ejemplo para mostrarte el problema)
int numero = 1;
if(numero == 1)
if(numero == 2)
if(numero != 1 && numero != 2)
printf("El numero es distinto de 1 y de 2");
Se ve claramente que si el número vale 1 ya no va a valer 2 ni ningún otro valor. Por lo que se puede hacer más eficiente así:
int numero = 2;
if(numero == 1) // si vale 1...
else if(numero == 2) // si no vale 1, si vale 2...
else // si no vale 1 ni 2... ya se da por hecho que es distinto de 1 y de 2
printf("El numero es distinto de 1 y de 2");
En este caso se comprueba cada <if> hasta que uno sea cierto y en el momento que uno es cierto no sigue comprobando el resto de condiciones.
En tu caso compruebas de forma aislada cada mes excepto el último y en el último haces:
si mes == "diciembre" entonces
12 invierno
sino entonces
prueba de nuevo
fin si
Entonces ese <sino> se ejecutará siempre que el mes no sea igual a "diciembre".