INFORMATIQUE SCIENTIFIQUE



Documents pareils
Cours d Algorithmique et de Langage C v 3.0

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.


INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Claude Delannoy. 3 e édition C++

Algorithmique et Programmation, IMA

Cours d initiation à la programmation en C++ Johann Cuenin

Introduction au langage C

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Introduction à l algorithmique et à la programmation M1102 CM n 3

Bases de programmation. Cours 5. Structurer les données

SUPPORT DE COURS. Langage C

Programmation C++ (débutant)/instructions for, while et do...while

UE C avancé cours 1: introduction et révisions

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Programmer en JAVA. par Tama

UE Programmation Impérative Licence 2ème Année

Recherche dans un tableau

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Programme Compte bancaire (code)

Conventions d écriture et outils de mise au point

Algorithmique, Structures de données et langage C

Programmation en langage C

Java Licence Professionnelle CISII,

TP 1. Prise en main du langage Python

STAGE IREM 0- Premiers pas en Python

Algorithme. Table des matières

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

Introduction à MATLAB R

Langage C. Patrick Corde. 22 juin Patrick Corde ( Patrick.Corde@idris.fr ) Langage C 22 juin / 289

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

Solutions du chapitre 4

Les structures. Chapitre 3

Algorithmes et Programmes. Introduction à l informatiquel. Cycle de vie d'un programme (d'un logiciel) Cycle de vie d'un programme (d'un logiciel)

Cours d Informatique

Langage Éric Guérin 5 octobre 2010

Plan du cours. Historique du langage Nouveautés de Java 7

TD3: tableaux avancées, première classe et chaînes

INF 321 : mémento de la syntaxe de Java

I. Introduction aux fonctions : les fonctions standards

REPUBLIQUE ALGERIENNE DEMOCRATIQUE ET POPULAIRE UNIVERSITE M HAMED BOGARA DE BOUMERDES

Corrigé des TD 1 à 5

LES TYPES DE DONNÉES DU LANGAGE PASCAL

1.6- Génération de nombres aléatoires

Rappels Entrées -Sorties

Initiation à la programmation en Python

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Algorithmique et programmation : les bases (VBA) Corrigé

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

COMPARAISONDESLANGAGESC, C++, JAVA ET

as Architecture des Systèmes d Information

INF111. Initiation à la programmation impérative en C amini/cours/l1/inf111/ Massih-Reza Amini

Le langage C. Introduction, guide de reference

Programmation en Java IUT GEII (MC-II1) 1

Notions fondamentales du langage C# Version 1.0

Projet L1, S2, 2015: Simulation de fourmis, Soutenance la semaine du 4 mai.

Les bases de l informatique et de la programmation. École polytechnique

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

et Programmation Objet

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Programmation en C/C++

TP : Gestion d une image au format PGM

ALGORITHMIQUE ET PROGRAMMATION En C

Le Langage C Licence Professionnelle Qualité Logiciel Pr. Mouad BEN MAMOUN ben_mamoun@fsr.ac.ma Année universitaire 2011/2012

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Organigramme / Algorigramme Dossier élève 1 SI

Programmation C. J.-F. Lalande. 15 novembre 2012

Généralités sur le Langage Java et éléments syntaxiques.

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Programmation Classique en langage C

Introduction au Langage de Programmation C

Cours 1: Java et les objets

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Langage Java. Classe de première SI

1 Recherche en table par balayage

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

Programmation en langage C d un µcontrôleur PIC à l aide du compilateur C-CCS Sommaire

Informatique Générale

Cours d algorithmique pour la classe de 2nde

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Anis ASSÈS Mejdi BLAGHGI Mohamed Hédi ElHajjej Mohamed Salah Karouia

Utilisation d objets : String et ArrayList

PROJET ALGORITHMIQUE ET PROGRAMMATION II

V- Manipulations de nombres en binaire

Programmation linéaire

Présentation du langage et premières fonctions

Notes du cours 4M056 Programmation en C et C++ Vincent Lemaire et Damien Simon

Rappels sur les suites - Algorithme

Le Langage C++ Patrick TRAU - ULP IPST version du 02/10/05

Algorithmique I. Algorithmique I p.1/??

Transcription:

INFORMATIQUE SCIENTIFIQUE IUT ORSAY Mesures Physiques - 1 re année Algorithmes et Conseils de programmation version 3.0 http://www.iut-orsay.fr/dptmphy/pedagogie/welcome.html Bob CORDEAU

Informatique : Rencontre de la logique formelle et du fer à souder. Maurice NIVAT SOMMAIRE NOTATIONS ALGORITHMIQUES SYNTAXE DU LANGAGE C EXEMPLE TYPE D UN PROGRAMME C CORRESPONDANCES ENTRE NOTATIONS ALGORITHMIQUES ET LANGAGE C TYPES CLASSIQUES DU C CONSEILS ET CONVENTIONS D ÉCRITURE INDENTATION PRIORITÉS DES OPÉRATEURS ERREURS DE COMPILATION EXERCICES CORRIGÉS D ALGORITHMIQUE 2006-2007 - 2 - BC v3.0

NOTATIONS ALGORITHMIQUES du cours d informatique scientifique Dépouiller la langue jusqu à la mettre à nu... Ernest Hemingway Les types de données de base booléen ; entier ; flottant ; caractère. Commentaires : les souligner Déclaration des variables : nom + type (on peut les initialiser à la déclaration) hauteur : entier pi 3.14 : flottant Variables structurées (indexées à partir de 0) tab : tableau de 10 flottants str : chaîne de 8 caractères tab[0].. tab[9] str[0].. str[7] Affectation tab[2] 2.36 index index + 3 Opérateurs relationnels == : égal!= : différent < : inférieur : inférieur ou égal > : supérieur : supérieur ou égal Entrées/Sorties Saisir(index) Afficher("Hauteur de la façade : ", hauteur, " mètres") Sélection Elle peut être simple sans le sinon Elle peut être complète avec le sinon (cf. alg. 1) Boucles Boucle Faire.. TantQue. (cf. alg. 2) Boucle TantQue. (cf. alg. 3) Boucle Pour. (cf. alg. 4) BC v3.0-3 - 2006-2007

Algorithm 1 Sélection Si (condition) < instructions > Sinon < instructions > FinSi Algorithm 2 Boucle Faire.. TantQue Faire < instructions > TantQue(condition) Algorithm 3 Boucle TantQue TantQue (condition) < instructions > FinTantQue Algorithm 4 Boucle Pour Pour cpt Dans [a..b] ParPasDe n < instructions > FinPour Algorithm 5 Fonction : calcul de la factorielle (notez que n est en entrée) DébutFonction FACTORIELLE( n : entier) : entier fact, cpt : entier fact 1 Pour cpt Dans [1..n] ParPasDe 1 fact fact*cpt FinPour Retourner f act FinFonction 2006-2007 - 4 - BC v3.0

Fonctions Notation : voir exemple (cf. alg. 5). Utilisation : toujours dans une expression : a Doubler(3) Afficher(Doubler(4-x)) c 9 + Factorielle(Doubler(n+2)) Leur exécution produit un résultat, et un seul, qui prend la place de la fonction lors de l évaluation de l expression. Procédures Notation : voir exemples (cf. alg. 6 et 7). Algorithm 6 Procédure d échange (notez que a et b sont en entrée-sortie) DébutProcedure ECHANGER( a : entier, b : entier) temp a : entier variable temporaire a b b temp FinProcedure Algorithm 7 Procédure de calcul d heure (notez que h et m sont en sortie) DébutProcedure HEURESMINUTES( dureeenmin : entier, h : entier, m : entier) h dureeenmin/60 m dureeenmin 60 h FinProcedure Utilisation : leur appel constitue à lui seul une instruction : HeuresMinutes(193, h, m) Afficher("Valeur après échange") Echanger(u, v) Seules les procédures permettent de modifier la valeur de plusieurs arguments. BC v3.0-5 - 2006-2007

Afficher Dans s DébutFonction DébutProcédure DébutProgramme Faire s FinFonction FinPour FinProcédure FinProgramme FinSi FinTantQue ParPasDe Pour Retourner Saisir Si Sinon TantQue Liste des mots réservés Remarque Outre ces mots réservés, on emploiera des fonctions utiles, par exemple : Alea(n), fonction qui fournit un entier au hasard entre 0 et n-1 Par ailleurs, toutes les fonctions mathématiques usuelles seront disponibles. On les écrira simplement comme en math (pourvu que la variable x soit déclarée) : sin(x), arccos(x), tanh(x), log(x)... 2006-2007 - 6 - BC v3.0

SYNTAXE du LANGAGE C FICHIERS SOURCES *.cpp fichiers principaux Vos programmes. *.h fichiers d en-tête Ne pas mettre de code dans les en-tḙtes. DIRECTIVES Pas de ; après une directive. #include <iostream.h> En-tḙte système. #include "monentete.h" En-tḙte utilisateur. #define ANCIEN NOUVEAU Remplace partout ANCIEN par NOUVEAU. #define CHEZ_MOI "C:\\InfoScient\\" globales numériques ou textuelles. DÉCLARATIONS DE VARIABLES Toute variable doit ḙtre déclarée. int i, j=2, cpt; On peut initialiser en déclarant. const double rac2 = 1.414; Une constante doit ḙtre initialisée. types de base disponibles char bool int short long float double DÉFINIR UN NOUVEAU TYPE typedef CONNU NOUVEAU typedef float TAB[9]; TAB est un nouveau type : TAB t; t est un tableau de 9 float NOTATION [] POUR DÉFINIR DES : Les indices commencent à 0. tableaux Son nom est un pointeur sur double t[7]; son premier élément. int m[2][3]; matrice de 2 lignes et 3 colonnes. chaînes de caractères char s[9]; s[0].. s[8] terminée par \0 AFFECTATION De mḙme type : choux carottes t[4] = 12.5; Ne pas confondre avec == RELATIONS ==!= > < >= <= Attention à égal (==) et à différent (!=) ALTERNATIVE if(j == 2) cout << "j est pair"; if(premier(k)) cout << "k est premier"; else cout << "k est composé"; La condition est toujours booléenne. Signifie Premier(k) est vrai SÉLECTION PAR ÉTIQUETTES switch(i) Ne pas oublier les break! case 1 : a = s[j]; break; Étiquettes de type discret : case 2 : c = b+5; break; int, short, char, long... default : // tous les autres cas BC v3.0-7 - 2006-2007

BOUCLES for for(i = 0; i < N; i++) som = som + t[i]; do.. while do cout << "Entrez un entier > 0 : "; cin >> n; while(n < 1); while while((n%i) == 0) n = n/2; cpt++; ENTRÉES / SORTIES ( à la C++ ) affichage cout << p << "\% de " << t; saisie cin >> val; Les bases de la répétition. La plus utile quand on connaˆıt les valeurs de début et de fin de l indice. Condition en fin de boucle. Condition en début de boucle. Les communications. ENTRÉES / SORTIES ( à la C ) Les communications. formats courants %d entier modificateurs : %i entier %li entier long %f flottant %hi entier court %c caractère %lf réel double %s chaîne de caractères %2.3f nn.nnn %o octal %x hexadécimal affichage printf("%.2lf \% de %d\n", p, t); 13.95 % de 148 saisie scanf("%li", &numlong); Ne pas oublier le &... scanf("%s", string);... sauf pour les chaˆınes! FONCTIONS et PROCÉDURES Prototype + appel + définition fonction Toujours dans une expression. int Factorielle(int n); // prototype Donne un seul résultat typé. int Factorielle(int n) // définition int i, fact = 1; Déclaration de variables locales. for(i = 0; i <= n; i++) fact = fact + 1; return fact; procédure Pas de type (void), donc pas void InitTab(double t[]); // proto. d affectation lors de l appel. void InitTab(double t[]) // déf. int i; Déclaration de variables locales. for(i = 0; i < N; i++) t[i] = 0; Pas de return 2006-2007 - 8 - BC v3.0

OPÉRATEURS BOOLÉENS Opérateurs logiques. &&! ET / OU / NON OPÉRATEURS BINAIRES Opérateurs bit à bit (masque). & ˆ ET / OU / XOR / complément << >> Décalage des bits gauche/droite POINTEURS et RÉFÉRENCES : variables typées Contient l adresse d une autre opérateur & variable de mḙme type. int x, &y = x; y est un alias de x opérateur * int *pa; // *pa : valeur de pa pa est un pointeur (une adresse). déclaration et manipulation int x = 3, *pa; *pa est un int et pa un (int *) pa = &x; // donc *pa vaut 3 Car pa reçoit l adresse de x. références et procédures Exemple à bien connaˆıtre! void RAZ(int& a); Prototype. void main(void) int i = 15; Ici i = 15 RAZ(i); Après l appel : i = 0 void RAZ(int& a) a = 0; Définition. pointeurs et procédures Exemple à bien connaˆıtre! void RAZ(int *pa); Prototype. void main(void) int i = 15; Ici i = 15 RAZ(&i); Après l appel : i = 0 void RAZ(int *pa) *pa = 0; Définition. passage des tableaux en arguments int f(int tab[]); // un prototype Aspect tableau. int f(int *tab); // autre écriture Aspect pointeur équivalent. int j, m, n, t[5]; j = f(t); // un appel On passe l adresse dans les 3 cas. m = f(&t[3]); // autre appel On passe une partie du tableau. n = f(t+3); // même résultat Écriture équivalente par pointeur. STRUCTURES Paquet d informations hétérogènes. déclaration de structures Ou mieux avec un typedef : struct individu typedef struct char nom[40]; char nom[40]; int age; int age; char sexe; char sexe; INDIVIDU; déclaration de variables structurées Ou mieux avec un typedef : struct individu Luc, Bob; INDIVIDU Luc, Bob; struct individu *Aude; INDIVIDU *Aude; utilisations Syntaxes pointée ou fléchée : Luc.sexe = M ; Notation pointée. Luc.age = 17; Notation pointée. Bob.age = 3 * Luc.age - 4; Notation pointée. Aude->sexe = F ; Notation fléchée pour les pointeurs de structure. BC v3.0-9 - 2006-2007

EXEMPLE DE STRUCTURE TYPE d un programme C en quatre parties 1 - Identification du programme // TP747e2.c // Dennis Ritchie, 29/02/2013 2 - En-tête (directives, nouveaux types et prototypes globaux) #include <iostream> using namespace std; const int N = 25; typedef int TAB[N]; 3 - Fonction principale : reflet de l algorithme général int main(void) int imin, tmp; TAB t; // prototype local int IndiceDuMin(TAB, // tableau d entiers int); // taille du tableau srand(time(null)); for(int i = 0; i < N; i++) t[i] = rand() % N; imin = IndiceDuMin(t, N); // appel de fonction cout << " Avant : t[0] = " << t[0] << "\t t[imin] = " << t[imin] << "\n"; // inversion de t[0] et de t[imin] tmp = t[0]; t[0] = t[imin]; t[imin] = tmp; cout << "\n Apres : t[0] = " << t[0] << "\t t[imin] = " << t[imin] << "\n"; cout << endl; system("pause"); return 0; 4 - Définition des fonctions et procédures : reflets des algorithmes particuliers int IndiceDuMin(TAB t, int n) int u = t[0], imin = 0; for(int i = 1; i < n; i = i+1) if(t[i] < u) u = t[i]; imin = i; return imin; 2006-2007 - 10 - BC v3.0

CORRESPONDANCES Algo C Le style est une façon très simple de dire des choses compliquées. Jean Cocteau Déclarations et affectations Langage algorithmique Langage C z : flottant double z ; z 16.24 z = 16.24 ; i, j : entier int i, j ; n 6 : entier int n = 6 ; t, tab : tableau de n entier int t[n], tab[n] ; Instructions et structures de contrôle Langage algorithmique Langage C t[i] t[i]+1 t[i] = t[i]+1 ; Afficher("Impédance : ", z, " ohm") cout << "Impedance : " << z << " ohm" ; Saisir(z) cin >> z ; Pour i Dans [0..n[ ParPasDe 1... FinPour for(int i = 0; i < n; i = i + 1)... Faire... TantQue (i < n) do... while(i < n) ; TantQue (i < n)... FinTantQue while(i < n)... Si (i == j)... Sinon... FinSi if(i == j)... else... Retourner(z) return z ; commentaire // commentaire i Minimum(t, tab) i = Minimum(t, tab) ; Fonctions : signatures algorithmiques / prototypes C algo DébutFonction Factorielle( n : entier) : entier C int Factorielle(int n) ; algo DébutFonction Next( t : tableau de flottant, n : entier) : flottant C float Next(float t[], int n) ; algo DébutProcédure Echanger( x : flottant, y : flottant) C void Echanger(double& x, double& y) ; algo DébutProcédure HeuresMinutes( t : entier, h : entier, m : entier) C void HeuresMinutes(int t, int& h, int& m) ; BC v3.0-11 - 2006-2007

Taille et amplitude des types classiques En utilisant l instruction sizeof, ainsi que les constantes prédéfinies dans l en-tête limits.h, on trouve les valeurs suivantes : FIG. 1 Taille et amplitude des types classiques 2006-2007 - 12 - BC v3.0

Conseils et conventions d écriture Ce que l on conçoit bien s énonce clairement. Nicolas Boileau Mots-Clés du langage C La description du langage C est basée sur la norme internationale ISO/IEC 9899 qui a été adoptée en 1990 et amendée en 1995 et 1999. La norme de 1995 est reconnue par tous les compilateurs courants. Les nouvelles extensions définies dans la version de 1999 (appelée ANSI C99) ne sont pas implantées dans beaucoup de compilateurs, et sont indiquées dans le tableau ci-dessus par un astérisque. Les 37 mots-clés suivants sont réservés et ne doivent pas être utilisés comme identificateurs. Voici une liste complète : auto enum restrict unsigned break extern return void case float short volatile char for signed while const goto sizeof _Bool continue if static _Complex default inline struct _Imaginary do int switch double long typedef else register union Identificateurs Un identificateur est un nom (de variable, de constante, de type, de fonction... ) choisi par le programmeur. Il se compose de lettres (a à z et A à Z), du caractère soulignement (_) ou de chiffres (0 à 9) ; le premier caractère doit être une lettre (ou un caractère soulignement, mais c est une convention utilisée par certains compilateurs, donc à éviter) ; éviter les caractères accentués (peu portable) ; avec tout compilateur, se limiter à des identificateurs de 32 caractères ; ne pas oublier que le C distingue les majuscules des minuscules : tab, Tab et TAB sont trois identificateurs différents ; enfin il est interdit d utiliser les mots clés réservés du langage C. Voici quelques exemples d identificateurs : Valides : a, DM, FLOAT, _var1, HautDeFenetre ; Non valides : do, 586cpu, z\%hler, nl-flag, US_$. Dans ce cadre, on reste libre de choisir ses identificateurs, à ceci près qu il est commode et plus clair, pour la lecture du code, de s imposer quelques conventions. BC v3.0-13 - 2006-2007

Choix des identificateurs : conseils et conventions 1. Constantes et nouveaux types Ils sont conventionnellement écrits en majuscules : const int MAX_ELEM = 5; typedef double PRESSION; 2. Variables (a) Variables à courte portée (compteurs de boucle, indices de tableau... ). Les choisir courts et conventionnels (le code y gagne en clarté) : i, j, k, cpt... (b) Variables à portée étendue (les autres). Choisir des noms expressifs ; commencer le nom par une minuscule ; si le nom est composé, adopter un style (par exemple : jour_du_mois ou bien jourdumois), mais gardez-le : le choix du style est moins important pour la lisibilité que sa cohérence. 3. Fonctions Commencer le nom par une majuscule ; préférer des mots d action, souvent des verbes. Par exemple : LireFichier(), RangeValeur(), AfficheListe()... 2006-2007 - 14 - BC v3.0

L indentation On nomme ainsi les retraits en début de ligne destinés à faciliter la lecture des programmes et des algorithmes. C est une habitude qu il faut s imposer avec rigueur, elle permet d extraire rapidement la structure (le squelette) du programme, la logique d une boucle ou d un test, et de détecter bien des oublis de fermeture de bloc. Parmi plusieurs styles d indentation on propose le suivant. DébutProgramme Combinaisons à deux dés i, j, n, s : entier n 0 Faire Afficher( Entrez un entier [2.. 12] : ) Saisir(n) TantQue((n < 2)ET(n > 12)) Choisissez votre style et... gardez-le! Pour i Dans [1..6] ParPasDe 1 Pour j Dans [1..6] ParPasDe 1 Si (i + j == n) s s + 1 FinSi FinPour FinPour Afficher( Il y a, s, façons de faire, n, avec 2 dés. ) FinProgramme #include <iostream> using namespace std; int main(void) int n, s = 0; do cout << " Entrez un entier [2.. 12] : "; cin >> n; while(n < 2 n > 12); for(int i = 1; i < 7; i++) for(int j = 1; j < 7; j++) if(i+j == n) s++; cout << "\n Il y a " << s << " facons de faire " << n << " avec 2 des.\n"; system("pause"); return 0; BC v3.0-15 - 2006-2007

Ordre de priorité des opérateurs Il est sage d utiliser la règle pratique suivante : Niveau de priorité Opérateurs arithmétiques 1 * / % 2 + - Entourer tout le reste de parenthèses! Vous pouvez aussi vous servir du «truc» mnémotechnique suivant, l acronyme PEMDAS : P pour parenthèses. Elles ont la plus haute priorité ; E pour exposants. Ils sont évalués ensuite, avant les autres opérations ; M et D pour multiplication et division, qui ont la même priorité ; A et S pour addition et soustraction, de même priorité et évaluées en dernier. Si deux opérateurs ont la même priorité, l évaluation est effectuée de gauche à droite. Que faire en cas d erreurs de compilation? Quand le compilateur indique des erreurs, il a raison! Lisez soigneusement les messages du compilateur (oui, même en anglais!), et pensez tout de suite aux points suivants : il manque souvent un point-virgule (à la ligne au-dessus, ou proche... ), ou bien une parenthèse, une accolade... Utilisez l option «Aide parenthèses/accolades relatives» (case à cocher dans les «Propriétés de l Editeur» de Dev-C++) ; l instruction for(... ;... ;...) comporte trois parties séparés par des points virgules ; quand il manque un #include, les noms correspondants sont inconnus. Voir la documentation intégrée de l IDE ou consulter le fichier «libc.pdf» ; un nom inconnu est souvent mal orthographié (vérifier sa casse) ; confusions fréquentes entre = et == ou bien entre & et &&... 2006-2007 - 16 - BC v3.0

EXERCICES CORRIGÉS D ALGORITHMIQUE 1. ÉNONCÉS Remarque Les exercices suivants vous sont fournis à titre d exemples et de modèle. Utilisez-les pour vous entraîner. Ils sont soit simples, soit moins simples (notés dans la marge) soit difficiles (notés ). 1. Écrire la trace de l algorithme suivant. Que fait-t-il?. Algorithm 8 Algorithme inconnu DébutProgramme Trace d un algorithme a, b, c : entier a A b B c C a a + b + c b b + c c a - c a a - c b c - b + a c c - b FinProgramme 2. Écrire un algorithme qui, à partir de la saisie d un rayon et d une hauteur, calcule le volume d un cône droit. 3. En utilisant les opérateurs booléens ET, OU et NON, écrire un programme qui affiche la table de vérité du ou exclusif. Vérifiez que : a XOR b = (a OU b) ET (NON(a) OU NON(b)). 4. L utilisateur donne un entier positif n et le programme affiche PAIR s il est divisible par 2 et IMPAIR sinon. 5. L utilisateur donne un entier positif et le programme annonce combien de fois de suite cet entier est divisible par 2. BC v3.0-17 - 2006-2007

6. L utilisateur donne un entier supérieur à 1 et le programme affiche, s il y en a, tous ses diviseurs propres sans répétition ainsi que leur nombre. Si il n y en a pas, il indique qu il est premier. Par exemple : Entrez un entier > 1 : 12 Diviseurs propres (sans répétition) de 12 : 2 3 4 6 soit 4 diviseurs propres. Entrez un entier > 1 : 13 Diviseurs propres (sans répétition) de 13 : Il est premier. 7. Il s agit d écrire, d une part, un programme principal, et d autre part, une fonction utilisée dans le programme principal. L utilisateur remplit un tableau de N = 100 entiers avec des entiers aléatoires en utilisant une fonction AleaEntier(N) qui retourne un entier entre 0 et N 1. Une fonction nommée IndiceDuMin() reçoit ce tableau et retourne l indice de la case qui contient le minimum. Écrire l algorithme de la fonction IndiceDuMin(). Écrire l algorithme d un programme qui échange le premier élément du tableau avec le minimum de ce tableau. 8. Un tableau tab comporte N = 100 variables flottantes dont les n premières (n < 100) sont utilisées. Écrire une fonction IndiceDuMax() qui retourne l indice du plus grand flottant parmi ces n, et une autre IndiceDuMin() qui retourne l indice du plus petit. Écrire ensuite un programme principal effectuant les actions suivantes : saisie filtrée de n (vous devez faire en sorte que n ne puisse pas être saisi hors de ses limites) ; remplissage aléatoire des n premières valeurs de tab (on utilisera une fonction Aléa(), sans argument, qui retourne un flottant au hasard entre 1.0 et +1.0) ; affichage de l amplitude du tableau (écart entre sa plus grande et sa plus petite valeur) ; affichage de la moyenne des n premières valeurs de tab. 9. Saisir un entier entre 1 et 3999 (pourquoi cette limitation?). L afficher en nombre romain. 10. Un tableau contient n entiers (2 < n < 100), tous compris entre 0 et 500. Vérifier qu ils sont tous différents. 11. L utilisateur donne un entier n entre 2 et 12, le programme donne le nombre de façons de faire n en lançant deux dés. 12. Même problème que le précédent mais avec n entre 3 et 18 et trois dés. 2006-2007 - 18 - BC v3.0

13. Généralisation des deux questions précédentes. L utilisateur saisie deux entrées, d une part le nombre de dés, nbd (que l on limitera pratiquement à 10), et d autre part la somme, s, comprise entre nbd et 6.nbd. Le programme calcule et affiche le nombre de façons de faire s avec les nbd dés. 14. On peut, par analogie avec les tableaux, définir une notation de manipulation de matrice : si m est une matrice, on note m[i, j] la valeur qui se trouve à l intersection de la i e ligne et de la j e colonne. On déclare trois matrices carrées de dimension N (pratiquement, on se limitera à N max = 10) : m1, m2 et m3 contenant des entiers. On affecte m1, ligne à ligne, par les N 2 premiers entiers pairs commençant à 2 ; m2 est la matrice unité, c est-à-dire qu elle contient des 1 sur la diagonale principle (NW-SE) et des 0 partout ailleurs. Écrire l algorithme du calcul de m3 = m1 m2. BC v3.0-19 - 2006-2007

2. SOLUTIONS N o a b c 1 A 2 B 3 C 4 A + B + C 5 B + C 6 A + B 7 C 8 A 9 B L algorithme effectue une permutation circulaire à droite des valeurs d entrée. Algorithm 9 Volume d un cône droit (Ex. n o 2) DébutProgramme Volume d un cône droit pi 3.141593 : flottant rayon, hauteur, volume : flottant Afficher( Rayon du cône : ) Saisir(rayon) Afficher( Hauteur du cône : ) Saisir(hauteur) volume (pi rayon rayon hauteur)/3 Afficher( Volume du cône =, volume) FinProgramme 2006-2007 - 20 - BC v3.0

Algorithm 10 Table de vérité du ou exclusif : XOR (Ex. n o 3) DébutProgramme Table de vérité de XOR a, b : booléen Afficher( a b a FAUX b FAUX Afficher(a, b, b V RAI Afficher(a, b, a V RAI b FAUX Afficher(a, b, b V RAI Afficher(a, b, FinProgramme a XOR b ), (a OU b) ET (NON(a) OU NON(b))), (a OU b) ET (NON(a) OU NON(b))), (a OU b) ET (NON(a) OU NON(b))), (a OU b) ET (NON(a) OU NON(b))) Algorithm 11 Pair ou impair? (Ex. n o 4) DébutProgramme Pair ou impair? n : entier entier à tester Faire Afficher( Entrez un entier strictement positif ) Saisir(n) TantQue(n < 1) Si (n%2 == 0) Afficher( PAIR ) Sinon Afficher( IMPAIR ) FinSi FinProgramme BC v3.0-21 - 2006-2007

Algorithm 12 Nombre de divisions par 2 (Ex. n o 5) DébutProgramme Nombre de divisions par 2 n : entier entier à tester cpt : entier nombre de diviseurs par 2 de n Faire Afficher( Entrez un entier strictement positif ) Saisir(n) TantQue(n < 1) cpt 0 initialise le compteur TantQue (n%2 == 0) n n/2 cpt cpt + 1 FinTantQue Afficher( Il est, cpt, fois divisible par 2. ) FinProgramme Algorithm 13 Diviseurs propres sans répétition (Ex. n o 6) DébutProgramme Diviseurs propres sans répétition n, i, cpt : entier Faire Afficher( Entrez un entier > 1 ) Saisir(n) TantQue(n < 2) i 2 plus petit diviseur propre possible de n cpt 0 initialise le compteur de diviseurs Afficher( Diviseurs propres (sans répétition) de, n, : ) Faire Si (n%i == 0) cpt cpt + 1 Afficher(, i) FinSi i i + 1 TantQue(i n/2) Si (cpt 0) Afficher( soit, cpt, diviseurs propres ) Sinon Afficher( Il est premier ) FinSi FinProgramme 2006-2007 - 22 - BC v3.0

Algorithm 14 Fonction IndiceDuMin() d un tableau d entiers (Ex. n o 7) DébutFonction INDICEDUMIN( t : entier[n], n : entier) : entier min, i, imin : entier min t[0] imin 0 Pour i Dans [1..n[ ParPasDe 1 Si (t[i] < min) min t[i] imin i FinSi FinPour Retourner (imin) FinFonction Algorithm 15 Échange de t[0] avec t[imin] (Ex. n o 7) DébutProgramme Échange de t[0] avec t[im in] N 100 : entier i, imin, tmp : entier t : entier[n] Pour i Dans [0..N[ ParPasDe 1 t[i] AleaEntier(N) FinPour im in IndiceDuMin(t, N) tmp t[0] t[0] t[imin] t[imin] tmp FinProgramme BC v3.0-23 - 2006-2007

Algorithm 16 Fonction IndiceDuMin() d un tableau de flottant (Ex. n o 8) DébutFonction INDICEDUMIN( t : flottant[n], n : entier) : entier min : flottant i, imin : entier min t[0] imin 0 Pour i Dans [1..n[ ParPasDe 1 Si (t[i] < min) min t[i] imin i FinSi FinPour Retourner (im in) FinFonction Algorithm 17 Fonction IndiceDuMax() d un tableau de flottant (Ex. n o 8) DébutFonction INDICEDUMAX( t : flottant[n], n : entier) : entier max : flottant i, imax : entier max t[0] imax 0 Pour i Dans [1..n[ ParPasDe 1 Si (t[i] > max) max t[i] imax i FinSi FinPour Retourner (im ax) FinFonction 2006-2007 - 24 - BC v3.0

Algorithm 18 Amplitude et moyenne d un tableau de flottant (Ex. n o 8) DébutProgramme Amplitude et moyenne d un tableau de flottant N 100 : entier i, n, imin, imax : entier tab : flottant[n] som : flottant Faire Afficher( Entrez un entier [2.. 100] ) Saisir(n) TantQue(n < 1) OU (n > N) som 0 Pour i Dans [0..n[ ParPasDe 1 tab[i] Alea() som som + tab[i] FinPour im in IndiceDuMin(tab, n) im ax IndiceDuMax(tab, n) Afficher( Amplitude de tab :, tab[imax] tab[imin]) Afficher( Moyenne des, n, premières valeurs de tab :, som/n) FinProgramme BC v3.0-25 - 2006-2007

Algorithm 19 Numération romaine (Ex. n o 9) DébutProgramme Numération romaine n : entier Faire Afficher( Entrez un entier [1..4000[ ) Saisir(n) TantQue(n < 1 OU n > 3999) TantQue (n 1000) Afficher( M ) n n 1000 FinTantQue Si (n 900) Afficher( CM ) n n 900 FinSi Si (n 500) Afficher( D ) n n 500 FinSi Si (n 400) Afficher( CD ) n n 400 FinSi TantQue (n 100) Afficher( C ) n n 100 FinTantQue... TantQue (n 1) Afficher( I ) n n 1 FinTantQue FinProgramme 2006-2007 - 26 - BC v3.0

Algorithm 20 Tableau d éléments différents (Ex. n o 10) DébutProgramme Tableau d éléments différents N 100 : entier n : entier nombre de valeurs utilisées T : entier[n] on suppose T déjà garni V erif : booléen[n] i : entier stop : booléen Pour i Dans [0..N[ ParPasDe 1 V erif[i] FAUX FinPour stop FAUX i 0 TantQue ((stop ==FAUX) ET (i < n)) Si (V erif[t[i]]) stop VRAI Sinon V erif[t[i]] VRAI FinSi i i + 1 FinTantQue Si (stop) Afficher( Au moins une valeur est répétée ) Sinon Afficher( Tous les éléments sont distincts ) FinSi FinProgramme BC v3.0-27 - 2006-2007

Algorithm 21 Combinaisons à 2 dés (Ex. n o 11) DébutProgramme Combinaisons à 2 dés i, j, n : entier s 0 : entier somme cherchée Faire Afficher( Entrez un entier [2.. 12] ) Saisir(n) TantQue(n < 2) OU (n > 12) Pour i Dans [1..6] ParPasDe 1 Pour j Dans [1..6] ParPasDe 1 Si (i + j == n) s s + 1 FinSi FinPour FinPour Afficher( Il y a, s, façons de faire, n, avec 2 dés ) FinProgramme Algorithm 22 Combinaisons à 3 dés (Ex. n o 12) DébutProgramme Combinaisons à 3 dés i, j, k, n : entier s 0 : entier somme cherchée Faire Afficher( Entrez un entier [3.. 18] ) Saisir(n) TantQue(n < 3) OU (n > 18) Pour i Dans [1..6] ParPasDe 1 Pour j Dans [1..6] ParPasDe 1 Pour k Dans [1..6] ParPasDe 1 Si (i + j + k == n) s s + 1 FinSi FinPour FinPour FinPour Afficher( Il y a, s, façons de faire, n, avec 3 dés ) FinProgramme 2006-2007 - 28 - BC v3.0

Algorithm 23 Combinaisons à n dés (Ex. n o 13) DébutProgramme Combinaisons à n dés MAX 10 : entier M 6 : entier nbd, s, j, k, sum, cpt : entier I : entier[max] Faire Afficher( Nombre de dés entre 2 et, MAX) Saisir(nbd) TantQue((nbd < 2)OU(nbd > MAX)) Faire Afficher( Entrez un entier entre, nbd, et, M nbd) Saisir(s) TantQue((s < nbd)ou(s > M nbd)) Pour j Dans [0..nbd[ ParPasDe 1 I[j] 1 FinPour cpt 0 Faire sum 0 Pour k Dans [0..nbd[ ParPasDe 1 sum sum + I[k] FinPour Si (sum == s) cpt cpt + 1 FinSi j 0 Si (I[j] < M) I[j] I[j] + 1 Sinon TantQue (I[j] == M) I[j] 1; j j + 1 FinTantQue I[j] I[j] + 1 FinSi TantQue(j < nbd) Afficher( Il y a, cpt, façons de faire, s, avec, nbd, dés ) FinProgramme BC v3.0-29 - 2006-2007

Algorithm 24 Différence de deux matrices carrées (Ex. n o 14) DébutProgramme Différence de deux matrices carrées N MAX 10 : entier N, i, j, k : entier m1, m2, m3 : matrice de N MAX N MAX entier Faire Afficher( Dimension des matrices : ) Saisir(N) TantQue(N < 2)OU(N > N MAX ) k 2 Pour i Dans [0..N[ ParPasDe 1 Pour j Dans [0..N[ ParPasDe 1 m1[i, j] k k k + 2 Si (i == j) m2[i, j] 1 Sinon m2[i, j] 0 FinSi m3[i, j] m1[i, j] m2[i, j] Afficher( m3[, i,,, j, ] =, m3[i, j]) FinPour FinPour FinProgramme 2006-2007 - 30 - BC v3.0

PROGRAMMES // Bob - algo_01.cpp #include <iostream> using namespace std; int main(void) char a= A, b= B, c= C ; cout << " a = " << a << "\t b = " << b << "\t c = " << c << endl; a = a + b + c; b = b + c; c = a - c; a = a - c; b = c - b + a; c = c - b; cout << "\n a = " << a << "\t b = " << b << "\t c = " << c << endl; cout << endl; system("pause"); return 0; // Bob - algo_02.cpp #include <iostream> using namespace std; #include <math.h> using namespace std; int main(void) double rayon, hauteur, volume; cout << " Rayon du cone (m) : "; cin >> rayon; cout << " Hauteur du cone (m) : "; cin >> hauteur; volume = (M_PI*rayon*rayon*hauteur)/3.0; cout << "\n volume du cone = " << volume << " m*m" << endl; cout << endl; system("pause"); return 0; // Bob - algo_03.cpp #include <iostream> using namespace std; int main(void) bool a, b; cout << " a\tb\ta XOR b\n-----------------------\n"; a = b = false; cout << " " << a << "\t" << b << "\t " << ((a b) && (!a!b)) << endl; b = true; cout << " " << a << "\t" << b << "\t " << ((a b) && (!a!b)) << endl; BC v3.0-31 - 2006-2007

a = true; b = false; cout << " " << a << "\t" << b << "\t " << ((a b) && (!a!b)) << endl; b = true; cout << " " << a << "\t" << b << "\t " << ((a b) && (!a!b)) << endl; cout << endl; system("pause"); return 0; // Bob - algo_04.cpp #include <iostream> using namespace std; int main(void) int n; do cout << " Entrez un entier strictement positif : "; cin >> n; while(n < 1); if(n % 2) cout << "\n IMPAIR\n"; else cout << "\n PAIR\n"; cout << endl; system("pause"); return 0; // Bob - algo_05.cpp #include <iostream> using namespace std; int main(void) int n, cpt=0; do cout << " Entrez un entier strictement positif : "; cin >> n; while(n < 1); while(!(n % 2)) n = n / 2; cpt = cpt + 1; cout << "\n Il est " << cpt << " fois divisible par 2.\n"; cout << endl; system("pause"); return 0; // Bob - algo_06.cpp #include <iostream> using namespace std; int main(void) int n, i=2, ns2, cpt=0; 2006-2007 - 32 - BC v3.0

do cout << " Entrez un entier strictement positif : "; cin >> n; while(n < 1); ns2 = n/2; cout << "\n Diviseurs propres (sans repetition) de " << n << " :"; do if(!(n % i)) cpt = cpt + 1; cout << " " << i; i = i + 1; while(i <= ns2); if(cpt) cout << "\n soit " << cpt << " diviseurs propres.\n"; else cout << "\n Il est premier.\n"; cout << endl; system("pause"); return 0; // Bob - algo_07.cpp #include <iostream> using namespace std; int main(void) const int N = 100; int i, imin, tmp, t[n]; // prototype local int IndiceDuMin(int [], // tableau d entier (entrée/sortie) int); // taille du tableau (entrée) srand(time(null)); for(i = 0; i < N; i = i + 1) t[i] = rand() % N; imin = IndiceDuMin(t, N); cout << " Avant : t[0] = " << t[0] << "\t t[imin] = " << t[imin] << endl; tmp = t[0]; t[0] = t[imin]; t[imin] = tmp; cout << " Apres : t[0] = " << t[0] << "\t t[imin] = " << t[imin] << endl; cout << endl; system("pause"); return 0; int IndiceDuMin(int t[], int n) int u = t[0], imin = 0; for(int i = 1; i < n; i = i + 1) if(t[i] < u) u = t[i]; imin = i; return imin; BC v3.0-33 - 2006-2007

// Bob - algo_08.cpp #include <iostream> using namespace std; int main(void) const int N = 100; int n, imin, imax; float tab[n], som = 0.0; int IndiceDuMin(float [], // tableau de flottant (entrée/sortie) int); // taille du tableau (entrée) int IndiceDuMax(float [], // tableau de flottant (entrée/sortie) int); // taille du tableau (entrée) float Alea(int); // (entree) srand(time(null)); do cout << " Entrez un entier [2.. 100] : "; cin >> n; while(n < 1 n > N); for(int i = 0; i < N; i = i + 1) tab[i] = Alea(n); som = som + tab[i]; imin = IndiceDuMin(tab, n); imax = IndiceDuMax(tab, n); cout << "\n Amplitude de tab = " << (tab[imax]-tab[imin]) << endl; cout << " Moyenne des " << n << " premieres valeurs de tab = " << (som/n) << endl; cout << endl; system("pause"); return 0; int IndiceDuMin(float t[], int n) int imin = 0; float u = t[0]; for(int i = 1; i < n; i = i + 1) if(t[i] < u) u = t[i]; imin = i; return imin; int IndiceDuMax(float t[], int n) int imax = 0; float u = t[0]; for(int i = 1; i < n; i = i + 1) if(t[i] > u) u = t[i]; imax = i; return imax; float Alea(int k) return (float)(rand() % k); // Bob - algo_09.cpp 2006-2007 - 34 - BC v3.0

#include <iostream> using namespace std; #define M 1000 #define CM 900 #define D 500 #define CD 400 #define C 100 #define XC 90 #define L 50 #define XL 40 #define X 10 #define IX 9 #define V 5 #define IV 4 #define I 1 int main(void) int n; do cout << " Entrez un entier [1.. 4000[ : "; cin >> n; while(n < 1 n > 3999); cout << "\n En Romain : "; while( n >= M) cout << "M"; n -= M; if( n >= CM) cout << "CM"; n -= CM; if( n >= D) cout << "D"; n -= D; if( n >= CD) cout << "CD"; n -= CD; while( n >= C) cout << "C"; n -= C; if( n >= XC) cout << "XC"; n -= XC; if( n >= L) cout << "L"; n -= L; if( n >= XL) cout << "XL"; n -= XL; while( n >= X) cout << "X"; n -= X; if( n >= IX) cout << "IX"; n -= IX; if( n >= V) cout << "V"; n -= V; if( n >= IV) cout << "IV"; n -= IV; while( n >= I) cout << "I"; n -= I; cout << endl << endl; system("pause"); return 0; // Bob - algo_10.cpp #include <iostream> using namespace std; int main(void) const int N = 100; int i, j, n, T[N]; bool tousdiff = true; do cout << " Entrez un entier [1.. 100] : "; cin >> n; while(n < 1 n > N); srand(time(null)); for(int k = 0; k < n; k = k + 1) T[k] = rand() % 501; // dans [0.. 500] i = 0; while(tousdiff && (i < n-1)) j = i + 1; while(tousdiff && (j < n)) if(t[i] == T[j]) BC v3.0-35 - 2006-2007

tousdiff = false; else j = j + 1; i= i + 1; if(tousdiff) cout << "\n Tous les elements sont distincts.\n"; else cout << "\n Au moins une valeur est repetee.\n"; cout << endl; system("pause"); return 0; // Bob - algo_11.cpp #include <iostream> using namespace std; int main(void) int n, s=0; do cout << " Entrez un entier [2.. 12] : "; cin >> n; while(n < 2 n > 12); for(int i = 1; i < 7; i = i + 1) for(int j = 1; j < 7; j = j + 1) if(i+j == n) s = s + 1; cout << "\n Il y a " << s << " facons de faire " << n << " avec 2 des.\n"; cout << endl; system("pause"); return 0; // Bob - algo_12.cpp #include <iostream> using namespace std; int main(void) int n, s=0; do cout << " Entrez un entier [3.. 18] : "; cin >> n; while(n < 3 n > 18); for(int i = 1; i < 7; i = i + 1) for(int j = 1; j < 7; j = j + 1) 2006-2007 - 36 - BC v3.0

for(int k = 1; k < 7; k = k + 1) if(i+j+k == n) s = s + 1; cout << "\n Il y a " << s << " facons de faire " << n << " avec 3 des.\n"; cout << endl; system("pause"); return 0; // Bob - algo_13.cpp #include <iostream> using namespace std; int main(void) const long MAX = 10; const long M = 6; long nbd, s, j, sum; long cpt = 0; long I[MAX]; do cout << "\n Nombre de des entre 2 et " << MAX << "?\t\t"; cin >> nbd; while(nbd < 2 nbd > MAX); do cout << "\n Entrez un entier entre " << nbd << " et " << M*nbd << "?\t"; cin >> s; while(s < nbd s > M*nbd); if((s == nbd) (s == M*nbd)) cpt = 1; else for(long k = 0; k < nbd; ++k) I[k] = 1; do sum = 0; for(long k = 0; k < nbd; k = k + 1) sum = sum + I[k]; if(sum == s) cpt = cpt + 1; j = 0; if( I[j] < M) I[j] = I[j] + 1; else while(i[j] == M) I[j] = 1; j = j + 1; I[j] = I[j] + 1; while(j < nbd); cout << "\n Il y a " << cpt << " facons de faire " << s << " avec " << nbd << " des.\n"; cout << endl; system("pause"); return 0; BC v3.0-37 - 2006-2007

// Bob - algo_14.cpp #include <iostream> using namespace std; int main(void) const int N_MAX = 10; int N; int m1[n_max][n_max], m2[n_max][n_max], m3[n_max][n_max]; do cout << " Dimension des matrices carrees [2.. " << N_MAX << "] : "; cin >> N; while(n < 2 N > N_MAX); for(int i = 0, k = 2; i < N; i = i + 1) for(int j = 0; j < N; j = j + 1) m1[i][j] = k; k = k + 2; if(i == j) m2[i][j] = 1; else m2[i][j] = 0; m3[i][j] = m1[i][j] - m2[i][j]; cout << "\n\n m3 = m1 - m2 :\n\n"; for(int i = 0; i < N; i = i + 1) for(int j = 0; j < N; j = j + 1) cout << "\t" << m3[i][j]; if(j == N-1) cout << "\n"; cout << "\n\n"; cout << endl; system("pause"); return 0; 2006-2007 - 38 - BC v3.0