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

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

Avatar de Usuario
Azrael^^
Enteradillo
Enteradillo
Mensajes: 36
Registrado: 31 Mar 2010, 18:48

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

Mensaje por Azrael^^ »

Y por esta lección voy. Pongo los 3 primeros ejercicios, que ahora estoy dándole vueltas al 4, el de los números primos, que de momento se me ha ocurrido sólo una cutreforma que no contempla cualquier número por alto que sea...

1.
Spoiler:

Código: Seleccionar todo

#include <stdio.h>

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

int numero;

printf("Introduzca un número menor que 20: ");
scanf("%d", &numero);

if ((numero % 2 == 0) && (numero < 20))
  printf("El número es par y menor de 20\n");

if (!(numero % 2 == 0))
  printf("El número es impar\n");

if (numero > 20)
  printf("El número es mayor que 20\n");

if (numero == 20)
  printf("El número es 20\n");

return 0;
}
2.
Spoiler:

Código: Seleccionar todo

#include <stdio.h>

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

float num1, num2, media, suma, mult;

printf("Escriba el primer número: ");
scanf("%f", &num1);
printf("Escriba el segundo número: ");
scanf("%f", &num2);

media = (num1 + num2) / 2;
suma = num1 + num2;
mult = num1 * num2;

printf("Media = %.2f\nSuma = %.0f\nMultiplicación = %.0f\n", media, suma, mult);

if ((media > 20) && (suma > 20) && (mult > 20))
  printf("La media, la suma y la multiplicación son mayores que 20\n");

if ((media < 20) && (suma > 20) && (mult > 20))
  printf("Sólo la suma y la multiplicación son mayores que 20\n");

if ((media > 20) && (suma < 20) && (mult > 20))
  printf("Sólo la media y la multiplicación son mayores que 20\n");

if ((media > 20) && (suma < 20) && (mult < 20))
  printf("Sólo la media y la suma son mayores que 20\n");

if ((media < 20) && (suma < 20) && (mult > 20))
  printf("Sólo la multiplicación es mayor que 20\n");

//Y estas dos últimas posibilidades no creo que se puedan dar, pero las meto...
if ((media > 20) && (suma < 20) && (mult < 20))
  printf("Sólo la media es mayor que 20\n");

if ((media < 20) && (suma > 20) && (mult < 20))
  printf("Sólo la suma es mayor que 20\n");

return 0;
}
3.
Spoiler:

Código: Seleccionar todo

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

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

int num1, num2, suma, par = 2, impar = 1;

printf("Introduzca el primer número: ");
scanf("%d", &num1);
printf("Introduzca el segundo número: ");
scanf("%d", &num2);

suma = num1 + num2;

if (suma % 2 == 0)
    while (par <= suma)
   {
     printf("%d ", par);
     fflush(0);
     par = par + 2;
     sleep(1);
   }

if (!(suma % 2 == 0))
    while (impar <= suma)
   {
     printf("%d ", impar);
     fflush(0);
     impar = impar + 2;
     sleep(1);
   }

return 0;
}


Luego pondré los otros dos y paso a la siguiente lección. Yuju! :D

PD: me está pareciendo realmente interesante todo esto, no sé cómo no me ha dado antes por ponerme a ello...

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 »

Muy bueno Azrael^^

Pero fíjate en cómo tengo yo formateado el código. No dudes en usar tabulaciones para hacer todo más legible. Todo lo que se halle entre llaves debería ir más a la derecha.

Saludos y ánimos con los primos :lol:
Imagen

Avatar de Usuario
Azrael^^
Enteradillo
Enteradillo
Mensajes: 36
Registrado: 31 Mar 2010, 18:48

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

Mensaje por Azrael^^ »

Bueno, después de unos días de vacaciones (qué bonito es Oporto!), vuelvo a ponerme con esto, que no quiero que se me olvide.

m0skit0 escribió:Muy bueno Azrael^^

Pero fíjate en cómo tengo yo formateado el código. No dudes en usar tabulaciones para hacer todo más legible. Todo lo que se halle entre llaves debería ir más a la derecha.

Saludos y ánimos con los primos :lol:


Captado. Cuidaré más el formateo de ahora en adelante.

Dejo los dos ejercicios que me quedaban.
4.
Spoiler:

Código: Seleccionar todo

#include <stdio.h>

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

  int ndado, ndiv = 2, ultdiv, termino;
 
  printf("Escriba un número: ");
  scanf("%d", &ndado);
 
  //Asignar último divisor posible
  ultdiv = ndado / 2;

  //Contemplar los primeros números que quedan fuera en la comprobación de después
  if(ndado == 1)
    printf("Por convenio, el número 1 no se considera primo.\n");
  else if((ndado == 2) || (ndado == 3))
    printf("%d es un número primo.\n", ndado);
  else
    {
      //Condicion necesaria para evitar bucle infinito
      while(termino != 0)
        {
          if(ndado % ndiv == 0)
            {
              printf("%d no es un número primo.\n", ndado);
              termino = 0;
            }
          else
            {
              //Cuando el divisor alcance al último posible, se acaba
              if(ndiv == ultdiv)
                {
                  printf("%d es un número primo.\n", ndado);
                  termino = 0;
                }
              else
                ndiv++;
            }   
        }
    }

  return 0;
}

5.
Spoiler:

Código: Seleccionar todo

#include <stdio.h>

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

  int num1, num2, contador = 5;

  //Introducir el número secreto
  printf("Introduzca un número por favor: ");
  scanf("%d", &num1);

  //Ahora hay que adivinarlo
  printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nIntenta adivinar el número que ha escrito tu compañero. Tienes %d intentos: ", contador);
  scanf("%d", &num2);

  //Condicion impuesta para evitar bucle infinito
  while(contador != 1)
   {
        if(num2 == num1)
          {
            printf("Enhorabuena, lo has acertado!!\n");
            contador = 1;
          }
        else
          {
            contador--;
            printf("Has fallado. Vuelve a intentarlo. Te quedan %d intentos: ", contador);
            scanf("%d", &num2);
            if(contador == 1)
              printf("Lo siento, has agotado todos tus intentos.\n");
          }
   }

  return 0;
}


Estoy convencido de que el de los números primos se puede hacer de manera más sencilla :?
Por cierto, en cuanto al ejercicio 5: ¿hay alguna forma fácil de evitar que el número secreto se muestre en pantalla? Algo como así como en linux cuando te pide meter una contraseña en la consola, que no aparece. Es que es horrible eso de meter varias veces "\n" para que se salga el número de pantalla...

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 »

Azrael^^ escribió:Estoy convencido de que el de los números primos se puede hacer de manera más sencilla :?

Efectivamente :twisted:

Azrael^^ escribió:Por cierto, en cuanto al ejercicio 5: ¿hay alguna forma fácil de evitar que el número secreto se muestre en pantalla? Algo como así como en linux cuando te pide meter una contraseña en la consola, que no aparece. Es que es horrible eso de meter varias veces "\n" para que se salga el número de pantalla...

Obviamente que se puede. Intenta investigarlo por tu cuenta, eso viene bien para leer documentación sobre funciones ;)
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 (VIII)

Mensaje por Dante »

Esta ves los ejercicios se me hicieron difíciles, tarde buen rato en hacerlos, de mil formas lo intente pero solo no querían quedar bien. Espero hacer mas rápido los de la siguiente, de por si con la escuela tengo menos tiempo.

Ejercicio 1
Spoiler:

Código: Seleccionar todo

#include <stdio.h>

int main()

 {

   int num;
   
   printf("Introduce un nuermo menor de 20 que sea par: ");
   scanf("%d", &num);

   if(num < 20 && (num % 2) == 0)
   printf("\nEl numero es menor que 20 y es un numero par\n");
   
   else
   printf("\nEl numero es mayor que 20 o no es par\n");

   return 0;

 }


Ejercicio 2
Spoiler:

Código: Seleccionar todo

#include <stdio.h>

int main()

  {

   float num, num2;

   printf("Introduce un numero con decimales: ");
   scanf("%f", &num);

   printf("Introduce otro numero con decimales: ");
   scanf("%f", &num2);


   if(num + num2 / 2 >= 20) printf("La media es igual o mayor que 20\n");

   if(num + num2 >= 20) printf("La suma es igual o mayor que 20\n");

   if(num * num2 >= 20) printf("El resultado de la multiplicacion es igual o mayor que 20\n");

   return 0;

  }


Ejercicio 3
Spoiler:

Código: Seleccionar todo

#include <stdio.h>

int main()

  {

   int num, num2, suma, x;

   printf("Introduce un numero: ");
   scanf("%d", &num);

   printf("Introduce otro numero: ");
   scanf("%d", &num2);

   suma = num + num2;
   x = 0;

   if(suma % 2 == 0)
   
     {
   
      printf("Se mostraran todos los numeros pares hasta el numero resultado de la suma");
      while(x <= suma)

      {
 
        printf("\n%d", x);
        x += 2;
     
      }

     }

   else(suma % 2 == 1);
   
      {

       printf("Se mostraran todos los numeros impares hasta el numero resultado de la suma");
       x = 1;

       while(x <= suma)

        {

         printf("%d\n", x);
         x += 2;
       
        }

   return 0;

  }


Ejercicio 4
Spoiler:

Código: Seleccionar todo

#include <stdio.h>

int main()

  {

   int num;

   printf("Introduce un numero entero: ");
   scanf("%d", &num);

   if(num % 2 && num % 3) printf("El numero es primario\n");
   else printf("El numero no es primario\n");

   return 0;
  }



Ejercicio 5
Spoiler:

Código: Seleccionar todo

#include <stdio.h>

int main()

  {

   int A,B,cache = 0, limite = 4;

   printf("Introduce un numero secreto entre el 1 y 10: ");
   scanf("%d", &A);

   printf("Trata de adivinar el numero secreto entre el 1 y 10\nTienes 5 intentos: ");
   scanf("%d", &B);

   if(A == B) printf("A la primera, tu ganas!!!\n");
   else
   do
   
    {

      if(A != B)
      printf("Fallaste, intentalo de nuevo\n");
      cache++;
      printf("Ingresa otro numero: ");
      scanf("%d", &B);
     
    }

   while(cache < limite);
   printf("GAME OVER\n");

   }


Listo para revisión. Voy por la siguiente...
PD: Ya corregí el ejercicio de la lección anterior.

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 »

Dante escribió:Ejercicio 1

Bien, pero no el formato:

Código: Seleccionar todo

   if(num < 20 && (num % 2) == 0)
      printf("\nEl numero es menor que 20 y es un numero par\n");
   
   else
      printf("\nEl numero es mayor que 20 o no es par\n");

Igualmente, ahora que estás empezando, te aconsejo que uses las llaves en los if aunque sólo tengan una sentencia. Te ahorrarás futuros molestos quebraderos de cabeza.

Código: Seleccionar todo

   if(num < 20 && (num % 2) == 0)
   {
      printf("\nEl numero es menor que 20 y es un numero par\n");
   }
   else
   {
      printf("\nEl numero es mayor que 20 o no es par\n");
   }


Dante escribió:Ejercicio 2

Ok también, pero sigues teniendo fallos de ejercicios anteriores, que ya te he comentado. Ahora realizas la suma num + num2 2 veces, cuando con una vez te vale. Y respeta el formato: las sentecias que se ejecuten cuando un if, entre llaves y tabuladas, no en la misma línea. Y las llaves van en el mismo nivel, es decir:

#include <stdio.h>

Código: Seleccionar todo

int main()
{

   float num, num2;

   printf("Introduce un numero con decimales: ");
   scanf("%f", &num);

   printf("Introduce otro numero con decimales: ");
   scanf("%f", &num2);


   if(num + num2 / 2 >= 20)
   {
      printf("La media es igual o mayor que 20\n");
   }

   if(num + num2 >= 20)
   {
      printf("La suma es igual o mayor que 20\n");
   }

   if(num * num2 >= 20)
   {
      printf("El resultado de la multiplicacion es igual o mayor que 20\n");
   }

   return 0;
}

Esto aplícalo a todos los ejercicios y tómalo como una rutina a la hora de escribir el código.

Ejercicio 3

Está mal. ¿Has probado a ejecutar con una suma impar?

Dante escribió:Ejercicio 4

Mal también. De hecho no tiene mucho sentido lo que intentas hacer. 2 es primo y según tu programa no lo es, así como el 3. Por el contrario, 25 lo marca como primo y no lo es, así como 35, 55 etc...

Dante escribió:Ejercicio 5

Funciona, pero:

Dante escribió:cache = 0

¿Me puedes explicar la razón para dar este nombre de variable?

Dante escribió:if(A == B) printf("A la primera, tu ganas!!!\n");

Sobra. Puedes poner esta condición directamente en el while. Recuerda que, como el if, puedes poner varias condiciones usando los operadores lógicos &&, || y !.

Te falta el return del main. De esto te tendría que haber avisado el compilador, así que préstale ojo a lo que te dice.

Saludos, y no sientas que repetir los ejercicios es perder el tiempo, más bien al contrario. El arte de programar sólo se puede adquirir con la práctica. Y demás, repetirlos hará que afiances tus conocimientos, a parte de que la práctica de programar también da otros beneficios (más velocidad al teclear, más rápidez en escribir código que ya hemos visto ejemplos parecidos, etc...).
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 (VIII)

Mensaje por ~Rdavid~ »

Uff después de un largo rato de estar haciendo las practicas e terminado xDD

Primero.
Spoiler:

Código: Seleccionar todo

#include <stdio.h>

int main(int argc, char *argv[])
{
 
  int num;
 
  printf("Escribe un número menor que 20 y par.\n");
  scanf("%d", &num);
 
  if ((num< 20) && (num % 2 == 0))
    printf("Bien, el número si es par y menor que 20\n");
  else
    printf("No se cumplierón uno o las dos condiciones\n");
   
 
  return 0;
}


Segundo.
Spoiler:

Código: Seleccionar todo

#include <stdio.h>

int main(int argc, char *argv[])
{
 
  float num1, num2, resMed, resMul, resSum;
 
  printf("Escribe dos números\n");
  printf("Primer número: ");
  scanf("%f", &num1);
  printf("Segundo número: ");
  scanf("%f", &num2);
 
  resMed = (num1 + num2)/2;
  resMul = num1 * num2;
  resSum = num1 + num2;
 
  if (resMed > 20)
    printf("Media: resultado %.2f, es mayor que 20\n", resMed);
  else
    printf("Media: resultado %.2f, no es mayor que 20\n", resMed);
 
  if (resMul > 20)
    printf("Multiplicación: resultado %.2f, es mayor que 20\n", resMul);
  else
    printf("Multiplicación: resultado %.2f, no es mayor que 20\n", resMul);
 
  if (resSum > 20)
    printf("Suma: resultado %.2f, es mayor que 20\n", resSum);
  else
    printf("Suma: resultado %.2f, no es mayor que 20\n", resSum);
 
 
 
  return 0;
}


Tercero.

Spoiler:

Código: Seleccionar todo

#include <stdio.h>

int main(int argc, char *argv[])
{
 
  int num1, num2, res, mayor, con1 = 0, con2 = 1;
 
  printf("Introduca dos números\n");
  printf("Primero: ");
  scanf("%d", &num1);
  printf("Segundo: ");
  scanf("%d", &num2);
 
  res = num1 + num2;
 
  if (num1 >= num2)
    mayor = num1;
  else
    mayor = num2;
 
 
  if (res % 2 == 0)
  {
    printf("\nLa suma de ellos es par [%d], los numeros pares hasta el mayor [%d] son:\n\n", res, mayor);
   
    while (con1 <= mayor)
    {
      printf("%d\n", con1);
      con1+= 2;
      sleep(1);
    }
  }
   
  else
  {
    printf("La suma de ellos es impar [%d], los numeros impares hasta la suma de ellos son:\n\n",res);
   
    while (con2 <= res)
    {
      printf("%d\n", con2);
      con2+= 2;
      sleep(1);
    }
  }
 
  return 0;
}


Cuarto. Para el que preguntaba si había una forma más fácil de encontrar un número primo :D , se me vino a la mente después de acordarme que en el cole había descubierto esta ecuación p = (n*2) +1 , donde p es un número primo y n cualquier número ya después solo tuve que acomodarla :D .

Spoiler:

Código: Seleccionar todo

#include <stdio.h>

int main(int argc, char *argv[])
{
 
  int num;
 
  printf("Introduce un número para saber si es primo o no\n");
  scanf("%d", &num);
 
 
  if (((num - 1) % 2 == 0) && (num % 3 != 0))
    printf("El número %d es primo\n", num);
  else
    printf("El número %d no es primo\n", num);
 
 
  return 0;
}


Quinto.

Spoiler:

Código: Seleccionar todo

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

int main(int argc, char *argv[])
{
 
  int num_secr, num_intr, inten = 1;
 
  printf("Juego adivina el número\n");
  printf("Jugador 1 introdusca un número del 1 al 10 a adivinar: ");
  scanf("%d", &num_secr);
 
  system("clear");
 
 

 
  while (inten < 6)
  {
    printf("Jugador 2 introduca un número del 1 al 10 para adivinar, solo tiene 5 intentos\n");
    printf("Número: ");
    scanf("%d", &num_intr);
    printf("\n\n");
   
    printf("Intentos [%d]\n", inten);
       
    if (num_intr > 0 && num_intr < 10)
    {
      if (num_intr == num_secr)
      {
       inten = 7;
       printf("Bien echo\n");
      }
      else if(inten == 5)
      {
        printf("Game Over\n");
        return 0;
      }
     
      else
      {
        printf("Ops, fallaste\n");
        inten++;
      }
    }
    else
      printf("Tiene que ser del 1 al 10\n");
   
  }
   
   
  return 0;
         
}


Bueno me voy al siguiente xD

Saludos.
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 »

~Rdavid~ escribió:Primero.

Nada que comentar, perfecto.

~Rdavid~ escribió:Segundo.

Idem :oki:

~Rdavid~ escribió:Tercero

Bien, aunque algunos comentarios:

  • suma en vez de res sería más correcto
  • while (con1 <= mayor) es muy parecido en ambos casos. Intenta encontrar una manera para no tener que incluirlo 2 veces en el código.

~Rdavid~ escribió:Cuarto
~Rdavid~ escribió:en el cole había descubierto esta ecuación p = (n*2) +1 , donde p es un número primo y n cualquier número

Lo siento pero estás equivocado. Ahí p no es un número primo, sino un número impar. Por ejemplo: n=7 -> p=15, que no es primo. No hay ninguna fórmula para hallar números primos, te lo digo de antemano.

~Rdavid~ escribió:Quinto.

Bien, algunos comentarios:
  • while (inten < 6) si los intentos son 5, intenta encontrar alguna forma de usar un 5 en vez de un 6. Esto lo dejará más legible.
  • Código: Seleccionar todo

        if (num_intr == num_secr) 
       {
           inten = 7;

    Esto no lo hagas nunca. Tienes que usar otra variable para controlar si se ha hallado el número correcto, o bien incluir la condición en el bucle. Una variable para una cosa, otra para otra. No hagas que las variables tengan varios usos.
  • Código: Seleccionar todo

        else if(inten == 5)
       {
         printf("Game Over\n");
         return 0;
       }

    Esto ya lo estás controlando en el while, por tanto te sobra. Intenta que la condición del while incluya esto.

Como indicación general, te falta incluir comentarios en tu código. Acostúmbrate a hacerlo desde ya.

Y en general me gusta el estilo que tienes, sólo te faltan algunas buenas prácticas, que ya les irás cogiendo el truco. Tiene usted un buen futuro como programador :mrgreen:
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 (VIII)

Mensaje por ~Rdavid~ »

Gracias por ayudarme :oki:.

Con respecto al quinto, que tal así:

Spoiler:

Código: Seleccionar todo

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

int main(int argc, char *argv[])
{
 
  int num_secr, num_intr, inten = 1;
 
  //introducimos el numero a adivinar
  printf("Juego adivina el número\n");
  printf("Jugador 1 introdusca un número del 1 al 10 a adivinar: ");
  scanf("%d", &num_secr);
 
  //Limpiamos la pantalla
  system("clear");
 
 

  //Comienza el bucle si hay menos de 5 intentos
  while (inten <= 5)
  {
    //Introducimos el numero intentando adivinar
    printf("Jugador 2 introduca un número del 1 al 10 para adivinar, solo tiene 5 intentos\n");
    printf("Número: ");
    scanf("%d", &num_intr);
    printf("\n\n");
   
    //Intentos
    printf("Intentos [%d]\n", inten);
       
    //Si el numero esta entre 1 a 10
    if (num_intr > 0 && num_intr < 10)
    {
      //Si el numero intr es igual al secr
      if (num_intr == num_secr)
      {
        printf("!Acertaste¡\n");
   printf("Bien echo\n");
   return 0;
   
      }
     
     
      else
      {
        // Si no sube un intento y vuleve a comenzar el bucle
   printf("Ops, fallaste\n");
   inten++;
      }
    }
    //Si no esta entre el 1 al 10 vuleve a comenzar el bucle
    else
      printf("Tiene que ser del 1 al 10\n");
   
  }
  //Cuando llega a 5 intentos
  printf("Game Over\n");
   
   
  return 0;
         
}


while (con1 <= mayor) es muy parecido en ambos casos. Intenta encontrar una manera para no tener que incluirlo 2 veces en el código.


¿Te refieres a while (con1 <= mayor) y while (con2 <= res)?, bueno no veo la forma sin tener que incluir esos dos por separado xD.

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

Mensaje por m0skit0 »

~Rdavid~ escribió:Con respecto al quinto, que tal así:

Mucho mejor. Pero

Código: Seleccionar todo

if (num_intr == num_secr)
{
   printf("!Acertaste¡\n");
   printf("Bien echo\n");
   return 0;
}

Intenta que las funciones sólo tengan un return, es mejor programación.

~Rdavid~ escribió:¿Te refieres a while (con1 <= mayor) y while (con2 <= res)?, bueno no veo la forma sin tener que incluir esos dos por separado xD.

De eso se trata, de comerse el coco ;) Pista: a lo mejor algunas variables más pueden ayudar.
Imagen

Responder