Página 4 de 7

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:
Spoiler:

Código: Seleccionar todo

int maxv[modamax];
int minv[modamin];
   
    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:

Código: Seleccionar todo

for (i=0;i<50;i++)
    {
        if (num[i] == max)
           modamax++;
        if (num[i] == min)
           modamin++;
    }
Para esto tengo que tener definido cual es el mayor y el menor que lo defino recorriendo todo el vector de este modo:

Código: Seleccionar todo

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

Código: Seleccionar todo

#include <stdio.h>

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];
    }
   
    media = media / 50;
   
    for (i=0;i<50;i++)
    {
        ordenmax[i] = 0;
        ordenmin[i] = 0;
        rep = 0;
       
        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.... :oki:
Spoiler:

Código: Seleccionar todo

#include <stdio.h>

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

    return 0;
}
PD: Que opinas??