Práctico 11: funciones

Los ejercicios se deben hacer dentro de JSLinux, y con el editor de texto vi.

1. Funciones que no devuelven resultados

cantidad de participantes 1 o 2 participantes.

  1. Definir un programa robot.c que muestra exactamente la salida siguiente:
1. limpiar
2. girar a la derecha
3. avanzar
1. limpiar
2. girar a la derecha
3. avanzar
1. limpiar
2. girar a la derecha
3. avanzar
1. limpiar
2. girar a la derecha
3. avanzar
FIN

El programa debe tener las funciones void pasos(void) y main. La función pasos se encarga de imprimir solo lo siguiente:

1. limpiar
2. girar a la derecha
3. avanzar
  1. Modificar este programa para que tenga una función void fecha(int a), para que muestre:
Estamos en el 2000!
Estamos en el 2016!
Estamos en el 2999!

Queremos que 2000, 2016, 2999 sean parámetros reales de las llamadas a la función fecha.

2. Funciones que devuelven valores

cantidad de participantes 1 o 2 participantes.

Escribir un programa bool.c que tenga el main siguiente:

main(){
 int i;
 for ( i = 0; i < 30 ; i = i + 1 )
   if ( divisible_por_3(i) )
    printf("%d es divisible por 3.\n", i);
}

Completar este programa con la función int divisible_por_3(int a) que devuelve:

3. Más funciones

cantidad de participantes 1 o 2 participantes.

Trabajamos en un archivo funciones.c nuevo.

  1. Definir la función int cuadrado(const int a) que calcula la función matemática : x ↦ x2.

Llamarla desde el main sobre algun entero aleatorio entre -50 y 50:

main(){
  int a;
  srand(time(0));
  a = (rand() % 101) - 50;  /* a tiene un valor entre -50 y +50 */
  printf("a vale %d\n", a);
  printf("a^2 vale %d\n", cuadrado(a));
}
  1. Definir la función int absoluto(const int a) que calcula la función matemática : x ↦ |x| (valor absoluto). Se puede hacer de la forma siguiente: si el parametro formal a es positivo, devolver a, sino, devolver  − a.

Llamarla desde el main:

...
printf("|a| vale %d\n", absoluto(a));
  1. Definir la función int mayor(const int a, const int b) que calcula la función matemática (x, y) ↦ {x si x ≥ y, sino y}.

Llamarla desde el main:

int b;
....
b = rand() %100; /* b tiene algun valor entre 0 y 99 */
...
printf("mayor(a, b) vale %d\n", mayor(a,b) );
  1. Agregar al programa la función int mayor_abs(const int a, const int b) que calcula el mayor del valor absoluto de dos enteros: (x, y) ↦ |x| si |x| ≥ |y|, sino |y|. Definir mayor_abs haciendo llamadas a las funciones existentes mayor y absoluta, sin usar condiciones.
...
printf("mayor_abs(a, b) vale %d\n", mayor_abs(a,b) );

4. Funciones con caracteres

cantidad de participantes 1 o 2 participantes.

En un programa cadenas.c:

  1. Escribir la función int es_minuscula(const char c) que devuelve 1 si el carácter dado es dentro del rango ‘a’ hasta ‘z’, y 0 sino.

  2. Escribir la función int es_mayuscula(const char c) que devuelve 1 si el carácter dado es dentro del rango ‘A’ hasta ‘Z’, y 0 sino.

  3. Escribir la función char cambiar_char(const char c) que, dada una minúscula, devuelve la correspondiente mayúscula, y vice versa. Si es dada otro carácter, devuelve el mismo carácter.

  4. Escribir la función void cambiar_cadena(char cadena[]) que aplica carácter por carácter la función cambiar_chara una cadena.

  5. Escribir un programa cadenas.c que lee una cadena dada por el usuario le aplica cambiar_cadena y la muestra de nuevo:

main(){
   char entrada[100];
   gets(entrada);  // gets acepta texto con espacios
   cambiar_cadena(entrada);
   printf("%s\n"entrada);
}

El resultado esperado es:

tcc -run cadenas.c
Hola Mundo!
hOLA mUNDO!

5. ¿Un programa puede conocer su nombre? Usar los parámetros del main

cantidad de participantes 1 o 2 participantes.

La función main tiene parámetros. Se pueden acceder escribiendo el main así:

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

  return 0;
}

Tenemos acceso a la variable argv que es un arreglo de elementos de tipo char *, es decir, es un arreglo de cadena de carácteres:

Cuidado que argv[i] no está siempre definido para valores i > 0.

  1. Escribir un programa nombre.c que imprime su propio nombre.
  2. Luego, hacer que imprima todos sus argumentos, y uno por línea. Para eso, usar la variable argc. Esta nos indica cuántos argumentos fueron dados a nuestro programa.

6. Mensajes secretos con rot13

Hacer un programa rot13.c que pide una frase al usuario, luego la codifica usando el algoritmo rot13, e imprime la versión codificada.

Implementar ese algoritmo rot13 en una función void rot13(char cadena[]).

rot13 es un algoritmo de codificación de mensajes muy sencillo, que permite disfrazar un mensaje mediante substitución de carácteres.

“rot13” significa “rotar 13 posiciones”, y consiste en reemplazar cada letra por la letra que está 13 posiciones adelante en el alfabeto. El resto de los caracteres no es modificado.

Por ejemplo, el texto siguiente:

En el capitulo 45 de Games of Cards, muere Kenny.

es convertido en:

Ra ry pncvghyb 45 qr Tnzrf bs Pneqf, zhrer Xraal.

rot13 es simétrico. Es decir que al mismo tiempo sirve para codificar y para decodificar un mensaje.

Pueden probar un convertidor en línea rot13.

  1. Implementar este programa pidiendo una frase al usuario con scanf. Usar por lo menos una función aparte del main (llamada rot13). Se pueden definir más funciones para ayudar a definir rot13.

  2. Hacer una versión modificada de este programa donde no se usa scanf si el programa recibe una frase como parámetro. Es decir, si se ejecuta el programa desde la linea de comando de la forma siguiente: