ejercicios de lenguaje c
1. compensación de macro
Primero debemos entender qué es la macro offsetof:
Esta macro en forma funcional devuelve el valor de desplazamiento, en bytes, de un miembro miembro de una estructura de datos o tipo de unión.
.El valor devuelto es un valor entero sin signo de tipo size_t con el número de bytes entre el miembro especificado y el comienzo de su estructura.
¿Qué significa?, puedes ver la imagen a continuación:
Veamos este ejercicio:
Contenido del ejercicio:
escriba una macro para calcular el desplazamiento de una variable en la estructura con respecto a la primera dirección.
Ideas para resolver problemas:
según el significado de la pregunta, primero debemos definir una macro OFFSETOF. Debido a que queremos devolver el desplazamiento de la variable miembro en relación con la posición inicial, debemos pasar el nombre de la estructura y la variable miembro. nombre; entonces, ¿cómo calcular el desplazamiento
?
Podemos tomar la dirección inicial como 0x00000000 y luego devolver la dirección de la variable miembro y el resultado es el desplazamiento;
Demostración de código:
#include<stdio.h>
#define OFFSETOF(STN,MEN) (int)&(((struct S*)0)->MEN)
typedef struct S
{
int a;
char b;
char c;
int d;
}node;
int main()
{
printf("%d\n", OFFSETOF(node S, a));
printf("%d\n", OFFSETOF(node S, b));
printf("%d\n", OFFSETOF(node S, c));
printf("%d\n", OFFSETOF(node S, d));
return 0;
}
}
Resultado de salida:
análisis:
2. Intercambiar bits de paridad
Contenido del ejercicio:
escriba una macro que pueda intercambiar los bits pares e impares de los dígitos binarios de un número entero.
Ideas para resolver problemas:
según el significado de la pregunta, primero debemos definir una macro INTERCAMBIO y pasar el nombre de la variable a intercambiar;
debido a que necesitamos intercambiar los bits pares e impares, podemos eliminar los impares. y bits pares respectivamente, y luego desplazar los bits impares un bit hacia la izquierda,
los bits pares se desplazan un bit hacia la derecha y el resultado de la suma es el resultado después del intercambio;
Demostración de código:
#include<stdio.h>
#define EXCHANGE(n) (((n&0x55555555)<<1)+((n&0xaaaaaaaa)>>1))
int main() {
int a = 21;
int b = EXCHANGE(a);
printf("%d", b);
return 0;
}
Resultados de ejecución:
Análisis:
3. Retire la matriz en su lugar.
Contenido del ejercicio:
elimine todos los elementos val de la matriz en su lugar. Se requiere que la complejidad del tiempo sea O (N) y la complejidad del espacio sea O (1). Requisito: después de eliminar los
elementos que deben eliminarse de la matriz, regrese la nueva longitud de la matriz.
Ideas para resolver problemas:
De acuerdo con el significado de la pregunta, podemos usar el método de doble puntero para esta pregunta. Primero, deje que un puntero apunte a la posición inicial de la matriz y luego el segundo puntero se mueva con el bucle for. Si encuentra el número que no es el número que se va a eliminar, se eliminará. Muévase a la posición del primer puntero y luego mueva el primer puntero hacia atrás, de modo que el primer puntero eventualmente apunte al siguiente dígito de la matriz final. , y su subíndice de posición es la longitud de la nueva matriz;
Demostración de código:
#include<stdio.h>
int removeElement(int* nums, int numsSize, int val) {
int pos = 0;
for (int i = 0; i < numsSize; i++) {
if (nums[i] != val) {
nums[pos] = nums[i];
pos++;
}
}
return pos;
}
int main() {
int arr[] = {
0,1,2,2,3,0,4,2 };
int val = 2;
int len = sizeof(arr) / sizeof(arr[0]);
int ret=removeElement(arr,len,val);
for (int i = 0; i < ret; i++) {
printf("%d ", arr[i]);
}
return 0;
}
Resultados de ejecución:
Análisis:
Resumir
Estas preguntas del examen son lo que creo que son ejemplos típicos, así que se las mostraré aquí; ¡
espero que todos estudien mucho y progresen todos los días!