Notions | Exercices 6-10

Enoncé exercice 6

Ecrire un programme C qui lit en entrée un caractère alphabétique entre a et y, qui peut être soit une majuscule ou une minuscule. Et affiche la lettre qui vient juste après lui dans l’ordre alphabétique.

Correction exercice 6

Dans ce programme on va lire une lettre, et on affichera la lettre qui la suit. Et puisque la lettre z se trouve dernière dans l’ordre alphabétique, on se limitera alors, seulement aux lettres entre a et y, qu’elles soient majuscules ou minuscules. Il faut donc tenir à transmettre cette information à l’utilisateur en l’indiquant au sein de la fonction printf (ligne 6).

Le type prédéfini du langage C qui permet de gérer les caractères (lettres, chiffres, signes de ponctuation, symboles …) est le type char. Son format et comme suit %c. On aura besoin donc de déclarer une variable de type char qu’on va appeler lettre (ligne 5). Elle sera utilisée pour contenir la lettre entrée par l’utilisateur. Sa lecture se fera à l’aide de la fonction scanf (ligne 7).

Les variables de type char comme c’est le cas pour celles du type int, supportent les opérations d’incrémentations. Et c’est exactement ce dont on a besoin pour cette exercice. Donc pour passer d’une lettre à celle qui la suit il suffira tout simplement d’incrémenter par 1 la valeur de la variable qui la contient. Et on peut faire ça en utilisant l’instruction lettre=lettre+1 ou plus simplement lettre++ (ligne 8).

Pour terminer, on affichera la valeur de la variable lettre, qui contiendra à ce stade la lettre suivante à celle initialement entrée par l’utilisateur (ligne 9).

Solution exercice 6
#include<stdio.h>
#include<stdlib.h>
int main()
{
    char lettre;
    printf("Donnez une lettre entre 'a' et 'y' ou entre 'A' et 'Y':\n");
    scanf("%c",&lettre);
    lettre++;
    printf("La lettre suivante est: %c.\n",lettre);
    system("pause");
    return 0;
}
Enoncé exercice 7

Ecrire un programme C qui lit deux réels R1 et R2 qui représentent les rayons de deux cercles concentriques, et renvoie ensuite l’aire de la surface comprise entre les deux cercles (surface grise).
Remarque: R1 peut être supérieur à R2, comme il peut lui être inférieur.

Correction exercice 7

Comme d’habitude la première chose à faire sera la déclaration des variables dont on aura besoin dans le programme. Dans cet exercice on utilisera cinq variables de type double. On pourrait utiliser le type float, mais on verra plus tard la raison derrière ce choix. Ces cinq variables sont; R1 et R2 pour les rayons, aire1 et aire2 pour l’aire de chacun des deux cercles, et finalement aire pour l’aire de la surface comprise entre les deux cercles.

Une fois les variables déclarées, on demandera à l’utilisateur, à l’aide de la fonction printf, d’entrer les valeurs des deux rayons (ligne 7). Ces valeurs vont être lises vers les deux variables R1 et R2 en utilisant la fonction scanf. Il faudra noter par cette occasion le format du type double qui est %lf (ligne 8).

Pour calculer l’aire de la surface grise, on procédera par le calcul des aires des deux cercles donnés par la formule générale Pi*R2 Pi = 3,14… et R le rayon du cercle (lignes 9-10). Et maintenant qu’on a les deux aires calculés, il suffira de soustraire l’aire du petit cercle du plus grand pour avoir l’aire qu’on cherche. Sauf, qu’à ce stade de notre apprentissage du langage C, on a pas encore les outils qui vont permettre de comparer les deux aires. On va donc utiliser une autre approche, qui consiste à calculer la différence entre les deux aires puis calculer la valeur absolue de cette différence. Dans la bibliothèque math.h on a la fonction fabs qui permet de faire juste ça. Elle prend en paramètre une variable de type double (c’est la raison pour laquelle on a déclaré des variables de type double) et qui renvoie sa valeur absolue (ligne 11). Ceci dit, il ne faut pas oublier d’importer la bibliothèque math.h (ligne 3).

Reste maintenant à afficher la valeur de l’aire calculé, à l’aide de la fonction printf. ceci est fait avec une précision de quatre chiffres après la virgule (ligne 12).
Remarque: pour la fonction fabs soit qu’on lui donne en paramètre (aire1 – aire2) ou (aire2 – aire1) elle donnera le même résultat.

Solution exercice 7
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
    double R1,R2,aire1,aire2,aire;
    printf("Donnez les rayons des deux cercles:\n");
    scanf("%lf%lf",&R1,&R2);
    aire1 = 3.14*R1*R1;
    aire2 = 3.14*R2*R2;
    aire = fabs(aire1-aire2);
    printf("L'aire de la surface entre les deux cercles est: %.4lf\n",aire);
    system("pause");
    return 0;
}
Enoncé exercice 8

Ecrire un programme C qui lit deux entiers est affiche le plus grand d’entre eux.

Correction exercice 8

Cet exercice vise à rappeler la formule de calcul du max de deux nombres. Soient a et b deux nombres quelconques, leur max est donné par :

max(a,b) = (a + b + |a – b|)/2

|a-b| est la valeur absolue de la différence (a-b).

On va commencer le programme en demandant à l’utilisateur d’entrer deux entiers, qu’on lira ensuite vers les variables entières a et b en utilisant la fonction scanf (lignes 7-8).

En utilisant maintenant la formule ci-dessus, on calculera leur max (ligne 9). Bien sûr il faudra y remplacer la grandeur |a-b|, qui ne sera pas reconnue par le compilateur, par la fonction de calcul de la valeur absolue réservée aux types entiers et qui est abs. Cette dernière est définie dans la bibliothèque math.h.
Finalement, on termine le programme en affichant le max calculé (ligne 10).

Solution exercice 8
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
    int a,b,max;
    printf("Entrez deux entiers:\n");
    scanf("%d%d",&a,&b);
    max = (a+b+abs(a-b))/2;
    printf("Le max de %d et %d est: %d.\n",a,b,max);
    system("pause");
    return 0;
}
Enoncé exercice 9

Ecrire un programme C qui trouve pour un réel les deux carrés parfaits les plus proches qui l’encadrent.

On rappelle qu’un carré parfait est un entier dont la racine carrée est aussi un entier. Exemple: 9 = 3×3 et 4 = 2×2 sont des carrés parfaits ; or, 5 ne l’est pas.

Correction exercice 9

Après la déclaration des variables nécessaires, et à l’aide de la fonction printf, on va demander à l’utilisateur d’entrer un réel (ligne 8). On le lit ensuite vers la variable x de type double, en utilisant la fonction scanf (ligne 9).

Maintenant, pour trouver les deux carrés parfaits qui encadrent x, la démarche est très simple ; elle commence par le calcul de la racine carrée de x à l’aide de la fonction sqrt définie dans la bibliothèque math.h. Cette fonction prend comme paramètre un double et renvoie sa racine carrée.

Le carré parfait inférieur à x sera alors le carré de l’entier le plus proche de la racine carrée de x du côté inférieur. Cet entier est donné directement par la fonction floor appliquée à sqrt(x). La fonction floor est définie elle aussi dans math.h, elle correspond à la fonction partie entière. En voici deux exemples : floor(2.423) = 2 et floor(4) = 4.

Avec presque la même façon on peut trouver le carré parfait supérieur à x. Mais maintenant on cherche l’entier le plus proche de la racine carrée de x du côté supérieur. Il sera donné en appliquant la fonction ceil à la racine carrée de x.La fonction ceil elle aussi est définie dans math.h. Et on a : ceil(2.423) = 3 et ceil(4) = 4.

Les deux fonctions ceil et floor renvoient un double, donc une conversion vers le type entier est faite (lignes 10 et 12).

Solution exercice 9
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
    double x;
    int a,b;
    printf("Entrez un reel:\n");
    scanf("%lf",&x);
    a = (int)floor(sqrt(x));
    a = a*a;
    b = (int)ceil(sqrt(x));
    b = b*b;
    printf("%d <= %lf <= %d\n",a,x,b);
    system("pause");
    return 0;
}
Enoncé exercice 10

Ecrire un programme C qui lit une fraction au format a/ba et b sont deux entiers, et donne son équivalent décimal avec une précision de quatre chiffres après la virgule.

Ex: si l’utilisateur entre 3/2, le programme doit afficher: 3/2 = 1.5000

Correction exercice 10

La seule difficulté que présente cet exercice est l’accès aux deux entiers qui se trouvent de part et d’autre du signe de division /. Une chose est sûr, on ne peut pas lire les deux entiers et faire comme si le signe / n’existait pas.

La solution est très simple, puisque on sait d’avance que l’utilisateur va entrer deux entiers séparés par un slash, il est possible de le signaler à la fonction scanf, en reprenant ce même format dans sa chaîne de formatage en veillant à remplacer la position des entiers qu’on va lire par des %d. Donc, la chaîne de formatage de scanf ne sera pas %d%d mais %d/%d (ligne 8).

Maintenant qu’on a les deux entiers a et b, on réalise une division réelle en faisant une conversion vers le type float de l’un des deux entiers (ligne 9). Après ça, on passe directement à l’affichage du résultat avec une précision de quatre chiffres après la virgule en utilisant %.4f (ligne 10).

Solution exercice 10
#include<stdio.h>
#include<stdlib.h>
int main()
{
    int a,b;
    float d;
    printf("Donnez une fraction:\n");
    scanf("%d/%d",&a,&b);
    d = (float)a/b;
    printf("%d/%d = %.4f\n",a,b,d);
    system("pause");
    return 0;
}