Content is user-generated and unverified.

Solutions TD2 - Structures de contrôle

Exercice 1 : Analyse de boucles

Question 1 : Valeur de S après exécution

c
int i; int S = 0;
for (i=1; i < 6; i+=2) { S = S + i; }
printf("%d\n", S);

Analyse étape par étape :

  • i = 1, S = 0 + 1 = 1
  • i = 3, S = 1 + 3 = 4
  • i = 5, S = 4 + 5 = 9
  • i = 7, condition i < 6 est fausse, sortie de boucle

Réponse : S = 9

Question 2 : Équivalence des boucles

Les deux programmes ne sont pas équivalents.

Programme 1 (for) :

c
#include<stdio.h>
int main() {
    int count = 1;
    for(count = 1; count <= 5; count++) {
        count = 1;
        printf("%d\n", count);
    }
    return 0;
}

Programme 2 (while) :

c
#include<stdio.h>
int main() {
    int count = 1;
    while(count <= 5) {
        printf("%d\n", count);
        count++;
    }
    return 0;
}

Différence :

  • Le programme 1 crée une boucle infinie car count est réinitialisé à 1 dans le corps de la boucle
  • Le programme 2 affiche les nombres de 1 à 5 normalement

Exercice 2 : Triangle d'étoiles

Programme pour afficher un triangle isocèle

c
#include <stdio.h>

int main() {
    int N;
    
    printf("Entrez le nombre de lignes : ");
    scanf("%d", &N);
    
    for (int i = 1; i <= N; i++) {
        // Afficher les espaces
        for (int j = 1; j <= N - i; j++) {
            printf(" ");
        }
        
        // Afficher les étoiles
        for (int k = 1; k <= 2 * i - 1; k++) {
            printf("*");
        }
        
        printf("\n");
    }
    
    return 0;
}

Exemple pour N = 5 :

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

Exercice 3 : Affichage d'entiers

1. Entiers de 1 à 50 séparés par des espaces

c
#include <stdio.h>

int main() {
    printf("Avec boucle while :\n");
    int i = 1;
    while (i <= 50) {
        printf("%d ", i);
        i++;
    }
    printf("\n");
    
    return 0;
}

2. Entiers de 50 à 1 séparés par des espaces

c
#include <stdio.h>

int main() {
    printf("Avec boucle do-while :\n");
    int i = 50;
    do {
        printf("%d ", i);
        i--;
    } while (i >= 1);
    printf("\n");
    
    return 0;
}

3. Entiers pairs de 2 à un nombre demandé

c
#include <stdio.h>

int main() {
    int limite;
    printf("Entrez la limite : ");
    scanf("%d", &limite);
    
    printf("Avec boucle for :\n");
    for (int i = 2; i <= limite; i += 2) {
        printf("%d ", i);
    }
    printf("\n");
    
    return 0;
}

4. Programme pour somme de 10 entiers

c
#include <stdio.h>

int main() {
    int somme = 0, nombre;
    
    printf("Entrez 10 entiers :\n");
    for (int i = 1; i <= 10; i++) {
        printf("Entier %d : ", i);
        scanf("%d", &nombre);
        somme += nombre;
    }
    
    printf("La somme est : %d\n", somme);
    
    return 0;
}

5. Moyenne de 10 entiers strictement positifs

c
#include <stdio.h>

int main() {
    int somme = 0, nombre;
    int count = 0;
    
    printf("Entrez 10 entiers strictement positifs :\n");
    while (count < 10) {
        printf("Entier %d : ", count + 1);
        scanf("%d", &nombre);
        
        if (nombre > 0) {
            somme += nombre;
            count++;
        } else {
            printf("Erreur : entrez un nombre strictement positif !\n");
        }
    }
    
    double moyenne = (double)somme / 10;
    printf("La moyenne est : %.2f\n", moyenne);
    
    return 0;
}

6. Moyenne strictement positive seulement

c
#include <stdio.h>

int main() {
    int somme = 0, nombre;
    int count = 0;
    
    printf("Entrez 10 entiers :\n");
    for (int i = 1; i <= 10; i++) {
        printf("Entier %d : ", i);
        scanf("%d", &nombre);
        
        if (nombre > 0) {
            somme += nombre;
            count++;
        }
    }
    
    if (count > 0) {
        double moyenne = (double)somme / count;
        printf("La moyenne des entiers positifs est : %.2f\n", moyenne);
        printf("Nombre d'entiers positifs : %d\n", count);
    } else {
        printf("Aucun entier positif saisi\n");
    }
    
    return 0;
}

Exercice 4 : Suite mathématique

Programme pour calculer la suite Un+1 = Un + 7 avec U0 = 2

c
#include <stdio.h>

int main() {
    int n, U;
    
    printf("Entrez le nombre de termes à afficher : ");
    scanf("%d", &n);
    
    U = 2;  // U0 = 2
    
    printf("Les %d premiers termes de la suite :\n", n);
    for (int i = 0; i < n; i++) {
        printf("U%d = %d\n", i, U);
        U = U + 7;  // Un+1 = Un + 7
    }
    
    return 0;
}

Exemple pour n = 5 :

U0 = 2
U1 = 9
U2 = 16
U3 = 23
U4 = 30

Exercice 5 : Calcul de puissance

1. Programme avec boucle for

c
#include <stdio.h>

int main() {
    double x;
    int n;
    double resultat = 1.0;
    
    printf("Entrez la base x : ");
    scanf("%lf", &x);
    printf("Entrez l'exposant n : ");
    scanf("%d", &n);
    
    // Calcul avec boucle for
    for (int i = 0; i < n; i++) {
        resultat *= x;
    }
    
    printf("%.2f^%d = %.2f\n", x, n, resultat);
    
    return 0;
}

2. Programme avec boucle while

c
#include <stdio.h>

int main() {
    double x;
    int n;
    double resultat = 1.0;
    int i = 0;
    
    printf("Entrez la base x : ");
    scanf("%lf", &x);
    printf("Entrez l'exposant n : ");
    scanf("%d", &n);
    
    // Calcul avec boucle while
    while (i < n) {
        resultat *= x;
        i++;
    }
    
    printf("%.2f^%d = %.2f\n", x, n, resultat);
    
    return 0;
}

Note : Ne pas utiliser la fonction pow de math.h comme demandé.

Exercice 6 : Test de nombres premiers

Programme pour tester si un nombre est premier

c
#include <stdio.h>

int main() {
    int n;
    int est_premier = 1;  // 1 = premier, 0 = pas premier
    
    printf("Entrez un nombre : ");
    scanf("%d", &n);
    
    if (n <= 1) {
        est_premier = 0;
    } else {
        for (int i = 2; i * i <= n; i++) {
            if (n % i == 0) {
                est_premier = 0;
                break;
            }
        }
    }
    
    if (est_premier) {
        printf("%d est un nombre premier\n", n);
    } else {
        printf("%d n'est pas un nombre premier\n", n);
    }
    
    return 0;
}

Rappel : Un nombre est premier s'il n'a aucun diviseur autre que 1 et lui-même.

Exercice 7 : Affichage de nombres parfaits

Programme pour afficher les nombres parfaits jusqu'à n

c
#include <stdio.h>

int main() {
    int n;
    
    printf("Entrez un nombre : ");
    scanf("%d", &n);
    
    printf("Les nombres parfaits inférieurs ou égaux à %d sont :\n", n);
    
    for (int i = 1; i <= n; i++) {
        int somme_diviseurs = 0;
        
        // Calculer la somme des diviseurs stricts
        for (int j = 1; j < i; j++) {
            if (i % j == 0) {
                somme_diviseurs += j;
            }
        }
        
        // Vérifier si c'est un nombre parfait
        if (somme_diviseurs == i) {
            printf("%d est parfait car %d = ", i, i);
            
            // Afficher les diviseurs
            int premier = 1;
            for (int j = 1; j < i; j++) {
                if (i % j == 0) {
                    if (!premier) printf(" + ");
                    printf("%d", j);
                    premier = 0;
                }
            }
            printf("\n");
        }
    }
    
    return 0;
}

Exemple : 28 est parfait car 28 = 1 + 2 + 4 + 7 + 14

Exercice 8 : Switch avec couleurs

1. Programme de lecture de couleur

c
#include <stdio.h>

int main() {
    char couleur;
    
    printf("Entrez une couleur (R/V/B/N) : ");
    scanf(" %c", &couleur);
    
    switch (couleur) {
        case 'R':
        case 'r':
            printf("ROUGE si la couleur vaut R ou r\n");
            break;
        case 'V':
        case 'v':
            printf("VERT si la couleur vaut V ou v\n");
            break;
        case 'B':
        case 'b':
            printf("BLEU si la couleur vaut B ou b\n");
            break;
        case 'N':
        case 'n':
            printf("NOIR pour tout autre caractère\n");
            break;
        default:
            printf("NOIR pour tout autre caractère\n");
            break;
    }
    
    return 0;
}

2. Programme de saisie d'entiers positifs

c
#include <stdio.h>

int main() {
    int nombre;
    int max_chiffres = 0;
    
    printf("Entrez des entiers positifs ou nuls (-1 pour arrêter) :\n");
    
    do {
        printf("Entrez un nombre : ");
        scanf("%d", &nombre);
        
        if (nombre >= 0) {
            // Calculer le nombre de chiffres
            int nb_chiffres = 0;
            int temp = nombre;
            
            if (temp == 0) {
                nb_chiffres = 1;
            } else {
                while (temp > 0) {
                    temp /= 10;
                    nb_chiffres++;
                }
            }
            
            // Afficher le nombre et ses chiffres
            printf("Nombre saisi : %d\n", nombre);
            printf("Nombre de chiffres : %d\n", nb_chiffres);
            
            // Mettre à jour le maximum
            if (nb_chiffres > max_chiffres) {
                max_chiffres = nb_chiffres;
            }
        }
    } while (nombre != -1);
    
    printf("Le maximum de chiffres saisis est : %d\n", max_chiffres);
    
    return 0;
}

3. Programme de calcul de carrés

c
#include <stdio.h>

int main() {
    int nombre;
    
    printf("Entrez des nombres positifs (0 pour arrêter) :\n");
    
    while (1) {
        printf("Entrez un nombre : ");
        scanf("%d", &nombre);
        
        if (nombre == 0) {
            break;
        }
        
        if (nombre > 0) {
            int carre = nombre * nombre;
            printf("Le carré de %d est %d\n", nombre, carre);
        } else {
            printf("Nombre négatif, refusé\n");
        }
    }
    
    printf("Programme terminé\n");
    
    return 0;
}

4. Programme de test d'amitié

c
#include <stdio.h>

// Fonction pour calculer la somme des diviseurs stricts
int somme_diviseurs(int n) {
    int somme = 0;
    for (int i = 1; i < n; i++) {
        if (n % i == 0) {
            somme += i;
        }
    }
    return somme;
}

int main() {
    int a, b;
    
    printf("Entrez deux entiers a et b : ");
    scanf("%d %d", &a, &b);
    
    int somme_a = somme_diviseurs(a);
    int somme_b = somme_diviseurs(b);
    
    printf("Somme des diviseurs de %d : %d\n", a, somme_a);
    printf("Somme des diviseurs de %d : %d\n", b, somme_b);
    
    if (somme_a == b && somme_b == a) {
        printf("Les nombres %d et %d sont amis\n", a, b);
    } else {
        printf("Les nombres %d et %d ne sont pas amis\n", a, b);
    }
    
    return 0;
}

Rappel : Deux nombres sont amis si la somme des diviseurs stricts de chacun est égale à l'autre nombre.

Exemple : 220 et 284 sont amis car :

  • Diviseurs de 220 : 1+2+4+5+10+11+20+22+44+55+110 = 284
  • Diviseurs de 284 : 1+2+4+71+142 = 220

Notes importantes :

  • Tous les programmes incluent la gestion des cas d'erreur
  • Les boucles sont choisies selon le contexte (for, while, do-while)
  • Les algorithmes sont optimisés (par exemple, test de primalité jusqu'à √n)
  • Les affichages sont formatés pour être lisibles
Content is user-generated and unverified.
    Solutions complètes TD2 - Structures de contrôle | Claude