[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 »

Sigo opinando que 5 bucles son demasiados :lol: Y mucho más teniendo bucles anidados (un bucle dentro de otro). No necesitas anidar bucles para nada.
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 »

Pos no se como reducir esos 5 bucles porque para escribir los numeros en la pantalla tengo que recorrerlos por separado para escribir cosas por el medio...
Alguna pista? :oops:
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 »

Primero céntrate en el bucle anidado. ¿Realmente lo necesitas?
Imagen

Avatar de Usuario
~Rdavid~
Experto
Experto
Mensajes: 965
Registrado: 12 Nov 2009, 17:29
Ubicación: Costa Rica

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

Mensaje por ~Rdavid~ »

Se pone difícil la cosa :lol: , bueno e conseguido hacer los primeros dos aunque en el segundo no e podido hacer lo de la posición aunque creo que estoy cera xD pero un tip o pista no me vendría mal xD, veré si puedo poner los demás más tarde :oki:

Primero.

Spoiler:

Código: Seleccionar todo

#include <stdio.h>

int main(int argc, char* argv[])
{
   int i=0, j = 0, k = 0;

   int pares[10];   
   int impares[10];

   //Rellenamos cada array dependiendo si es par o no
   while(i<19)
   {
      pares[j++]=i;
      impares[k++]=i+1;
      i+=2;
   }
   
  //Imprimimos los pares e impares aunque se podría hacer por separado para que se vea mejor.
   for (i=0; i<10; i++)
   {
      printf("Par %d\n", pares[i]);
      printf("impar %d\n", impares[i]);
   }
  return 0;
}


El Segundo.

Spoiler:

Código: Seleccionar todo

#include <stdio.h>
#include <time.h>

int main(int argc, char *argv[])
{
  int mayor=0, menor=50, i, x=0, cmoda=0, con=0,k,moda;
  float media;
  int num[50];
 
  //Iniciamos la función para randomizar
  srand(time(NULL));
 
 
  //Trabajamos el array para obtener mayor, menor, media y moda
  for(i=0;i<50;i++)
  {
    num[x++]=(rand()%50);
    media += num[i];
    printf("%d\n", num[i]);
   
   
    //Con esto obtenemos el mayor y el menor
    if(mayor < num[i])
      mayor=num[i];
    if(menor > num[i])
      menor=num[i];
   
   
    //Comparamos el vector randomizado con uno normal para ver cuantos numeros se repiten
    //Si se repiten con aumenten en 1 cada vez
    con=0;
    for(k=0;k<50;k++)
    {
      if(i!=k && num[i]==num[k])
        con++;
     
      if(con>cmoda)
      {
        moda=num[i];
        cmoda=con;
      }
    }
  }
 
  //Si la moda es mayor que 1 muestra la moda si no es porque no hay 
  if(moda>1)
    printf("\n\nEl número que más se repite es %d y se repite %d veces\n",moda,cmoda+1);   
  else
    printf("No hay moda\n");   
   
  printf("El número mayor es %d\n", mayor);
  printf("El número menor es %d\n", menor);
  printf("La media es %.2f\n", media/= 50);
 
  return 0;
}

Imagen

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 »

~Rdavid~ escribió:Primero.

Nada que objetar. Felicidades por el formato :oki:

~Rdavid~ escribió:El Segundo.

Veo que calculas las variables en el mismo bucle de inicialización del vector. Hazlo de forma que primero inicialices el vector y luego lo recorras (2 bucles). Esto es mejor ya que te acostumbras a que te llegue una entrada de datos ya preparada. Y dedícale un poco de tiempo, verás que no es tan difícil.
Imagen

Avatar de Usuario
~Rdavid~
Experto
Experto
Mensajes: 965
Registrado: 12 Nov 2009, 17:29
Ubicación: Costa Rica

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

Mensaje por ~Rdavid~ »

E logrado terminar los ejercicios de esta parte :oki: , como el 3 es como el 2 mejor arreglo lo que comentas en el 3 de una vez.

Tercero.

Spoiler:

Código: Seleccionar todo

#include <stdio.h>
#include <time.h>

int main(int argc, char *argv[])
{
  int mayor=0, menor=50, i, x=0, cmoda=0, con=0,k,moda,y=0,ord,z,posmay,posmen,posmoda;
  float media;
  int num[50];
 
 
  //Iniciamos la función para randomizar
  srand(time(NULL));
 
 
  //Trabajamos el array para obtener mayor, menor, media y moda
  for(i=0;i<50;i++)
  {
    num[x++]=(rand()%50);
    if(i==25)
     printf("\n");
     
    printf("%.2d ", num[i]);
   
  } 
   
  for(i=0;i<50;i++)
  { 
 
    media += num[i];
       
    //Con esto obtenemos el mayor y el menor
    if(mayor < num[i])
    {
      posmay=i+1;
      mayor=num[i];
    }
    if(menor > num[i])
    {
      posmen=i+1;
      menor=num[i];
    }
     
    //Comparamos el vector randomizado con uno normal para ver cuantos numeros se repiten
    //Si se repiten con aumenten en 1 cada vez
    con=0;
    for(k=0;k<50;k++)
    {
      if(i!=k && num[i]==num[k])
        con++;   
      if(con>cmoda)
      {
        moda=num[i];
        posmoda=i+1;
        cmoda=con;
      }
    }
   
  }
 
 
  //Ordenamiento por metodo burbuja de mayor a menor
  for (i=0; i<50-1; i++)
  {
    for (z=i+1; z<50; z++)
    {
      if (num[i] < num[z])
      {
        ord = num[i];
        num[i] = num[z];
        num[z] = ord;   
      }
    }
  }
 
  //Lo imprimimos
  printf("\nOrdenado de mayor a menor\n");
  for(i=0;i<50;i++)
  {
    printf("%.2d ",num[i]);
    if(i==24)
      printf("\n");
  }
 
  //Ahora de menor a mayor 
  for (i=0; i<50-1; i++)
  {
    for (z=i+1; z<50; z++)
    {
      if (num[i] > num[z])
      {
        ord = num[i];
        num[i] = num[z];
        num[z] = ord;     
      }
    }
  }
 
  printf("\nOrdenado de menor a mayor\n");
  for(i=0;i<50;i++)
  {
    printf("%.2d ",num[i]);
    if(i==24)
      printf("\n");
  }
 
 
  if(moda>1)
    printf("\n\nEl número que más se repite es %d, se repite %d veces y comienza desde la posición %d\n",moda,cmoda+1,posmoda);   
  else
    printf("\n\nNo hay moda\n");   
   
  printf("El número mayor es %d y esta en la posición %d\n", mayor,posmay);
  printf("El número menor es %d y esta en la posición %d\n", menor, posmen);
  printf("La media es %.2f\n", media/= 50);
   
  return 0;
}



Cuarto.

Spoiler:

Código: Seleccionar todo

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//Escribimos el struct con sus respectivas varliables
typedef struct entrada
{
  char nombre[50];
  int numero[8];
  int veces;
}Entrada;


int main(int argc, char *argv[])
{
  int salir=1, opc, id, id2, id3, entlibres=20;
  Entrada agenda[20]; 
 
  for(id=0;id<20;id++)
  {
    agenda[id].veces =-1;
  }
 
 
  //Iniciamos el menú
  do
  {
    system("clear");
    printf("         Menu\n\n");
    printf("Escoge una de las siguientes opciones\n\n");
    printf("Presiona 1 si quieres añadir una entrada, libres[%d]\n", entlibres);
    printf("Presiona 2 si quieres editar una entrada\n");
    printf("Presiona 3 si quieres borrar una entrada\n");
    printf("Presiona 4 si quieres salir\n");
    scanf("%d", &opc);
   
    //Error por si no se escoge una opción
    while(opc!=1 && opc!=2 && opc!=3 && opc!=4)
    {
      printf("No escogiste ninguna de la opciones, vuleve a escoger,\n");
      scanf("%d", &opc);
    }
   
    //Switch con cada función del menú
    switch(opc)
    {
      //Si hay espacios libres modifica las variables y resta un espacio libre
      case 1:
          if(entlibres==0)
          {
            printf("No quedan espacion libres.\n");
            printf("Presiona enter para regresar al menú\n");
            system("read foo");
          }
          else
          {
            id=0;
            while (agenda[id].veces != -1)
            id++;
            printf("Escribe el nombre: ");
            scanf("%s", &agenda[id].nombre);
            printf("Escribe el número de telefono de 8 dígitos: ");
            scanf("%d", &agenda[id].numero);
            agenda[id].veces =0;
            printf("ID: %d registrado\n", id);
            entlibres--;
            printf("Presiona enter para regresar el menú\n");
            system("read foo");
          }
          break;
      //modifica las variables si puso bien el id
      case 2:
          printf("Escoge una de las siguientes ID's a editar:\n");
          for(id=0;id<20;id++)
          {
            if(agenda[id].veces != -1)
            printf("%d ", id);
          }
          printf("ID a escoger: ");
          scanf("%d", &id2);
          while(id2<0 || id2>19 || agenda[id2].veces<0)
          {
            printf("ID incorrecta\n");
            printf("Vulve a escirbir la ID: ");
            scanf("%d", &id2);
          }
         
          printf("Escriba el nombre nuevo: ");
          scanf("%s", &agenda[id2].nombre);
          printf("Escribe el número de telefono nuevo de 8 dígitos: ");
          scanf("%d", &agenda[id2].numero);
          agenda[id2].veces++;
          printf("Presiona enter para regresar el menu\n");
          system("read foo");
          break;
      //Borra un id y suma una entrada más
      case 3:
          printf("Escoge una de las siguientes ID's a borrar:\n");
          for(id=0;id<20;id++)
          {
            if(agenda[id].veces != -1)
            printf("%d ", id);
          }
          printf("ID a escoger: ");
          scanf("%d", &id3);
          while(id3<0 || id3>19 || agenda[id3].veces<0)
          {
            printf("ID incorrecta\n");
            printf("Vulve a escirbir la ID: ");
            scanf("%d", &id3);
          }
          printf("ID borrado\n");
          printf("Fue accedido %d veces\n", agenda[id3].veces);
          entlibres++;
          agenda[id3].veces = -1;
          printf("Presiona enter para regresar el menu\n");
          system("read foo");
          break;
       case 4:
           salir=0;
           break;
      default:
          break;
    }
  } 
  while(salir==1);
  printf("Agenda terminada\n");
  return 0;
}


Ya solo me queda una parte más. :D

saludos :oki:
Imagen

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 »

Vamos con ello

~Rdavid~ escribió:Tercero.

Código: Seleccionar todo

    if(mayor < num[i])
    {
      posmay=i+1;
      mayor=num[i];
    }

¿posmay=i+1? :? Lo que tienes que guardar es la posición en el vector, no la posición visual :lol: Lo mismo te digo para el menor.

Código: Seleccionar todo

    for(k=0;k<50;k++)
    {
      if(i!=k && num[i]==num[k])
        con++;   
      if(con>cmoda)
      {
        moda=num[i];
        posmoda=i+1;
        cmoda=con;
      }
    }

Hmmm... mal. Estás recorriendo el vector demasiadas veces (muchísimas). Con una vez vas más que sobrao. Lo mismo te digo con respecto a los bucles de ordenación: todo lo puedes calcular y a la vez ordenar el vector en una sola pasada de bucle. Revisa a ver si puedes hacerlo.

~Rdavid~ escribió:Cuarto.

Te hago un par de comentarios generales y vamos a lo concreto:

  • Prueba a crear un struct de la agenda completa. Obviamente este struct nuevo contendrá elementos entrada.
  • Puedes saber qué posición está vacía de antemano sin tener que recorrer la agenda a cada vez.
  • Un while puede comprobar varias condiciones a la vez. No lo olvides nunca ;)

Código: Seleccionar todo

int veces;

Te sobra. Intenta hallar cómo hacerlo sin esto.

Código: Seleccionar todo

while(opc!=1 && opc!=2 && opc!=3 && opc!=4)

¿Y si hay 100 opciones? :roll: Encuentra una forma más limpia de escribir esto. Sólo necesitas 2 condiciones para cualquier cantidad de números consecutivos.

Código: Seleccionar todo

    scanf("%d", &opc);
   
    //Error por si no se escoge una opción
    while(opc!=1 && opc!=2 && opc!=3 && opc!=4)
    {
      printf("No escogiste ninguna de la opciones, vuleve a escoger,\n");
      scanf("%d", &opc);
    }

¿Para qué scanf 2 veces? Se te ocurre cómo modificar el bucle para incluir el scanf una sola vez?

Código: Seleccionar todo

while (agenda[id].veces != -1)
id++;

Formatea el código y usa {} siempre.

Código: Seleccionar todo

scanf("%d", &id2);

No necesitas id2, puedes usar el mismo id. En todo caso, pon nombres más descriptivos a estas variables, aunque resulte más pesados escribirlas enteras. Es el dilema del programador :mrgreen: Lo mismo te digo para scanf("%d", &id3);.

Código: Seleccionar todo

default:
          break;

Esto no hace nada, por tanto te sobra. Ten en cuenta que este default te puede evitar el tener que comprobar la opción introducida anteriormente. Por tanto o bien lo compruebas antes, o lo compruebas aquí.
Imagen

Avatar de Usuario
~Rdavid~
Experto
Experto
Mensajes: 965
Registrado: 12 Nov 2009, 17:29
Ubicación: Costa Rica

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

Mensaje por ~Rdavid~ »

Intentaré arreglar todo lo que me has comentado apenas pueda, gracias :oki:
Imagen

Avatar de Usuario
Dante
Enteradillo
Enteradillo
Mensajes: 42
Registrado: 28 May 2010, 01:51

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

Mensaje por Dante »

Ya tenia rato de no ponerme a programar, por ahora solo hice el numero 4. Mañana me pongo a hacer los demas.
Spoiler:

Código: Seleccionar todo

#include <stdio.h>
#include <string.h>

struct
{
   char nombre[80];
   int numero;
   
} datoscont[20];

int main (int argc, char* argv[])
{
   int puesto = 1, menu;
   int fullcontactos = 0;
   int activo = 1;

        printf("Buen dia, ¿que desea hacer?\n");
        printf("Seleccione una opcion.\n");

        while(activo == 1)
        {   
          printf("1.-Agregar conctacto nuevo.\n");
          printf("2.-Ver contacto.\n");
          printf("3.-Modificar conctacto.\n");
          printf("4.-Eliminar conctacto.\n");
          printf("5.-Salir\n");
          scanf("%d", &menu);


          switch(menu)
          {
           case 1: if(fullcontactos < 20)
                 {
                   printf("Introduce el nombre del conctacto: ");
                   scanf("%s", &datoscont[puesto].nombre);
                        printf("\nIntrodusca numero telefonico: ");
                        scanf("%d", &datoscont[puesto].numero);
                        printf("\nConctacto numero: %d\n", puesto);
                        fullcontactos++;
                        puesto++;
                  }   
                      else
                 {
                       printf("\nNo hay espacios disponibles, necesitara borrar alguno.");
                 }
                      break;

       case 2: printf("Introduce el numero de conctaco a cosultar: ");
             scanf("%d", &puesto);
                  printf("Nombre de conctacto:%s\nTel.%d\n\n", datoscont[puesto].nombre, datoscont[puesto].numero);
             break;

        case 3: printf("Numero de conctacto que desea editar: ");
              scanf("%d", &puesto);
                   printf("\nNuevo nombre de conctacto: ");
                   scanf("%s", &datoscont[puesto].nombre);
                   printf("\nNuevo numero telefonico: ");
                   scanf("%d", &datoscont[puesto].numero);
                   break;
   
        case 4: printf("Numero de conctacto que desea eliminar: ");
              scanf("%d", &puesto);
                   strcpy(datoscont[puesto].nombre, "");   
                   datoscont[puesto].numero = 0;
                   printf("\nNumero borrado.\n");
                   fullcontactos--;
                   break;
   

        case 5: printf("Aplicacion terminada.\n");
              activo = 0;
                   break;

        default: printf("\"ERROR\"opcion no valida.\n");
         }
}
return 0;
}

Perdón por el formato, lo trato de acomodar pero al momento de enviar se me desacomoda, esta es la primera vez que me pasa.

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 »

Dante escribió:por ahora solo hice el numero 4. Mañana me pongo a hacer los demas.

Veamos :)

Dante escribió:struct
{
char nombre[80];
int numero;

} datoscont[20];

Esto está mal programado. Estás declarando este array como global. Decláralo dentro de main, pero defínelo fuera de ella :mrgreen: Usa typedef

Dante escribió:while(activo == 1)

¿De verdad necesitas comparar esto en la primera entrada al bucle? ¿O es mejor un do...while? ;)

Dante escribió:menu

Este nombre de variable es un poco confuso. Prueba con algo más claro.

Dante escribió:int puesto = 1

Los vectores empiezan en 0, no en 1.

Dante escribió:int fullcontactos = 0;

¿Para qué quieres esta variable?

También tu agenda tiene un bug, ya que si rellenas toda la agenda y luego borras un contacto que no esté al final, al introducir uno nuevo, simplemente ni aparecerá, ya que lo escribirías fuera de la memoria de tu programa, corrompiendo tu programa, otros o a saber el qué :adora: Esto te lo digo sin haberlo probado, pero puedes probarlo y ver lo que te estoy diciendo. Intenta corregir este comportamiento ;)
Imagen

Responder