Re: [Curso] Introducción a la programación en C (X)
Publicado: 19 Abr 2010, 14:29
por m0skit0
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.
Re: [Curso] Introducción a la programación en C (X)
Publicado: 19 Abr 2010, 16:44
por dRoLl3R
Yo creo que hay que recorrerlos varias veces. Me explico:
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
Re: [Curso] Introducción a la programación en C (X)
Publicado: 19 Abr 2010, 23:00
por m0skit0
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.
Re: [Curso] Introducción a la programación en C (X)
Publicado: 05 May 2010, 16:31
por dRoLl3R
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
Re: [Curso] Introducción a la programación en C (X)
Publicado: 05 May 2010, 16:50
por m0skit0
Digo lo mismo que antes: recorres demasiadas veces el vector.
En cuanto a la duda del formato de printf(), como buen ejercicio te aconsejo que te mires la documentación de printf()
Re: [Curso] Introducción a la programación en C (X)
Publicado: 05 May 2010, 16:56
por dRoLl3R
¿Qué documentación?
Re: [Curso] Introducción a la programación en C (X)
Publicado: 05 May 2010, 17:04
por m0skit0
man 3 printf
Re: [Curso] Introducción a la programación en C (X)
Publicado: 05 May 2010, 17:16
por dRoLl3R
Bueno eso ya lo se hacer poniendo %02d o %.2d en el printf() para que tenga dos cifras gracias moski
Pero lo de reducir los vectores no lo veo...
Re: [Curso] Introducción a la programación en C (X)
Publicado: 05 May 2010, 17:40
por m0skit0
No es reducir los vectores, es calcular todo lo que puedas en un mismo recorrido del bucle.
Re: [Curso] Introducción a la programación en C (X)
Publicado: 06 May 2010, 16:59
por dRoLl3R
Lo había entendido pero me expresé mal xD Ya lo miraré con paciencia ...
-- Doble Post --
He quitado vectores hasta dejar solo los que son imprescindibles para representar vectores en los printf(). Espero que ahora este bien....
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]); } }