Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: ++c en 28 Abril 2014, 21:47 pm



Título: duda ejercicio, empezando con C
Publicado por: ++c en 28 Abril 2014, 21:47 pm
Hola que tal,

acabo de empezar a programar en C y he realizado el siguiente ejercicio:

Programa que calcula e imprima el promedio de varios enteros. Suponga que el último valor que lee la instrucción scanf es el valor 9999.

Código:
 
#include <stdio.h>

int main(){
    int contador=1,suma=0,x;
    float promedio=0.0;

    do{


            printf("\nDame un numero, introduce 9999 para salir: ");
            scanf("%d",&x);
            if(x==9999){
                break;
            }
            else{

                suma=suma+x;
                promedio=(float)suma/contador;
                contador++;

            }

    }
    while(x!=9999);
    printf("\n\nEl promedio total es: %f",promedio);
    return 0;
}

Me gustaría conocer como romper adecuadamente el programa si el primer dígito es 9999 sin mostrar el mensaje " El promedio total es 0.0 "

Cualquier indicación para programar más eficientemente se lo agradecería.

Muchas gracias


Título: Re: duda ejercicio, empezando con C
Publicado por: vangodp en 28 Abril 2014, 21:59 pm
si lo que quieres es detenerlo por completo pon un return 0; en vez de break; :D


Título: Re: duda ejercicio, empezando con C
Publicado por: leosansan en 29 Abril 2014, 00:28 am

Algo como esto:
Código
  1. .................
  2. }while(x!=9999);
  3.    if (contador!=1)
  4.      printf("\n\nEl promedio total es: %f",promedio);
  5.    return 0;
  6. }


¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: duda ejercicio, empezando con C
Publicado por: rir3760 en 29 Abril 2014, 02:06 am
Me gustaría conocer como romper adecuadamente el programa si el primer dígito es 9999 sin mostrar el mensaje " El promedio total es 0.0 "

Cualquier indicación para programar más eficientemente se lo agradecería.
No tienes porque calcular el promedio en cada iteración del bucle, en su lugar debes calcularlo después de este y la condición de salida "x != 9999" nunca se alcanza (si el valor introducido es 9999 el bucle termina antes con la sentencia "break;").

Ademas la variable "contador" no refleja el numero de valores introducidos: si el primero es el valor de salida 9999 su valor es uno (el inicial) cuando debería ser cero. Por ultimo la variable "promedio" no es necesaria ya que lo unico que haces con el promedio es imprimirlo.

Si realizamos los cambios (mas algunos otros menores) el programa termina asi:
Código
  1. #include <stdio.h>
  2.  
  3. int main(void)
  4. {
  5.   int contador = 0, suma = 0, x;
  6.  
  7.   while (1){
  8.      printf("Dame un numero, introduce 9999 para salir: ");
  9.      fflush(stdout);
  10.      if (scanf("%d",&x) != 1 || x == 9999)
  11.         break;
  12.      else {
  13.         suma += x;
  14.         contador++;
  15.      }
  16.   }
  17.  
  18.   /*
  19.    ** Si el numero de valores (contador) es diferente de cero:
  20.    **    Calcular el promedio e imprimirlo en la salida estandar
  21.    */
  22.  
  23.   return 0;
  24. }

Un saludo


Título: Re: duda ejercicio, empezando con C
Publicado por: ++c en 1 Mayo 2014, 00:23 am
Hola,

muchas gracias por contestar a vangodp, leosansan y a rir3760.

Unas dudas:

- Para el código de leosansan:

                      
Código
  1. if (contador!=1)

No entiendo bien el porque, ¿no sería contador !=0 para que realizara el promedio?

- Para el código de rir3760

          
Código:
if (scanf("%d",&x) != 1 || x == 9999)

No entiendo !=1, si se refiere a comparar el valor del while con la lectura por teclado...

Se me pasaba dejo el código entero con la modificación aplicada de rir3760

Código:
#include <stdio.h>

    int main(void)
    {
      int contador = 0, suma = 0, x;

      while (1){
         printf("Dame un numero, introduce 9999 para salir: ");
         fflush(stdout);
         if (scanf("%d",&x) != 1 || x == 9999)
            break;
         else {
            suma += x;
            contador++;
         }
      }
      if(contador!=0){
        printf("\nEl promedio de la operacion es: %f", (float)suma/contador);
      }
      return 0;
    }

Muchas gracias, he aprendido varios puntos muy interesantes y la facilidad y soltura de programación que mostráis.

Saludos!!


Título: Re: duda ejercicio, empezando con C
Publicado por: vangodp en 1 Mayo 2014, 00:45 am
si le pasas el entero correctamente la funcion scanf() te devuelve 1 asi que si scanf() no es 1 el bucle scaput XDDD
o sea esto:if (scanf("%d",&x) != 1 || x == 9999)

quiere decir: el bucle se rompe si scanf no es 1 o si x es igual a 9999 =D

prueba esto XDD

    int n1;
    int n = scanf ( "%d", &n1 );
   
    printf("%d", n);

si le pasar un int te va imprimir 1 pero si le intanteas pasar una letra te va devolver 0, magia del scanf XDD

saludos!!


Título: Re: duda ejercicio, empezando con C
Publicado por: leosansan en 1 Mayo 2014, 00:55 am

Pero que tenga en cuenta que si le pasa "12as" va a tomar como valor válido "12".

Habría que plamtear una validación de enteros más amplia.


¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)





Título: Re: duda ejercicio, empezando con C
Publicado por: ++c en 1 Mayo 2014, 14:10 pm
Espléndido!!  ;-) Que pasada conocer estos detalles de estas funciones, supongo que más adelante conoceré el poder de printf y scanf más a fondo, pero me alegro de ver un ejemplo tan práctico para adelantar y afianzar mejor conocimientos.

Gracias vangodp por colocarme ese ejemplo y a leosansan por indagar cuando me corresponda una validación de enteros como comentas más amplia  ;D

Saludos!!


Título: Re: duda ejercicio, empezando con C
Publicado por: vangodp en 1 Mayo 2014, 16:06 pm
Tu piensas que muchas de las funciones pueden retornar valores para simplemente hacer comprobaciones.
Lo mejor es que las conozcas bien a todas las funciones que sueles utilizar ;)

Esta es una muy buena pagina para eso.
http://www.cplusplus.com/reference/
Y esta no se queda atrás
http://en.cppreference.com/w/
esta ultima la puedes poner en español en la parte de abajo de la pagina XD
Suerte ;)