Al hacer
Estás perdiendo el valor que tenías en b, este valor lo necesitas porque pudiera ser tu segundo mayor. Fíjate haciendo la corrida al frío con 10, 20, 30 en ese orden. Una solución a tu problema sería que cuando un valor sea mayor al mayor, antes de asignar el nuevo mayor asignas el viejo como segundo mayor y en el caso de que el valor no sea mayor al mayor verificas si es mayor al segundo mayor y lo asignas.
Código (c) [Seleccionar]
if (a>b)
b=a;
Estás perdiendo el valor que tenías en b, este valor lo necesitas porque pudiera ser tu segundo mayor. Fíjate haciendo la corrida al frío con 10, 20, 30 en ese orden. Una solución a tu problema sería que cuando un valor sea mayor al mayor, antes de asignar el nuevo mayor asignas el viejo como segundo mayor y en el caso de que el valor no sea mayor al mayor verificas si es mayor al segundo mayor y lo asignas.