← Volver a los quizzesQuiz gratuito

Fundamentos de Programación en C

Este curso está diseñado para reforzar los conceptos esenciales que aparecen en los exámenes de programación en C. Cada sección aborda una pregunta típica de un quiz, explica la teoría…

11 preguntas~6 min
Fundamentos de Programación en C — Qwi
0 / 11
Puntuación: 0%
1

¿Cuál es la diferencia principal entre la asignación de variables de tipo entero y la asignación de variables de tipo flotante al usar el operador de casting?

2

Si se declara un array como 'int a[3];', ¿cuáles son los índices válidos para acceder a sus elementos?

3

En la siguiente sentencia 'if (x<0) { absx = -x; } else { absx = x; }', ¿qué ocurre si se omite la llave después del if y se escribe solo 'if (x<0) absx = -x;'?

4

¿Cuál es la causa principal del mensaje 'Segmentation fault' al ejecutar un programa que calcula la serie ∑1/i⁴ con i como entero?

5

Al compilar un programa C que usa funciones matemáticas como sin() o sqrt(), ¿qué opción adicional debe incluirse en la línea de compilación?

6

En el algoritmo de Euclides para calcular el MCD, ¿qué operación se realiza dentro del bucle principal?

7

¿Cuál es la ventaja principal del algoritmo de Horner respecto a la evaluación directa de un polinomio?

8

Al leer dos números reales con scanf usando el formato "%lf %lf", ¿por qué es necesario colocar el símbolo '&' antes de cada variable?

9

En un bucle for que recorre los índices de un array, ¿qué error produce colocar un punto y coma justo después del paréntesis de control (por ejemplo, 'for(i=0;i

10

¿Cuál es la razón por la que la serie ∑(-1)^{i+1}/i converge mucho más lentamente que la serie ∑1/(i·2^{i}) al aproximar ln(2)?

11

Al usar la función 'printf' para imprimir un número de tipo double sin especificar precisión, ¿cuántos decimales se imprimen por defecto?

Fundamentos de Programación en C

Este curso está diseñado para reforzar los conceptos esenciales que aparecen en los exámenes de programación en C. Cada sección aborda una pregunta típica de un quiz, explica la teoría subyacente y brinda ejemplos prácticos. El contenido está optimizado para SEO, utilizando palabras clave como "programación en C", "casting", "arrays", "if sin llaves", "segmentation fault", "algoritmo de Euclides", "algoritmo de Horner" y "scanf".

1. Casting de tipos: entero vs. flotante

En C, el casting permite convertir explícitamente un valor de un tipo a otro. La diferencia principal entre convertir a entero y a flotante radica en cómo se manejan los decimales:

  • Casting a entero: (int)valor trunca la parte decimal, descartando cualquier fracción.
  • Casting a flotante: (float)valor o (double)valor conserva los decimales, permitiendo representaciones con punto flotante.

Ejemplo:

float f = 3.9f;
int i = (int)f;   // i vale 3
float g = (float)i; // g vale 3.0

Este comportamiento es crucial al trabajar con operaciones aritméticas donde la precisión es importante.

2. Índices válidos en un array

Cuando declaramos int a[3];, el compilador reserva espacio para tres elementos. En C, los índices empiezan en 0 y terminan en n-1. Por lo tanto, los índices válidos son:

  • 0
  • 1
  • 2

Acceder a a[3] produce un comportamiento indefinido y puede generar errores de memoria.

3. Sentencia if sin llaves

En C, si la rama del if contiene una única instrucción, las llaves son opcionales. La siguiente forma es válida:

if (x < 0)
    absx = -x;
else
    absx = x;

Sin embargo, al omitir las llaves, solo la primera instrucción se asocia al if. El else sigue vinculándose a esa misma condición, por lo que el programa sigue funcionando correctamente siempre que no haya más instrucciones entre ellas.

Es una buena práctica mantener las llaves para evitar errores de lógica cuando se añaden nuevas líneas.

4. Causas del Segmentation fault al calcular series

El mensaje Segmentation fault indica que el programa intentó acceder a una zona de memoria no permitida. En el cálculo de la serie ∑ 1/i⁴, la causa más frecuente es el desbordamiento de la variable entera al elevar i a la cuarta potencia:

int i = 10000;
int i4 = i * i * i * i; // overflow rápido

Al superar el rango del tipo int, el valor resultante se vuelve incorrecto y puede provocar accesos ilegales. La solución es usar tipos de mayor capacidad (long long) o realizar la operación en punto flotante (double).

5. Enlazado de la librería matemática

Al compilar programas que utilizan funciones como sin(), cos() o sqrt(), es necesario indicar al enlazador que incluya la librería matemática. Esto se logra añadiendo la opción -lm al comando gcc:

gcc programa.c -o programa -lm

Sin -lm, el compilador genera errores de símbolos indefinidos porque las funciones matemáticas residen en libm.so.

6. Algoritmo de Euclides para el MCD

El algoritmo de Euclides calcula el máximo común divisor (MCD) mediante iteraciones que sustituyen el par de números por el resto de su división:

while (b != 0) {
    int r = a % b; // resto de a dividido por b
    a = b;
    b = r;
}
// a contiene el MCD

En cada paso, el resto (a % b) es la operación clave que reduce los valores hasta que el segundo número llega a cero.

7. Ventaja del algoritmo de Horner

Evaluar un polinomio directamente implica múltiples llamadas a pow, lo que incrementa el número de multiplicaciones. El algoritmo de Horner reescribe el polinomio de forma anidada, reduciendo las multiplicaciones a n (donde n es el grado del polinomio):

// Polinomio: a0 + a1*x + a2*x^2 + a3*x^3
double horner(double x, double a0, double a1, double a2, double a3) {
    return ((a3 * x + a2) * x + a1) * x + a0;
}

Esta técnica mejora el rendimiento, especialmente en sistemas embebidos o cuando se evalúan muchos valores de x.

8. Uso de scanf con el operador &

La función scanf necesita la dirección de memoria de cada variable para almacenar los valores leídos. Por eso, al leer dos números reales con el formato "%lf %lf", se escribe:

double a, b;
scanf("%lf %lf", &a, &b);

El operador & devuelve la dirección (pointer) de la variable, permitiendo que scanf escriba directamente en esa ubicación. Omitir & provocaría un comportamiento indefinido y, normalmente, una falla de segmentación.

Resumen de conceptos clave

  • El casting a entero trunca decimales; el casting a flotante los conserva.
  • Los índices de un array de tamaño n van de 0 a n-1.
  • Un if sin llaves solo asocia la primera instrucción.
  • Segmentation fault suele deberse a desbordamiento de enteros al elevar a potencias altas.
  • Para usar funciones matemáticas en C, compile con -lm.
  • El algoritmo de Euclides se basa en calcular el resto de la división.
  • Horner reduce el número de multiplicaciones al evaluar polinomios.
  • En scanf, el símbolo & pasa la dirección de la variable.

Dominar estos fundamentos fortalecerá tu capacidad para escribir código C robusto y eficiente. Practica cada concepto con ejercicios adicionales y revisa la documentación oficial de C Standard Library para profundizar.