Práctico 5: pruebas de escritorio, valores aleatorios

Parte 1: Pruebas de escritorio

Los programas siguientes son presentados sin el texto común main(){...}.

Para cada uno de esos programas, armar una tabla donde cada línea corresponde a la sentencia ejecutadia, y cada columna a cada variable que aparece en el programa.

1.1 Programas secuenciales

/* 1.1 */
int a = 1;
a = 5;
a = a * 2 ;
a = a + 1 ;
/* 1.2 */
int a = 10;
int b = 1;
b = 2;
b = a + b;
a = a - 1 ;
/* 1.3 */
int a = 10;
int b = 4;
b = a % b;
b = a % b;
a = a * b;
/* 1.4 */
int a = 17;
int b = 11;
int c = 7
a = a - b;
b = b - c;
c = a * b;

1.2 Programas con condiciones if, if-else

/* 2.1 */
int a = 1;
if (a > 10){
    a = a - 15;
} else {
    a = a + 10;
} 
/* 2.2 */
int a = 10;
int b = 1;
int c = 0;
if (a <= 10 && b >= 1){
    c = c + 1;
}
if (a < 10){
    c = c + 1;
}
if (b > 1){
    c = c + 1;
} 
/* 2.3 */
int a = 99;
int c = 0;
if (a >= 80){
    c = c + 1;
} else if (a >= 90) {
    c = c + 1;
} else if (a >= 95) {
    c = c + 1;
}
/* 2.4 */
int b = 9;
int c = 0;
if (b > 10){
    c = 1;
} else if (b > 5){
    c = 2;
} else {
    c = 3;
}

1.3 Programas con bucles while

/* 3.1 */
int i = 0;
int a = 0;
while (i < 5){
    i = i + 2;
}
/* 3.2 */
int i = 0;
int a = 0;
while (i < 4){
    if (i % 2 == 0)
        a = a + 1;
    else
        a = a - 1;
    i = i + 1;
}
/* 3.3 */
int i = 5;
int a = 0;
while (i < 4){
    if (i % 2 == 0)
        a = a + 1;
    else
        a = a - 1;
}
/* 3.4 */
int i = 0;
int a = 0;
while (i < 99){
    a = a + i;
    i = 100;
}
/* 3.5 */
int i = 1;
int a = 0;
while (i < 5){
    a = a + i;
    i = a;
}

Parte 2: Valores aleatorios

cantidad de participantes 1 o 2 participantes.

2.1 Inicializar y utilizar el generador de números aleatorios

Crear una copia del programa del ejercicio 2, llamada alea.c.

Modificar esta copia nueva de forma que no se use más scanf, sino que se consiguen valores aleatorios para las dos variables.

El cuerpo del main deber conformarse de la forma siguiente:

main(){
  int a;
  srand(time(0));
  a = rand();
  printf("este es un valor aleatorio:\n", a);

Este programa dejó de ser interactivo, ya no necesitamos darle valores manualmente, ¡los consigue solo!

2.2 Variables de acumulación y valores aleatorios

¿Qué proporción de todos los enteros naturales son divisibles por 7?

Ya lo sabemos, son 1 de cada 7. Pero podemos comprobarlo con un programa que genera valores aleatorios y comprueba, para cada uno, si cumple con alguna condicion (acá, ser divisibles por 7).

Hacer un programa buclealea.c que hace esto.

Antes del bucle, inicializamos dos variables que nos van a servir de contadores: si y no.:

int si = 0;
int no = 0;

En el bucle, que se deberá repetir 1000 veces, cada vez que el numero aleatorio cumple con la condicion, incrementamos si, sino, incrementamos no.

Despues del bucle, usar la sentencia siguiente para mostrar el porcentaje de números divisibles por 7:

printf("proporcion: %d%%\n", (100*si) / (si+no));

2.3. Juego “adivinar el número”

En este ejercicio vamos a programar un juego donde la computadora elige un número al azar entre 1 y 10, y el jugador tiene que adivinarlo.

La estructura del programa es la siguiente:

  1. el programa elige al azar un número n entre 1 y 10
  2. el usuario ingresa un número u
  3. si u no es el número exacto, el programa dice si n es más grande o más chiquito que el número ingresado
  4. repetimos desde 2. hasta que u sea igual a n

Usemos un bucle para que el programa le pida un entero al usuario por lo menos una vez y se repita hasta que sea encontrada el entero n.

El programa tiene que imprimir los mensajes adecuados para informarle al usuario qué hacer y qué pasó.

Programar el juego en un archivo adivina.c.

Parte 3: Ejercicios no obligatorios

3.1: Volviendo a la línea de comando con watch

watch es un comando que sirve para repetir otros comandos. Es interesante para repetir comandos cuya salida puede cambiar en el tiempo. Por ejemplo para ejecutar ls -l cada 2 seguntos (el intervalo de repetición por defecto), se ejecuta el comando:

watch ls -l

Para salir de watch, apretar la combinación de teclas Control + c (en línea de comando, control+c no sirve para copiar texto sino para matar el proceso corriente).

watch acepta el flag -n para especificar el intervalo de ejecución. Para ejecutar el comando date cada 5 segundos:

watch -n 5 date

Ejecutar algun programa non-interactivo que genere y use números aleatorios cada 1 segundo, usando adecuadamente watch y tcc.

3.2 Conversión de caracteres a numeros

cantidad de participantes 1 o 2 participantes.

Hacer lo siguiente en un programa llamado entero.c.

  1. Declarar una variable de tipo char con nombre c, y una variable de tipo int con nombre x. Imprimir el mensaje “Por favor ingrese un numero entre 0 y 9.”. Pedir un carácter al usuario con getchar y asignarlo a la variable char. Convertirlo a un valor entero y asignarlo a la variable de tipo int.

  2. Mostrar el valor de esa variable con printf, para eso usar el especificador de sustitución %d (d = decimal).

  3. Agregar una estructura condicional, tal que si x es mayor o igual a 5, se imprima “x es grande!” sino se imprima “x es chiquito!”.

  4. Si el número es divisible por 3, imprimir “Este numero es divisible por 3.”, sino imprimir “Este numero no es divisible por 3.”