¡Buenas!
Enhorabuena por el codigo. Sigue asi. Solo te comentare algun detalle.
En C, las variables se declaran antes de cualquier otra sentencia del programa, por lo tanto, tendras que declararlas justo despues de la cabecera de las fuciones (en este caso al principio de main).
Y otro detalle, que funciona pero creo que tu intencion era otra, en las condiciones. Has puesto:
if (aa && bb != 0 && cc==0)
y expresiones similares.
Igual lo estoy interpretando mal y realmente querias poner esto, pero creo que tu intencion era decir que si aa y bb son distintos de cero y cc es igual a cero... En C y C++ tienes que poner cada condicion de forma explicita y utilizar parentesis para agruparlas. En este caso los parentesis dan igual, pero cuando utilices expresiones mas complejas que impliquen y y o logicos, tendras que tener en cuenta que el y tiene mayor precedencia que el o. Por lo tanto vete acostumbrandote, aunque te parezca que no es necesario, a utilizar parentesis, asi cuando empieces a manejar expresiones mas complicadas te ahorraras problemas. Bueno, la expresion quedaria asi:
if ((aa!=0 && bb != 0) && cc==0)
.
¿Poque funciona el codigo que has puesto? En C las expresiones logicas son valores enteros, cero es falso y no cero eas verdadero, por lo tanto, las expresiones siguientes son equivalentes:
if (aa != 0 && bb != 0 && cc==0)
if (aa && bb && !cc)
Ya que si aa != 0, tanto la expresion aa != 0 como solamente aa son verdad, la primera de dara 1, y la segunda sera un valor distinto de cero, por lo que ambas seran verdad. Si cc == 0, significa que cc a secas es falso (ya que cc es cero) por lo tanto ! transformara el cero en uno, por lo que !cc y c == 0, produciran como resultado verdadero.
Recuerda esto:
cero es falso.
no cero es verdadero.
! transforma cero en uno.
! transforma no cero en cero.
&& tiene mayor precedencia que ||
utiliza parentesis para agrupar las expresiones logicas, aunque te parezca que no hace falta, para obligar a que se evaluen en el orden correcto.
Un ejemplo de esto ultimo seria por ejemplo, decidir el color y la forma de un objeto. Imagina que tiene una propiedad color, y otra forma y quieres saber si el objeto es por ejemplo un cubo de color rojo o azul. Lo harias asi:
if((color == ROJO || color == AZUL) && forma == CUBO)
//...
Ya que si lo pones asi:
if(color == ROJO || color == AZUL && forma == CUBO)
//...
&& se evaluara antes que || por lo que realmente estarias evaluando:
if(color == ROJO || (color == AZUL && forma == CUBO))
//...
Ya ves que son detalles, el codigo en general esta bien, sigue trabajando que vas bien.
¡Saludos!