Cours d’informatique Initiation au langage C


Télécharger Cours d’informatique Initiation au langage C

★★★★★★★★★★1.5 étoiles sur 5 basé sur 2 votes.
Votez ce document:

Télécharger aussi :


IUT ANNECY

Département Mesures Physiques

Cours d’informatique

Initiation au langage C

Mots clefs :

Initiation à la programmation Langage C Variables Opérations Structures alternatives et itératives Tableaux Fonction Algorithmes 

La plus part des exercices proposés sont de grands classiques de l’initiation à la programmation. Ils sont présentés dans de nombreux ouvrages, livres, polycopiés, cours en ligne,  et  sont  indépendants du langage.

CH 1 : Variables et opérations________________1

           Annexe : les caractères______________12

CH 2 : Structures alternatives_______________13

CH 3 : Structures itératives_________________21

CH 4 : Tableaux__________________________26

CH 5 : Fonctions _________________________32

             Annexe : visibilité _________________40

CH 6 : Bilan _____________________________41 

TEST 2009-2010 _________________________43

ANNEXES

Annexe 1 : utiliser Code::blocks _____________45 Annexe 2 : installer Code::blocks ____________49 Annexe 3 : compléments de langage C ________50

Annexe 4 : structure d’un programme en C ____51

CH 1 : VARIABLES ET OPERATIONS

L’ordinateur utilise une représentation binaire de l’information, l’information élémentaire est le bit, il ne peut prendre que deux valeurs 0 ou 1.

Programme, fichier texte, fichier image…tout ce qui est utilisé par un ordinateur est donc codé en un ensemble de 0 et de 1. 

Ces deux valeurs correspondent à deux états électriques, utilisés pour mémoriser et traiter l’information au sein de l’ordinateur.

Les circuits de l’ordinateur manipulent des ensembles de bits : 

•   Quartet        4 bits                                                       

•   Octet            8 bits                       

•   Mot              16, 32 bits ( ou plus, à préciser)         

•   ko, Mo, Go :                multiples de l’octet

Dans ce module, nous utiliserons 

•   les nombres, entiers et réels, dont le codage est introduit au paragraphe suivant, et 

•   les caractères : chaque caractère est codé par 7 bits en code ASCII standard, sur 8 bits en code ASCII étendu. Ceci est détaillé en annexe 1, en fin de chapitre.

1.    CODAGE DES NOMBRES (VOIR COURS D’INFO. D’INSTRUM.)__________________________________

Un nombre est représenté et codé par un nombre fini (4, 8, 16...) de bits. 

1.1  Les entiers

         Code binaire naturel sur n bits

Il permet de représenter  les entiers naturels compris entre 0 et 2n-1 Exemple

sur 8 bits on peut coder les entiers positifs de 0 à 28 - 1 = 255 73 = 64 + 8 + 1 = 26 + 23 + 20

= 0 × 27 + 1 × 26 + 0 × 25 + 0 × 24 + 1 × 23 + 0 × 22 + 0 × 21 + 1 × 20 est codé par 0100 1001 sur 8 bits.

         Code complément à deux sur n bits  

C’est le plus utilisé en calcul scientifique.

Il permet de représenter  les entiers naturels compris entre –2n-1  et 2n-1-1

•   les entiers positifs sont codés en binaire naturel

•   les entiers négatifs : la valeur absolue est codée en binaire naturel, le résultat est complémenté (1 ?0) puis on ajoute 1 au  nombre obtenu. 

Exemple

Sur 8 bits on peut coder les entiers de - 27 à 27 – 1 soit –128 à 127

- 73 est codé par  complément de (0100 1001) + 1 = 1011 0110 + 1 =1011 0111 sur 8 bits.

1.2  Les réels

Le codage le plus fréquent est le codage virgule flottante standard (IEEE 754).

Pour un tel codage sur 32 bits 

S

Exposant : E

Mantisse : M

S

e7

e6

e5

e4

e3

e2

e1

e0

m1

m2

m3

m4

m5

m6

m23

•   S bit de signe 

•   E exposant sur 8 bits à lire en binaire naturel

•   M mantisse sur 23 bits à lire comme une partie décimale en binaire (M = 2-1.m1+2-2m2 + … +2-23m23)

S                                                                                               E-127

X = (-1) . (1+M) . 2

2.    VARIABLES________________________________________________________

2.1  Type et nom des variables

Les nombres et caractères sont stockés dans des variables. Une variable possède un nom et un type adapté. Les principaux typesde variable utilisés sont

•   les entiers, codés sur  8, 16 ou 32 bits (int = integer)

•   les réels, codés sur 32 ou 64 bits, (double = réel double précision)

•   les caractères, codés sur 8 bits, et associés à une lettre ou un signe via le code ASCII.

Exemple char lettre; int compte; int entier1, entier2; double longueur, largeur;

On écrit le nom des variables en utilisant les lettres minuscules et majuscules, les chiffres, mais pas le _.

On évite d’appeler tous les entiers « n » et tous les réels « x » ou toutes les variables « toto »: on donne des noms significatifs comme « longueur », « taux », « note »…Le programme gagne ainsi en lisibilité.

Les majuscules servent à délimiter les noms, on commencera par une minuscule :

Exemple motDePasse bilanJanvier reel2 adresseDeBase 

2.2 Assignation, initialisation

On peut affecter une valeur à une variable au moment de sa déclaration. On dit qu’on initialise la variable.

Exemple

int nbr=2, triple=3*nbr; char lettre='A';          //'A' désigne le caractère A  

On peut affecter une valeur à une variable après sa déclaration, on dit qu’on assigne une valeur à une variable.

Exemple nbr=3; triple = 3 * nbr;

longueur = 0.12;        // réel double précision virgule flottante       largeur = 1.5e-1;            // réel double précision notation scientifique

Attention :

double quotient;

quotient = 5/3 ;   // 1.00  quotient = 5./3 ;       // 1.67

                2.3 Conversions       

         Conversion implicite

Lors d'une opération entre deux variables de types différents, c'est le type « le plus précis » qui est choisi pour évaluer l'opération.

Lors d'une affectation, il y a conversion dans le type de la variable.

A chaque conversion implicite, le compilateur prévient par un WARNING : il est préférable d’être explicite.

Exemples :

int nbr1, nbr2 = 3; double reel = 1.1; nbr1 = nbr2/reel;  

//nbr1 -> double, puis opération sur 2 doubles : 2.73,  puis résultat tronqué : 2 cout<<nbr2<<endl;

      Conversion explicite

Pour transformer le type d'une variable, on fait précéder l'expression par le nouveau type entre parenthèses. Il peut y avoir perte d'information lors d'une conversion explicite.

Exemple double reel; int partieEntiere;

partieEntiere = (int)reel;  // ou encore partieEntiere = int(reel) ; 

2.4 Constantes

Pour interdire le changement de la valeur d'une variable, on fait précéder son nom, lors de l'assignation, du mot const : 

Exemple

const  int NOMBRE = 3; const  double TAUX = 0.86; const  double PI = 3.14159 ;

On écrit le nom des constantes en majuscule.

3.    OPERATEURS______________________________________________________

3.1  Opérateurs arithmétiques

Opérateur

Nom

Exemple

Résultat

+

Identité

unaire

+5

-                                  Opposé                                                                  unaire                -5                            

+                                 Addition                                                                binaire              3+6                          

-

Soustraction

binaire

3.5-2

*

Produit

binaire

5*2

/

Quotient

binaire

7/3   11./2.

%                                modulo (n'agit que sur des entiers)                      binaire              11%3 12%3             

3.2  Opérateurs relationnels

Une expression utilisant un ou plusieurs opérateurs relationnels vaut 0 si elle est fausse, 1 si elle est vraie.

Opérateur

Nom

Exemple

Résultat  pour a=2   b=4

==

égal à

(3==5)   (a==b/2)

!=

différent de

(a!=b)

<                                inférieur                     (a<b)                              

<=

inférieur ou égal

(a<=b/2)

>

supérieur

(b>(a%2))

>=

supérieur ou égal

(b>=a)

3.3  Opérateurs logiques

Ces opérateurs considèrent toute valeur entière non nulle comme un 1 logique (vrai) et zéro comme un 0 logique (faux).

Opérateur

Nom

Exemple

Résultat  pour  a=2   b=4

&&

ET logique

(a==2)&&(b>3)

||

OU Logique

(c<d)||(c>=d)

!

NON Logique

!(a>b)



Evaluation  de gauche à droite, jusqu'à ce que le résultat définitif soit trouvé :   (a<b)&&(c<d) si a>b, la seconde expression n'est pas évaluée.

3.4  Opérateurs de décrémentation et d'incrémentation

Nous utiliserons juste

 i++; qui augmente de « 1 » le contenu de i.

Voir en annexe 3 les autres opérateurs.

3.5  Ordre de priorité des opérateurs

On peut bien sûr utiliser des parenthèses lorsqu’on ne connaît pas les priorités : la compréhension peut être plus immédiate. (cf. ex 1.1)

Opérateur

ordre de priorité

opérateur

ordre de priorité

1

()  

gauche à droite

8

&

gauche à droite

2

!  ~   ++  --   (type) 

droite à gauche

9

^

gauche à droite

3

*  /  %

gauche à droite

10

|

gauche à droite

4

+  -

gauche à droite

11

&&

gauche à droite

5

<<   >>

gauche à droite

12

||

gauche à droite

6

<  <=   >   >=

gauche à droite

13

expr condition

droite à gauche

7           == !=                                                      gauche à droite                                                             

TD 1

1.  ANALYSE DE CODE

Déterminer les valeurs de res1, res2 et res3

int nbr1, nbr2; int res1, res2, res3; nbr1 = 3; nbr2 = 4; res1 = nbr2%nbr1; res2 = 45%4; res3 = 45%nbr1;

Déterminer les valeurs successives de k et x.

int i=10, j=4, k; double x; k=i+j; x=i; x=i/j; x=(double)i/j; x=5/i; k=i%j; x=105; i=5; x= x+i;

Déterminer les valeurs de x après avoir placé des parenthèses « inutiles » mettant en évidence les priorités :

x= 7 + 3 * 6 / 2 – 1 ; x = 2 % 2 +2*2-2/2 ; x = (3*9*(3+(9*3/(3)))) ;

Déterminer les valeurs successives de q et x

int n=5, p=9; int q; double x; q=n<p; q=n==p; q=p%n+p>n; x=p/n; x=(double)p/n; x=(int)(p+0.5)/n;

Chercher et expliquer les erreurs du programme

const  int X=10;   int y,z;   y+z = 10;   10 = z;   X=100;   z==10;  

2.    ANALYSES DE PROBLEMES

2.1 Disque

On souhaite réaliser un programme qui

•   Reçoit au clavier la valeur numérique du rayon d’un cercle • Calcule la circonférence et la surface du disque possédant ce rayon

•   Affiche les résultats.

Prévoir une application numérique de test, par exemple : 

- Si le rayon vaut 1, la circonférence vaut ……………..et la surface …………….

Définir les variables nécessaires : nom et type. 

-

-

-

Ecrire les lignes  ( ou la ligne) de code correspondantes.

-

-

-

Définir ? comme constante. Ligne de code.

-

Quels sont les calculs à réaliser ?

-

-

Quelles sont les opérations d’entrée et de sortie à réaliser (nous verrons comment les coder lors du TP 1).

-

-

-

2.2 Aire

L’aire A d’un triangle dont les côtés ont pour longueur a, b et c peut se faire de la manière suivante : 

A = som×(som?a)×(som?b)×(som?c) où som = (a + b + c)/2.

Pour un triangle rectangle tel que a = 3, b = 4, calculer c, puis appliquer la formule et la vérifier.

Le programme 

•    Reçoit au clavier les trois valeurs numériques a, b ,c, longueurs des cotés du triangle.

•    Calcul la demi-somme et  la surface du triangle.

•    Affiche le résultat

Indication : on utilisera la fonction sqrt() pour extraire la racine carré. (ajouter #include <math.h> en tête de programme)

Prévoir une application numérique de test, par exemple :  

Dans le cas particulier d’un triangle rectangle tel que a = 3, b = 4, l’aire peut être facilement calculée, elle vaut :

……………………Le troisième côté a pour longueur c = ……………, en appliquant la formule, on trouve som =

………….et A = …………….. Est-ce bien l’aire attendue ? ……….

Définir les variables nécessaires : nom et type. 

-

-

-

Ecrire les lignes  de code correspondantes.

-

-

-

-

Quels sont les calculs à réaliser ?

-

-

Quelles sont les opérations d’entrée et de sortie à réaliser (nous verrons comment les coder lors du TP 1).

-

-

-

TP 1

         Consignes valables pour tous les TP

•   Tous les programmes sont sauvés dans votre partition. 

•   Créer un dossier destiné à recevoir vos programmes INFORMATIQUE.

•   Les programmes sont recopiés dans un fichier texte (C ou Word) et imprimés une seule fois en fin de TP (ou en dehors de la séance : voir démo prof).

1.    PREMIER PROGRAMME : PRISE EN MAIN DU LOGICIEL_____________________

Ex1

A l'aide de l'annexe 1, paragraphes 1.1 et 1.2 créer un premier programme

Remplacer le message entre guillemets "Hello World" par votre message personnel…sans accent.

A l'aide de l'annexe 1 paragraphe 1.4, lancer le programme.

Faites-vous expliquer ce programme.

Commenter alors entièrement le programme en ajoutant des commentaires  après chaque ligne (// commentaires…).

    Remarques :

Par défaut, un répertoire TP1 est créé là où vous avez localisé le projet TP1 : ce répertoire porte le nom du projet.

Il contient des sous-répertoires  destinés à recevoir (par défaut)  les exécutables et programmes intermédiaires.

Observer le contenu de ce répertoire en passant par l’explorateur.

2.    COMPLEMENT DE COURS ____________________________________________

Tout programme comporte une fonction principale qui commence par la ligne int main(), puis comprend le code du programme entre accolades. La dernière ligne est « » int main()

{

                      …     ;

                                …     ;

return 0 ; 

}

Quelques explications sur cette structure seront données au chapitre sur les fonctions.

                Le squelette général d’un programme en C est donné en annexe 4.          

2.1 Ecrire à l’écran

Pour écrire un message à l’écran, suivi d’un retour ligne, on utilise l’instruction cout <<suivi du message entre guillemets

cout<< "Contenu du message" <<endl ;

Pour afficher une valeur numérique, on utilise

cout<<3<<endl ;

On peut également afficher le résultat d’un calcul : 

cout<<3*5<<endl ;

Pour afficher le contenu d’une variable, on utilise le nom de la variable :  int nbr = 5 ; cout<<nbr<<endl ;

Il est conseillé de terminer chaque instruction cout par un retour ligne (endl).

On peut également afficher par la même instruction des messages et le contenu de variables :  double diam = 2 , circonf ; circonf = 3.14159*diam ; cout<< "La circonference du cercle vaut : " <<circonf<< " metres "<<endl ; Pour utiliser la « fonction » cout, on ajoute en début de fichier la ligne 

#include <iostream>

Le programme complet s’écrit alors. :

#include <iostream>

 using namespace std;

 int main()

{

     int nbr = 5 ;     double diam = 2 , circonf ;  cout<< " contenu du message " <<endl ;     cout<<3<<endl ;  cout<<3*5<<endl ;       cout<<nbr<<endl ;       circonf = 3.14159*diam ;      cout<< " la circonference du cercle vaut: " <<circonf<< " metres"<<endl;      return 0;

}

2.2 Saisir au clavier

Pour saisir une donnée au clavier, et la placer dans une variable, on utilise l’instruction cin>>, suivie du nom de la variable. La donnée est frappée au clavier suivie de la touche de validation (Enter : ?)  int i;  cin>>i;

                            cout<<"le double de "<<i<<" est : "<<2*i<<endl;

On peut également saisir plusieurs valeurs successivement à l’aide d’une seule instruction, lors de la saisie, on sépare les entrées par la touche de validation ?.

     int cotea, coteb, cotec;      cout<<"Entrez les longueurs des 3 cotes du triangle : "<<endl;       cin>>cotea>>coteb>>cotec;

                            ...

Il peut être judicieux, quand on souhaite saisir une donnée, d’en prévenir l’utilisateur par un message : 

int i;

                            cout<<"Entrer un nombre entier puis valider"<<endl;

                            cin>>i;

                            cout<<"le double de "<<i<<" est : "<<2*i<<endl;

3.  EXERCICES DE BASE ________________________________________________

Ex2

A l'aide de l'annexe 1, paragraphe 1.3, ranger le premier programme et en créer un nouveau : . Ecrire et tester le programme préparé en TD au paragraphe 2.1 Sauver, compiler, exécuter.

Puis, présenter le programme avec des commentaires : 

// declaration des variables

// Entrée des donnees

//Calcul

//Affichage des résultats …..

Ex3

Ecrire et tester le programme préparé en TD au paragraphe 2.2.

Ex4

Ecrire un programme qui permet de calculer un prix TTC à partir d’un prix hors taxe saisi au clavier, le taux de TVA étant fixé à 19,6 % et défini comme une constante.

Ex5 pas a

Lire entièrement l'annexe 1 §2 en repérant les touches citées.

Recopier le programme suivant et l'exécuter pas à pas en recopiant la valeur des variables au fur et à mesure. Attention, la ligne pointée est celle qui sera exécutée au prochain "F7".

Valeur de n

Valeur de r

Expliquer le résultat :

/

/

/

/

/

/

/

/

/

                #include <iostream>                     

using namespace std; int main()

                {                                                                                                                                                   

      int n;       double r;       n=2; r=n/3;

       r=n/3.;     n=n/3;      n=r+6;      r=n;       r=r/4;      n=r;  r=n;       return 0;                                     

                }                                                                                                    

?  Faire vérifier

Ex6 Ecrire un programme qui demande à l’utilisateur d’entrer un réel x et  affiche le résultat r1  de l’opération 1 .

1? x

                                                                                                                                                                               2               3

Modifier le programme pour qu’il affiche en plus le résultat r2 de l’opération1+ x + x + x .

Modifier le programme pour afficher l’écart entre les deux résultats ci-dessus calculés : r1 – r2.



Vérifier, en créant un petit programme, que vous savez :

 Afficher un message à l'écran

 Saisir un nombre au clavier, puis l'afficher à l'écran,

 Afficher un résultat de calcul accompagné d'un message,( ex : resultat = …)  Saisir plusieurs nombres à la suite, avec une seule instruction.

 Trouver le fichier en-tête à inclure pour utiliser une fonction quelconque.

4.    EXERCICES AVANCES________________________________________________

Ex7

Ecrire un programme qui calcule la moyenne de 2, puis 3 valeurs entières. On utilisera une seule variable pour la saisie des données.

Ex8

Le but de cet exercice est de calculer le nombre de rouleaux de papiers peint nécessaire à la décoration d’une pièce, en supposant qu’il n’y a pas de raccords.

Voici les données disponibles :

On connaît les dimensions d’un rouleau standard : longueur 10,05 m et  largeur 53 cm.

L’utilisateur entre les dimensions de la pièce : hauteur, longueur, largeur.

On souhaite calculer ensuite 

•   le nombre de bandes par rouleau, le périmètre de la pièce, le nombre total de bandes requises, et enfin le nombre de rouleaux.

Résoudre le problème sans l’ordinateur pour le cas suivant : 2,1 m de hauteur, pièce de 4 m × 3 m.

Définir :

•   les constantes, les variables 

On utilisera des noms explicites pour chaque constante ou variable.

Les calculs seront effectués sur des réels (double), on utilisera les  fonctions d’arrondi à l’entier supérieur (ceil) ou inférieur (floor), voir l’aide.

Ex9

Lire l’annexe page suivante.

Ecrire un programme qui 

•   Demande à l’utilisateur d’entrer un nombre compris entre 0 et 255

•   Affiche  le caractère associé au nombre par le codage ASCII (remarque : les premiers caractères ne donnent pas un caractère à l'affichage).

5.    PROJET

P1 

•   Ecrire un programme qui calcule et affiche la valeur de Pi en utilisant la fonction arc tangente (atan),  sachant que atan (1) = ?/4.

•   En utilisant les compléments sur la mise en forme, au chapitre 4, afficher Pi avec 5 décimales. 

ANNEXE : LES CARACTERES

Chaque caractère est codé sur 8 bits, ce qui permet de coder 256 caractères.

•   0 et 31 : caractères de contrôle pour l’affichage et l’imprimante, nous ne les utiliserons pas.

•   32 à 127 : caractères de l’alphabet standard US,  

•   128 à 255 : dépend du système, différents sous DOS et Windows, caractères non US et semi-graphiques.

Les caractères de l’alphabet standard sont disponible sur le clavier.

Les caractères de code 128 à 255 sont affichés grâce à leur code, en tant que caractères 

cout<<char(158)<<endl ; //affiche ×

Ces caractères ainsi que leur code sont donnés ci-dessous :

CH 2 : STRUCTURES ALTERNATIVES

1.  IF…ELSE __________________________________________________________

1.1 exemples

if (i>0)

{

cout<<"positif"<<endl;                

}

                      cout<<"max = "<<endl;          

if (a>b) 

{

                           cout<<a<<endl;            

} else

{

                           cout<<b<<endl;            

}

if (nombre>max)

{     max = nombre;     cpt++;

} else if (nombre<min)

{     min = nombre;

}

if (note>=12)

{ cout<<"Admis"<<endl;

} else if (note<8)

{ cout<<"Refusé"<<endl;

} else {

    cout<<"Oral"<<endl; }

1.2 exercices 

En s’inspirant des exemples ci-dessus, compléter les programmes suivants :

Le programme affiche si le nombre est pair ou impair.  int nombre;

cout<<"entrer un nombre "<<endl; cin>>nombre;

    -- 

    --

Le programme affiche « + » si le nombre est positif, « - »   si le nombre est négatif, « 0 » si le nombre est nul. int nombre; cout<<"entrer un nombre  "<<endl; cin>>nombre;

    -- 

    --

                1.3 structures if…else        

La valeur de l'expression est évaluée et, si elle est vraie, instruction1 est exécutée sinon c'est instruction2 qui est exécutée (si elle existe).

       if(expression)

{

                instructions1;

          }      

Soit, en « français»:

« si l’expression  est vraie, alors on réalise les instructions »

          if(expression)                                      

{

                instructions1;

} else

{

                instructions2;

}

Soit, en « français»:

« si l’expression  est vraie, alors on réalise les instructions 1, sinon, on réalise les instructions 2»

•   L’expression est entourée de parenthèses. 

•   Une expression est vraie si l’expression entre parenthèse est différente de 0.

•   Un ensemble d'instructions est entouré d'accolades.

•   Une instruction se termine toujours par un point virgule : ";".

•   Plusieurs structures if…else peuvent être imbriquées.

2.    SWITCH…CASE_____________________________________________________

2.1 Exemple

int a=2, b=7;             int operation;      

cout<<"Choisir une operation : + (1) ou - (2) ou * (3)"<<endl;   cin>>operation;         switch(operation)      

                {            

                case 1:            

       cout<<"somme = "<<a+b<<endl;            break;        case 2 :   

                      cout<<"difference = "<<a-b<<endl;         

       break;             case 3 :      

                      cout<<"produit = "<<a*b<<endl;             

       break;             default :     

                      cout<<"mauvais choix"<<endl;         

}

2.2 structure

Exécution d’instructions selon la valeur d’expression.

switch (expression)

{

                            case val1 : 

           instructions1;          break;      case val2 : 

           instructions2;          break;      case val3 : 

           instructions3;          break;      default : 

                                            instructions4;

}

Soit, en « français»:

« si l’expression vaut val_1,  alors on réalise les instructions 1 et on sort de la structure, sinon,    si l’expression vaut val_2,  alors on réalise les instructions 2 et on sort de la structure, sinon,  si l’expression vaut val_3, alors on réalise les instructions 3 et on sort de la structure, sinon, on réalises les instructions 4 et on sort de la structure.»            

•   break : permet de sortir du switch. Si on omet le break, toutes les instructions suivantes sont exécutées, jusqu'au prochain break.

•   default : si expression ne correspond à aucun des cas, le branchement est réalisé sur default.. Si cette instruction est absente, le programme passe à l'instruction suivante.

•   On peut mettre n’importe quelle expression dans la parenthèse du switch, par exemple un caractère, un réel, comme le montre l’exemple ci-dessous, similaire à l’exemple précédent.

{

case'+':    

                cout<<"somme = "<<a+b<<endl;         

break;             

case'-' :          

      cout<<"difference = "<<a-b<<endl;         

break;             

case'*' :        

      cout<<"produit = "<<a*b<<endl;             

      break;             

default :          

}

      cout<<"mauvais choix"<<endl;         

int a=2, b=7;           char operation;        

cout<<"Choisir une operation : + ou - ou * "<<endl;        cin>>operation;         switch(operation)       

TD 2

Ex 1 Analyse de code 

int x, c = 0; cout<<"Entrer un entier"<<endl; cin>>x; if((x>=-20)&&(x<=-8)) 

{ c = -10;

} if((x>=1)&&(x<=5))

{ c = 10;

} if((x>=34)&&(x<=180))

{ c = 20;

}

cout<<"c = "<<c<<endl;

A quel problème répond ce programme ?

Comment le rendre plus efficace : proposer les nouvelles lignes de code.

Ex 2 Structures if imbriquées

Soient deux réels non nuls x et y, on souhaite déterminer le quadrant dans lequel se trouve le point de coordonnées (x, y). On suppose que les quadrants sont numérotés de 1 à 4, dans le sens trigonométrique, en partant du quadrant supérieur droit. Représenter par un schéma (organigramme) la démarche qui permet de résoudre ce problème.

Ecrire le code correspondant (x et y sont demandés à l’utilisateur).

Ex 3 Analyse de problème

Le programme calcule les racines réelles d’une équation du second degré et affiche le nombre de solutions réelles et leurs valeurs. ( a x2 + b x + c = 0).

Résoudre le problème “sans l’ordinateur” : rappeler les calculs à effectuer pour obtenir la ou les solution(s)

Prévoir une application numérique de test, 

Trouver trois triplets (a, b, c) permettant de tester chacun des trois cas, quelles sont les solutions attendues dans chaque cas.

-       triplet donnant un déterminant nul : a =………. , b = ………., c = ………., solution =………. 

-       triplet donnant un déterminant positif : a = ………., b = ………., c = ………., solutions = ……….……….

-       triplet donnant un déterminant négatif : a = ………., b = ………., c = ……….

Définir les variables nécessaires : nom et type. 

-

-

-

Ecrire les lignes  (ou la ligne) de code correspondantes.

-

-

-

Quels sont les calculs à réaliser ?

-

-

-

Quelles sont les opérations d’entrée et de sortie à réaliser.

-

-

-

Ex 4 Structure choix

En vous inspirant de l’exemple du cours, écrire un programme qui demande à l’utilisateur d’entrer un nombre réel puis lui propose le menu suivant : 

1  : carré

2  : racine carré

3  : cosinus

4  : sinus

Le résultat de l’opération choisie est affiché à l’écran.

Ex 5 Tri de deux ou trois nombres

On souhaite permuter le contenu de deux variables. Proposer une solution, puis un programme complet permettant de tester cette solution (entrée des deux nombres, permutation, affichage).

On souhaite ordonner deux nombres. Le programme reçoit ces deux nombres dans les variables nbr1 et nbr2 et échange le contenu des variables si nécessaire, de sorte que nbr1 contienne le plus petit nombre.

Proposer une démarche, puis écrire le programme complet (entrée des deux nombres, test avec éventuelle permutation, affichage dans l’ordre croissant).

Utiliser les deux exercices précédents pour effectuer le tri dans l’ordre croissant de trois nombres entrés au clavier dans les variables  nbr1, nbr2, nbr3.

Tester à la main votre programme pour en vérifier la validité. Trouver les exemples nécessaires au test de tous les cas.

TP2

Un petit truc : pour réaligner convenablement votre code : Pluggin/Source Code Formatter… Le style utilisé est le

Astyle, pour en savoir plus : en.wikipedia.org/wiki/Indent_style

Un autre petit truc : Pour augmenter la police de caractère dans l’éditeur : Settings / Editor / Choose…

1.    DEBUGUER

1.1 Ex 0 Debug

Suivre pas à pas l’exécution du programme ci-dessous en visualisant les variables. Justifier les valeurs puis détecter le problème !

#include <iostream> using namespace std;

 int main() {     int resultat,temp, donnee = 512;     resultat = 8*donnee*donnee*donnee-1;     temp = 2*resultat; resultat = temp+1;     temp = resultat+1;     resultat = resultat*4;     temp = temp*2;     resultat = resultat/temp;     return 0;

}

2.    EXERCICES DE BASE

Tester les deux programmes du cours, paragraphe 1.2, puis les exercices 2, 3 et 4 du TD : 

Ex1 / Ex2 / Ex3 / Ex4 / Ex5

Ex6

Réaliser le programme d’échange de deux valeurs, le modifier pour obtenir un tri des deux valeurs, puis le modifier pour trier trois valeurs entrées par l’utilisateur.



Ex7  

Ecrire un programme qui demande à l’utilisateur d’entrer un nombre et affiche si le nombre est multiple de 5 ou non. 

Ex8  

Ecrire un programmequi reçoit deux réels x et y et affiche 

•    « Egaux »  si, les deux réels sont alors considérés comme égaux.

•    « Différent » sinon.

Ex9

Ecrire un programme qui saisit un entier positif ou négatif au clavier et affiche sa valeur absolue. (On n’utilisera pas la fonction valeur absolue du C)

Vérifier que vous savez :

 Utiliser un « if » tout seul

 Utiliser un « if/else » avec la bonne indentation ( = décalage du texte)  Permuter le contenu de deux variables à l’aide d’une troisième.

3.    EXERCICES AVANCES

Ex10

On dispose de données sous forme d’entiers compris entre 0 et  9999. On choisit de coder ces données avant transmission sur ligne téléphonique, pour les garder secrètes. Le programme doit lire un entier à 4 chiffres et le crypter comme suit :

•   chaque chiffre est remplacé par (chiffre + 7) modulo  10, puis, 

•   le premier et le troisième chiffre sont permutés, puis 

•   le second et le quatrième chiffre sont permutés. 

•   le programme doit ensuite afficher le nombre crypté.

On commencera par extraire du nombre  et afficher les 4 chiffres correspondants aux milliers, centaines, dizaines et unités.

(Attention, ne pas écrire 0147 mais 147, car un zéro devant un nombre indique - en C - qu’il est codé en octal…)

Ex11

Réaliser ensuite un autre programme pour le décryptage…

Ex 12 jukebox 

Récupérer sur le serveur (DUT\MPH\Doc-Etudiants\MPh1\MPh1 Informatique) les 4 fichiers .wav dans le répertoire JUKE. Les copier-coller dans votre répertoire de travail  (TP2).

Le programme doit proposer le menu suivant : 

Le choix de l’utilisateur est saisi au clavier. Selon le choix, le bon morceau (fichier) doit être joué par le PC.

Complément

Pour charger dynamiquement un fichier .wav et  jouer ce son 

•   Placer le fichier .wav dans le même répertoire que votre code source .cpp

•   Inclure le fichier qui va permettre d’utiliser le son sous windows.

 #include <windows.h>

•   Inclure le fichier d'en-tête mmsystem.h contenant le prototype de la fonction PlaySound() qui va permettre de jouer le fichier .wav, au début du code source  

 #include <mmsystem.h>

•   Ajouter la bibliothèque « libwinmm.a » au projet.             

                          Cette bibliothèque contient entre autre le code d'exécution de la fonction PlaySound().                

                          Elle se trouve dans le répertoire des bibliothèques de CodeBlocks      

 C:\Program Files\CodeBlocks\MinGW\lib\libwinmm.a    ou équivalent….              

On l’ajoute au projet en utilisant par exemple Project / Build Options / Linker Settings / Add / …

•   Puis, pour jouer le fichier “” et rendre la main au programme à la fin du son, utiliser comme suit la fonction PlaySound :  

 PlaySound ("",NULL,SND_SYNC);

4.  PROJET

P2 

Complément

La fonction rand() renvoie un entier compris entre 0 et 32 767 (tirage pseudo-aléatoire).

La fonction srand permet de réinitialiser le générateur de nombres aléatoires.

srand(time(NULL));       

Comment obtenir un réel aléatoire compris entre 0 et 1 ?

(Ces fonctions nécessitent l’appel des fichiers stdlib.h et time.h)

On souhaite tirer un point P (x,y) au hasard dans le carré ci-contre, puis tester s’il appartient au disque de rayon 1 inscrit dans ce carré.    Proposer une solution.

CH 3 : STRUCTURES ITÉRATIVES : BOUCLES

1.    WHILE, DO WHILE__________________________________________________

1.1  exemples

int k=0, nbr=23; while (nbr!=0)

{ nbr = nbr/2;

                            k = k+1;

}

cout<<k<<endl;

int mult;

cout<<"entrer un multiple de 10"<<endl; do

{

                            cin>>mult;

}

while((mult%10)!=0); //parenthèses pour plus de lisibilité

1.2  while

Les instructions sont exécutées de façon répétitive aussi longtemps que le résultat de l’expression  de continuation à priori est vraie.

while (expression)

{

                            instructions;

}

Soit, en « français» : « tant que  l’expression  est vraie, alors on réalise les instructions »

1.3  do…while

Cette instruction est similaire à la précédente, le test de continuation a posteriori a lieu après chaque exécution des instructions, de fait les instructions sont  au moins exécutées une fois.

do {

    instructions ;

}

while (expression) ;

Soit, en « français» : « On réalise les instructions, tant que  l’expression  est vraie »

On utilise une structure while ou do…while quand  - au moment de l’exécution de la boucle – le « programme »  ne sait pas combien de fois la boucle va être exécutée, on utilise une structure for quand on connaît le nombre d’itérations

1.4  exercice

Déterminer les valeurs successives de m, n et de la condition de continuation lors de l’exécution de la boucle : int m=0, n=3;   do    

{

     cout<<"m="<<m<<" et n="<<n<<endl;             m++;  n--;         

}                       while(m<n);       

2.  FOR _____________________________________________________________

2.1 exemple

int i ;   for (i=0 ; i<4 ; i++ )

{      cout<<i*i<<endl ;

}

2.2 for : utilisation simplifiée

Voici une utilisation simplifiée de la structure for, N  est une valeur entière fixée dans le programme :

int i ;   for (i=0 ; i<N ; i++ )

{       instructions ;

}

i est initialisé à 0, si i est inférieur à N, les instructions sont réalisées une première fois, puis i est incrémenté, si i < N, les instructions sont à nouveaux exécutées, i est incrémenté…. La boucle stoppe quand la condition i < N est fausse.

Donc, « en français » : « Partant de i=0, tant que i est inférieur à N,  réaliser les instructions et   incrémenter ». Les instructions sont donc exécutées N fois, pour i variant de 0 à N-1 ;  en sortie de boucle, i vaut N remarques :  i++ est équivalent à  i = i+1, c’est à dire une incrémentation de i.

2.3 for : structure générale

La structure générale est 

for (initialisation ; condition ; mise à jour)

{      instructions ;

}

Soit, « en français » : « Réaliser l’initialisation, puis, tant que la condition est vraie,  réaliser les instruction et faire la mise à jour »

On peut donc créer une initialisation, un test (condition) et une mise à jour différentes de celles proposées dans la version simplifiée.

2.4 Exercice

Déterminer l’affichage réalisé lors de l’exécution de cette boucle :

                int i;             

for (i=0; i<=5; i++)  

{ cout<<"i : "<<i<<endl; 

} cout<<"i vaut maintenant : "<<i<<endl; 

TD 3

Déterminer la structure utilisée (for ou while) et écrire le contenu de la boucle pour les exercices 1 à 3.

Ex 1

L'utilisateur saisit un nombre entier au clavier et le programme affiche une colonne contenant un nombre d’étoiles correspondant au nombre donné :

3

*

*

*

Ex 2

Le programme demande à l'utilisateur d'entrer le montant qu'il désire retirer au distributeur. Ce montant doit être un multiple de 20 euros. La question est reposée tant que le montant entré n'est pas correct. Ex 3

Complément : 

La fonction rand() renvoie un entier compris entre 0 et 32 767 (tirage pseudo-aléatoire).

La fonction srand() permet de réinitialiser le générateur de nombres aléatoires. srand(time(NULL));      

Ces fonctions nécessitent l’appel des fichiers stdlib.h et time.h.

Ecrire un programme qui affiche 10 entiers aléatoires compris entre 0 et 32 767.

Ecrire un programme qui affiche 10 entiers aléatoires compris entre 0 et 10.

Ecrire un programme qui affiche 10 réels aléatoires compris entre 0 et 1.

Ecrire un programme qui affiche 50 nombres aléatoires compris entre 0 et 100, puis le modifier pour qu'il n'affiche que les multiples de 5.

Ex 4 

i

somme

int somme, n, i; somme = 0; cout<<"Nombre d'iterations ? " <<endl; cin>>n; for(i=0 ; i<n ; i = i+1)   

{ somme = somme + i*i;

} cout<<somme<<endl;

Prévoir l’évolution des variables dans le tableau ci-contre pour n = 5 :

Quelle est la valeur de i en sortie de boucle ?

Que se passe-t-il si on omet la seconde ligne ?

Pourquoi a-t-on choisi une structure for et non une structure while ?

Quelle suite cette boucle calcule-t-elle ?

Ex 5 

On souhaite entrer des nombres au clavier (par exemple, saisir les notes d’un examen), puis analyser ces notes. On ignore au départ le nombre de notes à saisir. Les notes étant comprises entre 0 et 20, on décide d’entrer une note négative pour arrêter le traitement.

Ecrire un programme qui  • saisit les notes

• calcule et affiche la somme des notes, attention, on ne désire pas ajouter la valeur négative d’arrêt de boucle.

Complément : 

Pour calculer la somme des notes, on initialise la variable somme à 0, puis à chaque fois qu’une note est entrée, on l’ajoute à somme : 

somme = somme + note ;

TP 3

1.  EXERCICES  DE BASE________________________________________________

Les trois premiers exercices consistent à programmer des exemples et exercices du cours.

Ex1 (§1.1) / Ex2 (§1.1)  / Ex3 (§2.4) 

Ex4

Tester l'exercice 1 du TD.

Ex5

Tester l'exercice 2 du TD. Modifier ce programme pour, en plus, limiter la somme retirée à 120 euros. Si le montant est supérieur, la question  est reposée.

Ex6

Tester les programmes de l’exercice 3.

Puis, modifier le dernier pour que le programme 

•   Génère des nombres aléatoires compris entre 0 et 100, 

•   Affichent parmi ces nombres ceux qui sont multiples de 5 ou de 6, 

•   S’arrête quand 20 nombres aléatoires multiples de 5 ou de 6 sont affichés.

Même question pour afficher 10 multiples aléatoires de 5 et



510