| 
	
		|  Autor | Tema: duda ejercicio, empezando con C  (Leído 3,743 veces) |  
	| 
			| 
					
						| ++c 
								
								 Desconectado 
								Mensajes: 29
								
								
								
								
								
								   | 
 
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
 
 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| vangodp 
								 
								
								 Desconectado 
								Mensajes: 455
								
								   | 
 
si lo que quieres es detenerlo por completo pon un return 0; en vez de break;  
 
 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| leosansan 
								       
								
								 Desconectado 
								Mensajes: 1.314
								
								
								
								
								
								   | 
 
Algo como esto:.................}while(x!=9999);    if (contador!=1)      printf("\n\nEl promedio total es: %f",promedio);    return 0;}
 ¡¡¡¡ Saluditos! ..... !!!! |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| rir3760 
								       
								
								 Desconectado 
								Mensajes: 1.639
								
								
								
								
								
								   | 
 
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: #include <stdio.h> int main(void){   int contador = 0, suma = 0, x;    while (1){      printf("Dame un numero, introduce 9999 para salir: ");      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 |  
						| 
								|  |  
								|  |  En línea | 
 
 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 
								
								 Desconectado 
								Mensajes: 29
								
								
								
								
								
								   | 
 
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!! |  
						| 
								|  |  
								| « Última modificación:  1 Mayo 2014, 15:53 pm por simorg » |  En línea | 
 
 |  |  |  | 
			| 
					
						| vangodp 
								 
								
								 Desconectado 
								Mensajes: 455
								
								   | 
 
si le pasas el entero correctamente la funcion scanf() te devuelve 1 asi que si scanf() no es 1 el bucle scaput XDDDo 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!!
 
 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| leosansan 
								       
								
								 Desconectado 
								Mensajes: 1.314
								
								
								
								
								
								   | 
 
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! ..... !!!! |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| ++c 
								
								 Desconectado 
								Mensajes: 29
								
								
								
								
								
								   | 
 
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    Saludos!! |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| vangodp 
								 
								
								 Desconectado 
								Mensajes: 455
								
								   | 
 
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áshttp://en.cppreference.com/w/ esta ultima la puedes poner en español en la parte de abajo de la pagina XD Suerte   |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  |  |  
 
	
 
 
				
					
						| Mensajes similares |  
						|  | Asunto | Iniciado por | Respuestas | Vistas | Último mensaje |  
						|   |   | SOLUCIONADO ;Duda empezando con winsock
							« 1 2 » Programación Visual Basic
 | Littl3 | 15 | 7,218 |  6 Marzo 2008, 17:49 pm por Littl3
 |  
						|   |   | Duda en ejercicio++ Ejercicios
 | Lamarkus | 1 | 3,817 |  1 Diciembre 2010, 17:31 pm por [L]ord [R]NA
 |  
						|   |   | Empezando en C/C++ primera duda Programación C/C++
 | devKL | 8 | 3,778 |  11 Noviembre 2011, 03:44 am por devKL
 |  
						|   |   | buenas, estoy empezando en programacion en c++ y me pusieron un ejercicio Programación C/C++
 | syncblack | 2 | 2,580 |  19 Marzo 2014, 23:07 pm por leosansan
 |  
						|   |   | Duda: empezando con los exploits Bugs y Exploits
 | onfyah7 | 2 | 3,655 |  12 Febrero 2015, 03:40 am por onfyah7
 |    |