Introducción al lenguaje de programación C

Introducción

  1. Escribir una función que reciba el capital inicial, una tasa de interés y un número de años y devuelva el monto final a cobrar. La fórmula a utilizar es:

    \(C_n = C \times \left(1 + \frac x{100}\right)^n\)

    Donde \(C\) es el capital inicial, \(x\) es la tasa de interés y \(n\) es el número de años a calcular.

  2. Escribir una función que convierta un valor en grados Fahrenheit a grados Celsius. La fórmula que los relaciona es \(F = \frac95 C + 32\).

  3. Escribir una función que convierta un valor en grados Celsius a grados Fahrenheit.

  4. Escribir una función que dadas la hora, minutos y segundos devuelva el tiempo en segundos.

  5. Escribir una función que dadas las coordenadas de un vector en \(\mathbb{R}^3\), \((x, y, z)\) devuelva la norma del mismo dada por \(\sqrt{x^2 + y^2 + z^2}\).

  6. Teniendo el radio de un cilindro y su altura escribir funciones que calculen:

    1. El diámetro del cilindro.

    2. La circunferencia.

    3. El área de la base.

    4. El volumen del cilindro.

    5. El área del cilindro.

    (Notar que algunas funciones pueden resolverse llamando a las ya programadas.)

  7. Escribir una función que dado un número entero devuelva 1 si el mismo es impar y 0 si fuera par.

  8. Escribir una función que dado un número devuelva el primer número múltiplo de 10 inferior a él. Por ejemplo, para 153 debe devolver 150.

  9. Escribí una función que compare (reciba) 2 números enteros a y b. La función debe retornar un número menor, igual o mayor que cero si a es, respectivamente, menor que, igual a, o mayor que b.

  10. Escribir una función que reciba un número entero y devuelva 1 si el número es positivo y -1 si el número es negativo.

  11. Escribir una función que reciba un número entero y devuelva 1 si el número es positivo y 0 si el número es negativo.

  12. Escribir un programa que imprima, en 3 líneas separadas, su nombre, apellido y padrón. Por ejemplo:

    Nombre: Nicasio
    Apellido: Maciel
    Padron: 123456
    

Programas sencillos: Ciclos

Lectura recomendada: Los secretos de printf().

  1. Escribir un programa que imprima la tabla de multiplicar del número 7.

  2. Escribir un programa que imprima la tabla de multiplicar para los números del 1 al 10.

  3. Escribir un programa que imprima la tabla de conversión de Celsius a Fahrenheit para los valores de 0ºC a 100ºC de 10 en 10 con 2 decimales.

    Nota

    Utilizar la función programada en el ejercicio 3

  4. Escribir un programa que imprima por pantalla todas las fichas del dominó, sin repetir.

  5. El algoritmo babilonio para calcular la raíz cuadrada de un número \(n\) consta de los siguientes pasos:

    1. Se propone que el resultado de la raíz \(x\) vale un valor arbitrario, por ejemplo \(n\).

    2. Se inicializa \(y\) en 1.

    3. Mientras que la diferencia entre \(x\) e \(y\) sea superior a nuestro margen de error: a. El nuevo valor de \(x\) se calcula como el promedio entre

      \(x\) e \(y\).

      1. El nuevo valor de \(y\) se calcula como \(n / x\).

    Implementar una función que calcule la raíz cuadrada de \(n\) según este método.

  6. Escribir funciones que calculen:

    1. Factorial: \(n! = 1 \cdot 2 \cdots (n-2) \cdot (n-1) \cdot n\),

    2. Número de Euler: \(e = 1 + \frac{1}{1!} + \frac{1}{2!} + \frac{1}{3!} \cdots\),

    3. Exponencial: \(e^x = 1 + \frac{x}{1!} + \frac{x^2}{2!} + \frac{x^3}{3!} \cdots\).

    4. Producto de Wallis: \(\frac\pi2 = \left(\frac21\cdot\frac23\right)\cdot\left(\frac43\cdot\frac45\right)\cdot\left(\frac65\cdot\frac67\right)\cdot\left(\frac87\cdot\frac89\right)\cdots\).

    5. Tetración: \({}^na = \underbrace{a^{a^{\cdot^{\cdot^{a}}}}}_n\).

  7. Los coeficientes binomiales \(n\choose k\) se pueden computar como \({n\choose k} = \frac{n!}{k!(n-k)!}\), escribir una función que los calcule.

  8. La potencia de un binomio se computa como \((x + y)^n = \sum_{k=0}^n {n\choose k} x^{n-k}y^k\). Escribir una función void desarrollar_binomio(int n); que imprima los términos a calcular. Por ejemplo, para desarrollar_binomio(3); la misma debe imprimir:

    (x + y)^3 = + 1.x^3.y^0 + 3.x^2.y^1 + 3.x^1.y^2 + 1.x^0.y^3
    
  9. Escribir una función que dado un número entero lo imprima espejado. Por ejemplo: 9511 se imprime como 1159. Sugerencia: utilice los operadores módulo % y división /.

Programas sencillos: Decisiones

  1. Escribir una función es_primo que dado un número entero devuelva true si el mismo es primo y false en caso contrario.

  2. Escribir una función que dados dos números x e y imprima:

    • x es mayor que y, si x es mayor que y,

    • x y y son iguales, si los números son iguales.

  3. Escribir una función que dado un número entero devuelva su valor absoluto.

  4. Escribir una función que dada una dimensión imprima la matriz identidad de esa dimensión.

  5. Escribir un programa que calcule las 2 raíces de un polinomio de segundo grado (de la forma \(ax^2 + bx + c = d\)). Validar las operaciones a realizar (no dividir por cero ni calcular la raíz de un número negativo, o imprimir la raíz compleja).

  6. Escribir una función que dadas dos rectas definidas por su pendiente y su ordenada al origen devuelva la abcisa en la que se intersectan. Validar lo que considere necesario.

  7. Escribir funciones que resuelvan los siguientes problemas:

    1. Dado un año indicar si es bisiesto.

      Nota

      Un año es bisiesto si es un número divisible por 4, pero no si es divisible por 100, excepto que también sea divisible por 400.

    2. Dado un mes y un año, devolver la cantidad de días correspondientes.

    3. Dada una fecha (día, mes, año), indicar si es válida o no.

    4. Dada una fecha, indicar los días que faltan hasta fin de mes.

    5. Dada una fecha, indicar los días que faltan hasta fin de año.

    6. Dada una fecha, indicar la cantidad de días transcurridos en ese año hasta esa fecha.

    7. Dadas dos fechas (día1, mes1, año1, día2, mes2, año2), indicar el tiempo transcurrido entre ambas, en años, meses y días.

    Nota

    En todos los casos, invocar las funciones escritas previamente cuando sea posible.

  8. Escribir un programa que calcule la mínima cantidad de billetes (moneda peso argentino) con los que se puede obtener un monto.

    Ejemplo: 2320 ARS = (2x1000 ARS + 3x100 ARS + 1x20 ARS).

  9. Escribir una función que implemente el algoritmo de Euclides para calcular el máximo común divisor de dos números \(n\) y \(m\), dado por los siguientes pasos:

    1. Teniendo \(n\) y \(m\), se obtiene \(r\), el resto de la división entera de \(m/n\).

    2. Si \(r\) es cero, \(n\) es el MCD de los valores iniciales.

    3. Se reemplaza \(m \leftarrow n\), \(n \leftarrow r\), y se vuelve al primer paso.

  10. En el período antiguo de Egipto las fracciones sólo podían escribirse con numerador 1, por este motivo los egipcios desarrollaron un algoritmo para poder escribir cualquier fracción como una suma de fracciones de numerador 1. El algoritmo es el siguiente:

    1. Se tiene una fracción \(\frac pq\). Si \(p = 1\) o si \(p\) divide a \(q\) ya está. Tenemos una fracción de numerador 1. En el primer caso ya está expresado de esa forma, en el otro caso, basta simplificar dividiendo numerador y denominador por \(p\) y el numerador dará 1.

    2. Se elige un \(n\) como \(n = \left\lceil \frac qp \right\rceil\), donde el símbolo \(\left\lceil . \right\rceil\) representa al redondeo hacia arriba.

    3. Entonces \(\frac pq = \frac1n + \frac{pn-q}{qn}\).

    4. Se repite desde el paso 1. para la segunda fracción con \(p \leftarrow pn-q\), \(q \leftarrow qn\).

    Un ejemplo rápido, tenemos \(\frac{35}{729}\). Calculamos \(n = \left\lceil \frac{729}{35} \right\rceil = 21\). Entonces \(\frac{35}{729} = \frac1{21} + \frac{35\times21-729}{721\times21} = \frac1{21} + \frac6{15309}\). Como 6 ni es 1 ni tampoco divide a 15309 tenemos que aplicar lo mismo a esta fracción. Calculamos \(n = 2552\), hacemos las cuentas y nos queda: \(\frac{35}{729} = \frac1{21} + \frac1{2552} + \frac3{39068568}\), pero como 3 es divisor de 39068568 simplificamos y la descomposición queda: \(\frac{35}{729} = \frac1{21} + \frac1{2552} + \frac1{13022856}\), una suma de 3 fracciones de numerador 1.

    Escribir un programa que dado un p y q iniciales imprima cada una de las fracciones, para 35 y 729 debe imprimir 21, 2552 y 13022856.

  11. (Decisión múltiple) Escribir una función que dado un carácter imprima:

    si el carácter es 'A':
        "House Arryn"
    si el carácter es 'B':
        "House Baratheon"
    si el carácter es 'F':
        "House Frey"
    si el carácter es 'G':
        "House Greyjoy"
    si el carácter es 'L':
        "House Lannister"
    si el carácter es 'M':
        "House Martell"
    si el carácter es 'S':
        "House Stark"
    si el carácter es 'T':
        "House Targaryen"
    si es otro carácter:
        "No lo conozco"
    

Entendiendo C

  1. Dados los siguientes tipos

    • char

    • unsigned char

    • short

    • int

    • unsigned int

    • unsigned long

    • float

    • double

    1. ¿Cuál es el tamaño, en bytes, de cada uno y cuáles son sus valores máximos y mínimos?

    2. ¿Cuáles, si alguno, pueden tener un tamaño diferente? ¿De qué depende el cambio?

  2. Cuantificar la cantidad de memoria requerida para los siguientes problemas

    Nota

    Los vectores y las matrices ocupan tanto como la suma de sus elementos

    1. Un sistema mide un valor de temperatura float por segundo. ¿Cuánta memoria se genera por hora de registros?

    2. Una pantalla 1080p tiene una resolución de 1920x1080 pixeles. ¿Cuánta memoria hace falta para generar una imagen si...?

      • cada pixel es monocromo, es decir, ocupa 1 bit.

      • se utilizan 256 colores, es decir, 1 byte por pixel.

      • se utilizan 24 bits de color (SVGA).

    3. La cámara de fotos de un iPhone 11 tiene 12 megapixeles. ¿Cuánta memoria ocupa una foto de 24 bits de profundidad de color?

    4. El audio digital se suele almacenar en 16 bits a distintas frecuencias de muestreo. ¿Cuánto ocupa un minuto de audio mono muestreado a...?

      • 44.1 KHz (CD).

      • 192 KHz

      • un CD pero estéreo.

  3. Implementá las siguientes funciones.

    • long sumar(int a, int b),

    • long restar(int a, int b),

    • float multiplicar(int multiplicando, int multiplicador),

    • double dividir(int dividendo, int divisor), y

    • mod(): retorna el resto de una división.

    1. ¿por qué crees que se eligieron esos valores de retorno?

    2. Si ahora quisiéramos soportar operaciones en punto flotante, además de las operaciones con enteros ¿qué debería cambiar?

  4. ¿Cuál es la diferencia entre los literales 6, '6', y "666"? Defina 3 constantes distintas para cada uno de ellos.

  5. Definir las siguientes constantes:

    • M_PI con el valor 3.14159265358979,

    • STR_HOLA_MUNDO con el valor "Hola mundo",

    • NOTA_MAX con el valor 10,

    • NOTA_MIN_APROBADO con el valor 4, y

    • SEGxHORA con el valor 3600.

  6. ¿Qué diferencia hay entre los operadores = e ==?

  7. ¿Es válida la sentencia: M_PI = 3.14159;, con M_PI definida como en el ejercicio 30?.

  8. Siendo NOTA_MAX una constante definida y nota una variable

    1. ¿Es válida la sentencia NOTA_MAX == nota;?

    2. ¿Qué valores puede tomar esa sentencia?

  9. Escribir un programa que muestre por pantalla el valor de tres variables de tipo entero, real y carácter que hayan sido definidas pero no inicializadas. Compilar y ejecutar el programa. Analizar la salida que se produce.

  10. Corregir los errores en cada una de las siguientes sentencias. Nota: puede haber más de un error en cada una:

    1. printf ("El producto de %d y %d es %d"n, x, y);

    2. a + b = suma;

    3. */ Programa para obtener el máximo */

    4. if (numero => maximo)
           maximo == numero;
      
    5. printf ("El resto de dividir %d por %d es\n",
              numerador,
              denominador,
              numerador % denominador);
      
    6. if (x = y)
           print ("%d es igual a %d\n", x, y);
      
    7. print ("La suma da %dn," x + y);

  11. (Todo es memoria 1)

    1. Escribir un programa que imprima el carácter 'A'.

    2. Escribir un programa que imprima, con valor decimal, los caracteres '0' y 'J'. Nota: utilice printf().

  12. (Todo es memoria 2) Respóndase las siguientes preguntas, y luego verifíquelas escribiendo un programa que se las responda:

    1. ¿Qué diferencia hay entre 0 y '0'? ¿Es válida la operación '6' - '0'?

    2. ¿Es válida la operación 'X' - 'A'? ¿Qué obtiene al hacerla? ¿A qué tipo de variable corresponde?

  13. Escribir un programa que imprima por pantalla los valores de las constantes estándar INT_MIN, INT_MAX, RAND_MAX y UINT_MAX. ¿En qué encabezados se encuentran estas constantes?

  14. Escribí una función que imprima tu nombre, apellido y padrón. La misma no recibe argumentos.

    Nombre: Nicasio
    Apellido: Maciel
    Padron: 123456
    
    1. Utilice 3 llamadas a puts(),

    2. Utilice 1 llamada a puts(),

    3. Utilice 3 llamadas a printf().

  15. (printf()) Dado un número flotante imprimirlo:

    1. Con 2 decimales,

    2. Con 3 decimales.

    3. Con signo, sea positivo o negativo.

    4. Con 4 decimales, en ancho fijo de 10 caracteres, con signo y alineado a derecha.

  16. En C, se define que el valor entero 0 (cero) representa el valor de verdad FALSO, mientras que un valor distinto de 0 representa el valor de verdad VERDADERO. A partir del estándar ISO C99 se encuentra disponible el tipo bool, incluyendo el encabezado stdbool.h. Sin embargo, éste no se incluye en código ANSI C compatible (el estándar anterior).

    1. Escriba la sentencia para definir un tipo enumerativo que cumpla con la definición del estándar y utilice los símbolos VERDADERO (o TRUE) y FALSO (o FALSE),

    2. Escriba la sentencia para definir una variable del tipo definido,

    3. Escriba una porción de código donde se imprima por pantalla "VERDADERO" o "FALSO" según el valor de la variable declarada.

    4. ¿Cómo convertiría de este enumerativo al tipo bool?

  17. Defina el tipo enumerativo status_t con los símbolos ST_OK, ST_ERR_VALOR_NEGATIVO y ST_ERR_VALOR_NULO. Escriba un programa que le pida al usuario un número positivo, valide la entrada e imprima por pantalla "Gracias, vuelvan pronto." si el usuario ingresa un valor apropiado o, en caso de error, imprima un mensaje acorde.

  18. Defina el tipo byte_t a partir de unsigned char.

    1. Si aún no lo sabe, respóndase: ¿Qué es un byte?

  19. El estándar C99 define varios tipos de enteros [1] distintos en el encabezado stdint.h (e inttypes.h).

    1. Busque qué tipos se encuentran definidos en dicho encabezado y lístelos.

    2. ¿Qué utilidad cree que pueden tener dichos tipos?

Interactuando con el usuario

  1. Escribir un programa que calcule el inverso y la raíz de un número ingresado por teclado. Realice las validaciones necesarias. Nota: puede elegir NO calcular la raíz de números negativos o mostrar un valor complejo.

  2. Escribir un programa que dado un día del año (1 a 366) ingresado por el usuario, imprima el día de la semana que le corresponde. Debe asumir que el año comenzó, por ejemplo, un domingo. Por ejemplo: si se ingresa '5', imprime 'jueves', si se ingresa '10' imprime 'martes', si se ingresa '294' imprime 'sabado'.

  3. Escribir un programa que convierta una cantidad de segundos ingresada por teclado a horas, minutos y segundos. Realice las validaciones necesarias.

  4. Escribir un programa que cuente la cantidad de líneas ingresadas por stdin hasta el ingreso de EOF. Al finalizar, muestre el resultado por pantalla.

    Nota

    si el archivo del código fuente del programa se llama g01e44.c, ejecute el programa del siguiente modo: cat g01e44.c | ./cuenta_lineas

  5. Escribir un programa que cuente la cantidad de espacios, tabuladores, caracteres de nueva línea y letras ingresados por stdin hasta el ingreso de EOF. Al finalizar, muestre el resultado por pantalla discriminando cada cuenta.

    Nota

    si el archivo del código fuente del programa se llama g01e45.c, ejecute el programa del siguiente modo: cat g01e45.c | ./cuentas

  6. Escribir un programa que pida números al usuario en tanto no se dispare la marca de EOF (en las terminales de GNU/Linux se dispara con Control+D). Al recibir la finalización, imprima los valores máximo, mínimo, promedio del intervalo. Escriba 3 versiones del mismo: una con un ciclo do-while, otra con un ciclo while y una tercera con un ciclo for. Nota: no es necesario almacenar todos los valores ingresados por el usuario.

  7. Escribir un programa que lea de stdin una cantidad indefinida de calificaciones, hasta que se ingrese una calificación inválida. Una calificación inválida es aquella que se encuentra fuera del rango válido (por ejemplo, [0,100]). Al finalizar, debe imprimir un mensaje por stdout que indique el porcentaje de alumnos aprobados y los siguientes mensajes:

    1. Esto es raro si el porcentaje es 100%,

    2. Muy bien si el porcentaje es mayor al 80%,

    3. No está mal si el porcentaje se encuentra entre 60% y 80%,

    4. Algo no está bien si el porcentaje está entre 40% y 60%, y

    5. Algo está mal si el porcentaje es menor.

  8. Modificar el ejercicio 47 de forma tal que:

    1. la cantidad de calificaciones sea definida y la ingrese el usuario, y

    2. si se ingresa una calificación inválida, sea ignorada.

  9. Escribir un programa que pida al usuario los extremos de un intervalo y luego lea una cantidad indefinida de números. Finalizar cuando se ingrese el número 0, sin importar si está contenido en el intervalo. Al finalizar imprimir por pantalla:

    1. La cantidad de números ingresados.

    2. La cantidad de números ingresados que pertenecen al intervalo, en valor absoluto, relativo y porcentaje.

    3. Los valores mínimos y máximos ingresados.

  10. (Rendimiento del auto) Los automovilistas se encuentran preocupados por el consumo y rendimiento de su vehículo. Algunos de ellos llevan un registro con varias cargas de combustible, el costo del mismo y la cantidad de kilómetros recorridos con esa cantidad.

    Escriba un programa que permita al usuario ingresar dicha información y muestre el rendimiento (en litros / 100 km) del vehículo cada vez. Al finalizar, imprima el rendimiento promedio, el mínimo, el máximo, el total de kilómetros recorridos y el dinero utilizado.

    Lista 1 Ejemplo de ejecución
    Ingrese los kilometros recorridos (-1 para terminar): 486
    Ingrese el precio del combustible por litro: 21.38
    Ingrese el monto total utilizado en este compra: 930.24
    Rendimiento [l/100km] de este tanque >> 8.95
    
    Ingrese los kilometros recorridos (-1 para terminar): 606
    Ingrese el precio del combustible por litro: 23.57
    Ingrese el monto total utilizado en este compra: 980.04
    Rendimiento [l/100km] de este tanque >> 6.86
    
    Ingrese los kilometros recorridos (-1 para terminar): 594
    Ingrese el precio del combustible por litro: 24.89
    Ingrese el monto total utilizado en este compra: 900.16
    Rendimiento [l/100km] de este tanque >> 6.09
    
    Ingrese los kilometros recorridos (-1 para terminar): -1
    
      Rendimiento promedio [l/100km] >> 7.1919
         Mejor rendimiento [l/100km] >> 6.09
          Peor rendimiento [l/100km] >> 8.95
      Distancia total recorrida [km] >> 1686
    Combustible total consumidos [l] >> 121.25
      Costo total de su vehiculo [$] >> 2810.44
    

    Nota

    Según el algoritmo con el que se calcule el rendimiento promedio variará el resultado, por ejemplo, otro valor posible es: 7.3008.