Análisis de buenas preguntas en lenguaje C (4)

Pregunta uno de opción múltiple

已知函数的原型是: int fun(char b[10], int *a); 
设定义: char c[10];int d; ,正确的调用语句是( )
A: fun(c,&d); B: fun(c,d); C: fun(&c,&d); D: fun(&c,d);

[Respuesta] A
[Análisis]
Matriz : Al pasar parámetros, debemos prestar atención al tipo de parámetro. Para las matrices, podemos omitir directamente [] y el puntero digital dentro : al pasar parámetros como punteros, necesitamos Tenga en cuenta que el puntero int*a indica que el parámetro entrante es una dirección de puntero de tipo entero, por lo que para indicar la dirección de entero, se requieren & y el elemento d de tipo entero

Pregunta de opción múltiple dos

请问下列表达式哪些会被编译器禁止【多选】( )
int a = 248, b = 4;
int const *c = 21;
const int *d = &a;
int *const e = &b;
int const * const f = &a;
A: *c = 32; B: *d = 43 C: e=&a D: f=0x321f

[Respuesta] ABCD
[Análisis] Esta pregunta es para probar la comprensión de const
int const c = 21 porque const está a la izquierda de c, por lo que es un puntero constante, es decir, c no se puede cambiar, por lo que c = 32 es incorrecto, pero es solo que *c no se puede cambiar, c se puede cambiar, como c=&a ...
const int d = &a porque const está en el lado izquierdo de d, por lo que d no se puede cambiar. Esto es lo mismo Como en el error anterior,
int const e = &b const está solo en el lado izquierdo de e, por lo que solo e no se puede cambiar y e se puede cambiar, por lo que e=&a es incorrecto, pero e=248 es correcto

int const * const f = &a, podemos ver que hay dos constantes, una a la izquierda de f y la otra está en el lado izquierdo de f, por lo que ni f ni f se pueden cambiar, f=0x321f es hexadecimal, que representa la dirección De todos modos, cambiar f o *f está mal.

Pregunta de opción múltiple tres

以下程序的输出结果为( )
#include <stdio.h>
int i;
void prt()
{
    
    
for (i = 5; i < 8; i++)
printf("%c", '*');
printf("\t");
} 
int main()
{
    
    
for (i = 5; i <= 8; i++)
prt();
return 0;
}
A: *** B: *** *** *** *** C: *** *** D: * * *

[Respuesta] A
[Análisis] Tenga en cuenta que int i es una variable global, por lo que el ciclo de vida es el mismo que el de la función principal. Desaparecerá solo cuando se destruya el programa.
i=8 después del bucle prt. Después del salto fuera de prt, i = 8 en el bucle de función principal satisface i <= 8, y luego i ++ hace i = 9. Dado que i = 9 no satisface la condición del bucle i <8 en prt, salta directamente del bucle. , y se genera el valor final. *** Tenga en cuenta que no es la función principal después de que el bucle prt salta tres veces
. Bucle y luego realice un bucle en prt. El resultado es B porque no se comprende el significado de las variables globales.
El significado de \t es aproximadamente igual a la tecla TAB, que puede entenderse como presionar la barra espaciadora varias veces.
A continuación se muestra una captura de pantalla del proceso clave que utilicé para depurar.
inserte la descripción de la imagen aquíinserte la descripción de la imagen aquíinserte la descripción de la imagen aquí

Pregunta cuatro de opción múltiple

下面代码段的输出是( )
int main()
{
    
    
int a=3;
printf("%d\n",(a+=a-=a*a));
return 0;
}
A: -6 B: 12 C: 0 D: -12

[Respuesta] D
[Análisis] Creo que este tipo de preguntas son las mismas que escribí en un blog antes. La explicación detallada de los operadores (muy detallada) es un poco elegante. No es necesario escribirlo así. Si se escribe paso a paso, quedará claro y claro.
El siguiente es el análisis de esta pregunta.
inserte la descripción de la imagen aquí
Este algoritmo se realiza de derecha a izquierda, así que primero mire a-=a*a, por lo que el resultado calculado es un =-6, y luego mira a+=a, entonces el resultado calculado es -12.

Pregunta cinco de opción múltiple

下列不能实现死循环的是( )
A: while(1){} B: for(;1;){} C: do{}while(1); D: for(;0;){}

[Respuesta] D
[Análisis] Para lograr un bucle infinito for while, solo necesita hacer que el contenido de while() sea verdadero, y la declaración en while no tiene interrupción para lograr un bucle infinito. En for (; x; )
x Si es 1, significa verdadero bucle sin fin, y si es 0, significa falso, sin bucle.

Pregunta de programación 1

Enlace de pregunta

首先输入要输入的整数个数 n ,然后输入 n 个整数。
输出为 n 个整数中负数的个数,和所有正整数的平均值
结果保留一位小数。
注意: 0 即不是正整数,也不是负数,不计入计算 
本题有多组输入用例。
输入描述:首先输入一个正整数 n ,然后输入 n 个整数
输出描述:输出负数的个数,和所有正整数的平均值

[Análisis del problema] La pregunta requiere generar el número de números negativos y el promedio de enteros positivos, y excluir el caso de ingresar 0, por lo que se necesita una declaración if para separar estos casos
. Suponemos suma = 0 para contar el número de números negativos números ingresados. promedio = 0 es el promedio de números enteros positivos, x es el número de entrada. Cuando se ingresa un número negativo, es suma ++, y cuando se ingresa un número entero positivo, promedio + x 0 es un poco problemático.
También necesitamos para establecer y = 0. Cuando se ingresa 0, cuando y–, y asignamos el valor de , entonces podemos sumar y al calcular el promedio, lo que equivale a restar el número de 0 de entrada. Vale la pena señalar que el número de los números negativos también hay que restarlos (no lo he hecho porque no lo he restado)
[Código]

#include<stdio.h>
int main()
{
    
    
	int n, sum = 0, x, y = 0;
	double average = 0;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++)
	{
    
    
		scanf("%d", &x);
		if (x == 0)
		{
    
    
			x = 1;
			average += x;/*因为这样做x+y=0,
			              这样就可以抵消,
			      并且n最后也可以减掉x=0的个数*/
			y--;
		}
		else if (x > 0)
		{
    
    
			average += x;//x为正数
		}
		else
		{
    
    
			sum++;//x为负数
		}
	}
	if (n + y == 0)
		average = 0.0;//全部为0的情况
	else
	{
    
    
		average = average + y;/*不全部为0的情况
		           +y后就把x=0变成x=1的都减掉*/
		n = n + y-sum;//减去x=0的个数
		average = average / n;//算平均值
	}
	printf("%d %.1f", sum, average);
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/2301_79178723/article/details/132428940
Recomendado
Clasificación