duda ejercicio, empezando con C

Iniciado por ++c, 28 Abril 2014, 21:47 PM

0 Miembros y 1 Visitante están viendo este tema.

++c

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.


#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

vangodp

si lo que quieres es detenerlo por completo pon un return 0; en vez de break; :D

leosansan


Algo como esto:
Código (cpp) [Seleccionar]
.................
}while(x!=9999);
    if (contador!=1)
      printf("\n\nEl promedio total es: %f",promedio);
    return 0;
}



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



rir3760

Cita de: ++c en 28 Abril 2014, 21:47 PMMe 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:
#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++;
      }
   }
   
   /*
   ** Si el numero de valores (contador) es diferente de cero:
   **    Calcular el promedio e imprimirlo en la salida estandar
   */
   
   return 0;
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

++c

#4
Hola,

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

Unas dudas:

- Para el código de leosansan:

                      if (contador!=1)

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

- Para el código de rir3760

          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


#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!!

vangodp

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!!

leosansan


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! ..... !!!!






++c

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!!

vangodp

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 ;)