[C con Clase] alguien me puede ayudar?

Steven Davidson steven en conclase.net
Jue Jun 7 19:18:50 CEST 2007


Hola Fabio,

El pasado 2007-06-07 10:44:45, fabio escribió:

f> por favor alguien me puede decir porque se ejecuta una sola vez este programa, es decir el ciclo "do -while" no se ejecuta hasta que el usuario ingresa el "n" para no seguir calculando potencias. pasa que calcula una poencia, luego sale la pregunta de si quiero calcular mas pero a continuacion esta la leyenda de "apriete una tecla para continuar" que corresponde al system("pause") creo yo, y a apretar una tecla la pantalla de ejecucion se sierra inmediatamente. muchas gracias.

Sergio te ha contestado correctamente a la razón del problema que estás teniendo. Quiero agregar a lo que ha dicho.

Después de leer los números de coma flotante, 'x' y 'n', el búfer del teclado contiene el carácter de fin-de-línea, '\n', producido al presionar la tecla [ENTER]. Cuando llegamos a leer el siguiente carácter, 'cont', el programa se encuentra con que el búfer no está vacía, y por tanto no pide caracteres al usuario. Se extrae y se guarda este carácter en el búfer a la variable 'cont'.

La solución es extraer este carácter de fin-de-línea para vaciar el búfer del teclado y así podemos forzar a 'scanf()' a pedir caracteres al usuario. Por ejemplo,

scanf( "%f",&n );
getchar();  /* Extraer '\n' */
exponente( x, n );
printf( "\n calcula otra potencia?, s/n: " );
scanf( "%c", &cont);

Obviamente, la solución anterior funcionará correctamente si el usuario no escribe más de un carácter para 'cont'. Si esto ocurre, entonces no conseguimos mucho con extraer el siguiente carácter. Para ello, sugiero crear una cadena de caracteres auxiliar para sacar cuantos caracteres podamos. Por ejemplo,

char aux[1024]="";
...
scanf( "%f",&n );
fgets( aux, 1024, stdin );  /* Extraer 1024 caracteres */
exponente( x, n );
printf( "\n calcula otra potencia?, s/n: " );
scanf( "%c", &cont);

Bajo ciertas bibliotecas, como las de Borland y Microsoft, puedes usar 'fflush()' para canales (o streams, en inglés) de entrada. Por norma, esto no es posible, pero algunas bibliotecas extienden el comportamiento estándar. Puedes probar escribiendo:

scanf( "%f",&n );
fflush( stdin );  /* Extraer todos los caracteres en el búfer del teclado*/
exponente( x, n );
printf( "\n calcula otra potencia?, s/n: " );
scanf( "%c", &cont);


De paso, quiero matizar sobre el código que nos has enviado:
1. La función 'main()' debe retornar un número entero de tipo 'int'. Por lo tanto, la definición debe ser:

int main()
{
...
}

2. Por convenio, 'main()' retorna 0 (cero) para indicar que el programa ha terminado correctamente. Esto es,

int main()
{
  ...
  return 0;
}

3. No es un error escribir el prototipo de una función dentro de un ámbito local, como por ejemplo dentro de otra función. Sin embargo, esto no es lo típico. Si no tienes una buena razón para localizar la función, sugiero declararla globalmente.

4. Supongo que estás probando algo al implementar la función 'exponente()'; posiblemente una tarea para alguna clase. Sólo quiero hacerte saber que <math.h> contiene la función estándar 'pow()' que hace justamente esto: elevar un número a la potencia de otro.


Espero haber aclarado las dudas.

Steven


Más información sobre la lista de distribución Cconclase