Ejercicios para practicar el lenguaje C (la segunda parte del verano)

Insertar descripción de la imagen aquí


Prefacio

¡Di cosas importantes tres veces!
¡estudiar! ¡estudiar! ¡estudiar!


1. Juicio de expresión

Para el fragmento de código, la siguiente descripción es correcta ( )

t=0;
while(printf("*"))
{
    
    
    t++;
    if (t<3)
        break;
}

A: La expresión de control de bucle es equivalente a 0
B: La expresión de control de bucle es equivalente a '0'
C: La expresión de control de bucle es ilegal
D: Ninguna de las afirmaciones anteriores es correcta

Análisis de la pregunta:
porque el valor de retorno de la llamada a la función print("*") es el número de caracteres en la cadena, que es 1.
Por lo tanto, la condición después de while siempre es verdadera, por lo que la expresión de control de bucle es equivalente a '0' (el carácter '0' no es 0).
La respuesta correcta es B

Respuesta a la pregunta:
B


2. Comprensión y aplicación del código Assii.

Cuando se ejecuta el siguiente programa, si se ingresa 1abcedf2df <Enter>, el resultado de salida es ( )

#include <stdio.h>
int main()
{
    
    
    char ch;
    while ((ch = getchar()) != '\n')
    {
    
    
        if (ch % 2 != 0 && (ch >= 'a' && ch <= 'z'))
        ch = ch - 'a' + 'A';
        putchar(ch);
    }
    printf("\n");
    return 0;
}

A: 1abcedf2df
B: 1ABCEDF2DF
C: 1AbCEdf2df
D: 1aBceDF2DF

Análisis del problema:
el programa primero considera si el valor del código ASCII de ch es un número impar, luego verifica si es una letra minúscula y, cuando ambos están satisfechos, se cambia a una letra mayúscula.

Respuesta a la pregunta:
C.


3. Juicio de salto de bucle

Sabemos que la declaración de interrupción en lenguaje C solo puede saltar del bucle más cercano, pero a veces necesitamos saltar de múltiples bucles. La forma correcta de saltar de múltiples bucles a continuación es [Opción múltiple] ( ) A: Escriba el programa como una
función Finalice la función con retorno para saltar del bucle
B: modifique la condición del bucle externo, por ejemplo

for( int i = 0 ; i < MAX1 ; i ++ )
{
    
    
    for( int j = 0 ; j < MAX2 ; j ++ )
    {
    
    
        if( condition )
        {
    
    
            i = MAX1;
            break;
        }
    }
}

C: establecer condiciones de juicio en el bucle exterior, por ejemplo

for( ; symbol != 1 && condition2 ; )
{
    
    
    for( ; symbol != 1 && condition3 ; )
    {
    
    
        if( condition1 )
        symbol = 1 ;
    }
}

D: agregue una pausa después del bucle exterior, por ejemplo

for( ; condition2 ; )
{
    
    
    for( ; condition3 ; )
    {
    
    
        if( condition1 )
            symbol = 1 ;
    } 
        if(symbol == 1 )
             break ;
}

Análisis de preguntas:
esta pregunta tiene como objetivo clasificar los métodos para saltar de bucles de varios niveles. Cada opción es correcta. El código es un pseudocódigo y la condición representa una expresión lógica.

Respuesta a la pregunta:
ABCD


4. Número de veces que aparece un número en orden ascendente

Enlace de pregunta Enlace al DO
Insertar descripción de la imagen aquí

Análisis del problema:
también se puede resolver mediante recorrido, pero la matriz está en orden no descendente. La idea de búsqueda binaria es la mejor. Primero busque la posición digital más a la izquierda mediante búsqueda binaria y luego busque binariamente la posición digital más a la derecha. .La resta de las dos posiciones + 1 es la longitud. Si
el valor del medio es mayor que el valor que buscas: el número que buscas debe estar a la derecha, izquierda = medio + 1; si
el valor del medio es menor que el valor que buscas: entonces el número que buscas debe estar a la izquierda, derecha = medio - 1,
el valor del medio es el mismo que el valor que buscas, los valores son los mismos:
el número más a la izquierda que se puede encontrar: si mid está a la izquierda, simplemente regrese a mid; de lo contrario, restablezca la derecha = mid-1 y desplace continuamente el centro hacia la izquierda. El número más a la derecha a encontrar: si mid es la derecha, simplemente regrese a mid. , de lo
contrario reset left=mid+1 y desplazar continuamente el centro hacia la derecha.Respuesta

a la pregunta:

int get_last_or_first_idx(int* data, int len, int k,int flag) {
    
    
    int left = 0, right = len - 1, mid;//左右指针下标及中间结点下标
    while (left <= right) {
    
    
        mid = left + (right - left) / 2;//找到中间结点
        if (data[mid] > k)
            right = mid - 1;//如果中间节点大于k,则将右节点左移
        else if (data[mid] < k)
            left = mid + 1;//如果中间节点小于k,则将左节点右移
        else {
    
    //如果中间节点值等于k,则判断flag的值来区分找的是哪边
            if (flag == 0) {
    
     
                if (mid == left || data[mid - 1] != k) return mid;//如果中间结点等于k,且前一个结点不等于k,以及和left位置相同,则找到最左边的k,返回下标
                else right = mid - 1;
            } else {
    
    
                if (mid == right || data[mid + 1] != k) return mid;//如果中间结点等于k,且后一个结点不等于k,以及和right位置相同,则找到最右边的k,返回下标
                else left = mid + 1;
            }
        }
    }
    return -1;
}
int GetNumberOfK(int* data, int dataLen, int k ) {
    
    
    if (dataLen == 0) return 0;
    int left = get_last_or_first_idx(data, dataLen, k, 0);
    int right = get_last_or_first_idx(data, dataLen, k, 1);
    if (left == -1 && right == -1) return 0; 
    return right - left + 1;//左右下标相减得到k的个数
}

5. Conversión de enteros

Enlace de pregunta: enlace del DO
Insertar descripción de la imagen aquí

pista:

El rango de A y B está entre [-2147483648, 2147483647]

Análisis de la pregunta:
En realidad, cuando se pregunta cuántos bits deben modificarse, la pregunta es cuántos bits son diferentes, porque solo se pueden modificar cuántos bits son diferentes;

Pregunta respuesta:

int convertInteger(int A, int B){
    
    
    int a=A^B;//相同为0,相异为1
    double count=0;
    for(int i=0;i<32;i++){
    
    
        if((a>>i)&1==1){
    
    //通过与1与,得到求出的数二进制序列中有多少个1,从而确定个数;
            count++;
        }
    }
    return count;
}

6. Aplicación de declaraciones de bucle

¿Cuál de las siguientes descripciones es correcta ( )
A: La declaración break solo se puede usar en el cuerpo del bucle y en el cuerpo de la declaración switch
B: Cuando aparece break en el cuerpo de la declaración switch en el cuerpo del bucle, su función es saltar de el cuerpo de la declaración de cambio y terminar el cuerpo del bucle. La función de ejecutar
la declaración C: continuar es terminar el ciclo después de ejecutar las declaraciones restantes en el cuerpo del bucle.
D: La declaración continuar no se puede utilizar en declaraciones while y declaraciones do- while .

Análisis de preguntas:
la declaración de interrupción se usa generalmente en declaraciones de bucle y declaraciones de cambio. Cuando se usa break en una declaración de cambio, el programa puede saltar fuera del interruptor y ejecutar las declaraciones después del cambio;
cuando se usa break en una declaración de bucle do- while, for, while, el programa puede terminar el bucle y ejecutar el declaraciones después del bucle, es decir, el bucle se romperá cuando se cumplan las condiciones.
La función de la declaración de continuación es omitir las declaraciones restantes en el cuerpo del ciclo y forzar la ejecución del siguiente ciclo. Hay errores en las tres opciones B, C y D. Por lo tanto, la respuesta correcta a la opción A es

:
A


7. Llamada de función

Supongamos que la descripción de la función fun y el grupo de parámetros real está en la siguiente forma, luego en la declaración de llamada de función, la correcta es ()

void fun(char ch,float x[]);
float a[10];

A: diversión(“asd” , a[]); B: diversión('x', A); C: diversión('68', 2,8); D: diversión(32, a);

Análisis de la pregunta:
Para pasar parámetros en la matriz de la opción A, solo necesita escribir el nombre de la matriz. a[] está mal. El segundo parámetro de la opción B está escrito en mayúsculas, lo cual es incorrecto. El segundo parámetro de la opción C es un número de punto flotante, pero el segundo parámetro de la función divertida es una matriz que no coincide. El parámetro x de la función divertida necesita pasar una matriz o un puntero flotante *. Solo la forma de la opción D es correcto.
Respuesta a la pregunta:
D.


8. Intersección de dos matrices.

Enlace de pregunta: enlace del DO
Insertar descripción de la imagen aquí

pista:

1 <= números1.longitud, números2.longitud <= 1000
0 <= números1[i], números2[i] <=1000

Análisis de la pregunta:
Para pasar parámetros en la matriz de la opción A, solo necesita escribir el nombre de la matriz. a[] está mal. El segundo parámetro de la opción B está escrito en mayúsculas, lo cual es incorrecto. El segundo parámetro de la opción C es un número de punto flotante, pero el segundo parámetro de la función divertida es una matriz que no coincide. El parámetro x de la función divertida necesita pasar una matriz o un puntero flotante *. Solo la forma de la opción D es correcto.
Pregunta respuesta:

int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {
    
    
    static int arr[1000];//定义静态,防止销毁
    *returnSize = 0;//返回数组大小
    for (int i = 0; i < nums1Size; i++) {
    
    //将nums1中的每个数遍历nums2找到相同的数
        for (int j = 0; j < nums2Size; j++) {
    
    
            if (nums1[i] == nums2[j]) {
    
    
                int k = 0;
                for (k = 0; k < *returnSize; k++) {
    
    //遍历arr数组看是否已经存在,找到了返回下标
                    if (arr[k] == nums2[j])
                        break;
                }
                if (k == *returnSize) {
    
    //如果k等于*returnSize则说明数组中不存在该数,则向数组中加入该数
                    arr[*returnSize] = nums2[j];
                    (*returnSize)++;//返回数组长度+1
                }
            }
        }
    }
    return arr;
}

9. Conceptos básicos del lenguaje C.

Entre las siguientes descripciones de funciones del lenguaje C, la correcta es [Elección múltiple] ( )
A: En el lenguaje C, una función generalmente consta de dos partes, que son el encabezado de la función y el cuerpo de la función
B: los parámetros reales y la forma de la Los parámetros de función pueden tener el mismo nombre
C: Las variables definidas en main() se pueden usar directamente en otras funciones llamadas
D: En los programas C, las llamadas a funciones no pueden aparecer en declaraciones de expresión

Análisis de la pregunta:
Las variables locales definidas en la función principal solo son válidas en la función principal, porque la función principal también es una función y tiene una relación paralela con otras funciones. Error de C; cuando la función tiene un valor de retorno, puede aparecer en la expresión, D
Respuesta incorrecta:
AB


10. Organización de imágenes

Enlace de pregunta: enlace del DO
Insertar descripción de la imagen aquí

Análisis de la pregunta:
esta pregunta en realidad examina la clasificación de caracteres. Cada carácter ascii tiene un valor ascii correspondiente en la memoria y se puede ordenar mediante el almacenamiento de datos en la memoria.
Clasificación de burbujas: compare e intercambie datos adyacentes, envíe datos más grandes o más pequeños hacia atrás hasta el final de la matriz y luego comience la siguiente ronda de
proceso de burbujeo de big data.

Respuesta a la pregunta:
Método 1:

#include <stdio.h>
void Qsort(char*arr,int len){
    
    
    for(int i=0;i<len;i++){
    
    //冒泡排序
        for(int j=0;j<len-i-1;j++){
    
    
            if(arr[j]>arr[j+1]){
    
    
                char temp=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=temp;
            }
        }
    }
}
int main() {
    
    
    char arr[1001] = {
    
    0};
    while (scanf("%s", arr)!= EOF) {
    
    
        char digit[1001] = {
    
    0};//将数字入到该数组
        int digits = 0;//数字个数
        char upper[1001] = {
    
    0};//将大写字母入到该数组
        int uppers = 0;//大写字母个数
        char lower[1001] = {
    
    0};//将小写字母入到该数组
        int lowers = 0;//小写字母个数
        char* ptr = arr;
        while (*ptr) {
    
    //查找并添加
            if (*ptr >= '0' && *ptr <= '9') {
    
    
                digit[digits] = *ptr;
                digits++;
            }
            if (*ptr >= 'A' && *ptr <= 'Z') {
    
    
                upper[uppers] = *ptr;
                uppers++;
            }
            if (*ptr >= 'a' && *ptr <= 'z') {
    
    
                lower[lowers] = *ptr;
                lowers++;
            }
            ptr++;
        }  
        //进行排序      
        Qsort(digit,strlen(digit));
        Qsort(upper,strlen(upper));
        Qsort(lower,strlen(lower));
        //进行输出
        for (int j = 0; j < digits; j++) {
    
    
            printf("%c", digit[j]);
        }
        for (int j = 0; j < uppers; j++) {
    
    
            printf("%c", upper[j]);
        }
        for (int j = 0; j < lowers; j++) {
    
    
            printf("%c", lower[j]);
        }
    }
return 0;
}

Método dos:

#include <stdio.h>
int main()
{
    
    
    char str[1024] = {
    
    0};
    while(gets(str)) {
    
    
        int len = strlen(str);
        for (int i = 0; i < len; i++) {
    
    
            for (int j = 1; j < len - i; j++) {
    
    
                if (str[j] < str[j - 1]) {
    
    
                    char ch = str[j - 1];
                    str[j - 1] = str[j];
                    str[j] = ch;
                }
             }
         }
        printf("%s\n", str);
    }
    return 0;
}

11. Referencia de matriz

Si hay una definición: int a[2][3];, la referencia correcta al elemento de la matriz a en las siguientes opciones es ( ) A:
a[2][0]
B: a[2][3]
C :a[0 ][3]
D: a[1>2][1]

Análisis de la pregunta:
esta pregunta considera principalmente el caso de acceso fuera de límites a la matriz. Las filas y columnas de una matriz bidimensional comienzan desde 0. Para una matriz a, el subíndice máximo de fila es 1 y el subíndice máximo de columna es 2. En la opción D, 1 El valor de la expresión >2 es 0, lo cual es correcto. Otras opciones pueden tener filas y columnas que están fuera de los límites. A significa que la fila está fuera de los límites, B significa que ambas filas y la columna están fuera de límites, y C es que la columna está fuera de límites.
Respuesta a la pregunta:
D.


12. Referencia de matriz

Se sabe que i y j son variables enteras, entre las siguientes expresiones, la que no es equivalente a la referencia de subíndice X[i][j] es [opción múltiple] ( ) A: ( X [i]
+ j )
B:
(X+i)[j]
C: *(X+i+j)
D: ( (X+i)+j)

Análisis de la pregunta:
esta pregunta prueba el acceso a elementos de una matriz bidimensional. La opción A es correcta. X [i] es el nombre de la matriz de la i-ésima fila. El nombre de la matriz representa la dirección del primer elemento. La dirección de un elemento, después de +j, es la dirección del elemento cuyo subíndice es j en la línea i. La desreferencia general es X[i][j], y A es correcta. La opción B se debe a que [] tiene una prioridad más alta que *, por lo que el código es equivalente a **((x+i)+j). Cruza el límite después de X+i+j, y no significa X[i ][j], entonces error. La opción C también es evidentemente errónea. La opción D es una forma de puntero estándar para acceder a un elemento de una matriz de dos dígitos.
Respuesta a la pregunta:
antes de Cristo


13. Estadísticas de recuento de caracteres

Enlace de pregunta: enlace del DO
Insertar descripción de la imagen aquí

Análisis de la pregunta:
la idea de esta pregunta es crear primero una matriz con un tamaño de 128, para garantizar que varios caracteres del 0 al 127 puedan encontrar la posición correspondiente a su valor assi en la matriz, cambie el posición encontrada a 1, y finalmente cambie la matriz Agregue los valores para obtener
la respuesta a la pregunta de tipo de carácter:

#include <stdio.h>
int main() {
    
    
    char arr[501]={
    
    0};
    while (scanf("%s",arr) != EOF) {
    
     
        char*ptr=arr;
        int count[128]={
    
    0};
        while(*ptr){
    
    
            int temp=*ptr;//通过Assii码值作为下标找到count数组中对应的位置
            count[temp]=1;//将值变为1;
            ptr++;
        }
        int ret=0;
        for(int i=0;i<=129;i++){
    
    //遍历相加
            ret+=count[i];
        }
        printf("%d\n",ret);
    }
    return 0;
}

14. La mayoría de los elementos

Enlace de pregunta: enlace del DO
Insertar descripción de la imagen aquí

Ejemplo:
n == nums.length
1 <= n <= 5 * 104
-109 <= nums[i] <= 109

Análisis de la pregunta:
Hay un número en una matriz que aparece más de n/2 veces, a partir del carácter 0, suponiendo que sea el número más numeroso, cuando encuentre el mismo número, el conteo será +1, y cuando encuentre diferentes números, el conteo será -1. De hecho, se consumen entre sí. Cuando el conteo llega a 0, significa que la ortografía se completa y la ortografía comienza nuevamente desde el siguiente carácter. Sin embargo, en el análisis final, el número de Los números que aparecen más que n/2 son más, por lo que también es el último carácter restante.
Ejemplo: "23335" primero comienza a contar 1 desde el carácter 2, cuando encuentra 3, será -1 si es diferente, y el proceso de comenzar desde el "335" restante se consumirá. En este momento, el carácter guardado es 3, y contando cuando encuentre 3 +1, cuando encuentre 5, cuente -1. Cuando el conteo no es 0, los caracteres guardados al final son los caracteres cuyo número excede n/2. Respuesta a la pregunta

:

int majorityElement(int* nums, int numsSize){
    
    
    int count=1;//记录多数元素的个数与非多数元素出现个数的差
    int more=nums[0];//将第一个作为多数元素
    int i=1;
    for(i;i<numsSize;i++){
    
    
        if(more==nums[i]){
    
    //下标对应的数为多数元素,则count++
            count++;
        }
        else{
    
    //下标对应的数不是多数元素,则count--
            count--;
        }
        if(count==0){
    
    //如果count等于0,那就可能该数不是多数元素,将下一个作为多数元素继续遍历
            more=nums[i+1];
        }
    }
    if(count>0){
    
    //多数元素的个数与非多数元素出现个数的差大于0,则说明此时记录的元素多于总数的一半,为多数元素,
        return more;
    }
    else{
    
    
       return 0;
    }
}

Resumir

¡Di cosas importantes tres veces!
¡vamos! ¡vamos! ¡vamos!

Supongo que te gusta

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