Dudas de programa en C

Iniciado por Orb, 12 Enero 2016, 18:39 PM

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

Orb

Buenas
Estaba haciendo un ejercicio en C cuyo enunciado es elaborar un programa que encuentre el valor mayor y menor de la suma de 10 numeros enteros introducidos por teclado.
Esto es lo que he hecho ;
#include <stdio.h>
int main(void){
int datos[10];
int cantidad_datos=10;
int i;
int mayor=0;
int menor;
int suma;
for(i= 0 ; i < cantidad_datos ; i++){
printf("\nIntroduzca el valor del número #%i\n", i+1);
scanf("%d", &datos[i]);
}
for(i=0 ; i <cantidad_datos ; i++){
if(datos[i] > mayor)
mayor= datos[i];
}
printf("\nEl valor máximo es %d\n", mayor);
for(i=0 ; i<cantidad_datos ; i++){
if(datos[i] < menor)
menor = datos[i];
}
printf("\nEl valor mínimo es %d\n", menor);

}


Es un código bastante sucio pero no me lo toméis en cuenta que estoy empezando.
Mi primera duda es como sumar todos los elementos del vector.Probé haciendo esto :
int suma;
suma= datos[1]+datos[2]+.... etc etc
pero no funcionó, podría hacerse con un for?
Y mi otra duda sería como optimizar el código con funciones.Es decir que hallar el mínimo lo haga una función llamada minimo(), el maximo otra llamada maximo()..
Para que esto fuera posible que debería hacer, al declarar la función pasar como parámetros esos valores y luego retornarlos al llamar la función?
Es decir algo como
int maximo(int mayor)
y luego hacer la llamada así?
maximo(mayor2)
o directamente no harían falta parámetros en la función?
No sé si me explico, a ver si alguien puede ayudarme

NowhereMan

Yo sugiero que lo hagas ordenando todos tus valores (ya sea de mayor a menor o de menor a mayor) y asi simplemente seleccionas el numero, que deseas, el metodo mas sencillo a mi parecer es el metodo de la burbuja, que puedes hacer con un simple for

MAFUS

Unas cuantas cosas:
menor no está inicializado, si es menor que cualquier número que entres el programa te dará datos falsos.

En este caso no te hace falta ningún array. Cada vez que se ingrese un dato por teclado se puede ver si es mayor o menor que los que tienes guardados y además puedes ir sumando el resultado final.

Sí, puedes realizar funciones que te devuelvan el mayor/menor. Para ello le pasas los dos valores a comparar y que te devuelva el mayor/menor de los dos. En internet hay muchos ejemplos de esto pero se realizan con macros ya que son más rápidas e igualmente clarifican el código.

Orb

#3
Buenas, gracias por responder.
He buscado acerca del método mencionado el de la burbuja, aunque sin mucho éxito.
Mafus, la variable menor no esta inicializada pero de momento funciona, me devuelve el valor menor.¿Por qué es tan importante inicializar?
Y al ser 10 datos veía mejor un array que diez variables para guardar diez valores :!
Y lo de las macros primera vez que lo escucho jajajajaja

Un saludo!

Edito:Me he quedado bastante trabado ya que ayer la funcion para hallar el menor funcionaba perfectamente, ahora he ido a hacerlo y devuelve 0 , ya sea menor; o menor=0;
No sé si será por los datos que introducí ayer por teclado, si serán distintos a los de hoy, pero que mosqueo :huh:
Edit2: al final lo que hice fue inicializar menor en 999999999 , asi parece que va

Aprovecho para plantear otra cuestion,la suma la acabe haciendo con esto : suma= suma + datos porque si suma=suma + datos; no esta en la linea de codigo del for y el scanf , es decir si pongo esa linea al final en la ejecucion del programa me devuelve ese valor a 0?

Orb

Finalmente lo he conseguido.Se me olvido añadir que ademas de las funciones que mencione antes, habia que obtener la media de los datos mediante una funcion.Os dejo el codigo a ver si me podeis dar consejillos, cualquier critica es agradecida ;

#include <stdio.h>
void media(int sum){
int media;
media= sum/10;
printf("\nLa media de todos los valores introducidos es %d\n", media);
}
int main(void){
int datos[10];
int cantidad_datos=10;
int i;
int mayor=0;
int menor=9999999;
int suma=0;
for(i= 0 ; i < cantidad_datos ; i++){
printf("\nIntroduzca el valor del número #%i\n", i+1);
scanf("%d", &datos[i]);
suma= suma + datos[i];
}
for(i=0 ; i <cantidad_datos ; i++){
if(datos[i] > mayor)
mayor= datos[i];
}
for(i=0 ; i<cantidad_datos ; i++){
if(datos[i] < menor)
menor = datos[i];
}
printf("\nEl valor máximo es %d\n", mayor);
printf("\nEl valor mínimo es %d\n", menor);
printf("\nLa suma de todos los valores es %d\n", suma);
media(suma);

}

fary

    #include <stdio.h>

    void media(int sum){
int media;
media= sum/10;
printf("\nLa media de todos los valores introducidos es %d\n", media);
    }

    int main(void){
int datos[10];
int i;
int mayor=0;
int menor=9999999;
int suma=0;

for(i= 0 ; i < 10 ; i++){
printf("\nIntroduzca el valor del número #%i\n", i+1);
scanf("%d", &datos[i]);
suma += datos[i];
}

for(i=0 ; i < 10 ; i++){
if(datos[i] > mayor){
mayor = datos[i];
}
if(datos[i] < menor){
menor = datos[i];
}
}

printf("\nEl valor máximo es %d\n", mayor);
printf("\nEl valor mínimo es %d\n", menor);
printf("\nLa suma de todos los valores es %d\n", suma);
media(suma);
     
return 0;
    }


Sugerencias:

Que pongas el return, en el main... ya te lo he puesto yo en el arreglo del código pero tienes que acordarte de ponerlo si declaras una funcion que no sea de tipo void.

Identar el código, que no quede todo en plano ya que es imposible de leer.

Te he resumido el programa de 2 bucles innecesarios a 1 solo.

saludos.
Un byte a la izquierda.

Yoel Alejandro

#6
Disculpa Orb,

El mayor y el menor se inicializan al primer elemento del arreglo. Pues no puedes estar adivinando un número "inmensamente grande", o uno "inmensamente pequeño" (siempre habrá un número mayor o menor que otro). ¿Qué tal si el usuario pasa valores negativos?

mayor = datos[0];      /* <-- primer elemento */
menor = datos[0];      /* <-- primer elemento */
suma = 0;
for(i=1 ; i <cantidad_datos ; i++){      /* inicias el ciclo con el segundo elemento, y de ahi en adelante */
   if(datos[i] > mayor)
       mayor = datos[i];
   if(datos[i] < menos)
       menos = datos[i];
   suma = suma + datos[i];
}
promedio = suma / cantidad_datos;


y en este caso hemos reunido el cálculo de mayor, menor y suma en el mismo ciclo, de acuerdo a la sugerencia de fary
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

MAFUS

Dice Orb:
Citarhabia que obtener la media de los datos mediante una funcion

Por tanto la media no se debe obtener en el mismo cálculo.
Por otra parte, en caso de hacerlo todo en la misma función el usar un array sería malgastar memoria y tiempo de cálculo de la posición de elementos.