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

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

arisma
Habitual
Habitual
Mensajes: 497
Registrado: 18 Sep 2009, 08:41

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

Mensaje por arisma »

m0skit0 escribió:Optimizar la comprobación de si un número es primo o no. Todos lo habéis hecho muy parecido, y en todos los casos el bucle es demasiado largo, se puede reducir a la mitad (y menos) de comprobaciones ;)


:(

Lo repasaré a ver.

Avatar de Usuario
miguelamacias
Experto
Experto
Mensajes: 960
Registrado: 03 Sep 2009, 14:16
Ubicación: Coria del Río, Sevilla
Contactar:

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

Mensaje por miguelamacias »

Si un número es divisible entre 4 lo es también por 2. Esa comprobación sobra. Igual con el ocho.

Avatar de Usuario
dark_sasuke
Moderador Global
Moderador Global
Mensajes: 3380
Registrado: 03 Sep 2009, 02:13
Twitter: D4rkyt0

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

Mensaje por dark_sasuke »

creo que asi, es que iwal no "cojo" como optimizar el bucle :cry:

Spoiler:

Código: Seleccionar todo

#include <stdio.h>

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

{

int  num_insertado, bucle = 4;
   
//bienvenida al programa y escaneo del numero
printf("bienvenido a este programa :)\n");
printf("por favor inserta un numero y te dire si es primo : ");
scanf("%d", &num_insertado);

   
if(num_insertado <=1)
{   
   printf("\nel numero 0 el numero 1 y los numeros negativos\nNO son validos!\n");

return 0;
}
else     
   
   printf("\ntu numero es un numero natural, muy bien :) y ademas,\n");


while(num_insertado%bucle!=0)
   bucle++;

if(num_insertado==bucle)
   
   printf("tu numero es primo\n");

else

   printf("tu numero NO es primo\n");



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

Mensaje por m0skit0 »

¿¿bucle = 4?? No no no, ésa no es la palabra mágica, no no no. Además, ahora ya no funciona bien :tongue: No se trata de joderlo, sino de mejorarlo ;)
Imagen

Avatar de Usuario
dark_sasuke
Moderador Global
Moderador Global
Mensajes: 3380
Registrado: 03 Sep 2009, 02:13
Twitter: D4rkyt0

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

Mensaje por dark_sasuke »

m0skit0 escribió:¿¿bucle = 4?? No no no, ésa no es la palabra mágica, no no no. Además, ahora ya no funciona bien :tongue: No se trata de joderlo, sino de mejorarlo ;)


joder!!!!! a ver que si no me quemo el cerebro antes de descubrir como mejorarlo xD
Imagen

arisma
Habitual
Habitual
Mensajes: 497
Registrado: 18 Sep 2009, 08:41

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

Mensaje por arisma »

miguelamacias escribió:Si un número es divisible entre 4 lo es también por 2. Esa comprobación sobra. Igual con el ocho.


Pero has de tener en cuenta que 6 por ejemplo es divisible entre 2 pero no entre 4.

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 »

Pero miguelamacias tiene razón. Generalizando su regla, si el número en cuestión no es divisble entre 2 (o lo que es lo mismo, es impar), entonces no es divisible entre ningún número par ;)
Imagen

Avatar de Usuario
largeroliker
Administrador
Administrador
Mensajes: 8286
Registrado: 03 Sep 2009, 09:46
PSN ID: larger0o
Gamertag Xbox Live: larger0o
Steam ID: larger0o
Twitter: larger0o
Ubicación: Málaga
Contactar:

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

Mensaje por largeroliker »

Primero:

Spoiler:

Código: Seleccionar todo

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

int main(int argc, char *argv[])
{
  int numero; 
  //Leemos el número
   printf("Introduzca el numero deseado: ");
   scanf("%d", &numero);
   //Comprobamos que sea par y menor de veinte
   
   if ((numero % 2 == 0) && (numero < 20))
      printf("%d es un numero par y menor que veinte", numero);
   else
       printf("%d no es un numero par y menor que veinte", numero);
   getch();
  return 0;
}


el segundo:
Spoiler:

Código: Seleccionar todo

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

int main(int argc, char *argv[])
{
  float num1, num2;
 
  //Leemos los números
  printf("Introduzca el primer numero: ");
  scanf("%f", &num1);
  printf("Introduzca el segundo numero: ");
  scanf("%f", &num2);
  //Ahora calculamos si cumplen cada una de las opciones.
  if ((num1+num2) > 20)
     printf("La suma de %.0f y %.0f es mayor de 20\n", num1, num2);
     else
     printf("La suma de %.0f y %.0f no es mayor de 20\n", num1, num2);
  if (((num1+num2)/2) >20)
     printf("La media de %.0f y %.0f es mayor de 20\n", num1, num2);
     else
     printf("El media de %.0f y %.0f no es mayor de 20\n", num1, num2);
  if ((num1*num2) > 20)
     printf("El producto de %.0f y %.0f es mayor de 20", num1, num2);
     else
     printf("El producto de %.0f y %.0f no es mayor de 20", num1, num2);
     getch();
  return 0;
}


el tercero:

Spoiler:

Código: Seleccionar todo

#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
  int num1, num2, suma;
 
  //Leemos los números
  printf("Introduzca el primer numero: ");
  scanf("%d", &num1);
  printf("Introduzca el segundo numero: ");
  scanf("%d", &num2);
 
  //Calculamos la suma, y si es par.
 //A partir de ahora calcula si la suma es par y si num1 es par. Si ambos coinciden no hace nada extra, pero si alguno descuadra le añade uno a num1. Para contar suma dos desde num1 a num2.
 
  suma= num1+num2;
  if (suma % 2 == 0)
{
     if (!(num1 % 2 == 0))
     {
     num1++;
        while (num1 < num2)
     {
         printf("%d-", num1); 
         num1++;
         num1++; 
         sleep(500);   
     } 
     }
     else
     {
         while (num1 < num2)
     {
         printf("%d-", num1); 
         num1++;
         num1++; 
         sleep(500);   
     }   
     } 
}
else if (!(suma % 2 == 0))
{
     if (num1 % 2 == 0)
     {
     num1++;
          while (num1 < num2)
     {
         printf("%d-", num1); 
         num1++;
         num1++; 
         sleep(500);   
     }   
     }
     else
     {
         while (num1 < num2)
     {
         printf("%d-", num1); 
         num1++;
         num1++; 
         sleep(500);   
     }
     }   
}
  sleep(1000); 
  return 0;
}

Este me ha dado bastantes quebraderos de cabeza, y el problema es que lo veo muy repetitivo. Con una herramienta al estilo "conjunto de acciones con tal nombre" al estilo Visual habría ocupado bastante menos :lol:


Ahora me pongo con el cuarto, un descansito :mrgreen:


Saludos! ;)
Imagen
Steam Deck · Xbox Series X · PS5 · Switch · PS Vita · WiiU · PS3 · new 3DS XL · Xbox 360 · PSP · PS2

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 »

Veamos al vicejefe :D

largeroliker escribió:Primero:

Nada que objetar (y dale con getch() xD)

largeroliker escribió:el segundo:

Funciona, pero podrías mejorarlo:

Código: Seleccionar todo

  if ((num1+num2) > 20)
     printf("La suma de %.0f y %.0f es mayor de 20\n", num1, num2);
     else
     printf("La suma de %.0f y %.0f no es mayor de 20\n", num1, num2);

La única diferencia entre un caso y otro en el caso del printf() es el no. Intenta no escribir todo 2 veces ;) Ah y se dice mayor que, no mayor de (Ay paio, tú no eres mayor de mi primo). Lo mismo se aplica para el resto de casos.

En cuanto a estilo:

Código: Seleccionar todo

  if ((num1+num2) > 20)
     printf("La suma de %.0f y %.0f es mayor de 20\n", num1, num2);
  else
     printf("La suma de %.0f y %.0f no es mayor de 20\n", num1, num2);

El else va al mismo nivel que el if. Cuando sangrías es al cumplirse la condición.

largeroliker escribió:el tercero:

Vicejefe, vuelva a leerse el enunciado, que se ha hecho usted un lío del copón xD

m0skit0 escribió: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.

Mi consejo es que vuelvas a hacerlo desde cero. Fíjate que no hay tantas condiciones como tú planteas en tu código. Además, tienes el while escrito 4 veces exactamente igual :? Si ves que pasa eso, es que estás estructurando mal el código.

Aparte, le dejo su código con un buen estilo de formateo (fíjese que sólo cuando hay una condición se sangría):

Spoiler:

Código: Seleccionar todo

#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
   int num1, num2, suma;

   //Leemos los números
   printf("Introduzca el primer numero: ");
   scanf("%d", &num1);
   printf("Introduzca el segundo numero: ");
   scanf("%d", &num2);
   
   //Calculamos la suma, y si es par.
   
   suma= num1+num2;

   if (suma % 2 == 0)
   {
      if (!(num1 % 2 == 0))
      {
         num1++;
         while (num1 < num2)
         {
            printf("%d-", num1);
            num1++;
            num1++;
            sleep(500);   
         }
      }

      else
         while (num1 < num2)
         {
            printf("%d-", num1);
            num1++;
            num1++;
            sleep(500);   
         }
   }

   else if (!(suma % 2 == 0))
   {
      if (num1 % 2 == 0)
      {
         num1++;
         while (num1 < num2)
         {
            printf("%d-", num1);
            num1++;
            num1++;
            sleep(500);   
         }   
      }

      else
         while (num1 < num2)
         {
            printf("%d-", num1);
            num1++;
            num1++;
            sleep(500);   
         }
   }

   sleep(1000);

   return 0;
}

En vez de num++; num++; puedes hacer num+=2 ;)
Imagen

Avatar de Usuario
largeroliker
Administrador
Administrador
Mensajes: 8286
Registrado: 03 Sep 2009, 09:46
PSN ID: larger0o
Gamertag Xbox Live: larger0o
Steam ID: larger0o
Twitter: larger0o
Ubicación: Málaga
Contactar:

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

Mensaje por largeroliker »

m0skit0 escribió:Veamos al vicejefe :D

largeroliker escribió:Primero:

Nada que objetar (y dale con getch() xD)

.....no soy supersónico, como ya dije xD
m0skit0 escribió:
largeroliker escribió:el segundo:

Funciona, pero podrías mejorarlo:

Código: Seleccionar todo

  if ((num1+num2) > 20)
     printf("La suma de %.0f y %.0f es mayor de 20\n", num1, num2);
     else
     printf("La suma de %.0f y %.0f no es mayor de 20\n", num1, num2);

La única diferencia entre un caso y otro en el caso del printf() es el no. Intenta no escribir todo 2 veces ;) Ah y se dice mayor que, no mayor de (Ay paio, tú no eres mayor de mi primo). Lo mismo se aplica para el resto de casos.

Sip. Entonces para solucionarlo lo que se me ocurre es que escriba ese texto de todas formas, pero la parte del "mayor/menor que" que dependa de una variable de texto, a la que se le aplicaría el if. Algo así:

Código: Seleccionar todo

 if ((num1+num2)> 20)
           variable= "mayor que"
         else
           variable= "menor que"
printf("La suma de %.0f y %.0f es %s 20\n", num1, num2, variable);

m0skit0 escribió:En cuanto a estilo:

Código: Seleccionar todo

  if ((num1+num2) > 20)
     printf("La suma de %.0f y %.0f es mayor de 20\n", num1, num2);
  else
     printf("La suma de %.0f y %.0f no es mayor de 20\n", num1, num2);

El else va al mismo nivel que el if. Cuando sangrías es al cumplirse la condición.

Oka.
m0skit0 escribió:
largeroliker escribió:el tercero:

Vicejefe, vuelva a leerse el enunciado, que se ha hecho usted un lío del copón xD

m0skit0 escribió: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.

Mi consejo es que vuelvas a hacerlo desde cero. Fíjate que no hay tantas condiciones como tú planteas en tu código. Además, tienes el while escrito 4 veces exactamente igual :? Si ves que pasa eso, es que estás estructurando mal el código.


Claro, las condiciones las escribí a posteriori, posiblemente no las hayas visto xD

El tema es, comprueba si suma es par y si num1 (suponiendo que sea el menor, si no tendría que añadir otra comprobación en cada caso) es par. Porque si lo hago tal y como lo escribo, si sumáramos 3 y 23 daría 26, par, pero a la hora de contar contaría 3, 5, 7, 9...y lo mismo en el caso inverso. Lo del código igual repetido cuatro veces es por eso.

Como verás, la idea es comprobar si es par la suma y luego el número. Si el número es impar hay que convertirlo en par, y viceversa.
m0skit0 escribió:Aparte, le dejo su código con un buen estilo de formateo (fíjese que sólo cuando hay una condición se sangría):


En vez de num++; num++; puedes hacer num+=2 ;)

Oka, lo he medio rehecho, a ver qué tal ahora:

Spoiler:

Código: Seleccionar todo

#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
  int num1, num2, suma, menor, mayor;
 
  //Leemos los números
  printf("Introduzca el primer numero: ");
  scanf("%d", &num1);
  printf("Introduzca el segundo numero: ");
  scanf("%d", &num2);
 
  //Calculamos la suma   
  suma= num1+num2;
  //Comprobamos cuál es mayor y cual menor
  if (num1 < num2)
  {
     menor = num1;
     mayor = num2;
  }
  else
  {
      menor= num2;
      mayor= num1;
  }
/Si la suma es par y el menor impar, o viceversa, le sumamos uno y contamos de dos en dos.
  if (suma % 2 == 0)
{
      if(!(menor % 2 == 0))
     menor++;
     
     while (menor < mayor)
     {
         printf("%d-", menor); 
         menor+=2; 
         sleep(500);   
     }   
}
else
{
       if (menor % 2 == 0)
        menor++;     
     while (menor < mayor)
     {
         printf("%d-", menor); 
         menor+=2;
         sleep(500);   
     }
}
  sleep(1000); 
//Aah, no hay getch!! xDDDD
  return 0;
}

Saludos! ;)
Imagen
Steam Deck · Xbox Series X · PS5 · Switch · PS Vita · WiiU · PS3 · new 3DS XL · Xbox 360 · PSP · PS2

Responder