Respuesta a la pregunta #2. ¿Cómo hacer un bucle infinito?

Hoy vamos a ver la respuesta a la pregunta ¿Cómo hacer un bucle infinito?.

Teníamos el código:

#include <stdio.h>
 
int main() {
	char i;
	for (i=0; i>=0; i++) {
		printf("Soy un bucle infinito (ciclo %d)\n", i);
	}
 
	return 0;
}

y se trataba de convertirlo en un bucle infinito sin modificar el for y usando números enteros. Una posible solución es:

#include <stdio.h>
 
int main() {
	unsigned char i;
	for (i=0; i>=0; i++) {
		printf("Soy un bucle infinito (ciclo: %d)\n", i);
	}
 
	return 0;
}

El problema era que el bucle no era infinito porque cuando la variable i llega a 127 y le sumamos 1 se convierte en -128. Como este es un número negativo la condición del for ya no se cumple.

Al usar un unsgined, cuando la variable i llega a 255 si la incrementamos pasa al siguiente número válido que es el 0. De esta forma ya tenemos uno de los incómodos bucles infinitos.

Pregunta de examen en C: ¿Cómo hacer un bucle infinito?

Siguiendo con la pregunta de examen de hace unos días “¿Es un bucle infinito?” hoy toca una nueva pregunta:

¿Cómo modificarías este código para que sí fuera un bucle infinito?

NOTA: No se puede cambiar nada en la línea del for y se deben usar números enteros.

#include <stdio.h>
 
int main() {
	char i;
	for (i=0; i>=0; i++) {
		printf("Soy un bucle infinito (ciclo %d)\n", i);
	}
 
	return 0;
}

Respuesta a la pregunta de examen ¿es un bucle infinito?

Hace unos días publiqué una pregunta sobre bucles infinitos en C. Hoy os pongo la respuesta.

El programa era:

#include <stdio.h>
 
int main() {
	int i;
	for (i=0; i>=0; i++) {
		printf("Soy un bucle infinito\n");
	}
 
	return 0;
}

Aparentemente sí tenemos un bucle infinito, puesto que i empieza cumpliendo la condición i>=0 y así seguirá aunque i incremente su valor.

PEEEEERO, debemos tener en cuenta que en un int no podemos almacenar un número infinito. Por ejemplo en un compilador de 32 bits el mayor número que se puede almacenar en un int es 2.147.483.647. ¿Y qué sucede cuando llegamos al 2.147.483.648? Pues que el compilador continúa en el siguiente número válido que es el -2.147.483.647. Este número, claro, ya no cumple con la condición del for. Por lo tanto el programa finalizará en ese punto.

Así que no, no tenemos un bucle infinito. Es un bucle largo pero no infinito.

Si quieres comprobarlo sin tener que esperar un rato puedes probarlo usando un char:

#include <stdio.h>
 
int main() {
	char i;
	for (i=0; i>=0; i++) {
		printf("Soy un bucle infinito\n");
	}
 
	return 0;
}

Otra opción sería:

#include <stdio.h>
#include <limits.h>
 
int main() {
	int i;
	for (i=INT_MAX -10; i>=0; i++) {
		printf( "Am I and infinite loop? (loop %u)\n", i );
	}
 
	return 0;
}

Curso de programación en C para principiantes

Ejercicios de C resueltos y comentados

Pregunta de examen en C ¿es un bucle infinito?

En el siguiente programa ¿se produce bucle infinito? ¿por qué?

#include <stdio.h>
 
int main() {
	int i;
	for (i=0; i>=0; i++) {
		printf("Soy un bucle infinito\n");
	}
 
	return 0;
}

La respuesta en un par de días.

Curso de programación en C para principiantes

Ejercicios de C resueltos y comentados

Ejercicios de examen de C

Otro de los proyectos que tengo en marcha (suma y sigue) es un libro con ejercicios de examen de C resueltos y comentados. Para hacerlo más completo necesito más ejercicios. Si quieres colaborar puedes enviarme alguno.

¿Qué ganas enviando un ejercicio de examen?

  • Si tu ejercicio se incluye en el libro tendrás una copia gratuita del libro.

Condiciones:

  • No se trata de un servicio para solucionar problemas de examen.
  • No se admiten trabajos de clase, proyectos, ni similares, sólo ejercicios de examen.

Para colaborar rellena este formulario:

Señales en C: Contador de CTRL+C (ejemplo de SIGINT)

Os dejo aquí un sencillo ejemplo de señales que cuenta las veces que el usuario pulsa las teclas CTRL+C. El comportamiento normal al pulsar estas teclas es cerrar el programa, pero aquí asociamos la señal SIGINT (la que se produce cuando pulsamos CTRL+C) a la función contar():

#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
 
int num_pulsaciones = 0;  /* Contador de pulsaciones de  CTRL-C */
int bucle = 1;            /* Controlador de salida del bucle de espera */
void terminar_bucle ();   /* Captura la señal de alarma SIGALRM */
void contar ();           /* Captura la señal de interrupción SIGINT */
 
int main () {
    /* Asociamos la señal SIGINT a la función cortar(). La señal SIGINT la recibe el programa cuando
       se pulsa CONTROL+C. */
    signal (SIGINT, contar);
 
    /* Asocia la señal SIGALRM a la función terminar_bucle(). Cuando el programa reciba la señal alarma
       se ejecutará la función terminar_bucle. */
    signal (SIGALRM, terminar_bucle);
 
    printf ("Pulsa varias veces CTRL-C durante 15 segundos.\n");
 
    /* Programamos una alarma para dentro de 15 segundos.
       Cuando pasen 15 segundos este programa
       recibirá una señal SIGALRM. */
    alarm (15);
 
    /* Entramos en un bucle infinito del que solo saldremos 
       cuando la variable bucle cambie su valor. Esto sucederá
       cuando se ejecute la función terminar_bucle(). */
    while (bucle==1);
 
    /* Desactivamos la señal SIGINT porque ya no vamos a contar
       más veces cuando el usuario pulse CTRL+C. */
    signal (SIGINT, SIG_IGN);
 
    printf ("Has pulsado CTRL+C %d veces.\n", num_pulsaciones);
 
    return 0;
    }
 
/* Esta función se ejecutará cuando el proceso reciba la señal SIGALRM al de 15 segundos. */
void terminar_bucle () {
      // Vamos a desactivar la alarma SIGALRM. SIG_IGN hace que se ignore la señal SIGALRM.
      signal (SIGALRM, SIG_IGN);
 
      // Queremos que el bucle infinito que había en la función main se termine. Como hacemos bucle=1
      // el bucle ya no cumple la condición bucle==1 y se termina.
      bucle=0;
      printf ("¡Alarma!\n");
}
 
/* Esta función se ejecuta cada vez que se pulsa CTRL+C (señal SIGINT).
   Cuando se termine esta función el programa seguirá en el punto que se había quedado. */
void contar ()
{
    /* Primero desactivamos la señal SIGINT por si se pulsa CTRL+C 
       mientras se está ejecutando esta función. */
    signal (SIGINT, SIG_IGN);
    printf ("Has pulsado CTRL-C\n");
    num_pulsaciones++;
    // Volvemos a asociar SIGINT con la función cortar() para la próxima vez que el usuario pulse CTRL+C.
    signal (SIGINT, contar);
}

Curso de programación en C para principiantes

Ejercicios de C resueltos y comentados

Calcular los diez primeros elementos de la sucesión de Fibonacci en C

Os dejo aquí otro ejercicio de C que, por supuesto, está incluido en mi libro de ejercicios de C resueltos y comentados.

Se trata del cálculo de los primeros diez elementos de la sucesión de Fibonacci:

#include <stdio.h>
 
int main() {
    int n1, n2, numero, i;
 
    n1 = 0;
    n2 = 1;
 
    printf("0 1 ");
    for( i=0; i<8; i++) {
        numero = n1 + n2;
        printf( "%d ", numero );
        n1 = n2;
        n2 = numero;
    }
 
    return 0;
}

Comprobar si una palabra es un palíndromo en C

Con este sencillo programa escrito en C podemos comprobar si una palabra es un palíndromo (una palabra que se lee igual tanto del derecho como del revés). Esta versión la he hecho usando punteros para el acceso a los elementos de la cadena:

#include <stdio.h>
#include <string.h>
 
int main()
{
    char palabra[20];
    int i, j;
    int palindromo = 1;
    printf("Escribe una cadena: ");
    fflush(stdout);
    gets(palabra);
    j=strlen(palabra)-1;
    for(i=0; i<strlen(palabra)/2; i++, j--) {
        printf("Comprobando %c==%c\n", *(palabra+i), *(palabra+j));
        if (*(palabra+i)!=*(palabra+j)) {
            palindromo = 0;
            break;
        }
    }
    if (palindromo)
        printf("\nEs un palíndrimo.\n");
    else
        printf("\nNo es un palíndrimo.\n");
 
    return (0);
}

Comprobar si un número es primo en C

Aquí os dejo un ejemplillo de cómo se comprueba si un número es primo en C:

#include <stdio.h>
 
int main() {
	int numero, i;
	char es_primo = 1;
 
	i = 2;
 
	printf("Introduce un número: ");
	fflush(stdout);
	scanf("%d", &numero);
 
	while( i<=numero/2 && es_primo==1 ) {
		printf("Comprobando el %d.\n", i);
		if( numero % i == 0 ) {
			printf("%d es divisible al menos 
				por %d, por lo tanto no es
				primo.\n", numero, i);
			es_primo = 0;
		}
		i++;
	}
	if(es_primo)
		printf("%d es número primo.\n", numero);
 
	return 0;
}

Libro Programación avanzada en C para Linux: necesito tu opinión

Como ya comenté hace un par de días estoy preparando un libro de programación avanzada Linux con C. Busco a unos voluntarios para echarle un vistazo y darme su opinión.

¿Qué necesito?

  • Gente dispuesta a leer los capítulos que les voy enviando.
  • Por cada capítulo y revisión una opinión sobre la calidad del mismo y comentarios y sugerencias.

¿Qué ofrezco a cambio?

  • Una vez el libro esté terminado regalaré una copia a cada uno de los colaboradores.
  • Su nombre aparecerá publicado en el libro.

Condiciones

  • Aportar ideas y sugerencias. Si no recibo ningún comentario de los capítulos que voy enviando no enviaré más capítulos.
  • Rellena el formulario de abajo para apuntarte. Valoraré que me contéis quiénes sois y lo que podéis aportar (sí, tú también ¡anímate hombre!)
  • Únicamente aceptaré a los veinte primeros que se ofrezcan.

Apúntate

[contact_form]

Curso de programación en C para principiantes

Ejercicios de C resueltos y comentados