Práctico 3: variables, getchar, estructuras condicionales

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

Parte 1: ASCII, printf, variables

1.1. Programas con putchar y código ASCII

cantidad de participantes 1 o 2 participantes.

  1. Escribir un programa que use solamente la función putchar (varias veces) y solo con constantes numéricas, usando el código ASCII, con salida:

    Hola
    [salto de línea]
  2. Con la misma consigna, escribir otro programa cuya salida es:

    :)
    [salto de línea]
  3. Con la misma consigna, escribir otro programa cuya salida es:

    "Hola! \o/"
    [salto de línea]

1.2. Programas que generan programas

cantidad de participantes 1 o 2 participantes.

  1. Usando las funciones printf y putchar, escribir un programa padre.c que imprime exactamente el programa siguiente:

    main(){
      printf("Hola!\n");
    }

    Hay varias formas de conseguir el mismo resultado.

  2. Comprobar que la salida generada es correcta de la manera siguiente:

    tcc -run padre.c > hijo.c
    tcc -run hijo.c

    El primer comando toma la salida de la ejecución de padre.c y la guarda en un archivo nuevo hijo.c. El segundo comando ejecuta el programa hijo.c.

1.3. Sustituciones en printf

cantidad de participantes 1 o 2 participantes.

  1. En cada caso, ¿cuál es la cadena de carácteres impresa?

    1. printf("bo%ca", 't');
    2. printf("pa%sta", "l");
    3. printf("%src%c", "cha", 'o');
    4. printf("c%cc%sr%cl%c", 'o', "od", 'i', 'o');
  2. Escribir un programa que tenga la salida siguiente, con un solo uso de la función printf y usando sustitución de carácteres para mostrar las comillas (con el carácter de conversión %c):

    "Hola"[salto de línea]

1.4. Variables de tipo char *

cantidad de participantes 1 o 2 participantes.

  1. Consideramos el programa siguiente:

    main(){
      printf("Hey!\n");
    }

    Modificarlo (pero manteniendo su salida) para que la línea del printf sea como sigue:

      printf(mensaje);

    Para eso, declarar una variable nueva de tipo char * y de nombre mensaje.

  2. Consideramos el programa queen.c siguiente:

    main(){
      printf("%s all,%s all, %s all,and %s now\n",
             "I want it", "I want it", "I want it", "I want it");
    }
    1. Modificar este programa de forma que la constante cadena de caracteres "I want it" aparezca una sola vez en el código. Para eso definir una variable nueva.
    2. Definir una segunda variable de tipo cadena de caracteres para que la llamada a la función printf no tenga ninguna constante cadena de caracteres.

Parte 2: getchar, condiciones, variables enteras

2.1. getchar, comparaciones y estructuras condicionales

cantidad de participantes 1 o 2 participantes.

  1. Escribir un progama que pida al usuario un carácter, luego si el carácter es 'a' imprime “Hola!”, sino imprime “Buen dia.”, y luego imprime (en todos casos) “Adios!”.

  2. Escribir un programa que imprima primero “Ingrese una letra, mayuscula o minuscula”. Pedir un carácter con getchar. Luego, usando un solo operador relacional, si el carácter es una mayúscula imprimir “Es una mayuscula!”, sino es imprimir “Es una minúscula!”. (Estamos suponiendo que el usuario ingresa o una mayúscula o una minúscula, ninguna otra cosa).

2.2. Condiciones con operadores lógicos, else if

cantidad de participantes 1 o 2 participantes.

  1. Escribir un programa que pida al usuario un carácter. Si el carácter es 'a', 'e', 'i', 'o' o 'u', imprime “Es una vocal minuscula.”, sino, imprime “No es una vocal minuscula”.

  2. Escribir un programa que imprime primero “Ingrese un numero, o una letra mayuscula o minuscula.”. Luego, pida al usuario un carácter. Si es un número, imprimir “Es un número!”. Si no, si es una letra mayuscula imprimir “Es una letra mayuscula!”. Sino, si es una letra minuscula imprimir “Es una letra minuscula!”. Sino, imprimir “No se lo que es!”. (Ahora estamos suponiendo que el usuario puede ingresar cualquier carácter.) Para cada condición usar el operador lógico && y operadores relacionales para comprobar que el carácter dado es parte de un rango de carácteres.

2.3. Ingreso directo de de valores con scanf, estructuras condicionales anidadas

cantidad de participantes 1 o 2 participantes.

  1. Crear un programa llamado scanf.c con el contenido siguiente:

    En la llamada a la función scanf, observar el uso del operador &.

  2. Agregar una estructura condicional tal que si el número ingresado es estrictamente mayor a 100, se imprime “Este numero es mayor a 100.”, sino se imprime “Este numero es menor que 100”.

  3. Solo en el caso que el número es mayor que 100, agregar una estructura condicional tal que si el número es par, se imprime “Este numero es par.” , sino se imprime “Este número es impar.”

Parte 3: Ejercicios difíciles pero interesantes

3.1. Programa auto-replicante

cantidad de participantes De 1 a 3 participantes.

  1. Escribir un prograna cuya salida es su proprio código fuente.

3.2. El primer parámetro de la función main: argc

cantidad de participantes 1 o 2 participantes.

Hacer lo siguiente en un programa llamado argc.c.

  1. Escribir así el esqueleto de su programa:

  2. Mostrar el valor del entero argc usando printf. argc representa la cantidad de parametros que recibe el ejecutable. Probar de las siguientes maneras:

    O si compilan el programa con tcc argc.c:

    Estamos variando la cantidad de argumentos que le pasamos a nuestro programa. Podemos ver que el valor de la variable argc cambia en función de eso.

  3. Agregar al programa lo necesario para que imprima “No diste ningun argumento.” si no se dio ningun argumento al programa, sino, “Diste 1 argumento” si se dio un argumento, sino “Diste x argumentos” (con “x” reemplazado por el número, y la palabra “argumentos” en plural) si se dio 2 o más argumentos.

  4. Este programa ya es un poco más largo que el resto, ¿no?

    Para descargarlo desde JSLinux, hacer lo siguiente desde la línea de comandos:

2.3. El operador &, mostrar las direcciones en memoria de las variables

cantidad de participantes 1 o 2 participantes.

  1. Crear un programa llamado direccion.c. Declarar una variable de tipo char con nombre c, y otra de tipo int con nombre x, sin asignarles valores iniciales. Mostrar su dirección en memoria, usando printf, el especificador de conversión %p y el operador &.

  2. Ejecutar el programa varias veces y observar la salida.