[Curso] Introducción a la programación en C (X)

Moderadores: Kravenbcn, largeroliker, fidelcastro, cerealkiller, pspCaracas, m0skit0, LnD, ka69, zacky06

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: [Curso] Introducción a la programación en C (X)

Mensaje 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.
Imagen

Avatar de Usuario
dRoLl3R
Habitual
Habitual
Mensajes: 315
Registrado: 29 Sep 2009, 21:30
Ubicación: [ † ] Asturias

Re: [Curso] Introducción a la programación en C (X)

Mensaje 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 :?
PSP3ooo: 4.21 -> 5.00 -> 5.03 -> 5.03 GEN-A -> 5.03 M33 -> 5.03 MHU -> 5.03 GEN-C -> 5.03 MHU -> 6.20 PRO-B4

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: [Curso] Introducción a la programación en C (X)

Mensaje 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.
Imagen

Avatar de Usuario
dRoLl3R
Habitual
Habitual
Mensajes: 315
Registrado: 29 Sep 2009, 21:30
Ubicación: [ † ] Asturias

Re: [Curso] Introducción a la programación en C (X)

Mensaje 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
PSP3ooo: 4.21 -> 5.00 -> 5.03 -> 5.03 GEN-A -> 5.03 M33 -> 5.03 MHU -> 5.03 GEN-C -> 5.03 MHU -> 6.20 PRO-B4

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: [Curso] Introducción a la programación en C (X)

Mensaje 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() ;)
Imagen

Avatar de Usuario
dRoLl3R
Habitual
Habitual
Mensajes: 315
Registrado: 29 Sep 2009, 21:30
Ubicación: [ † ] Asturias

Re: [Curso] Introducción a la programación en C (X)

Mensaje por dRoLl3R »

¿Qué documentación?
PSP3ooo: 4.21 -> 5.00 -> 5.03 -> 5.03 GEN-A -> 5.03 M33 -> 5.03 MHU -> 5.03 GEN-C -> 5.03 MHU -> 6.20 PRO-B4

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: [Curso] Introducción a la programación en C (X)

Mensaje por m0skit0 »

man 3 printf
Imagen

Avatar de Usuario
dRoLl3R
Habitual
Habitual
Mensajes: 315
Registrado: 29 Sep 2009, 21:30
Ubicación: [ † ] Asturias

Re: [Curso] Introducción a la programación en C (X)

Mensaje 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... :(
PSP3ooo: 4.21 -> 5.00 -> 5.03 -> 5.03 GEN-A -> 5.03 M33 -> 5.03 MHU -> 5.03 GEN-C -> 5.03 MHU -> 6.20 PRO-B4

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: [Curso] Introducción a la programación en C (X)

Mensaje por m0skit0 »

No es reducir los vectores, es calcular todo lo que puedas en un mismo recorrido del bucle.
Imagen

Avatar de Usuario
dRoLl3R
Habitual
Habitual
Mensajes: 315
Registrado: 29 Sep 2009, 21:30
Ubicación: [ † ] Asturias

Re: [Curso] Introducción a la programación en C (X)

Mensaje 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??
PSP3ooo: 4.21 -> 5.00 -> 5.03 -> 5.03 GEN-A -> 5.03 M33 -> 5.03 MHU -> 5.03 GEN-C -> 5.03 MHU -> 6.20 PRO-B4

Responder