user@linuxtrack:~ $ python -c 'print("Soyez les bienvenus !")'

Vous n'êtes pas identifié(e).

#1 13-01-2013 17:04:10

WarLocG
#! modo de compet

[Exercices] Quelques exercices d'entrainement

Voici les exercices des modules de Langage Procédural/C de mon cursus en baccalauréat en informatique de gestion, afin de vous entraîner.

Etterbeek 2008-2009:

/!\ petit conseil: commencez d'abord par les exercices de uccle 2009-2010 /!\

Note: j'essaie de réorganiser les exercices de cette période qui est un peu foutoir, en attendant, entraînez vous sur ceux de Uccle 2009-10

E1) Entrez 3 nombres et affichez le maximum des trois.

E2) Résoudre une équation du second degré.
Rappel: delta = b²-4ac.
Si delta > 0 => 2 valeurs: (-b+√delta)/2a et (-b-√delta)/2a.
Si delta = 0 => -b/2a
Si delta < 0 => On s'arrête => Impossible de calculer racine d'un nombre négatif, sauf en mathématique avancée avec les nombres complexes (lien wiki: https://fr.wikipedia.org/wiki/Nombre_complexe).

E3) Afficher une table des 128 premiers caractères ASCII sous la forme:

dec:   0  oct: 000  hex: 0x00  ASCII: ' '
dec:   1  oct: 001  hex: 0x01  ASCII: ' '
dec:   2  oct: 002  hex: 0x02  ASCII: ' '
...
dec:  10  oct: 012  hex: 0x0A  ASCII: ' '
...
dec:  48  oct: 060  hex: 0x30  ASCII: '0'
dec:  49  oct: 061  hex: 0x31  ASCII: '1'
...
dec:  65  oct: 081  hex: 0x41  ASCII: 'A'
dec:  66  oct: 082  hex: 0x42  ASCII: 'B'
...
dec:  97  oct: 121  hex: 0x61  ASCII: 'a'
dec:  98  oct: 122  hex: 0x62  ASCII: 'b'
dec:  99  oct: 123  hex: 0x63  ASCII: 'c'
dec: 100  oct: 124  hex: 0x64  ASCII: 'd'
...
dec: 128 ...

E4) Entrez un nombre entier de 2 octets en binaire et afficher sa valeur en hexadécimal et décimal.
Exemple:

Saisissez un entier en base 2: 1011
Equivaut à 11 en base 10 (0x000B en base 16).

E5) Devinette. Le programme doit deviner un nombre choisi par l'utilisateur entre 1 et 100. L'utilisateur répondra par H (trop haut), B (trop bas), E (Exact) ou S (Stop). Prévoir le cas où le nombre est à coup sûr exact et affichez le nombre de tentatives.
Exemple:

Devinette:
Est-ce que votre nombre est 64 ? H
Est-ce que votre nombre est 32 ? B
Est-ce que votre nombre est 48 ? H
Est-ce que votre nombre est 36 ? H
Est-ce que votre nombre est 32 ? B
Est-ce que votre nombre est 34 ? B
Votre nombre est 35, nombre de tentatives: 6.

E6) Affichez la pyramide suivante:

         1
        232
       34543
      4567654
     567898765
    67890109876
   7890123210987
  890123454321098
 90123456765432109
0123456789876543210

E7) Amstrong. Un nombre d'Amstrong est un nombre dont la somme des cube de chaque chiffre qui le compose est égal à lui même. Ecrire un programme qui affiche tous les nombres d'Amstrong compris entre 1 et 1000.
Exemple: 153 = 1³ + 5³ + 3³

E8) Ecrire un programme qui saisit 2 entiers positifs puis propose un menu permettant de les additionner ou soustraire.

Saisissez 2 entiers: 12 23
1, Additionner 12 et 23
2, Soustraire 12 de 23
3, Soustraire 23 de 12
Choix ? 2
23-12= 11

[size=24]Uccle 2009-2010:[/size]

[size=18]--partie 1: introduction : printf() et scanf()--[/size]

1.1) Affichez à l'écran la croix suivante en une seule instruction:

   *   
   *   
   *   
*******
   *   
   *   
   *   

[spoiler=Réponse]

[== C++ ==]
#include <stdio.h>

int main()
{
    printf("   *   \n   *   \n   *   \n*******\n   *   \n   *   \n   *   \n");
    return 0;
}

[/spoiler]
1.2) Saisissez 3 nombres à l'écran et affichez dans l'ordre inverse de la saisie.
[hide=Réponse]

[== C++ ==]
#include <stdio.h>

int main()
{
    int a,b,c;
    
    printf("Saisissez 3 nombres (a b c): ");
    scanf("%d %d %d",&a,&b,&c);
    
    printf("%d %d %d\n",c,b,a);
    return 0;
}

[/hide]
1.3) Saisissez l'heure sous forme hh:mm:ss et affichez " il est exactement xx heures, yy minutes et zz secondes ".
Remarque: Il n'y a pas encore test pour vérifier si l'heure est une heure correcte à ce niveau la.
[hide=Réponse]

[== C++ ==]
#include <stdio.h>

int main()
{
    int hh,mm,ss;
    
    printf("Saisissez une heure sous forme hh:mm:ss: ");
    scanf("%d:%d:%d",&hh,&mm,&ss);
    
    printf("Il est exactement %d heures, %d minutes et %d secondes\n",hh,mm,ss);
    return 0;
}

[/hide]
[size=18]--partie 2 : introduction : les opérateurs--[/size]

2.1) Saisissez 2 nombres entiers et affichez leur somme, leur différence, leur produit, leur quotient et leur reste.
Remarque: donnez des nombres différents de 0, les tests n'étant pas encore vu a ce niveau là.
Amélioration: la même chose avec les tests contre les divisions par 0.
[hide=Réponse de la version simplifiée]

[== C++ ==]
#include <stdio.h>

int main()
{
    int a,b;

    printf("Saisissez 2 nombres entiers différents de 0: (a b): ");
    scanf("%d %d",&a, &b);

    printf("Somme=%d\n", a+b);
    printf("Soustraction=%d\n", a-b);
    printf("Produit=%d\n", a*b);
    printf("Quotient=%d\n", a/b);
    printf("Reste (modulo)=%d\n", a%b);

    return 0;
}

[/hide]
[hide=Réponse de la version améliorée]

[== C++ ==]
#include <stdio.h>

int main()
{
    int a,b;

    printf("Saisissez 2 nombres entiers: (a b): ");
    scanf("%d %d",&a, &b);

    printf("Somme=%d\n", a+b);
    printf("Soustraction=%d\n", a-b);
    printf("Produit=%d\n", a*b);
    if (!b) printf("Impossible de diviser par 0. Quotient et reste non disponible.\n");
    else {
        printf("Quotient=%d\n", a/b);
        printf("Reste (modulo)=%d\n", a%b);
    }

    return 0;
}

[/hide]

2.2) Saisissez une lettre minuscule et affichez la lettre majuscule correspondante. En sachant que 'a' = 97 et 'A' = 65.
[hide=Réponse]

[== C++ ==]
#include <stdio.h>

int main()
{
    char a;

    printf("Saisissez une lettre minuscule: ");
    scanf("%c",&a);

    printf("Correspondance %c vers %c\n",a,a-32);

    return 0;
}

[/hide]

2.3) Saisissez un nombre de secondes et affichez l'heure, minutes et secondes correspondantes.
[hide=Réponse]

[== C++ ==]
#include <stdio.h>

int main()
{
    int t, h, m, s;

    printf("Saisissez un nombre de secondes: ");
    scanf("%d",&t);
    
    h = t / 3600; /* nombre d'heures */
    m = (t % (h*3600)) / 60; /* nombre de minutes */
    s = (t % (h*3600) % (m * 60)); /* nombre de secondes */
 
    printf("Correspondance heures:minutes:secondes: %d:%d:%d\n",h,m,s);

    return 0;
}

[/hide]

2.4) Ecrire un programme qui permute et affiche la valeur de 3 variables B=A, C=B et A=C.
Amélioration 1: en utilisant une fonction shl(), shr() puis shsym(). /* shift left, shift right, shift symetric */
Amélioration 2: avec fonction et vecteur (ou tableau statique).
Amélioration 3: avec fonction et pointeurs (ou tableau dynamique).
[hide=Réponse de la version simplifiée]

[== C++ ==]
#include <stdio.h>

int main()
{
    int a,b,c,tmp=0;

    printf("Saisissez 3 nombres A, B et C: (a b c): ");
    scanf("%d %d %d", &a,&b,&c);
    
    printf("Avant permutation: A=%d, B=%d et C=%d\n",a,b,c);
    
    tmp = c;
    c = b;
    b = a;
    a = tmp;
    
    printf("Après permutation: A=%d, B=%d et C=%d\n",a,b,c);

    return 0;
}

[/hide]
[hide=Réponse de la version améliorée 1]

{Bientot}

[/hide]
[hide=Réponse de la version améliorée 2]

{Bientot}

[/hide]
[hide=Réponse de la version améliorée 3]

{bientot}

[/hide]

[size=18]--partie 3: les boucles et alternatives--[/size]
(à partir d'ici, on va commencer à gérer les situations d'erreurs)

3.1) Écrire un programme qui simule l'utilisation d'une calculatrice. Le programme demande à l'utilisateur d'introduire l'opérateur(+,-,/,*), deux nombres et effectue l'opération correspondante. Pour la division, vérifier si le dénominateur n'est pas égal à 0.
Faites le de 2 manières différentes.
a) avec des if
b) avec switch/case
[hide=Réponse de la version avec if]

[== C++ ==]
#include <stdio.h>

int main()
{
    int a,b;
    char op;

    printf("Saisissez 2 nombres et l'opérateur (+,-,*,/): (a b symbole): ");
    scanf("%d %d %c", &a,&b,&op);
    
    if (op == '+') printf("Résultat=%d\n",a+b);
    else if (op == '-') printf("Résultat=%d\n",a-b);
    else if (op == '*') printf("Résultat=%d\n",a*b);
    else if (op == '/'){
        if (!b) printf("division par zero. programme terminé.\n");
        else printf("Résultat=%d\n",a/b);
    } else printf("opérateur non reconnu. programme terminé.\n");

    return 0;
}

[/hide]
[hide=Réponse de la version avec switch/case]

[== C++ ==]
#include <stdio.h>

int main()
{
    int a,b;
    char op;

    printf("Saisissez 2 nombres et l'opérateur (+,-,*,/): (a b symbole): ");
    scanf("%d %d %c", &a,&b,&op);
    
    switch (op){
    case '+': 
        printf("Résultat=%d\n",a+b);
        break;
    case '-': 
        printf("Résultat=%d\n",a-b);
        break;
    case '*': 
        printf("Résultat=%d\n",a*b);
        break;
    case '/':
        if (!b) printf("division par zero. programme terminé.\n");
        else printf("Résultat=%d\n",a/b);
        break;
    default:
        printf("opérateur non reconnu. programme terminé.\n");
    }

    return 0;
}

[/hide]

3.2) Ecrire un programme qui saisit un caractère et affiche "OK" si le caractère est 'O' ou 'o'. "Sorry" si le caractère est 'N' ou 'n' et "bof" sinon.
[hide=Réponse]

[== C++ ==]
#include <stdio.h>

int main()
{
    char c;

    printf("Saisissez un caractère ('o' => OK,'n' => Sorry, autres => bof): ");
    scanf("%c", &c);
    
    switch (c){
    case 'o':
    case 'O': 
        puts("OK");
        break;
    case 'n':
    case 'N': 
        puts("Sorry");
        break;
    default:
        puts("bof");
    }

    return 0;
}

[/hide]

3.3) Ecrire un programme qui lit, au moyen d'une boucle while, des nombres pairs et s'arrête dès qu'un nombre impair à été saisi. Il affiche ensuite le nombre d'entiers pairs saisis.
[hide=Réponse]

[== C++ ==]
#include <stdio.h>

int main()
{
    int a, cpt=0;

    printf("Saisissez un nombre (nombre impair pour quitter): ");
    scanf("%d", &a);
    while (!(a%2)){  
        puts("cpt +1");   
        ++cpt;  /* nombre pair => compteur +1 */
         
        printf("Saisissez un nombre (nombre impair pour quitter): ");
        scanf("%d", &a);
    }
    printf("Nombre d'entiers pairs ayant été rentrés: %d\n", cpt);

    return 0;
}

[/hide]

3.4) Ecrire un programme qui affiche tous les nombres premiers entre 1 et 100.
[hide=Réponse]

[== C++ ==]
#include <stdio.h>

int main()
{
    int i,j,cpt;
    
    puts("Liste des nombres premiers");
    
    for (i=1;i<100;i++)
    {
        cpt = 0;
        for (j=2;j<i;j++)
        {
            if (!(i%j)) cpt++;
        }
        if (!cpt) printf("%4d",i);
    } putchar('\n');

    return 0;
}

[/hide]

3.5) Ecrire un programme qui calcule la factorielle d'un nombre introduit au clavier.
Exemple: !5=5*4*3*2*1.
Amélioration: avec fonction récursive.
[hide=Réponse de la version simplifiée]

[== C++ ==]
#include <stdio.h>

int main()
{
    int a, tmp, fact;
    
    printf("Saisissez un nombre: ");
    scanf("%d",&a);
    
    fact = tmp = a;
    
    while (--tmp){
        fact *= tmp;
    }
    printf("Le factoriel de %d est %d\n",a,fact);

    return 0;
}

[/hide]
[hide=Réponse de la version améliorée]

[== C++ ==]
#include <stdio.h>

int factoriel(int nb){
    if (nb > 1) return nb * factoriel(nb-1);
    else return 1; 
}

int main()
{
    int a;
    
    printf("Saisissez un nombre: ");
    scanf("%d",&a);
    
    printf("Le factoriel de %d est %d\n",a,factoriel(a));

    return 0;
}

[/hide]

3.6) Au patinage artistique, 8 juges attribuent une cote comprise entre 1 et 6. On élimine la plus haute et la plus basse et on affiche la moyenne des 6 restantes. (A faire en flottant).
Amélioration 1: avec fonctions min(), max() et avg(). /* minimum, maximum et average */
Amélioration 2: avec nombres aléatoires.
Amélioration 3: avec macro MIN(a,b), MAX(a,b) à la place des fonctions du même nom.
[hide=Réponse version simplifiée]

[== C++ ==]
#include <stdio.h>

int main()
{
    int i;
    float cote, somme=0.0, min=10.0, max=0.0;
    
    puts("Au patinage artistiques, 8 juges donnent les cotations suivantes (entre 1.0 et 6.0: ");
    
    for (i=1; i<9; i++){
        printf("Juge %d: ",i);
        scanf("%f",&cote);
        min = cote < min ? cote : min;
        max = cote > max ? cote : max;
        somme += cote;
    }
    somme -= (min + max);
    
    printf("La note moyenne est de %.1f\n",somme/6);

    return 0;
}

[/hide]
[hide=Réponse version améliorée 1]

[== C++ ==]
#include <stdio.h>

float min(float a, float b){
    return (a < b) ? a : b;
}

float max(float a, float b){
    return (a > b) ? a : b;
}

float avg(float total, int nb){
    return total / nb;
}

int main()
{
    int i;
    float cote, somme=0.0, vmin=10.0, vmax=0.0;
    
    puts("Au patinage artistiques, 8 juges donnent les cotations suivantes:");
    
    for (i=1; i<9; i++){
        printf("Juge %d: ",i);
        scanf("%f",&cote);
        vmin = min(cote,vmin);
        vmax = max(cote,vmax);
        somme += cote;
    }
    somme -= (vmin + vmax);
    
    printf("La note moyenne est de %.1f\n",avg(somme,6));

    return 0;
}

[/hide]
[hide=Réponse version améliorée 2]

[== C++ ==]
#include <stdio.h>
#include <stdlib.h>  /* rand(), srand() */
#include <time.h>    /* time() */

float min(float a, float b){
    return (a < b) ? a : b;
}

float max(float a, float b){
    return (a > b) ? a : b;
}

float avg(float total, int nb){
    return total / nb;
}

int main()
{
    int i;
    float cote, somme=0.0, vmin=10.0, vmax=0.0;
    
    puts("Au patinage artistiques, 8 juges donnent les cotations suivantes:");
    
    srand(time(NULL)); /* initialise le générateur de nombre aléatoire */
    for (i=1; i<9; i++){
        cote = 1.0 +((rand() / (double) RAND_MAX) * 5); /* creation de nombre aléatoire entre 1 et 6 */
        printf("%6.1f",cote);
        vmin = min(cote,vmin);
        vmax = max(cote,vmax);
        somme += cote;
    }
    putchar('\n');
    somme -= (vmin + vmax);
    
    printf("La note moyenne est de %.1f\n",avg(somme,6));

    return 0;
}

[/hide]
[hide=Réponse version améliorée 3]

[== C++ ==]
#include <stdio.h>
#include <stdlib.h>  /* rand(), srand() */
#include <time.h>    /* time() */

/* definition des macros */

#define MIN(a,b) (a) < (b) ? (a) : (b)
#define MAX(a,b) (a) > (b) ? (a) : (b)

/* definition des fonctions */

float avg(float total, int nb){
    return total / nb;
}

/* debut de programme */

int main()
{
    int i;
    float cote, somme=0.0, vmin=10.0, vmax=0.0;
    
    puts("Au patinage artistiques, 8 juges donnent les cotations suivantes:");
    
    srand(time(NULL)); /* initialise le générateur de nombre aléatoire */
    for (i=1; i<9; i++){
        cote = 1.0 +(rand() / (double) RAND_MAX) * 5; /* creation de nombre aléatoire entre 1 et 6 */
        printf("%6.1f",cote);
        vmin = MIN(cote,vmin);
        vmax = MAX(cote,vmax);
        somme += cote;
    }
    putchar('\n');
    somme -= (vmin + vmax);
    
    printf("La note moyenne est de %.1f\n",avg(somme,6));

    return 0;
}

[/hide]

3.7) Ecrire les tables de multiplication de 1 à 10 avec présentation.

    |   1   2   3   4   5   6   7   8   9  10
---------------------------------------------
   1|   1   2   3   4   5   6   7   8   9  10
   2|   2   4   6   8  10  12  14  16  18  20
   3|   3   6   9  12  15  18  21  24  27  30
   4|   4   8  12  16  20  24  28  32  36  40
   5|   5  10  15  20  25  30  35  40  45  50
   6|   6  12  18  24  30  36  42  48  54  60
   7|   7  14  21  28  35  42  49  56  63  70
   8|   8  16  24  32  40  48  56  64  72  80
   9|   9  18  27  36  45  54  63  72  81  90
  10|  10  20  30  40  50  60  70  80  90 100

[hide=Réponse]

[== C++ ==]
#include <stdio.h>

int main()
{
    int i, j;
    
    puts("    |   1   2   3   4   5   6   7   8   9  10");
    puts("---------------------------------------------");
    for (i=1; i<=10; i++){
        printf("  %2d|",i);
        for (j=1;j<=10;j++){
            printf("%4d",i*j);
        }
        putchar('\n');
    }

    return 0;
}

[/hide]

3.8) Afficher un triangle isocèle à l'écran formé d'étoiles. La hauteur de ce triangle (c-à-d le nombre de lignes) sera fourni en données. On s'arrangera pour que la dernière ligne du triangle s'affiche à l'extrême gauche de l'écran.
[hide=Réponse]

[== C++ ==]
#include <stdio.h>

int main()
{
    int n, i, j;

    printf("Entrez la hauteur du triangle: ");
    scanf("%d",&n);

    for (i=1;i<=n;i++)
    {
        for (j=1; j <= n-i; j++)
        {
            putchar(' ');
        }
        for (j=1; j < i*2; j++)
        {
            putchar('*');
        }putchar('\n');
    }

    return 0;
}

[/hide]

3.9) Afficher toutes les manières possible de faire un euro avec des pièces de 2 cents, 5 cents, et 10 cents et le nombre de possibilités.
Les résultats seront affichés comme suit:

   1 euro =  50 x  2c
   1 euro =  45 x  2c    2x  5c
...
   1 euro =  10 x 10c

Il y a ... possibilités de faire 1 euro.

[hide=Réponse]

[== C++ ==]
#include <stdio.h>

int main(){

    int c10, c5, c2, r, r2, cpt=0;

    for (c10=0;c10<=10;c10++){
        r = 100-(c10*10);
        for (c5=0;c5 <= r/5; c5+=2){
            r2 = r - (c5*5);
            c2 = r2 / 2;
            
            printf("   1 euro =");
            if(c10) printf("  %2d x 10c",c10);  
            if(c5) printf("  %2d x 5c",c5);  
            if(c2) printf("  %2d x 2c",c2);
            putchar('\n');
            cpt++;
        }
    }
    printf("Il y a %d manières d'obtenir 1 euro avec 10c, 5c et 2c.\n",cpt);

    return 0;
}

[/hide]

3.10) Ecrire un programme qui affiche le pgcd (plus grand commun diviseur) de 2 nombres entiers positifs.
Amélioration: avec fonction pgcd().
[hide=Réponse de la version simplifiée]

[== C++ ==]
#include <stdio.h>

int main(){

    int a, b, a2, b2, tmp;

    printf("Saisissez 2 nombres entiers (a b): ");
    scanf("%d %d",&a, &b);
    
    if ((a>0) & (b>0)){
        a2 = a;
        b2 = b;
        while (a2 % b2){
            tmp = a2 % b2;
            a2 = b2;
            b2 = tmp;
        }
        printf("Le pgcd de %d et de %d est %d\n",a,b,b2);
    }else puts("Au moins un des deux nombres n'est pas un entier positif non nul.");

    return 0;
}

[/hide]
[hide=Réponse de la version améliorée]

[== C++ ==]
#include <stdio.h>

int pgcd(int a, int b){
    
    int tmp;
    
    while (a % b){
        tmp = a % b;
        a = b;
        b = tmp;
    }
    return b;
}

int main(){

    int a, b;

    printf("Saisissez 2 nombres entiers (a b): ");
    scanf("%d %d",&a, &b);
    
    if ((a>0) & (b>0)) printf("Le pgcd de %d et de %d est %d\n",a,b,pgcd(a,b));
    else puts("Au moins un des deux nombres n'est pas un entier positif non nul.");

    return 0;
}

[/hide]

3.11) Ecrire 5 nombres triangulaires à partir de 5 valeur saisies à l'écran. Un nombre trinagulaire est la somme de lui-même et de ses précédents.
Exemple: nombre triangulaire de 3 = 6 (3+2+1).
Amélioration: avec fonction récursive.
[hide=Réponse de la version simplifiée]

[== C++ ==]
#include <stdio.h>

int main(){

    int i, j, a, nbtri;

    puts("Saisissez 5 nombres:");
    for (i=0; i <5; i++){
        printf("Votre nombre: ");
        scanf("%d",&a);
        
        nbtri=0;
        for (j=1; j<=a; j++){
            nbtri += j;
        }
        printf("Le nombre triangulaire de %d est %d\n",a,nbtri);
    }

    return 0;
}

[/hide]
[hide=Réponse de la version améliorée]

[== C++ ==]
#include <stdio.h>

int nbtri(int a){
    if (a == 1) return 1;
    else return a + nbtri(a-1);
}

int main(){

    int i, a;

    puts("Saisissez 5 nombres:");
    for (i=0; i <5; i++){
        printf("Votre nombre: ");
        scanf("%d",&a);
        
        printf("Le nombre triangulaire de %d est %d\n",a,nbtri(a));
    }

    return 0;
}

[/hide]

[size=18]--partie 4: les vecteurs (tableaux statiques)--[/size]

4.1) Ecrire un programme qui remplit un tableau T de type int (max 10 éléments) par des valeurs entrées au clavier et affiche le tableau.Le programme calcule est affiche ensuite la somme des éléments du tableau.

4.2) Ecrire un programme qui remplit un tableau T à 2 dimensions de type int (3 * 4) par des valeurs entrées au clavier et affiche la somme de chaque ligne et chaque colonne en n'utilisant qu'une variable d'aide pour la somme.

---

Bon travail de codage. Ne regardez pas les réponses tout de suite. Essayez de les faire par vous-même, et pour vous-même. C'est ainsi que vous apprendrez. Je me permet aussi de citer une pieuse parole de notre père fondateur lors de la conférence:

Citation de Richard Stallman: " Pour apprendre un langage, il faut lire beaucoup de code et écrire beaucoup de code... "


Avant de poser vos questions, jeter un oeil ici
Mon CodeVault et Wiki : ici
Les messages privés envers le staff sont uniquement pour les cas d'urgence ou affaires privées (personnelles). Les demandes se feront exclusivement sur le forum. Merci de respecter cette clause sous peine de sanctions.

Hors ligne

Pied de page des forums