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

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 (VIII)

Mensaje por m0skit0 »

Dark Pallacus escribió:El tercero me ha costado, eh!

Hablando de terceros... Está bien, pero

  • Ya que vas a comparar tantas veces la suma, crea una variable y asígnale la suma, luego simplemente compara esa variable. Así evitas tener que calcular la suma siempre (que hace que el programa vaya más lento). Por ejemplo en el while la suma se calcularía de nuevo por cada pase del bucle.
  • if (contador % 2 == 0) es una división por cada pase del bucle. Encuentra una forma mejor de hacerlo, es muy fácil sacar todos los números pares hasta uno dado sin comprobar uno por uno ;)
  • Si haces lo anterior te darás cuenta de los 2 bucles while son muy parecidos, si no idénticos. Deja sólo uno de ellos.

Dark Pallacus escribió:Y el cuarto.

Demasiado largo comprobar tooodos los números si son divisbles hasta llegar al número primo. Intenta recorrer menos números.

Dark Pallacus escribió:Y el último: Probadlo que os vais a reír. ;)

Está bien y me gusta el concepto de la forma en que sales de los bucles while cuando una condición es cierta, pero un código más legible sugiere usar otra variable (y esto aplica al problema anterior también), tal que:

Código: Seleccionar todo

  int encontrado = 0;
  while (turno <= 5 && !encontrado)
  {
    printf("\n %s cual crees que es el numero que ha elegido %s? ", jugador_2, jugador_1);
    scanf(" %d", &numero_2);
    if (numero_2 == clave_secreta)
    {
      printf("\n Felicidades! Eres telequinesico!");
      encontrado = 1;
    }
  }

A lo mejor he obviado en las lecciones que en C 0 es falso y cualquier otro número es verdadero.

También deberías usar un switch y no un if-else al final, es más limpio y más legible (y para eso se inventó :lol: ).

Suerte y a por ello ;)
Imagen

Avatar de Usuario
Dark Pallacus
ViP Hordes
ViP Hordes
Mensajes: 1509
Registrado: 03 Sep 2009, 00:35
PSN ID: Pallacus
Ubicación: Barcelona
Contactar:

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

Mensaje por Dark Pallacus »

m0skit0 escribió:Hablando de terceros... Está bien, pero

* Ya que vas a comparar tantas veces la suma, crea una variable y asígnale la suma, luego simplemente compara esa variable. Así evitas tener que calcular la suma siempre (que hace que el programa vaya más lento). Por ejemplo en el while la suma se calcularía de nuevo por cada pase del bucle.
* if (contador % 2 == 0) es una división por cada pase del bucle. Encuentra una forma mejor de hacerlo, es muy fácil sacar todos los números pares hasta uno dado sin comprobar uno por uno ;)
* Si haces lo anterior te darás cuenta de los 2 bucles while son muy parecidos, si no idénticos. Deja sólo uno de ellos.
- Suma simplificada, aunque al final solo la uso un par de veces :tongue:
- Cambiado lo del contador, ahora el programa hace menos operaciones innecesarias.
- Simplificado a un solo bucle :D
Spoiler:

Código: Seleccionar todo

#include <stdio.h>

int main(int argc, char *argv[])
{
  //establecemos las variables:
  int numero_1, numero_2, contador, suma;
 
  //Pedimos al usuario que proporcione 2 numeros enteros
  printf("\n Por favor, introduce 2 numeros enteros: ");
  scanf(" %d %d", &numero_1, &numero_2);
 
  suma = numero_1 + numero_2;
  contador = suma;
  printf("\n La suma de ambos es ");
 
  //Si la suma es par imprimiremos todos los pares.
  if (suma % 2 == 0)
    printf("par. Igual que: ");
     
  //Si no es par es que es impar. En este caso imprimiremos los impares.
  else
    printf("impar. Igual que: ");
   
  while (contador >= 1)
  {
    printf("%d, ", contador);
    contador = contador - 2;
  }
 
  printf("\n\n");
 
  return 0;
}
PS3 - PSP 2000

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 (VIII)

Mensaje por m0skit0 »

Hm, estás imprimiendo los números al revés :tongue: Perfecto salvo ese detalle :oki:
Imagen

Avatar de Usuario
Dark Pallacus
ViP Hordes
ViP Hordes
Mensajes: 1509
Registrado: 03 Sep 2009, 00:35
PSN ID: Pallacus
Ubicación: Barcelona
Contactar:

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

Mensaje por Dark Pallacus »

m0skit0 escribió:Demasiado largo comprobar tooodos los números si son divisbles hasta llegar al número primo. Intenta recorrer menos números.
He reducido a la mitad, luego buscaré la manera de reducirlo a un tercio del actual (sin que el programa deje de funcionar :D)
Spoiler:
//Dado un número entero, verificar si el número es primo o no.
#include <stdio.h>

int main(int argc, char *argv[])
{
int numero, contador = 3;

//pedimos al usuario que introduzca un número.
printf("\n Por favor, introduce un numero entero y comprobare si es primo o no: ");
scanf(" %d", &numero);
printf("\n ");

//Descartamos que el numero sea par:
if ((numero > 2) && (numero% 2 == 0))
{
printf("%d es par y no es primo. Pero tu si.", numero);
contador = contador + numero;
}
else
{
switch(numero)
{
//Descartamos el 0...
case 0:
printf("En serio que has puesto 0?");
break;
//... y el 1.
case 1:
printf("El 1 es el primero de los primos. Como tu.");
break;
//Comprobamos si el numero es 2...
case 2:
printf("2 es primo.");
break;
//... o 3
case 3:
printf("3 es primo.");
contador = 4;
break;
//Y finalmente comprobamos si el numero es divisible entre algún impar.
default:
while (contador < numero)
{
//Comprobamos si el número es divisible entre los impares menores que numero.
if (numero % contador == 0)
{
printf("%d no es primo.", numero);
contador = contador + numero;
}
contador = contador + 2;
}
}
}
//si no se encuentra un divisor de numero, contador acabará teniendo el mismo valor que número.
if(contador == numero)
printf("%d es primo.", numero);

printf("\n\n");
return 0;
}

m0skit0 escribió:Hm, estás imprimiendo los números al revés :tongue: Perfecto salvo ese detalle :oki:
Nadie dijo en que orden tenian que salir XD.
EDITO: SI que lo ponia :tongue:
# Dados dos números enteros, si la suma de ambos es par, imprimir todos los valores pares hasta el mayor de ellos. Si la suma no es par, imprimir los valores impares hasta la suma de ambos.

Ahora le echo un vistazo ;) :oki:

Vistazo echado:
Spoiler:

Código: Seleccionar todo

//Dados dos números enteros, si la suma de ambos es par, imprimir todos los valores pares hasta el mayor de ellos. Si la suma no es par, imprimir los valores impares hasta la suma de ambos.
#include <stdio.h>

int main(int argc, char *argv[])
{
  //establecemos las variables:
  int numero_1, numero_2, contador, suma;
 
  //Pedimos al usuario que proporcione 2 numeros enteros
  printf("\n Por favor, introduce 2 numeros enteros: ");
  scanf(" %d %d", &numero_1, &numero_2);
 
  suma = numero_1 + numero_2;
  printf("\n La suma de ambos es ");
 
  //Si la suma es par imprimiremos todos los pares.
  if (suma % 2 == 0)
  {
    contador = 2;
    printf("par. Igual que: ");
  }
     
  //Si no es par es que es impar. En este caso imprimiremos los impares.
    else
    {
      contador = 1;
      printf("impar. Igual que: ");
    }
   
  while (contador < suma)
  {
    printf("%d, ", contador);
    contador = contador + 2;
  }
 
  printf("\n\n");
 
  return 0;
}
Última edición por Dark Pallacus el 06 Ene 2011, 18:48, editado 1 vez en total.
PS3 - PSP 2000

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 (VIII)

Mensaje por m0skit0 »

:oki:
Imagen

Avatar de Usuario
Dark Pallacus
ViP Hordes
ViP Hordes
Mensajes: 1509
Registrado: 03 Sep 2009, 00:35
PSN ID: Pallacus
Ubicación: Barcelona
Contactar:

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

Mensaje por Dark Pallacus »

Al final revisé el hilo. :tongue:

He ido tomando ideas y puliendo los ejercicios. Por favor comentad:
m0skit0 escribió:# Ya que vas a comparar tantas veces la suma, crea una variable y asígnale la suma, luego simplemente compara esa variable. Así evitas tener que calcular la suma siempre (que hace que el programa vaya más lento). Por ejemplo en el while la suma se calcularía de nuevo por cada pase del bucle.
# if (contador % 2 == 0) es una división por cada pase del bucle. Encuentra una forma mejor de hacerlo, es muy fácil sacar todos los números pares hasta uno dado sin comprobar uno por uno ;)
# Si haces lo anterior te darás cuenta de los 2 bucles while son muy parecidos, si no idénticos. Deja sólo uno de ellos.

Hecho:
Spoiler:

Código: Seleccionar todo

//Dados dos números enteros, si la suma de ambos es par, imprimir todos los valores pares hasta el mayor de ellos. Si la suma no es par, imprimir los valores impares hasta la suma de ambos.
#include <stdio.h>

int main(int argc, char *argv[])
{
  //establecemos las variables:
  int numero_1, numero_2, suma, contador, limite;
 
  //Pedimos al usuario que proporcione 2 numeros enteros
  printf("\n Por favor, introduce 2 numeros enteros: ");
  scanf(" %d %d", &numero_1, &numero_2);
 
  suma = (numero_1 + numero_2);
 
  printf("\n La suma de ambos es ");
 
  //Si la suma es par ponemos el contador a 2 y el límite al mayor de los numeros proporcionados por el usuario.
  if (suma % 2 == 0)
  {
    contador = 2;
    printf("par. ");
    if (numero_1 > numero_2)
      limite = numero_1;
    else
      limite = numero_2;   
  }
 
  //Si no es par es que es impar. En este caso ponemos el contador a 1 y el limite al resultado de la suma.
  else
  {
    contador = 1;
    printf("impar. ");
    limite = suma;
  }
 
  printf(" Igual que: ");
  //E imprimimos los numeros que corresponda.
  while (contador <= limite)
  {
    printf("%d, ", contador);
    contador += 2;
  }
  printf("\n\n");
 
  return 0;
}

El juego:
m0skit0 escribió:Está bien y me gusta el concepto de la forma en que sales de los bucles while cuando una condición es cierta, pero un código más legible sugiere usar otra variable (y esto aplica al problema anterior también), tal que:

Código: Seleccionar todo

  int encontrado = 0;
  while (turno <= 5 && !encontrado)
  {
    printf("\n %s cual crees que es el numero que ha elegido %s? ", jugador_2, jugador_1);
    scanf(" %d", &numero_2);
    if (numero_2 == clave_secreta)
    {
      printf("\n Felicidades! Eres telequinesico!");
      encontrado = 1;
    }
  }

A lo mejor he obviado en las lecciones que en C 0 es falso y cualquier otro número es verdadero.

También deberías usar un switch y no un if-else al final, es más limpio y más legible (y para eso se inventó :lol: ).)

Revisado.
Spoiler:

Código: Seleccionar todo

//5. Crear un programa en el que un usuario A introduce un número secreto entre 0 y 10 y otro usuario B debe adivinarlo en 5 intentos máximo. El programa sólo se debe detener si el usuario B acertó o si ha gastado los 5 intentos de manera fallida.
#include <stdio.h>

int main(int argc, char *argv[])
{
  //Establecemos las variables.
  char jugador_1 [20], jugador_2 [20];
  int clave_secreta, numero_2, turno = 1, encontrado = 0;
 
  //Pedimos a los usuarios que se identifiquen.
  printf("\n Introduce el nombre del jugador 1: ");
  scanf("%s", jugador_1);
  printf("\n Introduce el nombre del jugador 2: ");
  scanf("%s", jugador_2);
 
  // Ahora pedimos al jugador 1 que introduzca un número secreto.
  printf("\n\n %s escribe un numero del 0 al 10 :", jugador_1);
  scanf(" %d", &clave_secreta);
  system ("clear");
 
  while ((turno <= 5) && (encontrado == 0))
  {
    printf("\n\n Turno %d de 5.", turno);
    printf("\n %s cual crees que es el numero que ha elegido %s? ", jugador_2, jugador_1);
    scanf(" %d", &numero_2);
    if (numero_2 == clave_secreta)
    {
      printf("\n Felicidades! Eres telequinesico!");
      encontrado = 1;
    }
    //Si se equivoca, nos reimos de él.
    else
      switch (numero_2)
      {
   case 0:
     printf("\n Cero patatero!");
     break;
   case 1:
     printf("\n Uno! Que no pare ninguno!");
     break;
   case 2:
     printf("\n Dos! Dime adios!");
     break;
   case 3:
     printf("\n Tres! Prueba del reves!");
     break;
   case 4:
     printf("\n Cuatro! Atate el zapato!");
     break;
   case 5:
     printf("\n Cinco! Ai, pillin, pillin!");
     break;
   case 6:
     printf("\n Seis! A ver si aprendeis!");
     break;
   case 7:
     printf("\n Siete! Pa cagarla al retrete!");
     break;
   case 8:
     printf("\n Ocho! Te has quedado sin bizcocho!");
     break;
   case 9:
     printf("\n Nueve! Date prisa que llueve!");
     break;
   case 10:
     printf("\n Diez! Pero aciertalo pardiez!");
     break;
      }
    turno ++;
  }
  printf("\n\n");
  return 0;
}

Y finalmente quería pulir el de los números primos. A ver que os parece:
Spoiler:

Código: Seleccionar todo

//Dado un número entero, verificar si el número es primo o no. 
#include <stdio.h>

int main(int argc, char *argv [])
{

   //Establecemos las variables.
   int numero_introducido, divisible = 0, dividendo = 3, es_primo;

   //Pedimos al usuario que introduzca un número para ser comprobado.
   printf("\n Introduce un número natural y comprobaré si es primo: ");
   scanf(" %d", &numero_introducido);

   //Si el numero introducido no es valido lo comunicamos al usuario.
   if (numero_introducido <= 1)
   {
     es_primo = 2;
     printf("\n Fuera de rango: el numero 0 y los numeros negativos no son numeros naturales.");
     printf("\n El numero 1 no es valido para la definición de primo.");
   }
   //Si el número introducido es par lo descartamos
   else if ((numero_introducido % 2 == 0) && (numero_introducido != 2))
   {
     printf("\n %d es par, por tanto...\n", numero_introducido);
     es_primo = 0;
   }
     
   //Comprobamos los casos posibles
   else
   {
     //Para que la comprobación resulte cierta "dividendo" debe ser 3 o mayor. Por tanto hay que comprobar uno a uno los impares hasta 9.
     switch (numero_introducido)
     {
       case 2:
         es_primo = 1;
         break;
       case 3:
         es_primo = 1;
         break;
       case 5:
         es_primo = 1;
         break;
       case 7:
         es_primo = 1;
         break;
       case 9:
         es_primo = 0;
         break;
    //Ahora si, los impares mayores de 9 se pueden comprobar optimizando el uso del procesador.
    //Comprobamos si el numero introducido tiene divisores enteros.
       default:
    printf("\n Calculando\n");
         while ((dividendo * dividendo) <= numero_introducido)
         {
           if ((numero_introducido % dividendo) == 0)
        divisible = 1;
      dividendo ++;
      dividendo ++;
         }
         //Una vez comprobado si el número tiene divisores, establecemos si es primo o no
         if (divisible == 0)
           es_primo = 1;
         else
      es_primo = 0;
     }
   }
   //Finalmente Imprimimos si el número introducido es par o no.
   if (es_primo == 0)
     printf("\n %d no es primo", numero_introducido);
   else if (es_primo == 1)
     printf("\n %d es primo", numero_introducido);
   
   //Y Sangramos,sobretodo que quede bonito.  :D
   printf("\n\n");
}
PS3 - PSP 2000

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 (VIII)

Mensaje por m0skit0 »

:oki: :oki: :oki:

Pero en el del número primo, intenta no comparar tantos casos por número, no es el objetivo del ejercicio. El objetivo es hacer un algoritmo que tenga en cuenta:

1. El menor número posible de casos concretos
2. El menor número de números que comprobar
3. El menor coste en procesador

En ese orden ;)
Imagen

Avatar de Usuario
iShadows
Enteradillo
Enteradillo
Mensajes: 45
Registrado: 24 Sep 2010, 18:46

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

Mensaje por iShadows »

Esto se esta poniendo dificil... :(
Imagen

Avatar de Usuario
Dark Pallacus
ViP Hordes
ViP Hordes
Mensajes: 1509
Registrado: 03 Sep 2009, 00:35
PSN ID: Pallacus
Ubicación: Barcelona
Contactar:

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

Mensaje por Dark Pallacus »

m0skit0 escribió:Pero en el del número primo, intenta no comparar tantos casos por número, no es el objetivo del ejercicio. El objetivo es hacer un algoritmo que tenga en cuenta:

1. El menor número posible de casos concretos
2. El menor número de números que comprobar
3. El menor coste en procesador

En ese orden ;)

Que chungo! Es que si reduzco los casos concretos tendré que aumentar mucho los números que comprobar, lo que se traduce en mucho mas uso del procesador.

Por cierto: He estado buscando información para que el usuario introduzca un número y no aparezca en pantalla, pero no he encontrado nada. :tongue:
PS3 - PSP 2000

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 (VIII)

Mensaje por ~Rdavid~ »

iShadows escribió:Esto se esta poniendo dificil... :(

Pero si vas por la parte más facil :lol:
Imagen

Responder