Corrigés des exercices sur les fonctions

Documents pareils
Corrigé des exercices sur les références

Corrigés des premiers exercices sur les classes

Programme Compte bancaire (code)

Premiers Pas en Programmation Objet : les Classes et les Objets

Utilisation d objets : String et ArrayList

Java Licence Professionnelle CISII,

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Programmer en JAVA. par Tama

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)

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

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

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

Projet de programmation (IK3) : TP n 1 Correction

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

Introduction au langage C

Package Java.util Classe générique


Tp 1 correction. Structures de données (IF2)

Chapitre 10. Les interfaces Comparable et Comparator 1

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

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

INF 321 : mémento de la syntaxe de Java

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

TP, première séquence d exercices.

Langage Java. Classe de première SI

Recherche dans un tableau

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

as Architecture des Systèmes d Information

Prendre le marteau, le tableau, le mètre, le crayon, la ficelle, le clou, la pointe ;

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

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

ACTIVITÉ DE PROGRAMMATION

Programmation avec des objets : Cours 7. Menu du jour

Principes des langages de programmation INF 321. Eric Goubault

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

Un ordonnanceur stupide

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

Le prototype de la fonction main()

Conventions d écriture et outils de mise au point

Algorithmique et Programmation, IMA

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

PROGRAMMATION PAR OBJETS

Programmation par les Objets en Java

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

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

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Introduction à MATLAB R

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

Exercices sur les interfaces

Claude Delannoy. 3 e édition C++

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

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Langage à objets : JAVA (1)

Derrière toi Une machine virtuelle!

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

Assurance Qualité. Cours de génie logiciel. Renaud Marlet. LaBRI / INRIA (d'après A.-M. Hugues) màj 23/04/2007

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

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

Lier Erlang avec d autres langages de programmation

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

Corrigé des exercices avancés sur les structures récursives

Algorithmique I. Algorithmique I p.1/??

STAGE IREM 0- Premiers pas en Python

Dis papa, c est quoi un bus logiciel réparti?

Synchro et Threads Java TM

Introduction : les processus. Introduction : les threads. Plan

COMPARAISONDESLANGAGESC, C++, JAVA ET

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

I. Introduction aux fonctions : les fonctions standards

Notions fondamentales du langage C# Version 1.0

STS SE. FreeRTOS. Programmation réseau WIFI. Programmation réseau. Socket Tcp. FlyPort smart Wi-Fi module

OS Réseaux et Programmation Système - C5

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

Représentation d un entier en base b

Objets et Programmation. origine des langages orientés-objet

Java 1.5 : principales nouveautés

Solutions du chapitre 4

TD/TP PAC - Programmation n 3

Threads. Threads. USTL routier 1

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

Remote Method Invocation Les classes implémentant Serializable

Introduction au langage Java

Probabilités. Rappel : trois exemples. Exemple 2 : On dispose d un dé truqué. On sait que : p(1) = p(2) =1/6 ; p(3) = 1/3 p(4) = p(5) =1/12

Programmation Classique en langage C

Programmation Réseau SSH et TLS (aka SSL)

Problèmes liés à la concurrence

Programmation Par Objets

1. Langage de programmation Java

Une introduction à Java

Corrigé des TD 1 à 5

Flux de données Lecture/Ecriture Fichiers

Architecture des ordinateurs

Cours de Programmation Impérative: Zones de mémoires et pointeurs

Cours Informatique Master STEP

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant.

Les structures. Chapitre 3

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

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

Auto-évaluation Programmation en Java

Transcription:

Corrigés des exercices sur les fonctions Exercice 5.1.1 adaptation de programme Question 1 Modifiez le programme pour que le calcul de la division soit réalisé par une fonction à deux paramètres, x et y. Question 2 Que se passe-t-il dans le cas où le deuxième nombre entré vaut 0? Le programme risque de boucler éternellement si x est positif : en effet, soustraire 0 à chaque tour de boucle ne change en rien la valeur de la condition. Modifiez le programme pour qu une erreur soit déclenchée quand le diviseur y vaut 0. Le programme suivant répond aux deux premières questions. public class Exo8_1bis{ static int division(int x, int y){ int res = 0; int cour = x; if (y == 0){ throw new DiviseParZero(); while (cour>=y){ cour = cour -y; res = res+1; int a, b; Terminal.ecrireString("Entrez le nombre: "); a = Terminal.lireInt(); Terminal.ecrireString("Entrez l exposant: "); b = Terminal.lireInt(); Terminal.ecrireString("" + a + "/" + b + " = "); Terminal.ecrireIntln(division(a,b)); class DiviseParZero extends Error{ 1

Question 3 Modifiez le programme pour qu il fonctionne également pour x ou y négatifs. public class Exo8_1ter{ static int division(int x, int y){ int res = 0; int signe = 1; int cour, moins; if (x<0){ cour = -x; signe = -1; else{ cour = x; if (y<0){ moins = -y; signe = -1 *signe; else{ moins = y; if (y == 0){ throw new DiviseParZero(); while (cour>=moins){ cour = cour -moins; res = res+1; return res*signe; int a, b; Terminal.ecrireString("Entrez le nombre: "); a = Terminal.lireInt(); Terminal.ecrireString("Entrez l exposant: "); b = Terminal.lireInt(); Terminal.ecrireString("" + a + "/" + b + " = "); Terminal.ecrireIntln(division(a,b)); class DiviseParZero extends Error{ Exercice 5.1.2 fonctions mathématiques Ecrire un programme avec les fonctions carre et cube qui calculent respectivement le carré et le cube (ou puissance 3) d un nombre de type double. La méthode main doit tester ces deux fonctions sur plusieurs exemples. class Exo8_2{ static double carre(double x){ return x *x; 2 NFA031 c CNAM 2012

static double cube(double x){ return x*x*x; public static void main(string[] argv){ double n; Terminal.ecrireString("Entrez un nombre: "); n = Terminal.lireDouble(); Terminal.ecrireString("" + n + " au carre = "); Terminal.ecrireDoubleln(carre(n)); Terminal.ecrireString("" + n + " au cube = "); Terminal.ecrireDoubleln(cube(n)); Quelques remarques sur ce programme. Les deux fonctions que nous avons là sont très simples. Il est aussi rapide d écrire dans le programme n*n que l appel à la fonction carre(n), pour un résultat équivalent. Le seul intérêt éventuel d une fonction dans un pareil cas est d améliorer la lisibilité du programme. Ici, c est relativement discutable. Autre remarque : voyez comme on évite de faire les entrées-sorties dans les fonctions. Les fonctions servent seulement à calculer. Les entrées-sorties sont effectuées dans la méthode main. On pourrait également utiliser une méthode spécialisée dans les entrées-sorties, mais il faut toujours éviter de mêler des calculs et des entrées-sorties. Exercice 5.1.3 égalité de tableaux Bien souvent, on veut comparer deux tableaux selon une égalité selon laquelle les deux tableaux t1 et t2 sont égaux si et seulement si ils ont la même longueur et les éléments de même indice sont égaux, c est à dire que t1[i] == t2[i] pour tout indice i. Ecrire une fonction appelée estegal qui réalise ce test d égalité pour des tableaux de type int[]. class Exo8_3{ static boolean estegal(int[] ti1, int[] ti2){ boolean res = true; if (ti1.length!= ti2.length){ res = false; else{ // ti1.length == ti2.length for (int i=0; i<ti1.length; i++){ res = res && (ti1[i] == ti2[i]); public static void main(string[] argv){ int[] t1 = {4, 5, 6; int[] t2 = {4, 5, 6; int[] t3 = {4, 5; int[] t4 = {6, 5, 4; Terminal.ecrireStringln("t1 = t2? " + estegal(t1,t2)); Terminal.ecrireStringln("t1 = t3? " + estegal(t1,t3)); Terminal.ecrireStringln("t1 = t4? " + estegal(t1,t4)); NFA031 c CNAM 2012 3

Le principe de la méthode de test est d abord, traiter le cas des tableaux de longueurs différentes qui ne peuvent être égaux. Ensuite, pour le cas où les deux tableaux sont de même longueur, on fait une boucle for dont le compteur i va prendre successivement toutes les valeurs des indices des deux tableaux, en commençant par 0. Pour chaque indice, on compare les valeurs des cases de tableaux à cet indice (ti1[i] == ti2[i]). Il suffit qu un seul des tests successifs soit faux pour que la variable res contiennent la valeur false. C est là l intérêt du connecteur logique &&. Même si le test faux est suivi de tests vrais, la variable res reste à false. On pourrait améliorer quelque peu la fonction en arrêtant le parcours dès qu on a trouvé un résultat faux. En effet, dès qu un test échoue, res passe à false et ne peut plus jamais changer de valeur. On peut interrompre la boucle for soit avec une instruction break, soit en utilisant un return qui met fin à l exécution de la fonction. Voilà ce que cela donne : static boolean estegal(int[] ti1, int[] ti2){ if (ti1.length!= ti2.length){ return false; else{ // ti1.length == ti2.length for (int i=0; i<ti1.length; i++){ if (ti1[i]!= ti2[i]){ return false; return true; On voit sur cette fonction qu il faut attendre d avoir parcouru tout le tableau, c est à dire attendre d être arrivé à la fin de la boucle sans avoir fait de return, pour pouvoir conclure positivement. Ce serait une erreur grave de faire un else au if de la boucle : en effet, avoir un test vrai ne permet pas de conclure. Il faut encore voir les éléments suivants, d où la boucle. Exercice 5.1.4 fonctions sur les tableaux Question 1 Ecrire une fonction qui cherche si un élément appartient à un tableau de char. Le caractère recherché et le tableau seront les deux paramètres de la fonction. Question 2 Ecrire une fonction qui compte le nombre d occurrences d un caractère dans un tableau, c est à dire le nombre de fois où un élément apparaît dans un tableau de caractères. Le caractère recherché et le tableau seront les deux paramètres de la fonction. Question 3 Ecrire une fonction qui prend deux tableaux en paramètres et qui teste si tous les éléments du premier tableau apparaissent au moins une fois dans le deuxième tableau. Il est possible d utiliser 4 NFA031 c CNAM 2012

dans le corps de cette fonction la fonction écrite pour la réponse à la question 1. Voici un programme qui répond aux trois questions. class Exo8_4{ static boolean appartient(char elem, char[] tab){ boolean res = false; for (int i = 0; i<tab.length; i++){ if (tab[i] == elem){ res = true; static int nboccurrences(char elem, char[] tab){ int res = 0; for (int i = 0; i<tab.length; i++){ if (tab[i] == elem){ res++; static boolean inclus(char[] t1, char[] t2){ boolean res = true; for (int i = 0; i<t1.length; i++){ if (!appartient(t1[i],t2)){ res = false; public static void main(string[] argv){ char[] x = { a, b, a, b, c, a, d ; char[] y = { a, b, a, d ; char[] z = { a, z, b ; Terminal.ecrireStringln(" z appartient à x? " + appartient( z,x)); Terminal.ecrireStringln(" c appartient à x? " + appartient( c,x)); Terminal.ecrireStringln("nombre de a dans x? " + nboccurrences( a,x)); Terminal.ecrireStringln("nombre de b dans x? " + nboccurrences( b,x)); Terminal.ecrireStringln("nombre de z dans x? " + nboccurrences( z,x)); Terminal.ecrireStringln("y inclus dans x? " + inclus(y,x)); Terminal.ecrireStringln("z inclus dans x? " + inclus(z,x)); La remarque de l exercice précédent sur la possibilité d interrompre la boucle peut s appliquer NFA031 c CNAM 2012 5

aux méthodes appartient et inclus. Exercice 5.1.5 concaténation de tableaux On appelle concaténation l opération qui prend deux tableaux et calcule un tableau contenant les éléments du premier tableau, puis, à leur suite, les éléments du second tableau, dans le même ordre, mais avec un indice différent. Ecrire une fonction qui calcule la concaténation de deux tableaux d entiers. Indice : il faut créer le tableau résultat dans le corps de la fonction. class Exo8_5{ static int[] concatene(int[] t1, int[] t2){ int[] res = new int[t1.length+t2.length]; for (int i = 0; i<t1.length; i++){ res[i] = t1[i]; for (int i = 0; i<t2.length; i++){ res[t1.length + i] = t2[i]; int[] t1 = {12, 17, 15, 10; int[] t2 = {13, 14, 11; int[] t3 = concatene(t1,t2); for (int i = 0; i<t3.length; i++){ Terminal.ecrireString(" " + t3[i]); Exercice 5.1.6 affichage de tableau On reprend le programme AfficheTable donné dans le cours du chapitre 8. Question 1 Dans un premier temps, on ne s intéressera qu aux entiers strictement positifs. Le nombre de caractères - à afficher à chaque tour de boucle dépend du nombre de chiffre de la valeur contenue dans le tableau à l indice i. class Exo8_6_1{ static void affichetable(int[] t){ int nb; Terminal.ecrireChar( + ); nb = t[i]; while (nb!= 0){ 6 NFA031 c CNAM 2012

nb = nb / 10; Terminal.ecrireString("-+"); Terminal.ecrireChar( ); Terminal.ecrireString(" " + t[i] + " "); Terminal.ecrireChar( + ); nb = t[i]; while (nb!= 0){ nb = nb / 10; Terminal.ecrireString("-+"); int[] ex = {1,5,8,9,7; int[] ex2 = {12, 5, 8, 123; affichetable(ex); affichetable(ex2); Le principe de cette méthode : on élargit les cases du tableau pour les nombres plus grands. La boucle while fait autant de tours qu il y a de chiffres dans le nombre. Question 2 Améliorez encore le programme pour qu il fonctionne avec des entiers négatifs, positifs ou nuls. Le programme que l on a fait fonctionne déjà pour les nombres positifs. Quand le nombre est 0, il faut tirer un trait alors que l on n entre pas dans la boucle while (la condition est fausse dès le départ). Pour les nombres négatifs, il faut ajouter un tiret au nombre de chiffres pour pouvoir tracer le signe - devant le chiffre. Dans ces deux cas, il faut ajouter un tiret. C est ce que fait le programme suivant avec un if. class Exo8_6_2{ static void affichetable(int[] t){ int nb; Terminal.ecrireChar( + ); nb = t[i]; if (nb <= 0){ NFA031 c CNAM 2012 7

while (nb!= 0){ nb = nb / 10; Terminal.ecrireString("-+"); Terminal.ecrireChar( ); Terminal.ecrireString(" " + t[i] + " "); Terminal.ecrireChar( + ); nb = t[i]; if (nb <= 0){ while (nb!= 0){ nb = nb / 10; Terminal.ecrireString("-+"); int[] ex = {1,5,8,9,7; int[] ex2 = {12, 5, -67, 8, 123, 0, -12; affichetable(ex); affichetable(ex2); 8 NFA031 c CNAM 2012