Questions de test de niveau de langage C

Bonjour à tous, je suis un poisson profond ~

[Préface] : Cette partie est une question de test par étapes après l'apprentissage du langage C. La dernière question de programmation est quelque peu difficile et doit être résolue. Si vous tapez beaucoup de code, cela vous semblera naturellement facile. Allez, presse-agrumes en fer ! ! !

1. Questions à choix multiples

1. Une fois le programme suivant exécuté, le résultat de sortie est ()

#include<stdio.h>
int cnt = 0;
int fib(int n)
{
	cnt++;
	if (n == 0)
		return 1;
	else if (n == 1)
		return 2;
	else
		return fib(n - 1) + fib(n - 2);
}
void main()
{
	fib(8);
	printf("%d", cnt);
}

[Réponse] : 67

Le problème de la récursivité des fonctions : saisissez une fois la fonction fib, cnt++, pour calculer la valeur de cnt, c'est-à-dire combien de fois la fonction fib a été saisie , puis listez le dendrogramme : jusqu'à ce qu'il atteigne 1 et 0, il n'entrera pas la fonction fib à nouveau, puis chaque numéro répertorié entrera dans la fonction pour utiliser cnt++, comptera le nombre total de colonnes, et la valeur correspondante est la valeur de cnt : 1+2+4+8+16+22+12+2 =67


2. La valeur finale du programme suivant k est ()

    int i = 10;
	int j = 20;
	int k = 3;
	k *= i + j;

[Réponse] : 90

Cette question examine le problème de la priorité des opérateurs

Les opérateurs d'affectation (*=, /=, +=, -=) ont une priorité très faible , donc i+j doit être calculé en premier, puis *k, qui est k*=30, qui est 90


3. Vrai ou faux : le langage C lui-même n'a pas d'instructions d'entrée et de sortie

【Réponse】 : correcte

Le langage C a une grammaire donnée, et l'entrée et la sortie sont fournies par des fonctions de bibliothèque.

Le langage C stipule certaines fonctions, en spécifiant le nom, la fonction, les paramètres et le type de retour de la fonction

Ces fonctions spécifiées sont implémentées par le fabricant du compilateur. Les fabricants de msvc, gcc et clang fournissent l'implémentation lors de l'implémentation du compilateur. Ces fonctions sont placées dans la bibliothèque standard et sont appelées fonctions de bibliothèque.


 4. S'il existe une déclaration de définition int year=1009, *p=&year, la déclaration suivante qui ne peut pas augmenter la valeur de la variable year à 1010 est ()

A.*p+=1 B.(*p)++ C.++(*p) D.*p++

[Réponse] : D

En fait, le code ci-dessus est équivalent à int year=1009 ; int *p=&year

A.* (opérateur de déréférencement) a une priorité plus élevée que += (opérateur d'affectation), p déréférence pointe sur l'année, puis sur l'année++

B. Entre parenthèses, calculez d'abord *p, puis année++

C. Il y a aussi des parenthèses, tant que (*p) est l'année++

D.*p++, ++ a une priorité supérieure à *, ++ est exécuté en premier, p++ est suivi de ++, la valeur est p en premier, puis p++, voici l'adresse ++ , pas l'élément pointé par l' adresse ++


5.car a;int b;float c;double d;

Alors le type de la valeur de l'expression a*b+dc est

[Réponse] : type double

Tout d'abord, a*b (char*int), le type char est transformé en un type int, et le résultat du type int *int est le type int

Ensuite, le type int+double, à ce moment, le type int est arithmétiquement converti en type double, et le résultat du type double+double est le type double

Enfin, le type flottant double, à ce moment, le type flottant est arithmétiquement converti en type double, et le résultat du type double-double est le type double

[Remarque] : dans ce processus, une promotion plastique et une conversion arithmétique se sont produites, et le type est modifié en premier, puis l'opération est effectuée.

2. Questions de programmation

1. Trouvez le plus petit multiple commun

【sujet】:

 [Question 1] : Pratique conventionnelle

Le plus petit multiple commun doit être supérieur ou égal aux deux nombres saisis, vous pouvez donc commencer à additionner à partir du plus grand nombre des deux nombres et voir quel nombre vous ajoutez peut diviser les deux nombres en même temps

#include <stdio.h>
int main() 
{
   int a=0;
   int b=0;
   //输入
   scanf("%d %d",&a,&b);
   //求较大值
   int m=a>b?a:b;
   //从较大者开始求最小公倍数
   while(1)
   {
    if(m%a==0&&m%b==0)
    break;
    m++;
   }
   //输出
   printf("%d\n",m);
    return 0;
}

[Problème Solution 2] : Le plus petit multiple commun = le produit des deux nombres d'entrée / le plus grand diviseur commun (méthode de roulement et de division)

#include <stdio.h>
int main() 
{
   int a=0;
   int b=0;
   int c=0;
   //输入
   scanf("%d %d",&a,&b);
   int n=a*b;
   //求最大公约数
   while(c=a%b)
   {
    a=b;
    b=c;
   }
   //输出
   printf("%d\n",n/b);
    return 0;
}

[Solution 3] : la plus grande efficacité

Supposons que m soit le plus petit commun multiple de a et b, alors m peut être divisible à la fois par a et b, m/a=i, m/b=j, alors nous pouvons voir si a*i peut diviser b , par exemple : To trouver le plus petit commun multiple de 3 et 5, vérifier d'abord si 3*1 peut diviser 5, puis vérifier si 3*2 peut diviser 5, et ainsi de suite, jusqu'à ce que 3*i puisse diviser 5, alors 3*i est le plus petit commun plusieurs

#include <stdio.h>
int main() 
{
   int a=0;
   int b=0;
   //输入
   scanf("%d %d",&a,&b);
   int i=1;
   while(a*i%b)
   {
    i++;
   }
   //输出
   printf("%d\n",a*i);
    return 0;
}

[Remarque] : nous ferions mieux d'écrire le type int en tant que type long long, car a et b peuvent atteindre un maximum de 100 000, et leur multiplication est très importante, et l'entrée et la sortie du type long long sont % lld

2. Inversion de la corde 

【sujet】:

【répondre】:

Idée : inverser la chaîne entière, puis chaque mot (ou inverser d'abord chaque mot, puis la chaîne entière)

#include <stdio.h>
#include<string.h>
void reverse(char* left, char* right) 
{
    while (left < right) 
    {
        char tmp = *left;
        *left = *right;
        *right = tmp;
        left++;
        right--;
    }
}
int main() 
{
    char arr[101] = {0};
    gets(arr);
    int len=strlen(arr);
    //1.逆序整个字符串
    reverse(arr,arr+len-1);
    //2.逆序每个单词
    char*cur=arr;
    while(*cur!='\0')
    {
        char*start=cur;
        while(*cur!=' '&&*cur!='\0')
        {
            cur++;
        }
        char*end=cur-1;
        reverse(start,end);
        if(*cur==' ')
        cur++;
    }
    printf("%s\n",arr);
    return 0;
}

【Précautions】:

(1) Chaîne d'entrée : impossible d'utiliser la fonction scanf pour entrer normalement, car elle arrête de lire dès qu'elle rencontre un espace, obtient (arr)

Si vous voulez l'utiliser, vous devez écrire scanf ("%[^\n]s", arr); cela signifie que la fonction scanf ne s'arrête pas tant qu'elle ne lit pas \n

Vous pouvez également utiliser getchar :

entier ch=0 ;

entier je=0 ;

tandis que( (ch=getchar( ) )!='\n')

{     arr[i++]=ch; }

(2) Inverser toute la chaîne : l'idée est d' échanger les caractères gauche et droit un par un jusqu'à gauche>droite pour arrêter l'échange

Il y a aussi comment passer l'adresse du dernier caractère lorsque la fonction personnalisée inverse passe des paramètres : l'adresse du premier caractère + la longueur de la chaîne -1

 (3) Sortie dans l'ordre inverse : définissez d'abord un pointeur cur pour pointer vers le début de la chaîne, puis commencez à parcourir, en prenant un mot comme une boucle, lorsque le pointeur pointe vers autre chose qu'un espace ou \0, cur continue pour parcourir vers le bas jusqu'à ce qu'il soit rencontré, puis Pour inverser ce mot, nous utilisons les pointeurs de début et de fin pour pointer respectivement vers le début et la fin d'un mot, puis le mot peut également être inversé en tant que chaîne

Lorsqu'un mot se termine, vous devez entrer le mot suivant. À ce stade, vous devez utiliser cur++, mais si c'est le dernier mot, vous n'avez pas besoin de cur++, car ++ fera sortir le tableau des limites

Cette fois, le contenu est terminé. Si vous avez des questions, bienvenue dans la zone de commentaires ou par message privé pour communiquer. Je pense que l'écriture de l'auteur est correcte, ou j'ai un peu gagné. S'il vous plaît, s'il vous plaît, bougez vos petites mains et donnez-moi un un clic sur trois liens.

Je suppose que tu aimes

Origine blog.csdn.net/qq_73017178/article/details/132109782
conseillé
Classement