Algorithmes et Programmation C

Travaux pratiques (1ère année).

http://www.mescours.ma/C/tpC.html

Najib Tounsi


NB. On pourra se référer avec profit au cours Langage C 


1) L'éternel helloWorld

#include <stdio.h>
main() {
    printf("Hello,world\n");
}

Indication : Si vous travaillez avec un environnement comme  Dev-C++, il se peut que vous ayez besoin de rajouter la ligne :

      #include <conio.h>

en début du fichier source et l'instruction getch(); en fin de programme.

2) Lecture de données, calcul et écriture de résultats

#include <stdio.h>
/* Convertir une température fahrenait en Celcius */
main() {
    int fahrenait;
    float celcius;
printf("Rentrer une temperature en fahrenait: ");
    scanf("%d", &fahrenait);
    celcius = (5.0/9)*(fahrenait-32);
    printf("En Celcius = %f\n", celcius);
}
- Améliorer le programme pour inviter l'utilisateur à rentrer une donnée, température en fahrenait.  (Rajouter printf("Rentrer une temperature en fahrenait: ");)
- Améliorer et écrire : Fahrenait 100 donne   37.8 en celcius

3) Par ici la monnaie

Décomposer une somme d' argent en monnaies de 1, 2, 5 et 10 Dh.

 Soit S la somme à décomposer. Il existe q et r entiers tels que:  S = b * q + r. Si q = 10, b est le nombre de pièces de 10Dh et r le reste de la monnaie. On décompose alors r en pièces de 5 Dh  suivant le même principe, et ainsi de suite.

Utiliser les opérateurs C/ et %, qui donnent respectivement le quotient entier et le reste de deux entiers.

/* Decomposer une somme d' argent en monnaies de 1, 2, 5 et 10 Dh */

#include<stdio.h>
main(){
       int somme;            /* la sommme  decomposer */
       int p10, p5, p2, p1;  /* nombres de pieces de 10, 5, 2 et 1 */
       int reste;            /* variable de travail */
 
       printf("Rentrer la somme: "); scanf("%d",&somme);
       p10 = somme / 10;
       reste = somme % 10;
       p5 = reste / 5;
       reste = reste % 5;
       p2 = reste / 2;
       reste = reste % 2;
       p1 = reste;
       printf("%d pcs de 10, %d pcs de 5, %d pcs de 2 et %d pcs de 1 Dh\n", p10, p5,p2, p1);
}
    NB. Dans ce programme, même si r devient nulle on continue les opérations. Il faut utiliser une instruction if (voir plus bas).

4) Facture d'électricité

Données: Taxe 10%, Prix unitaire, ancien et nouvel index de consommation.
Résultat recherché: Prix total TTC de la facture.

#include<stdio.h>
main(){
     int ancien, nouveau;
     const int taxe = 10;     /* taxe 10% */
     float  prixTotal;
     const float prixUnitaire = 0.6;

     printf("Rentrer ancien index: "); scanf("%d",&ancien);
     printf("Rentrer nouvel index"); scanf("%d",&nouveau);
     prixTotal= (nouveau - ancien)*prixUnitaire * (1 + taxe/100.);
     printf("Total a payer: %7.2f\n", prixTotal);
}
     - Exercice : introduire deux variables intermédiaires consommation et prixHorsTaxe.
     - Imprimer le détails des lignes de la facture:
Ancien index: 100
Nouvel index: 200
Consommation: 100
PrixHT      : 100 x 0.6 = 60
TVA   10%   : 6
Total a payer:       66 Dh.


5) Facture d'électricité (suite)

Maintenant, la première tranche de 100 kwh est facturée 0.6  Dh l'unité, et au dela, 0.9 Dh. On rajoute les instructions

...
consommation = nouveau - ancien;
if (consommation <= 100)
     prixHorsTaxe= consommation * prixUnitaire1 ;
else
     prixHorsTaxe= 100*prixUnitaire1 + (consommation-100)*prixUnitaire2 ;
prixTotal= prixHorsTaxe * (1 + taxe/100.);
...

6) Facture d'électricité (fin)

Maintenant, on fait N facture. N défini par

 #define N 10
    en début de fichier.

- Utiliser for (i=0; i<N; i++) { ... }  pour répéter N fois  le traitement entre accolades.

7) Afficher la table de multiplication de N, N donné.

/* Table de multiplication de N donne'. N lu dans une variable n */

#include <stdio.h>
main(){
     int i,n;
     printf("Rentrer N: "); scanf("%d",&n);
     for (i=1; i<11;i++)
          printf("%2d X %d = %2d \n", i, n, i*n);
}
   - Exercice : La table de multiplication des nombres 2 à 9 (Boucles imbriquées)
main(){
     int i,n;
     for (n=2; n<10; n++) {
          for (i=1; i<11;i++)
               printf("%2d X %d = %2d \n", i, n, i*n);
          printf("\n");
     }
}
    Exécuter avec:  a.out | more

8) Reprendre l'exercice (6) avec plusieurs factures.

On n'en connaît pas le nombre, mais la dernière lecture est un index négatif. (Utiliser while)

9) L'ordinateur choisit un nombre entre 1 et 100. Vous essayer de le deviner. L'ordinateur peut vous dire si votre choix est en dessus ou en dessous du code caché.

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int x, code;
    srand(getpid());       /* initialisation des nombres aléatoires */
    code = rand() % 100;  /* Choix aléatoire entre 1 et 100 */
    do {
        printf("Devinez :\t");
        scanf("%d", &x);
        if (x < code)
            printf("Trop petit\n");
        else if (x > code)
            printf("Trop Grand\n");
        else
            printf("GAGNE\n");
    } while (x != code);
}
  

- Sous Unix, compilateur C de base
    - Compiler avec: cc prog.c.
    - srand(n) initialise la séquence des nombres aléatoires. getpid() est une fonction qui retourne le numéro d'ordre attribué par le système au programme qui s'exécute. Il est nouveau à chaque exécution.

- Avec DevC++, compilateur gcc par exemple, remplacer par le programme suivant (l'initialisation de la fonction aléatoire est différente)

#include <conio.h>
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
main() {
    int  x, code;
    /* initialisation des nombres aliatoires */
    time_t s;
    time(&s);
    srand((unsigned int) s);
    
    code = rand() % 100;    /* Choix aliatoire entre 1 et 100 */
    printf("%d\n\n",code);
    do {
        printf("Devinez :\t");
        scanf("%d", &x);
        if (x < code)
            printf("Trop petit\n");
        else if (x > code)
            printf("Trop Grand\n");
        else
            printf("GAGNE\n");
    } while (x != code);
    getch();
}

10) Ecrire un programme qui calcule la moyenne de N températures données.

/*
 * Programmes qui calcule la moyenne de N temperatures
 * lues sur le clavier.
 */
#include <stdio.h>
#define N 12
main()
{
    int i;
    float temp, moyenne, sigma = 0;
    for (i = 0; i < N; i++) {
        printf("rentrer une temperature:\t");
        scanf("%f", &temp);
        sigma += temp;
    }
    moyenne = sigma / N;
    printf("\n La moyenne est :\t%f\n", moyenne);
}
   - Modifier ce programme, avec N donné lu par scanf(). Attention, prévoir le cas N = 0 avant de diviser.
   - Maintenant, le nombre de températures est inconnu. On sait seulement, que la liste s'arrête avec -273° non inclus.

11) Faire un programme qui calcule la racine de A donné, par la limite de la suite u = 1/2(u + a/u):

#include <stdio.h>
#include <math.h>
/*
 * Calcule de racine de A par le nieme terme d'une suite.
 */

main()
{
    double u, a;   /* terme de la suite et a */
    float eps;
    u = 1;         /* terme initial */

    printf("rentrer a :\t");
    scanf("%lf", &a);
    printf("rentrer epsilon :\t");
    scanf("%f", &eps);
    printf("%f %f\n\n", a, eps);
    while (fabs (u*u -a) > eps)
          u = (1/2.)*(u + a/u);
    printf("Racine(%g) = %g\n",a, u);
}
   - Calculer et imprimer aussi le nombre d'itérations

12) Calcul de exp(1)

Par la série s = 1 + 1/1 + 1/2 + 1/3! + ... + 1/n! . On calcule le i-ème terme u = 1/i! de la suite et on le rajoute à la somme s = s + u précédemment calculée. On calcule jusqu'à u <epsilon.

#define EPS 0.00001
#include <stdio.h>
/*
 * Calcule de e=exp(1) par devpt en serie
 */

main(){
    double u, s;
    int i;

    u = s = i = 1;
    while (u > EPS) {
        u /= i;
        s += u;
        i++;
    }
    printf("exp(1) = %f\n", s);
}
   - Calculer exp(x), avec x donné. On change par:
    printf("rentrer x : ");
    scanf("%lf", &x);
    while (u > EPS) {
        u = u*x/i;
        s += u;
        i++;
    }

13) Reprendre le programme 10 qui calcule la moyenne des températures

Calculer la température qui s'écarte le plus de la moyenne.

/*
 * Programmes qui calcule la moyenne de 12 temperatures
 * lues sur le clavier, et on cherche la temperature qui s'ecarte le
 * plus de la moyenne
 * Usage d'un tableau pour garder les valeurs lues
 */
#include <stdio.h>
#include <math.h>
#define N 12
main()
{
    int i, j, max;
    float temp[N], moyenne, sigma = 0, ecart;

    /* Calcule de la moyenne */
    for (i = 0; i < N; i++) {
        printf("rentrer une temperature:\t");
        scanf("%f", &temp[i]);
        sigma += temp[i];
    }
    moyenne = sigma / N;
    printf("\n La moyenne est :\t%f\n", moyenne);

    /* Calcule de l' ecart maximum. */
    max = -1;
    j = 0;
    for (i = 0; i < N; i++) {
        ecart = fabs(temp[i] - moyenne);
        if (ecart > max) {      /* temp[i] s' ecarte encore plus */
            j = i;
            max = ecart;
        }
    }
    printf("\n Ecart maximum pour temp[%d]:\t%f\n", j, temp[j]);
}

14) Chercher un élément x dans tableau t[N].

Version.0 avec booléen trouve.

#include<stdio.h>
#define N 10
/*
 * Programme de recherche d'un element x dans
 * une table tab
 * Version 0 (avec trouve)
 */
int tab[N] = {3, 5, 2, 89, 54, 1, 0, -4, 2, 55};
main()
{
    int i, x, trouve;
    printf("Element  a chercher:\t");
    scanf("%d", &x);
    i = 0;
    trouve = 0;
    while (i < N && !trouve)
        if (tab[i] == x)
            trouve = 1;
        else
            i++;
    if (trouve)
        printf("Au rang %d\n", i);
    else
        printf("N'existe pas \n");
}

14') Chercher un élément x dans tableau t[N].

Version.1 avec break. (C'est aussi de la programmation structurée!.)

#include<stdio.h>
#define N 10
/*
 * Programme de recherche d'un element x dans
 * une table tab
 * Version-1  (avec break)
 */
int tab[N] =
{3, 5, 2, 89, 54, 1, 0, -4, 2, 55};
main()
{
    int i, x;
    printf("Element  a chercher:\t");
    scanf("%d", &x);
    i = 0;
    while (i < N )
        if (tab[i] == x)
            break;
        else
            i++;
    if (i<N)
        printf("Au rang %d\n", i);
    else
        printf("N'existe pas \n");
}
    - Exercice: Utiliser for au lieu de while.

15) Remplir un tableau avec N nombres entiers choisis au hasard dans l'intervalle [1,49].

#include <stdlib.h> /* pour les fonctions rand et srand */
#include <stdio.h>
#include <time.h> /* fonction time pour initialiser srand  */

#define N 7 /* grille de N numéros*/ int tab[N]; main(){ int i, j, x; srand (time(0)); /* Initier la liste des pseudo-aléatoires */ i = 0; do { /* On tire au hasard et remplit le 1er No */ x = (rand() % 49) + 1; /* nombre aléatoire entre 1 et 49 */ /* table remplie jusqu'a i-1. On verifie si x n'y est pas */ for (j = i - 1; j >= 0; j--) if (tab[j] == x) /* nombre deja tire */ break; if (j < 0) tab[i++] = x; } while (i <= N); /* On sort le resultat */ for (i = 0; i < N; printf("%4d ", tab[i++])) ; printf("\n"); }

16) Programme qui calcule le Quotient et le reste de deux entiers.

/*
 * Programme qui calcule le quotient et le reste
 * de deux entiers donne's
 */
#include <stdio.h>
main()
{
    int a, b, q, r;

    printf("Rentrer a: ");
    scanf("%d", &a);
    printf("Rentrer b: ");
    scanf("%d", &b);
    if (b == 0)
        printf("B est nulle\n");
    else {
        r = a;
        q = 0;
        while (r > b) {
            q++;
            r -= b;
        }
        printf("Quotient = %d Reste = %d\n", q, r);
    }
}

17 ) Fonction PGCD de deux entiers A et B.

pgcd (int a, int b){
  /* PGCD de a b ,  par EUCLID. Version iterative*/

    int r;  
    r = b;
    while (r != 0) {
        r = a % b; 
        a = b;
        b = r;
    }
    return a;
}


18) Programme qui retrouve la valeur d un nombre à partir de la suite de ses chiffres sous forme de chaîne de caractères

/*
 * Programme qui retrouve la valeur d un nombre
 * a partir de sa suite de chiffres, codes en ASCII
 * La suite de chiffre se termine par \Ø
 */
#include <stdio.h>
#include <ctype.h>
char chif[10] = "12345\0";       /* Jeu d essai */
main(){
    int val = 0;                /* Valeur cherchee */
    int i = 0;
    while (chif[i] != '\0') {
        val = val * 10 + (chif[i] - 48);      /* Decalage 48 du a representation ASCII */
        i++;
    }
    printf("Valeur: %d   test : %d\n",val, val+6);
}
   - Lire la chaîne de chiffre comme donnée (scanf ("%s", chif); ).

18') Programme inverse, qui retrouve la suite de chiffres à partir de la valeur d 'un nombre

/*
 * Programme qui retrouve la suite de chiffres
 * d'un nombre a partir de sa valeur
 * La suite de chiffre se termine par \0
 */
#include <stdio.h>
#include <ctype.h>
char chif[10];  /* init \0 */
main() {
    int n, i = 0;
    printf("Rentrer une valeur: ");
    scanf("%d", &n);
    do {
        chif[i++] = n % 10 + 48;
        n /= 10;
    } while (n != 0);
    for (; i >= 0; i--)
        printf("%c", chif[i]);
    printf("\n");
}

19) Programme qui lit votre nom, et vous dit Bonjour

/*
 * Programme qui lit votre nom, et vous dit Bonjour
 */
#include <stdio.h>
main(){
      char nom[20];
      printf("Rentrer votre nom: ");
      scanf("%s",nom);    /* Sans & */
      printf("\nBonjour %s, Comment ca va ?\n", nom);
}

20) Programme qui convertit une chaîne en majuscule.

/*
 * Programme qui convertit une chaine en majuscule
 */
#define N 20
#include <stdio.h>
#include <string.h>
main(){
      char chaine[N];
      int i;
      printf("Rentrer la chaine: ");
      scanf("%s",chaine);
      for(i=0; i<N; i++)
           if (islower(chaine[i]) )
                chaine[i] -= 32;
      printf("\n%s\n", chaine);
}
- Convertir les lettres minuscules en majuscule et vice versa. Utiliser la fonction isupper(x)

21) Programme qui fait trois tentatives de lecture d'un mot de passe (une chaîne donnée).

/*
 * Programme qui fait trois tentatives de lecture
 * d'une chaine donnee.
 */
#include <stdio.h>
#include <string.h>
#define N 3                     /* nb tentatives */

main()
{
    char code[20] = "ginfo";    /* code a lire */
    char s[10];
    int i = 0;
    do {
        printf("Rentrer code: ");
        scanf("%s", s);
        if (strcmp(code, s) == 0)
            break;
        printf("code errone!\n");
        i++;
    } while (i < N);
    if (i < N)
        printf("Bravo\n");
    else
        printf("LOCK\n");
}

22) Parcours séquentiel de deux listes (ou fichiers) en parallèle

On a deux listes triées foot et cine contenant les matricules des élèves inscrits aux clubs football et cinéma. Imprimer le matricule de chaque élèves en indiquant s'il est inscrit au club foot seulement, ciné seulement ou aux deux clubs.

#include <stdio.h>
#define N 20

int c[N] ={
        2, 5, 7, 10, 11, 12, 13, 15, -1};
/* Liste des inscrits au Foot */

int f[N] ={
        2, 3, 6, 9, 12, 13, 16, 18, 20, -1};
/* Liste des inscrits au Cine */

main()
{
        int i = 0, j = 0;

        while ((f[i] != -1) && (c[j] != -1))
                if (f[i] < c[j]) {
                        printf("%d %d Inscrit en Foot \n", i, f[i]);
                        i++;
                }
                else if (f[i] > c[j]) {
                        printf("%d %d  Inscrit en Cine\n", j, c[j]);
                        j++;
                }
                else {      /* f[i] == c[j] */
                        printf("%d %d %d Inscrit dans les Deux\n", i, j, f[i]);
                        i++;
                        j++;
                }

        if (c[j] == -1) /* On termine avec Foot */
                while (f[i] != -1) {
                        printf("%d %d Inscrit en Foot \n", i, f[i]);
                        i++;
                }
        else  if (f[i] == -1) /* On termine avec  Cine*/
                while (c[j] != -1) {
                        printf("%d %d Inscrit en Cine \n", j, c[j]);
                        j++;
                }
}


- Maintenant on voudrait imprimer aussi le matricule des élèves inscrits dans aucun club. Modifier le programme, sachant que les élèves sont en nombre de N immatriculés de 1 à N.

23) Comparer deux mots.

#include <stdio.h>
#include <string.h>
#define N 20
char s1[N], s2[N];

main(){
    int i = 0, l, l1, l2;
    printf("Rentrer mot1: ");
    scanf("%s", s1);
    printf("Rentrer mot2: ");
    scanf("%s", s2);
    printf("%s %s\n", s1, s2);

    l1 = strlen(s1);
    l2 = strlen(s2);
    (l1 < l2) ? (l = l1) : (l = l2);
              /* l est la longueur minimum */
    while (s1[i] == s2[i] && i < l)
        i++;
    if (i < l)         /* on compare ieme car de s1 et s2 */
        if (s1[i] > s2[i])
            printf("s1 > s2\n");
        else
            printf("s1 < s2\n");
    else
        /* l'un des mots est termine */
    if (l1 < l2)
        printf("s1 < s2\n");
    else if (l1 == l2)
        printf("s1 = s2\n");
    else
        printf("s1 > s2\n");
}
24) A suivre

CopyLeft©  Najib Tounsi