Ejercicios para practicar el lenguaje C.

Insertar descripción de la imagen aquí


1. compensación de macro

Primero debemos entender qué es la macro offsetof:
Insertar descripción de la imagen aquí

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:
Insertar descripción de la imagen aquí
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:
Insertar descripción de la imagen aquí
análisis:
Insertar descripción de la imagen aquí

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:
Insertar descripción de la imagen aquí
Análisis:
Insertar descripción de la imagen aquí

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:
Insertar descripción de la imagen aquí
Análisis:
Insertar descripción de la imagen aquí


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!

Supongo que te gusta

Origin blog.csdn.net/mdjsmg/article/details/131967576
Recomendado
Clasificación