Exercices pratiques de langage C niveau 2 : épreuves 31 à 35

Épreuve 31

1. Complétion de programme

Dans le programme fourni, la fonction fun fait pivoter dans le sens horaire les éléments périphériques d’une matrice N×N. La procédure est la suivante : on copie d’abord la première ligne dans le tableau temporaire r, puis la première colonne devient la première ligne, la dernière ligne devient la première colonne, la dernière colonne devient la dernière ligne, et les éléments du tableau temporaire deviennent la dernière colonne.

Par exemple, si N=3 et que la matrice est :

1 2 3
4 5 6
7 8 9

le résultat de la rotation est :

7 4 1
8 5 2
9 6 3

Placez aux emplacements soulignés les expressions correctes, puis retirez les soluignements, pour que le programme produise le résultat attendu.

Remarque : n’ajoutez ni ne supprimez de lignes, et ne modifiez pas la structure du programme.

#include <stdio.h>
#define N  4

void fun(int (*t)[N])
{
    int j, r[N];

    for (j = 0; j < N; j++)
        r[j] = t[0][j];

    for (j = 0; j < N; j++)
        /*********** à compléter **********/
        t[0][N - j - 1] = t[j][___1___];

    for (j = 0; j < N; j++)
        t[j][0] = t[N - 1][j];

    /*********** à compléter **********/
    for (j = N - 1; j >= 0; ___2___)
        t[N - 1][N - 1 - j] = t[j][N - 1];

    for (j = N - 1; j >= 0; j--)
        /*********** à compléter **********/
        t[j][N - 1] = r[___3___];
}

int main()
{
    int t[][N] = {21, 12, 13, 24, 25, 16, 47, 38,
                  29, 11, 32, 54, 42, 21, 33, 10}, i, j;

    printf("\nThe original array:\n");
    for (i = 0; i < N; i++)
    {
        for (j = 0; j < N; j++)
            printf("%2d  ", t[i][j]);
        printf("\n");
    }

    fun(t);

    printf("\nThe result is:\n");
    for (i = 0; i < N; i++)
    {
        for (j = 0; j < N; j++)
            printf("%2d  ", t[i][j]);
        printf("\n");
    }
    return 0;
}

2. Correction de programme

Dans le programme fourni, la fonction fun remplace la dernière occurrence, dans la chaîne pointée par s, de la sous-chaîne pointée par t1 par la sous-chaîne pointée par t2. La nouvelle chaîne obtenue est placée dans le tableau pointé par w. On suppose ici que les chaînes t1 et t2 ont la même longueur.

Par exemple, si s vaut abcdabfab, t1 vaut ab et t2 vaut 99, le tableau w devra contenir abcdabf99.

Corrigez les erreurs signalées dans la fonction fun afin d’obtenir le résultat correct.

Remarque : ne modifiez pas la fonction main, n’ajoutez ni ne supprimez de lignes, et ne changez pas la structure du programme.

#include <stdio.h>
#include <string.h>

void fun(char *s, char *t1, char *t2, char *w)
{
    char *p, *r, *a;
    strcpy(w, s);

    /************ à corriger ************/
    while (w)
    {
        p = w;
        r = t1;
        while (*r)
        /************ à corriger ************/
            IF (*r == *p)
            { r++; p++; }
            else break;
        if (*r == '\0') a = w;
        w++;
    }
    r = t2;
    while (*r) { *a = *r; a++; r++; }
}

int main()
{
    char s[100], t1[100], t2[100], w[100];
    printf("\nPlease enter string S:");
    scanf("%s", s);
    printf("\nPlease enter substring t1:");
    scanf("%s", t1);
    printf("\nPlease enter substring t2:");
    scanf("%s", t2);
    if (strlen(t1) == strlen(t2))
    {
        fun(s, t1, t2, w);
        printf("\nThe result is :  %s\n", w);
    }
    else
        printf("\nError : strlen(t1) != strlen(t2)\n");
    return 0;
}

3. Conception de programme

Écrivez la fonction fun pour supprimer, dans la chaîne pointée par s, tous les caractères dont le code ASCII est impair, puis placer la chaîne restante dans le tableau pointé par t.

Par exemple, si la chaîne s contient ABCDEFG12345, le tableau t devra contenir BDF24.

Remarque : ne modifiez pas la fonction main ni les autres fonctions ; placez uniquement votre code entre les accolades de la fonction fun.

#include <stdio.h>
#include <string.h>

void NONO(void);

void fun(char *s, char t[])
{

}

int main()
{
    char s[100], t[100];
    printf("\nPlease enter string S:");
    scanf("%s", s);
    fun(s, t);
    printf("\nThe result is: %s\n", t);
    NONO();
    return 0;
}

void NONO(void)
{/* Cette fonction ouvre un fichier, lit les données, appelle fun,
     écrit les résultats puis ferme les fichiers. */
    char s[100], t[100];
    FILE *rf, *wf;
    int i;
    rf = fopen("in.dat", "r");
    wf = fopen("out.dat", "w");
    for (i = 0; i < 10; i++)
    {
        fscanf(rf, "%s", s);
        fun(s, t);
        fprintf(wf, "%s\n", t);
    }
    fclose(rf);
    fclose(wf);
}

Corrigé de l’épreuve 31

  1. (1) 0 (2) j-- (3) j
  2.  while (*w)
     if (*r == *p)
    
  3.  void fun(char *s, char t[])
     {
         int i, j;
         for (i = 0, j = 0; s[i] != '\0'; i++)
             if (s[i] % 2 == 0)
                 t[j++] = s[i];
         t[j] = '\0';
     }
    

Épreuve 32

1. Complétion de programme

Dans le programme fourni, la fonction fun décale d’une colonne vers la droite les éléments de la matrice N×N : l’élément qui sort à droite de chaque ligne revient à gauche sur la même ligne.

Par exemple, si N=3 et que la matrice est :

1 2 3
4 5 6
7 8 9

le résultat est :

3 1 2
6 4 5
9 7 8

Placez aux emplacements soulignés les expressions correctes, puis retirez les soulignements.

Remarque : n’ajoutez ni ne supprimez de lignes, et ne modifiez pas la structure du programme.

#include <stdio.h>
#define N  4

void fun(int (*t)[N])
{
    int i, j, x;

    /*********** à compléter **********/
    for (i = 0; i < ___1___; i++)
    {
        /*********** à compléter **********/
        x = t[i][___2___];
        for (j = N - 1; j > 0; j--)
            t[i][j] = t[i][j - 1];
        /*********** à compléter **********/
        t[i][___3___] = x;
    }
}

int main()
{
    int t[][N] = {21, 12, 13, 24, 25, 16, 47, 38,
                  29, 11, 32, 54, 42, 21, 33, 10}, i, j;
    printf("The original array:\n");
    for (i = 0; i < N; i++)
    {
        for (j = 0; j < N; j++)
            printf("%2d  ", t[i][j]);
        printf("\n");
    }
    fun(t);
    printf("\nThe result is:\n");
    for (i = 0; i < N; i++)
    {
        for (j = 0; j < N; j++)
            printf("%2d  ", t[i][j]);
        printf("\n");
    }
    return 0;
}

2. Correction de programme

Dans le programme fourni, la fonction fun extrait successivement les chiffres pairs de l’entier long s pour former un nouveau nombre placé dans t ; l’ordre est conservé, les chiffres de poids fort restant à gauche et ceux de poids faible à droite.

Par exemple, si s = 87653142, alors t = 8642.

Corrigez les erreurs signalées dans la fonction fun.

Remarque : ne modifiez pas la fonction main, n’ajoutez ni ne supprimez de lignes, et ne changez pas la structure du programme.

#include <stdio.h>

void fun(long s, long *t)
{
    int d;
    long sl = 1;
    *t = 0;

    while (s > 0)
    {
        d = s % 10;
        /************ à corriger ************/
        if (d % 2 = 0)
        {
            *t = d * sl + *t;
            sl *= 10;
        }
        /************ à corriger ************/
        s \= 10;
    }
}

int main()
{
    long s, t;
    printf("\nPlease enter s:");
    scanf("%ld", &s);
    fun(s, &t);
    printf("The result is: %ld\n", t);
    return 0;
}

3. Conception de programme

Écrivez la fonction fun pour rechercher, parmi les num chaînes transmises dans le tableau a, la chaîne la plus longue, puis retourner son adresse via le paramètre pointeur max.

Remarque : ne modifiez pas la fonction main ni les autres fonctions ; placez uniquement votre code entre les accolades de la fonction fun.

#include <stdio.h>
#include <string.h>

void fun(char (*a)[81], int num, char **max)
{

}

int main()
{
    char ss[10][81], *ps;
    int n, i = 0;
    printf("输入若干个字符串:");
    gets(ss[i]);
    puts(ss[i]);
    while (!strcmp(ss[i], "****") == 0)
    {
        i++;
        gets(ss[i]);
        puts(ss[i]);
    }
    n = i;
    fun(ss, n, &ps);
    printf("\nmax=%s\n", ps);
    return 0;
}

Corrigé de l’épreuve 32

  1. (1) N (2) N-1 (3) 0
  2.  if (d % 2 == 0)
     s /= 10;
    
  3.  void fun(char (*a)[81], int num, char **max)
     {
         int i;
         *max = a[0];
         for (i = 1; i < num; i++)
             if (strlen(*max) < strlen(a[i]))
                 *max = a[i];
     }
    

Épreuve 33

1. Complétion de programme

Dans le programme fourni, la fonction fun copie le contenu du fichier source indiqué vers le fichier cible indiqué. En cas de succès, la fonction renvoie 1 ; en cas d’échec, elle renvoie 0.

Placez aux emplacements soulignés les expressions correctes, puis retirez les soulignements.

Remarque : n’ajoutez ni ne supprimez de lignes, et ne modifiez pas la structure du programme.

#include <stdio.h>
#include <stdlib.h>

int fun(char *source, char *target)
{
    FILE *fs, *ft;
    char ch;

    /*********** à compléter **********/
    if ((fs = fopen(source, ___1___)) == NULL)
        return 0;

    if ((ft = fopen(target, "w")) == NULL)
        return 0;

    printf("\nThe data in file :\n");
    ch = fgetc(fs);

    /*********** à compléter **********/
    while (!feof(___2___))
    {
        putchar(ch);
        /*********** à compléter **********/
        fputc(ch, ___3___);
        ch = fgetc(fs);
    }

    fclose(fs);
    fclose(ft);
    printf("\n\n");
    return 1;
}

int main()
{
    char sfname[20] = "myfile1", tfname[20] = "myfile2";
    FILE *myf;
    int i;
    char c;

    myf = fopen(sfname, "w");
    printf("\nThe original data :\n");
    for (i = 1; i < 30; i++)
    {
        c = 'A' + rand() % 25;
        fprintf(myf, "%c", c);
        printf("%c", c);
    }
    fclose(myf);
    printf("\n\n");

    if (fun(sfname, tfname))
        printf("Succeed!");
    else
        printf("Fail!");
    return 0;
}

2. Correction de programme

Dans le programme fourni, la fonction fun supprime tous les caractères d’espacement (espaces, tabulations, retours chariot et sauts de ligne) de la chaîne pointée par p. La saisie de la chaîne se termine par le caractère #.

Corrigez les erreurs signalées dans la fontcion fun.

Remarque : ne modifiez pas la fonction main, n’ajoutez ni ne supprimez de lignes, et ne changez pas la structure du programme.

#include <stdio.h>
#include <string.h>
#include <ctype.h>

void fun(char *p)
{
    int i, t;
    char c[80];

    /************ à corriger ************/
    For (i = 0, t = 0; p[i]; i++)
        if (!isspace(*(p + i)))
            c[t++] = p[i];

    /************ à corriger ************/
    c[t] = "\0";
    strcpy(p, c);
}

int main()
{
    char c, s[80];
    int i = 0;
    printf("Input a string:");
    c = getchar();
    while (c != '#')
    {
        s[i] = c;
        i++;
        c = getchar();
    }
    s[i] = '\0';
    fun(s);
    puts(s);
    return 0;
}

3. Conception de programme

Écrivez la fonction fun pour convertir en majuscules les lettres situées aux indices impairs de la chaîne pointée par ss. Si le caractère situé à un indice impair n’est pas une lettre, il reste inchangé.

Par exemple, si la chaîne saisie est abc4Efg, le résultat devra être aBc4EFg.

Remarque : ne modifiez pas la fonction main ni les autres fonctions ; placez uniquement votre code entre les accolades de la fonction fun.

#include <stdio.h>
#include <string.h>

void NONO(void);

void fun(char *ss)
{

}

int main()
{
    char tt[81];
    printf("\nPlease enter an string:\n");
    gets(tt);
    printf("\nAfter changing, the string\n\"%s\"", tt);
    fun(tt);
    printf("\nbecomes\n  \"%s\"\n", tt);
    NONO();
    return 0;
}

void NONO(void)
{/* Cette fonction ouvre un fichier, lit les données, appelle fun,
     écrit les résultats puis ferme les fichiers. */
    FILE *fp, *wf;
    char tt[81];
    int i;
    fp = fopen("in.dat", "r");
    wf = fopen("out.dat", "w");
    for (i = 0; i < 10; i++)
    {
        fscanf(fp, "%s", tt);
        fun(tt);
        fprintf(wf, "%s\n", tt);
    }
    fclose(fp);
    fclose(wf);
}

Corrigé de l’épreuve 33

  1. (1) "r" (2) fs (3) ft
  2.  for (i = 0, t = 0; p[i]; i++)
     c[t] = '\0';
    
  3.  void fun(char *ss)
     {
         int i;
         for (i = 0; ss[i] != '\0'; i++)
             if (i % 2 == 1)
                 if (ss[i] >= 'a' && ss[i] <= 'z')
                     ss[i] -= 32;
     }
    

Épreuve 34

1. Complétion de programme

Dans le programme fourni, la fonction fun trie, selon l’ordre croissant des codes ASCII, les caractères situés aux indices impairs de la chaîne pointée par s. Ensuite, elle extrait ces caractères triés dans le tableau pointé par p pour former une nouvelle chaîne.

Par exemple, si la chaîne pointée par s est baawrskjghzlicda, la chaîne placée dans p devra être aachjlsw.

Placez aux emplacements soulignés les expressions correctes, puis retirez les soulignements.

Remarque : n’ajoutez ni ne supprimez de lignes, et ne modifiez pas la structure du programme.

#include <stdio.h>

void fun(char *s, char *p)
{
    int i, j, n, x, t;
    n = 0;
    for (i = 0; s[i] != '\0'; i++)
        n++;

    for (i = 1; i < n - 2; i = i + 2)
    {
        /*********** à compléter **********/
        ___1___;
        /*********** à compléter **********/
        for (j = ___2___ + 2; j < n; j = j + 2)
            if (s[t] > s[j])
                t = j;
        if (t != i)
        {
            x = s[i];
            s[i] = s[t];
            s[t] = x;
        }
    }

    for (i = 1, j = 0; i < n; i = i + 2, j++)
        p[j] = s[i];

    /*********** à compléter **********/
    p[j] = ___3___;
}

int main()
{
    char s[80] = "baawrskjghzlicda", p[50];
    printf("\nThe original string is :  %s\n", s);
    fun(s, p);
    printf("\nThe result is :  %s\n", p);
    return 0;
}

2. Correction de programme

Dans le programme fourni, la fonction fun extrait, en partant du rang faible, les chiffres situés aux rangs pairs de l’entier long s, puis forme un nouveau nombre placé dans t. Les chiffres de poids fort restent à gauche et ceux de poids faible à droite.

Par exemple, si s = 7654321, alors t = 642.

Corrigez les erreurs signalées dans la fonction fun.

Remarque : ne modifiez pas la fonction main, n’ajoutez ni ne supprimez de lignes, et ne changez pas la structure du programme.

#include <stdio.h>

/************ à corriger ************/
void fun(long s, long t)
{
    long sl = 10;
    s /= 10;
    *t = s % 10;

    /************ à corriger ************/
    while (s < 0)
    {
        s = s / 100;
        *t = s % 10 * sl + *t;
        sl = sl * 10;
    }
}

int main()
{
    long s, t;
    printf("\nPlease enter s:");
    scanf("%ld", &s);
    fun(s, &t);
    printf("The result is: %ld\n", t);
    return 0;
}

3. Conception de programme

Écrivez la fonction fun pour fusionner deux entiers positifs à deux chiffres a et b dans un enteir unique c. La règle de fusion est la suivante : le chiffre des dizaines de a devient le chiffre des centaines de c, le chiffre des unités de a devient le chiffre des unités de c, le chiffre des dizaines de b devient le chiffre des dizaines de c et le chiffre des unités de b devient le chiffre des milliers de c.

Par exemple, si a = 45 et b = 12, après l’appel de la fonction, c = 2415.

Remarque : ne modifiez pas la fonction main ni les autres fonctions ; placez uniquement votre code entre les accolades de la fonction fun.

#include <stdio.h>

void NONO(void);

void fun(int a, int b, long *c)
{

}

int main()
{
    int a, b;
    long c;
    printf("Input a, b:");
    scanf("%d%d", &a, &b);
    fun(a, b, &c);
    printf("The result is: %ld\n", c);
    NONO();
    return 0;
}

void NONO(void)
{/* Cette fonction ouvre un fichier, lit les données, appelle fun,
     écrit les résultats puis ferme les fichiers. */
    FILE *rf, *wf;
    int i, a, b;
    long c;
    rf = fopen("in.dat", "r");
    wf = fopen("out.dat", "w");
    for (i = 0; i < 10; i++)
    {
        fscanf(rf, "%d,%d", &a, &b);
        fun(a, b, &c);
        fprintf(wf, "a=%d,b=%d,c=%ld\n", a, b, c);
    }
    fclose(rf);
    fclose(wf);
}

Corrigé de l’épreuve 34

  1. (1) t = i (2) i (3) '\0'
  2.  void fun(long s, long *t)
     while (s > 0)
    
  3.  void fun(int a, int b, long *c)
     {
         *c = (b % 10) * 1000 + (a / 10) * 100
              + (b / 10) * 10 + (a % 10);
     }
    

Épreuve 35

1. Complétion de programme

Dans le programme fourni, la fonction fun décale d’un cran vers la droite les caractères situés aux indices impairs de la chaîne pointée par s : chaque caractère passe de l’indice impair i à l’indice impair suivant. Le caractère le plus à droite qui sort ainsi de la chaîne revient au premier indice impair. Les caractères situés aux indices pairs ne bougent pas. On suppose que la longueur de la chaîne est supérieure ou égale à 2.

Placez aux emplacements soulignés les expressions correctes, puis retirez les soulignements.

Remarque : n’ajoutez ni ne supprimez de lignes, et ne modifiez pas la structure du programme.

#include <stdio.h>

void fun(char *s)
{
    int i, n, k;
    char c;
    n = 0;
    for (i = 0; s[i] != '\0'; i++)
        n++;

    /*********** à compléter **********/
    if (n % 2 == 0) k = n - ___1___;
    else k = n - 2;

    /*********** à compléter **********/
    c = ___2___;

    for (i = k - 2; i >= 1; i = i - 2)
        s[i + 2] = s[i];

    /*********** à compléter **********/
    s[1] = ___3___;
}

int main()
{
    char s[80] = "abcdefgh";
    printf("\nThe original string is :  %s\n", s);
    fun(s);
    printf("\nThe result is :  %s\n", s);
    return 0;
}

2. Correction de programme

Dans le programme fourni, la fonction fun convertit d’abord une lettre majuscule en minuscule. Ensuite, si la minuscule obtenue est comprise entre a et u, elle est remplacée par la lettre située cinq rangs plus loin. Si elle est comprise entre v et z, on lui soustrait 21. La lettre minuscule ainsi obtenue est retournée comme valeur de la fonction.

Par exemple, si le paramètre est la lettre A, la fonction doit renvoyer f ; si le paramètre est W, elle doit renvoyer b.

Corrigez les erreurs signalées dans la fonction fun.

Remarque : ne modifiez pas la fonction main, n’ajoutez ni ne supprimez de lignes, et ne changez pas la structure du programme.

#include <stdio.h>
#include <ctype.h>

char fun(char c)
{
    if (c >= 'A' && c <= 'Z')
        /************ à corriger ************/
        c = c - 32;

    if (c >= 'a' && c <= 'u')
        /************ à corriger ************/
        c = c - 5;
    else if (c >= 'v' && c <= 'z')
        c = c - 21;

    return c;
}

int main()
{
    char c1, c2;
    printf("\nEnter a letter(A-Z):  ");
    c1 = getchar();
    if (isupper(c1))
    {
        c2 = fun(c1);
        printf("\nThe letter '%c' change to '%c'\n", c1, c2);
    }
    else
        printf("\nEnter (A-Z)!\n");
    return 0;
}

3. Conception de programme

Écrivez la fonction fun pour calculer :

S = Σ<sub>k=1</sub><sup>n</sup> ( Σ<sub>i=1</sub><sup>k</sup> √i )

Par exemple, si n = 20, S = 534.188884.

Remarque : ne modifiez pas la fonction main ni les autres fonctions ; placez uniquement votre code entre les accolades de la fonction fun.

#include <stdio.h>
#include <math.h>

void NONO(void);

double fun(int n)
{

}

int main()
{
    int n;
    double s;
    printf("\n\nInput n: ");
    scanf("%d", &n);
    s = fun(n);
    printf("\ns=%f\n", s);
    NONO();
    return 0;
}

void NONO(void)
{/* Cette fonction ouvre un fichier, lit les données, appelle fun,
     écrit les résultats puis ferme les fichiers. */
    FILE *rf, *wf;
    int n, i;
    double s;
    rf = fopen("in.dat", "r");
    wf = fopen("out.dat", "w");
    for (i = 0; i < 10; i++)
    {
        fscanf(rf, "%d", &n);
        s = fun(n);
        fprintf(wf, "%f\n", s);
    }
    fclose(rf);
    fclose(wf);
}

Corrigé de l’épreuve 35

  1. (1) 1 (2) s[k] (3) c
  2.  c = c + 32;
     c = c + 5;
    
  3.  double fun(int n)
     {
         double somme = 0.0, terme = 0.0;
         int i;
         for (i = 1; i <= n; i++)
         {
             terme += sqrt(i);
             somme += terme;
         }
         return somme;
     }
    

Étiquettes: C ncre Matrices pointeurs chaînes de caractères

Publié le 9 septembre à 00h39