El problema está en esos ".9".
En ningún momento aseguras que la nota tenga un solo decimal, entonces qué pasa si tienes un 9.95, 9.995, 9.999995, 6.99999999??? Todas esas notas no están contempladas en ningún caso.
Es por esto que no se usa (<= 9.9) sino que se usa (< 10) que sí contempla cualquier cantidad de decimales. Así que tendrías que sustituirlo en todos los casos y cuando sustituyas (<= 6.9) por (< 7) verás que funciona correctamente. El problema será que aunque tú escribas 6.9, un float (32 bits) maneja una cantidad muy grande de decimales, entonces es posible que se guarde 6.90[...]01 y entonces no se cumple la condición.
Aparte de eso, te doy algún consejo más aunque no te frustres por no haber hecho el mejor programa. Es normal cuando uno está empezando. Poco a poco irás mejorando en la lógica.
- Para limpiar el buffer no se debe utilizar nunca fflush(stdin). Esta función está definida por el lenguaje para limpiar el buffer de salida (fflush(stdout)) y hasta la propia documentación del lenguaje recoge que el uso con stdin es indeterminado. Puede ser que 1 millón de veces pero no hay fundamentación teórica que diga que va a funcionar 1 millón y 1 vez.
Una alternativa para limpiar el buffer es:
Por si te interesa el funcionamiento: el buffer contiene lo que introduces por teclado para luego usarlo (en una asignación a una variable por ejemplo). Puede ser que queden caracteres que no cabían en la variable y al final como último elemento del buffer el ENTER ('\n'). Con la instrucción anterior vas cogiendo cada caracter que queda en el buffer hasta encontrar el ENTER (que lo coge también). Una vez cogido el ENTER, ese bucle termina y el buffer está vacío.
- Si ordenas los rangos de los ifs verás que queda un código más simple y con menos condiciones. Además los else-if se suelen encadenar como te muestro acontinuación pues es más fácil de leer y ahorran llaves:
if(nota < 0){
printf("La nota es menor que 0. Intervalo: (-inf,0)"); } else if(nota < 5){ // Si llegamos a este else, la condicion anterior es falsa por lo tanto ya sabemos que el numero es >= 0. No hay que comprobarlo otra vez
printf("La nota esta entre 0 y 5 sin llegar al 5. Intervalo: [0,5)"); } else if(nota < 7){ // Si llegamos aqui ya sabemos que nota >= 0 por el primer if y que nota >= 5 por el segundo. No hay que comprobarlo.
printf("La nota esta entre 5 y 7 sin llegar al 7. Intervalo: [5,7)"); } else if(nota < 9){ // Igual que antes. Ya sabemos que la nota es >= 7.
printf("La nota esta entre 7 y 9 sin llegar al 9. Intervalo: [7,9)"); } else if(nota < 10){ // Ya sabemos que la nota es >= 9
printf("La nota esta entre 9 y 10 sin llegar al 10. Intervalo: [9,10)"); } else if(nota == 10){
} else { // Igual que antes si ninguno de los ifs anteriores se han cumplido, ya sabemos que la nota es > 10
printf("La nota es mayor que 10. Intervalo: (10, +infinito)"); }
Si has utilizado los intervalos de matemáticas puedes ver la diferencia de usar intervalo abierto o cerrado. En la mitad abierta (con paréntesis) no se incluye ese valor pero en la cerrada (con corchetes), sí. Ese matiz es la diferencia entre usar el < / > o el <= / >=.
Además suele quedar un poco feo eso de que el código se vaya tanto hacia el centro y cuando los bloques (condicionales, bucles,...) están formados por una única línea en su interior se pueden omitir las llaves. Muchas veces lo verás así:
if(nota < 0)
printf("La nota es menor que 0"); else if(nota < 5)
printf("La nota esta entre 0 y 5"); else if(nota < 7)
printf("La nota esta entre 5 y 7"); //...
PD: Por otra parte, muy bien usado el getchar() al final para hacer una pausa en vez de utilizar getch() o system("pause").