Conditions | Exercices 6-10

Enoncé exercice 6

Ecrire un programme C qui lit une date au format 15/09/2012 et l’affiche sous le format suivant: 15-Septembre-2012.

Correction exercice 6

On sait donc d’avance que le format de l’entrée sera entier/entier/entier. C’est-à-dire trois entiers séparés par deux slashs. On le signal donc à la fonction scanf afin de pouvoir extraire ces trois entiers. Ceci sera fait en utilisant la chaîne de formatage %d/%d/%d. Ces entiers seront lus vers les variables entières jour, mois et annee (ligne 7).

Du moment où on a le jour, on peut l’afficher tout de suite, puisque c’est le premier qui doit apparaître dans l’affichage. Cependant, il ne faut pas lors de son affichage revenir à la ligne, et ceci pour s’assurer que les trois entités jour, mois et année soient affichées sur la même ligne.

Il est aussi préférable d’afficher le jour en deux chiffres. En ajoutant un zéro à gauche, si le jour est constitué seulement d’un seul chiffre. Donc on va faire un test sur la valeur de la variable jour, et si elle est strictement inférieure à dix la variable jour va être affichée précédée du chiffre zéro (ligne 8). Dans l’autre cas, on l’affiche seule puisque elle est déjà constituée de deux chiffres (ligne 9). Dans les deux cas, on affiche un signe pour respecter le format de sortie.

Pour le mois, on exploite la structure de contrôle switch (lignes 10-36). Pour chaque valeur de la variable mois, on affiche le mois correspondent en lettres.

Pour l’année on réaffiche la variable annee mais précédée d’un signe (ligne 37).

Solution exercice 6
#include<stdio.h>
#include<stdlib.h>
int main()
{
    int jour,mois,annee;
    printf("Inscrivez une date (Ex: 15/9/2012):\n");
    scanf("%d/%d/%d",&jour,&mois,&annee);
    if(jour<10) printf("0%d-",jour);
    else printf("%d-",jour);
    switch(mois)
    {
       case 1: printf("Janvier");
            break;
       case 2: printf("Fevrier");
            break;
       case 3: printf("Mars");
            break;
       case 4: printf("Avril");
            break;
       case 5: printf("Mai");
            break;
       case 6: printf("Juin");
            break;
       case 7: printf("Juillet");
            break;
       case 8: printf("Aout");
            break;
       case 9: printf("Septembre");
            break;
       case 10: printf("Octobre");
            break;
       case 11: printf("Novembre");
            break;
       case 12: printf("Decembre");
            break;
    }
    printf("-%d\n",annee);
    system("pause");
    return 0;
}
Enoncé exercice 7

Ecrire un programme C qui lit un entier et dit s’il est un carré parfait ou non.

On rappelle qu’un entier est carré parfait, si sa racine carrée est entière. Ex: les nombre 1 (1×1), 4 (2×2) et 9 (3×3) sont tous des carrés parfaits.

Correction exercice 7

Même si on sait que le nombre que va entrer l’utilisateur est un entier, on va le lire dans une variable n de type float. Et ceci pour pouvoir calculer sa racine directement, à l’aide de la fonction sqrt définie dans la bibliothèque math.h, sans avoir à effectuer aucune conversion de type.

Et, à l’aide de la structure if else, on compare la racine carrée de l’entier n, qui est sqrt(n), avec sa partie entière (int)sqrt(n). Et sachant qu’un réel est entier, si et seulement s’il est égal à sa partie entière, on affichera dans le cas de l’égalité (dans ce cas sqrt(n) est un entier) que l’entier entré, est un carré parfait (ligne 9). Dans le cas contraire on affichera qu’il ne l’est pas (ligne 10).

Dans la fonction printf, on a utilisé pour afficher la variable réelle n, le format %.0f pour ne pas afficher les zéros qui sont à droite de la virgule, afin de donner l’apparence qu’on travaille avec des entiers.

Solution exercice 7
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
    float n;
    printf("Entrez un entier:\n");
    scanf("%f",&n);
    if( sqrt(n) == (int)sqrt(n) ) printf("%.0f est un carre parfait.\n",n);
    else printf("%.0f n'est pas un carre parfait.\n",n);
    system("pause");
    return 0;
}
Enoncé exercice 8

Ecrire un programme C qui lit les coordonnées des deux extrémités d’un segment, et lit ensuite les coordonnées d’un point dans le plan et dit si ce dernier se trouve ou non sur le segment.

Correction exercice 8

On lit les coordonnées point par point dans des variables de type double dont le format est %lf (lignes 8-13).

Pour qu’un point (a,b) appartient au segment [(x1,y1);(x2,y2)], il faut que la somme des distances de ce point vers les deux extrémités soient égale à la longueur du segment. C’est-à-dire:

distance((a,b);(x1,y1)) + distance((a,b);(x2,y2)) = distance((x1,y1);(x2,y2))

Pour calculer ces trois distances, on va utiliser la relation générale suivante et qui donne la distance entre deux points à partir de leurs coordonnées:

distance((x,y);(a,b)) = sqrt((x-a)2+(y-b)2)

Après le calcul des trois distances, et à l’aide de la structure de contrôle if else, on vérifie la condition précitée, et on affiche le message convenable.

Solution exercice 8
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
    double x1,y1,x2,y2,a,b;
    double dist1,dist2,dist;
    printf("Entrez le x1 et y1\n");
    scanf("%lf%lf",&x1,&y1);
    printf("Entrez le x2 et y2\n");
    scanf("%lf%lf",&x2,&y2);
    printf("Entrez le a et b\n");
    scanf("%lf%lf",&a,&b);
    dist1 = sqrt( (x1-a)*(x1-a)+(y1-b)*(y1-b) ); 
    dist2 = sqrt( (x2-a)*(x2-a)+(y2-b)*(y2-b) );
    dist = sqrt( (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2) );
    if( dist == dist1 + dist2 ) printf("Le point est sur le segment.\n");
    else printf("Le point n'est pas sur le segment.\n");
    system("pause");
    return 0;
}
Enoncé exercice 9

Ecrire un programme C qui lit deux instants dans le format HH:MM:SS, et affiche un des messages suivants:

  • Le premier instant vient avant le deuxième;
  • Le deuxième instant vient avant le premier;
  • Il s’agit du même instant.
Correction exercice 9

On va déclarer pour chacun des deux instants, trois variables pour contenir les heures, les minutes et les secondes. On déclare ensuite une variable k à laquelle on va affecter au cours du programme une valeur selon le cas:

  • 0 : si il s’agit du même instant;
  • 1 : si le premier instant vient avant le deuxième;
  • 2 : si le deuxième instant vient avant le premier.

On supposera que le premier instant vient avant le deuxième, en initialisant k par la valeur 1 (ligne 8).

La valeur initiale de la variable k va être changée dans le cas où la supposition ci-dessus n’est pas vraie. Et ceci dans l’un des cas suivants:

  • Si le deuxième instant vient avant le premier: ce cas peut se présenter en trois manières qui sont énumérées dans le programme (lignes 13-15). Dans ce cas, on affecte à la variable k la valeur 2.
  • Si il s’agit du même instant: dans ce cas on affecte à la variable k la valeur 0 (ligne 16).

Après cette étape, on effectue un test sur la valeur de la variable k à l’aide de la structure switch, et selon le cas on affiche le message correspondent (lignes 17-24).

Solution exercice 9
#include<stdio.h>
#include<stdlib.h>
int main()
{
    int h1,h2;
    int m1,m2;
    int s1,s2;
    int k=1;
    printf("Entrez le premier instant:\n");
    scanf("%d:%d:%d",&h1,&m1,&s1);
    printf("Entrez le deuxieme instant:\n");
    scanf("%d:%d:%d",&h2,&m2,&s2);
    if(h1>h2) k=2;
    if(h1==h2 && m1>m2) k=2;
    if(h1==h2 && m1==m2 && s1>s2) k=2;
    if(h1==h2 && m1==m2 && s1==s2) k=0;
    switch(k)
    {
       case 0: printf("Il s'agit du meme instant.\n");
            break;
       case 1: printf("Le premier instant vient avant le deuxieme.\n");
            break;
       case 2: printf("Le deuxieme instant vient avant le premier.\n");
    }
    system("pause");
    return 0;
}
Enoncé exercice 10

Ecrire un programme C qui affiche d’une manière aléatoire un des jours de la semaine.

Correction exercice 10

L’astuce de l’exercice est très simple, on génère un entier compris entre 0 et 6, en calculant le modulo 7 d’un entier généré aléatoirement à l’aide de la fonction rand(), puis on associe à chaque entier un jour de la semaine. Et en utilisant la structure switch on effectue un test sur la valeur de l’entier généré pour afficher le jour correspondant.

La fonction rand est définie dans la bibliothèque stdlib.h. Pour s’assurer qu’à chaque fois qu’on exécute le programme on obtient un nombre différent, il faudra faire l’initialisation de la septième ligne. Cette dernière nécessite la bibliothèque time.h.

Solution exercice 10
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
    int a;
    srand(time(NULL));
    a = rand();
    a = a%7;
    switch(a)
    {
         case 0: printf("Lundi\n");
              break;
         case 1: printf("Mardi\n");
              break;
         case 2: printf("Mercredi\n");
              break;
         case 3: printf("Jeudi\n");
              break;
         case 4: printf("Vendredi\n");
              break;
         case 5: printf("Samedi\n");
              break;
         case 6: printf("Dimanche\n");
              break;
    }
    system("pause");
    return 0;
}