[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

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

Mensaje por m0skit0 »

<< Anterior Siguiente >>

Una mañana me desperté y maté a un elefante en pijama. Me pregunto cómo pudo ponerse mi pijama (Groucho Marx)

Los que hayáis llegado hasta aquí y completado los anteriores ejercicios, podéis agarraros los cataplines porque aquí empieza lo interesante :mrgreen:

Bucles

Llamamos bucles a las sentencias del lenguaje que nos permiten repetir un cierto bloque de código dependiendo de cierta condición, o bien un cierto número de veces.

El bucle while() es el más básico. Repite el bloque de código que especifiquemos hasta que se cumpla cierta condición (hasta que cierta expresión sea cierta). Por ejemplo:

Código: Seleccionar todo

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

int main(int argc, char* argv[])
{
    // Sólo i es cero...
    int limite, i = 0;

    printf("Introduce el tope: ");
    scanf("%d", &limite);

    // Mientras i sea menor o igual que el limite especificado...
    while(i <= limite)
    {
        // Imprime el valor de i
        printf("%d ", i);
        // Incrementa i en 1
        i++;
        sleep(1);
    }

    return 0;
}

Uno de los problemas más comunes de los bucles son los famosos bucles infinitos. Los bucles infinitos son bucles cuya condicion es errónea (o hay un error de lógica en el bloque que se repite), por ejemplo:

Código: Seleccionar todo

#include <stdio.h>

int main(int argc, char* argv[])
{
    // Sólo i es cero...
    int limite, i = 0;

    printf("Introduce el tope: ");
    scanf("%d", &limite);

    // Mientras i sea menor o igual que el limite especificado...
    while(i <= limite)
        // Imprime el valor de i
        printf("%d ", i);

    return 0;
}

¡¡¡¡Flooooooood!!!! :laughing: Si probáis esto veréis que el programa nunca llegará a detenerse (Ctrl-C para detenerlo). Esto es porque evidentemente i siempre tiene el mismo valor 0, por tanto la condición del bucle siempre será cierta. Es Windows 98 y anteriores un error como éste en VB y había que reinicar manualmente :laughing:

Las expresiones que usamos en el bucle while son las mismas que en los if, como habréis podido comprobar. Veamos a ver más construcciones de expresiones condiciones con if (que igualmente se aplican a while y switch).

Código: Seleccionar todo

#include <stdio.h>

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

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

    if (numero != 9)
        printf("No es un nueve\n");

    if (!(numero < 10))
        printf("Es mayor o igual que 10\n");

    if ((numero % 3 == 0) && (numero > 20))
        printf("Es mayor que 20 divisible por 3\n");

    if ((numero % 5 == 0) || (numero <= 100))
        printf("Es múltiplo de 5 O es menor o igual que 100\n");

    if (!(numero == 6) && (numero < 10))
        printf("No es 6 Y es menor que 10\n");

    if (!( (numero % 2 == 0) && (numero > 10)))
        printf("Es impar o menor o igual que diez\n");

    // Cuenta inversa...
    while(numero >= 0)
        // numero-- resta uno a numero, pero tras el printf. Son como 2 operaciones en una sentencia ;)
        printf("%d ", numero--);

    return 0;
}

Uf... ¿Cómo lo véis? :shock: Las expresiones lógicas pueden parecer un poco enrevesadas al principio, pero si las entendemos bien no habrá problemas. A ver un pequeño repaso:

  • ! no (niega la expresión -> si es verdadera, la hace falsa y viceversa)
  • == igual
  • != no igual
  • > mayo
  • >= mayor o igual
  • < menor
  • <= menor o igual
  • && Y lógico (AND) (sólo es verdadero si ambas expresiones son verdaderas)
  • || Ó lógico (OR) (sólo es falso si ambas expresiones son falsas)

Veamos algunos ejercicios que podéis hacer para practicar esto:

  1. Dado un número entero evaluar si es menor que 20 y par (debe cumplir ambas condiciones).
  2. Dados dos números reales, evaluar si la media, la suma y la multiplicación son mayores que 20 (cada una de ellas).
  3. 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.
  4. Dado un número entero, verificar si el número es primo o no. Un número es primo si y sólo si es divisible por la unidad y por sí mismo.
  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.

Ay las mates xD Nos vemos en la siguiente ;)

Descarga en PDF (por cortesía de Chacaritas)

<< Anterior Siguiente >>
Imagen

Avatar de Usuario
Kravenbcn
Administrador
Administrador
Mensajes: 16291
Registrado: 01 Sep 2009, 21:27
PSN ID: Kravenbcn
Twitter: Kravenbcn
Ubicación: Barcelona
Contactar:

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

Mensaje por Kravenbcn »

m0ski creo que te has confudido en el título, este es el VIII, no?
No te pierdas nada, sigue a DaXHordes en Twitter, Facebook, Google+ y Youtube

Imagen
¿Quieres formar parte del equipo de DaXHordes.org? Esta es tu oportunidad.
PS3 · PS Vita · PSP

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 »

Cierto, jefe, estás en todas :?
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 »

1.
Spoiler:

Código: Seleccionar todo

#include <stdio.h>

int main()
{

   int num;
   
   printf("Introduce un número(debería ser menor de 20 y par): ");
   scanf("%i", &num);

   if (num < 20 && (num % 2) == 0) printf("Menor de 20 y par...");
   else printf("Lo siento no se cumple al menos una de las condiciones");

   return 0;
}


2. :P

Spoiler:

Código: Seleccionar todo

#include <stdio.h>

//Para el proximo pongo los argumentos xD
int main()
{
   float nPri, nSeg;

   printf("Primer número: ");
   scanf("%f", &nPri);
   printf("Segundo número: ");
   scanf("%f", &nSeg);
   //
   if ((nPri + nSeg) / 2 > 20) printf("La media es mayor de 20\n");
      else printf("La media no es mayor de 20\n");
   if ((nPri + nSeg) > 20) printf("La suma es mayor de 20\n");
      else printf("La suma no es mayor de 20\n");
   if ((nPri * nSeg) / 2 > 20) printf("El producto es mayor de 20\n");
      else printf("El producto no es mayor de 20\n");

   return 0;
}


3.
Spoiler:

Código: Seleccionar todo

#include <stdio.h>

int main(int argc, char* argv[])
{
   int nPri, nSeg, suma, mayor, i;

   printf("Introduce el primer número: ");
   scanf("%i",&nPri);
   printf("Introduce el segundo número: ");
   scanf("%i",&nSeg);

   suma = nPri + nSeg;
   if (nPri >= nSeg) mayor = nPri;
   else mayor = nSeg;

   if ((suma % 2) == 0) i = 0;
   else i = 1;
   
   while (i <= mayor)
   {
      printf("%i\n", i);
      i += 2;
   }
   
   return 0;
}


3b. Corregido, ahora si debe hacer lo que se pedía. jeje.
Spoiler:

Código: Seleccionar todo

#include <stdio.h>

int main(int argc, char* argv[])
{
   int nPri, nSeg, suma, mayor, i;

   printf("Introduce el primer número: ");
   scanf("%i",&nPri);
   printf("Introduce el segundo número: ");
   scanf("%i",&nSeg);

   suma = nPri + nSeg;
   

   if ((suma % 2) == 0)
   {
      i = 0;
      if (nPri >= nSeg) mayor = nPri;
      else mayor = nSeg;
   }
   else
   {
      i = 1;
      mayor = suma;
   }
   
   while (i <= mayor)
   {
      printf("%i\n", i);
      i += 2;
   }
   
   return 0;
}



4.
Spoiler:

Código: Seleccionar todo

#include <stdio.h>

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

   int num, primo = 1, i;


   printf("Introduce un número y te diré si es un número primo: ");
   scanf("%i", &num);
   
   i = 2;

   while (i < num && primo == 1)
   {
//      if (num % 2 == 0) primo = 0;
// Error ya que se me fue la cabeza, realmente es la siguiente para eso se usa i en el bucle
           if (num % i == 0) primo = 0;
      else i++; // i = i + 1;
   }

   if (primo == 1) printf("El número %i, es un número primo...\n", num);
   else printf("El número %i, NO es un número primo...\n", num);

   return 0;
}


5.
Spoiler:

Código: Seleccionar todo

#include <stdio.h>

int main(int argc, char* argv[])
{
   int nSec, nLeido, i;

   printf("Introduce el número que se debe adivinar: ");
   scanf("%i", &nSec);
   i = 0;
   while (i < 30) {
      printf("\n");
      i++; // i = i + 1;
   }
   i = 1; //Ahora lo voy a usar como contador de intentos

   /* Ponemos el primer scanf fuera ya que existe la posibilidad de que inicialicemos nSec(por defecto = 0)
      con el valor del número a adivinar, en dicho caso no preguntaria al usuario ninguna vez el número a adivinar */

   printf("Introduce el número que crees que es: ");
   scanf("%i", &nLeido);

   while ( nSec != nLeido && i < 5) {
      i++; // i = i + 1;
      printf("Número de intento %i, introduce otro número: ", i);
      scanf("%i", &nLeido);
   }

   if (nSec == nLeido) printf("MUY BIEN!, Lo has adivinado...\n");
   else
      printf("La proxima vez será, ejecuta el programa de nuevo...\n");

   return 0;
}
Última edición por arisma el 21 Ene 2010, 12:18, editado 6 veces en total.

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 »

Por supuesto arisma ;)

arisma escribió:int main()

Es aconsejable poner los parámetros de main(), sólo para acostumbrarse ;)

arisma escribió:printf("Lo siento no se cumple una de las condiciones");

O ambas :mrgreen:
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 »

Jajaja. No hay problema a partir del 3º lo pongo. Así no olvidaré los argumentos.

Avatar de Usuario
brujitosexy
Experto
Experto
Mensajes: 1097
Registrado: 03 Sep 2009, 19:30

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

Mensaje por brujitosexy »

Y que has pasado que ya lleva bastante tiempo, moskito, sin poner los capitulos siguientes.

Nos va a dejar a media :?:
:evil: smiles-afilant
Linus Torvalds:
“El Software es como el sexo; es mejor cuando es gratis…”

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 »

Hasta que no hagáis los ejercicios, no hay nuevo capítulo.
Imagen

Avatar de Usuario
brujitosexy
Experto
Experto
Mensajes: 1097
Registrado: 03 Sep 2009, 19:30

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

Mensaje por brujitosexy »

m0skit0 escribió:Hasta que no hagáis los ejercicios, no hay nuevo capítulo.

Ahh es por esos.
Pensaba que te habia cansado :!:
:D
Y cuantos capitulos son en total :?:

Escucharon muchachones al profe, debemos fajarnos con los ejercicios, hay que actualizarnos :!:
smiles-afilant
Linus Torvalds:
“El Software es como el sexo; es mejor cuando es gratis…”

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 »

brujitosexy escribió:Pensaba que te habia cansado

Me cansaré si nadie resuelve los problemas :|

brujitosexy escribió:Y cuantos capitulos son en total

Los que haga falta para que dejéis de ser noobs :lol:
Imagen

Responder