Analyse des bonnes questions en langage C (4)

Première question à choix multiples

已知函数的原型是: 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);

[Réponse] Un
[Analyse]
Tableau : Lors du passage des paramètres, nous devons faire attention au type de paramètre. Pour les tableaux, nous pouvons directement omettre [] et le pointeur numérique à l'intérieur : lors du passage des paramètres en tant que pointeurs, nous devons noter que le pointeur int*a indique que le paramètre entrant est une adresse de pointeur de type entier, donc pour exprimer l'adresse entière, & et l'élément d de type entier sont requis.

Deuxième question à choix multiples

请问下列表达式哪些会被编译器禁止【多选】( )
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

[Réponse] ABCD
[Analyse] Cette question vise à tester la compréhension de const
int const c = 21 car const est à gauche de c, c'est donc un pointeur constant, c'est-à-dire que c ne peut pas être modifié, donc c = 32 est faux, mais c'est juste que *c ne peut pas être modifié, c peut être modifié, comme c=&a ...
const int d = &a car const est sur le côté gauche de d, donc d ne peut pas être modifié. C'est la même chose comme l'erreur ci-dessus.
int const e = &b const est uniquement sur le côté gauche de e, donc seul e ne peut pas être modifié, et e peut être modifié, donc e=&a est faux, mais e=248 est correct

int const * const f = &a, nous pouvons voir qu'il y a deux const, l'un à gauche de f et l'autre Il est à gauche de f, donc ni f ni f ne peuvent être modifiés. f=0x321f est hexadécimal, ce qui représente l'adresse Quoi qu'il en soit, changer f ou *f est une erreur.

choix multiples trois

以下程序的输出结果为( )
#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: * * *

[Réponse] A
[Analyse] Notez que int i est une variable globale, donc le cycle de vie est le même que celui de la fonction principale. Il ne disparaîtra que lorsque le programme sera détruit. i = 8
après la boucle prt. Après le saut hors de prt, i=8 dans la boucle de fonction principale est Satisfait i<=8, puis i++ fait i=9. Puisque i=9 ne satisfait pas la condition de boucle i<8 dans prt, il sort directement de la boucle , et la valeur finale est sortie. *** Notez que ce n'est pas la fonction principale après que la boucle prt saute trois fois
. Boucle, puis boucle dans prt. Le résultat est B car la signification des variables globales n'est pas comprise.
La signification de \t est approximativement égale à la touche TAB, ce qui peut être compris comme appuyant plusieurs fois sur la barre d'espace. Vous
trouverez ci-dessous une capture d'écran du processus clé que j'ai utilisé pour déboguer.
Insérer la description de l'image iciInsérer la description de l'image iciInsérer la description de l'image ici

Quatrième question à choix multiples

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

[Réponse] D
[Analyse] Je pense que ce genre de question est la même que ce que j'ai écrit dans un blog auparavant. L' explication détaillée des opérateurs (très détaillée) est un peu fantaisiste. Il n'est pas nécessaire de l'écrire comme ça. S'il est écrit étape par étape, ce sera clair et clair.
Voici l'analyse de cette question.
Insérer la description de l'image ici
Cet algorithme est exécuté de droite à gauche, alors regardez d'abord a-=a*a, donc le résultat calculé est un =-6, puis regardez a+=a, donc le résultat calculé est -12 .

choix multiple cinq

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

[Réponse] D
[Analyse] Pour obtenir une boucle infinie pendant while, il vous suffit de rendre le contenu de while() vrai, et l'instruction dans while n'a pas de pause pour obtenir une boucle infinie. )
x Si c'est 1, cela signifie une vraie boucle sans fin ; si c'est 0, cela signifie faux et pas de boucle.

Première question de programmation

Lien vers les questions

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

[Analyse du problème] La question nécessite de sortir le nombre de nombres négatifs et la moyenne des entiers positifs, et d'exclure le cas de saisie de 0, donc une instruction if est nécessaire pour séparer ces cas
. Nous supposons que sum=0 pour compter le nombre de nombres négatifs. nombres saisis. moyenne=0 est la moyenne des entiers positifs, x est le nombre d'entrée. Lorsqu'un nombre négatif est saisi, il s'agit de sum++, et lorsqu'un nombre entier positif est saisi, moyenne+x 0 est un peu gênant. Nous avons
également besoin pour définir a y = 0. Lorsque 0 est entré, lorsque y–, et attribuer la valeur de , nous pouvons alors ajouter y lors du calcul de la moyenne, ce qui équivaut à soustraire le nombre de 0 en entrée. Il est à noter que le nombre de les nombres négatifs doivent également être soustraits (je ne l'ai pas fait car je ne l'ai pas soustrait)
[Code 】

#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;
}

Je suppose que tu aimes

Origine blog.csdn.net/2301_79178723/article/details/132428940
conseillé
Classement