Conceptos Fundamentales de Programación en C: Ejercicios Resueltos
Macros en C
Se utiliza #define para incluir una macro.
- Ejemplo 1:
#define PI 3.14
(Macro constante, donde PI es el nombre y 3.14 su valor). - Ejemplo 2:
#define R(x,y) x*y
(Macro con argumentos, donde R es el nombre, x e y los argumentos y x*y el valor).
Funciones en C
Una función se declara como:
int func(int *i) {
if (i == NULL)
return 0;
return *i;
}
Y se utiliza en un programa como:
int *i = malloc(sizeof(int));
*i = 1;
printf("%d", func(i));
Esta función retorna el número 1 ya que i no es nulo. La salida por pantalla es: 1.
Ejercicio 1: Macro para Calcular el Área de un Triángulo
Macro que se llame T para calcular el área de un triángulo:
#define T(x, y) (x * y) / 2
Ejercicio 2: Valor de la Variable ‘b’
Dado el siguiente código:
int a = 0, b = 10;
do {
b++;
} while (a > b);
El valor de b es: 11
Ejercicio 3: Valor de la Variable ‘n’
Si la variable entera div = 4
y n = 6
, en la siguiente instrucción:
if (n % div != 0)
n = div++;
El valor de n es: 6, y el valor de div es 5.
Ejercicio 4: Valores de ‘i’ y ‘j’
Dado el siguiente código:
int *j = malloc(sizeof(int));
int i = *j;
main() {
*j = 20;
printf("%d %X", i, j);
}
Los valores de i y j son: 0 y la dirección de memoria asignada a j (por ejemplo, 0x5F).
Ejercicio 5: Almacenamiento en un Puntero ‘p’
En la variable p declarada como: short int *p = malloc(20);
, podemos almacenar con seguridad 10 enteros cortos.
Ejercicio 6: Función para Determinar si un Número es Primo (Retorna 0 si es primo, 1 si no lo es)
int func(int p) {
int div = 2;
while (p % div != 0)
div++;
if (p != div)
return 1;
return 0;
}
Ejercicio 7: Indexación de Punteros
La indexación de punteros se refiere a: acceder a elementos de un array a través de un puntero.
Ejercicio 8: Salida de un ‘switch’
Salida del siguiente switch
:
switch (4) {
case 1:
printf("2");
case 2:
printf("\n 1");
default:
printf("3");
}
Como el valor de entrada es 4, no se ejecutan los casos 1 ni 2, por tanto, por defecto imprime 3.
Ejercicio 9: Función para Determinar si un Número es Primo (Retorna 1 si es primo, 0 si no lo es)
int primo(int i) {
int j = 2;
while (i % j != 0)
j++;
return i == j ? 1 : 0;
}
Ejercicio 10: Salida de la Función ‘funcion1’
Dado el siguiente código:
int i[] = {5, 1, 4};
int *funcion1(int *i) {
int n = 3;
for (int j = 0; j < 3; j++)
i[j] = n - j;
return i;
}
La salida es: i[0] = 3; i[1] = 2; i[2] = 1;
Ejercicio 11: Valor de ‘j’
#include
float r = 1.2;
main() {
int j = 10 * (int)r;
printf("%d", j);
}
El valor de j es: 10
Ejercicio 12: Memoria más Rápida
La memoria más rápida se encuentra en el microprocesador (registros).
Ejercicio 13: Macro para el Máximo de Dos Números
Macro para el máximo de dos números:
#define maximo(a, b) ((a) > (b) ? (a) : (b))
Ejercicio 14: Macro para el Área de un Rectángulo
Macro para el área de un rectángulo:
#define area(a, b) (a * b)
Ejercicio 15: Estructura en C
Una estructura se define como:
struct Ag {
char nombre[20];
char apellido[20];
char DNI[10];
} ag;
Para escribir el DNI:
scanf("%s", ag.DNI);
Ejercicio 16: Valor de ‘b’ en un Bucle ‘while’
Dado el siguiente código:
int a = 0, b = 10;
while (a > b)
b = a;
El valor de b es: 10
int a = 0, b = 10;
do {
b = a;
} while (a > b);
El valor de b es: 0
Ejercicio 17: Valor de ‘n’ en un Bucle ‘while’
Si la variable entera div = 2
y n = 11
, en la siguiente instrucción:
while (n % div != 0)
n = ++div;
El valor de n es: 3
Ejercicio 18: Valores de ‘i’ y ‘j’ (2)
int *j = malloc(sizeof(int));
int i = *j;
main() {
int *j = &i;
printf("%d %x", i, j);
}
Los valores de i y j son: 0 y la dirección de memoria de i (por ejemplo, 0x12).
Ejercicio 19: Caracteres que se Pueden Escribir
Dado c = (int *)malloc(20 * sizeof(int));
, se pueden escribir 40 caracteres (asumiendo que sizeof(int)
es 4 y sizeof(char)
es 1, y que se quiere escribir caracteres en un espacio reservado para enteros).
Ejercicio 20: Salida de ‘funcion1’
funcion1(int i) {
float r = 5;
}
La salida es: indefinida, ya que la función no tiene un valor de retorno especificado.
Ejercicio 21: Clasificación de Palabras
- struct: Palabra clave (C)
- fprintf: Función (F)
- unsigned: Palabra clave (C)
- stdio.h: Fichero de cabecera (FC)
- stdin: Palabra clave (C)
- return: Palabra clave (C)
- for: Palabra clave (C)
- while: Palabra clave (C)
- string.h: Fichero de cabecera (FC)
- scanf: Función (F)
Ejercicio 22: Valor de ‘j’ que se Imprime
#include
int j = 7;
main() {
int j = 9;
printf("%x", &j);
}
El valor de j que se imprime es la dirección de memoria de la variable local j (por ejemplo, 0x23).
Ejercicio 23: Almacenamiento de un Programa en Ejecución
Si se dispone de memoria suficiente, un programa en ejecución se almacena en la memoria principal (RAM).
Ejercicio 24: Macro M(a,b)
Una macro es declarada como #define M(a,b) (a)?a:b
. La función equivalente sería:
float M(float a, float b){
if(a>b){
return a;
} else {
return b;
}
}
Ejercicio 25: Completar el Código para Escribir Campos de una Estructura
struct Libro {
char *autor;
int paginas;
};
struct Libro *lib;
lib = (struct Libro *)malloc(sizeof(struct Libro));
lib->autor = (char *)malloc(20);
scanf("%s", lib->autor);
scanf("%d", &lib->paginas);
Ejercicio 26: Salida de un ‘switch’ (2)
switch (1) {
case 1:
printf("2");
case 2:
printf("\n 1");
default:
printf("3");
}
Salida: 2
1
3
Ejercicio 27: Diferencia entre Variable Global y Local
Una variable global se distingue de una local en:
- b) Su ámbito
- c) La variable global se inicializa a cero por defecto
Ejercicio 28: Salida de un Programa con ‘malloc’
main() {
unsigned *p = (unsigned *)malloc(sizeof(unsigned));
*p = 10;
printf("%X, %u", p, *p);
}
La salida es la dirección de memoria asignada a p (por ejemplo, 0x20) y el valor 10.
Ejercicio 29: Reescribir una Instrucción ‘while’ con ‘for’
Reescribir la siguiente instrucción utilizando un bucle for
:
while (act++->sig);
Equivalente en for
:
for (; act->sig != NULL; act++);
Ejercicio 30: Caracteres que se Pueden Escribir (2)
En la instrucción c = (char *)malloc(m * sizeof(char));
, se pueden escribir m caracteres.
Ejercicio 31: Tamaño en Bits del Contenido de un Puntero
Si un entero ocupa 4 bytes, el tamaño en bits del contenido del puntero p = (int *)malloc(10 * sizeof(int));
es 32 bits (el tamaño de una dirección de memoria, no el bloque de memoria reservado).
Ejercicio 32: Programa para Convertir de Binario a Decimal
int n, decimal, i;
int bitBin[] = {1, 0, 0, 1, 1, 1};
n = sizeof(bitBin) / sizeof(int);
decimal = 0;
for (i = 0; i < n; i++) {
decimal = decimal * 2 + bitBin[i];
}
printf("%d", decimal);