En general está bastante bien salvo eso que comentas. Pero lo que veo mal es que recorras el vector entero cada vez que quieres calcular algo cuando podrías recorrerlo una sola vez.
for (i=0;i<50;i++) { if (num[i] == max) maxv[a++] = i + 1; if (num[i] == min) minv[b++] = i + 1; }
Para esto necesito saber cual es el valor de modamax (veces que se repite el mayor) y de modamin (veces que se repite el menor) y para ello tengo que recorrer por separado el vector completo del siguiente modo:
for (i=0;i<50;i++) { media = media + num[i]; if (num[i] > max) max = num[i]; if (num[i] < min) min = num[i]; }
Yo creo que tal y como he escrito el programa tengo que recorrer el vector mas de una vez. Corrígeme si me equivoco que estoy aquí para aprender. Lo de la moda lo haré cuando tengo bastante tiempo para pensar que últimamente ando liado con los examenes
Bueno, es el eterno dilema código rápido vs consumo de memoria. Dado que este programa maneja cantidades muy pequeñas de memoria, deberías concentrarte más en la velocidad. Y sí es posible recorrerlo una sola vez si gastamos un poco más de memoria.
Moda: valor que más veces se repite en una muestra.
Después de estar ocupado unos cuantos días por examenes entre otras cosas aquí tengo el ejercicio 2 con la moda y un par de vectores menos y el ejercicio 3. Están los dos en el mismo
int main(int argc, char* argv[]) { int max = 0, min = 50, i = 0, modamax = 0, modamin = 0, a, b = 0, c = 0, d = 0, e = 0, rep, repmax = 0, moda; int num[50]; int ordenmax[50]; int ordenmin[50]; float media = 0;
srand(time(NULL));
while (i<50) num[i++] = (rand() % 50) + 1;
for (i=0;i<50;i++) { media = media + num[i]; if (num[i] > max) max = num[i]; if (num[i] < min) min = num[i]; }
if (num[i] == max) modamax++; if (num[i] == min) modamin++;
for (a=0;a!=50;a++) { if (num[a] == i) rep++; if (num[a] == (min + i)) ordenmax[i] = num[a]; if (num[a] == (max - i)) ordenmin[i] = num[a]; } if (rep >= repmax) { repmax = rep; moda = i; } }
a = 0;
int maxv[modamax]; int minv[modamin]; int modav[repmax];
printf("Los 50 numeros son:\n");
for (i=0;i<50;i++) { if (num[i] == max) maxv[a++] = i + 1; if (num[i] == min) minv[b++] = i + 1; if (num[i] == moda) modav[c++] = i + 1; if (ordenmax[i] != 0) d = d + 1; if (ordenmax[i] != 0) e = e + 1;
if (i == 25) printf("\n");
printf("%d ", num[i]); }
printf("\n\nLa media de los 50 numeros es %.2f.", media);
if (modamax != 1) { printf("\n\nEl numero mayor es el %d y se repite %d veces en las posiciones ", max, modamax); for (i=0;i<modamax;i++) { if (i < (modamax - 1)) printf("%d ", maxv[i]); else printf("y %d.", maxv[i]); } } else printf("\n\nEl numero mayor es el %d y se repite 1 vez en la posicion %d.", max, maxv[0]);
if (modamin != 1) { printf("\n\nEl numero menor es el %d y se repite %d veces en las posiciones ", min, modamin); for (i=0;i<modamin;i++) { if (i < (modamin - 1)) printf("%d ", minv[i]); else printf("y %d.", minv[i]); } } else printf("\n\nEl numero menor es el %d y se repite 1 vez en la posicion %d.", min, minv[0]);
printf("\n\nLa moda es el %d y se repite ", moda);
if (repmax == 1) printf("1 vez en la posicion %d.", modav[0]); else { printf("%d veces en las posiciones ", repmax);
for (i=0;i<repmax;i++) { if (i < (repmax - 1)) printf("%d ", modav[i]); else printf("y %d.", modav[i]); } }
printf("\n\nOrdenados de menor a mayor:\n");
a = 0;
for (i=0;i!=50;i++) if (ordenmax[i] != 0) { a = a + 1; printf("%d ", ordenmax[i]); if (a == (d/2)) printf("\n"); }
printf("\n\nOrdenados de mayor a menor:\n");
a = 0;
for (i=0;i!=50;i++) if (ordenmin[i] != 0) { a = a + 1; printf("%d ", ordenmin[i]); if (a == (e/2)) printf("\n"); }
return 0; }
A ver que dices profe
PD: Hay alguna manera de hacer que los números de una cifra ocupen dos?? Me explico con un ejemplo . Que el 1 sea 01. Sería para que quedara más estético
int main(int argc, char* argv[]) { int i, a, b = 0, c = 0, max = 50, min = 1, repmin = 0, repmax = 0, cont = 0, rep = 0, numModa = 0, repmoda = 0; int num[50]; int mayor[50]; int menor[50]; int maxv[50]; int minv[50]; int moda[50]; int modav[50]; float media = 0;
srand(time(NULL));
for (i=0;i!=50;i++) num[i] = (rand() % 50) + 1;
printf("Los 50 numeros son:\n"); for (i=0;i!=50;i++) { //Colocar en dos lineas los numeros desordenados if (i == 25) printf("\n");
printf("%.2d ", num[i]);
//Sumamos todos los numeros media = media + num[i];
//Guardamos dos vectores con con los numeros ordenados for (a=0;a!=50;a++) { //De menor a mayor if (num[a] == min + i) mayor[b++] = num[a]; //De mayor a menor if (num[a] == max - i) menor[c++] = num[a]; } }
media = media / 50; max = menor[0]; min = mayor[0]; b = 0; c = 0;
printf("\n\nOrdenados de menor a mayor:\n"); for (i=0;i!=50;i++) { //Calculamos el numero de repeticiones maximas. a = i; while (mayor[i] == mayor[a]) { cont++; if (cont > rep) rep = cont; a++; } cont = 0; //Posiciones del mayor if (num[i] == max) maxv[b++] = i + 1; //Posiciones del menor if (num[i] == min) minv[c++] = i + 1; //Repeticiones del menor if (num[i] == min) repmin = repmin + 1; //Repeticiones del mayor if (num[i] == max) repmax = repmax + 1; //Colocar en dos lineas los numeros ordenados if (i == 25) printf("\n");
printf("%.2d ", mayor[i]); }
printf("\n\nOrdenados de mayor a menor:\n"); for (i=0;i!=50;i++) { //Guardamos modas if (mayor[i] == mayor[i + (rep - 1)]) moda[numModa++] = mayor[i]; //Colocar en dos lineas los numeros ordenados if (i == 25) printf("\n");
printf("%.2d ", menor[i]); }
printf("\n\nLa media de los numeros es %.2f.", media); if (numModa == 1) printf("\n\nLa moda es el %.2d ", moda[0]); else printf("\n\nLas modas son ", rep);
for (i=0;i!=50;i++) { //Calculamos posiciones de la moda for (a=0;a!=numModa;a++) { if (num[i] == moda[a]) modav[repmoda++] = i + 1; //Numeros que son la moda if ((i == 0)&&(numModa!=1)) { if (a == (numModa - 1)) printf("y %.2d ", moda[a]); else if (a == (numModa - 2)) printf("%.2d ", moda[a]); else printf("%.2d, ", moda[a]); } } } printf("con %.2d repeticiones en las posiciones ", rep);
for (i=0;i!=repmoda;i++) { if (i == (repmoda - 1)) printf("y %.2d.", modav[i]); else if (i == (repmoda - 2)) printf("%.2d ", modav[i]); else printf("%.2d, ", modav[i]); }
if (repmax == 1) printf("\n\nEl mayor numero es el %.2d con 01 repeticion en la posicion %.2d.", max, maxv[0]); else { printf("\n\nEl mayor numero es el %.2d con %.2d repeticiones en las posiciones ", max, repmax); for (i=0;i<repmax;i++) { if (i == (repmax - 1)) printf("y %.2d.", maxv[i]); else if (i == (repmax - 2)) printf("%.2d ", maxv[i]); else printf("%.2d, ", maxv[i]); } }
if (repmin == 1) printf("\n\nEl menor numero es el %.2d con 01 repeticion en la posicion %.2d.", min, minv[0]); else { printf("\n\nEl menor numero es el %.2d con %.2d repeteciones en las posiciones ", min, repmin); for (i=0;i<repmin;i++) { if (i == (repmin - 1)) printf("y %.2d.", minv[i]); else if (i == (repmin - 2)) printf("%.2d ", minv[i]); else printf("%.2d, ", minv[i]); } }