8 - De C à Java
Tableau à un seul indice
Déclarer le tableau des tailles et initialiser les 8 premières valeurs :
double[] taille = { 1.76, 1.68, 1.89, 1.72, 1.54, 1.78, 1.34, 1.78 };
int nbPers = taille.length ; // vaut 8 ici
taille est un tableau de 8 éléments, chacun est une variable de type double.
On peut illustrer le tableau des tailles par le schéma suivant :
-
L’indice commence par 0 (zéro)
-
La boucle
for
est largement utilisée pour traiter les tableaux. -
Sur l’en-tête d’une fonction : une manière simple :
static void afficher( double[] taille, int nbPers)
etc . . .
Exemple : déterminer la taille la plus petite :
double plusPetiteTaille = Double.MAX_VALUE ;
for (int i = 0 ; i < taille.length ; i++)
if ( taille[i] < plusPetiteTaille)
plusPetiteTaille = taille[i];
Conversion d’un programme C en Java :
En classe, on a expliqué et tapé le programme Fonct5.c suivant :
/*
Fichier Fonct5.c
Auteurs Tremblay Julie IFT 1810 C Gr. 1
Choquette Alain IFT 1810 C Gr. 1
Ce programme permet de .... (voir exécution)
*/
#include <stdio.h>
float moyenne(float tab[], int nbElem)
{
float somme = 0.0;
int i ;
for(i = 0; i < nbElem; i++)
somme += tab[i];
return somme / nbElem;
}
int nombre(float tableau[], int nbElem, float borne)
{
int n = 0, i;
for(i = 0; i < nbElem; i++)
if (tableau[i] > borne)
n++;
return n;
}
int combien(char sexeVoulu, char sexe[], int nbPers)
{
int n = 0, i;
for(i = 0; i < nbPers; i++)
if (sexe[i] == sexeVoulu)
n++;
return n;
}
void afficher(float taille[], float poids[], char sexe[],
int nbPers)
{ int i;
printf("Contenu des 3 tableaux :\n\n");
printf("indice taille poids sexe\n");
for(i = 0; i < nbPers; i++)
printf("%3d %8.2f %7.1f %5c\n", i, taille[i],
poids[i], sexe[i]) ;
printf("\n\n") ;
}
int main()
{ const float BORNE1 = 1.75,
BORNE2 = 60.0;
float taille[] = {1.72, 1.86, 1.58, 1.76, 1.70},
poids[] = { 65.4, 76.1, 59.9, 73.4, 81.5};
char sexe[] = { 'F', 'M', 'F', 'F', 'M'} ;
int nbPers = sizeof(taille) / sizeof(float);
afficher(taille, poids, sexe, nbPers);
printf("Le nombre de personnes dont :\n");
printf(" - la taille depasse %.2f metre est %d\n",
BORNE1, nombre(taille, nbPers, BORNE1));
printf(" - le poids depasse %.2f kg est %d\n",
BORNE2, nombre(poids, nbPers, BORNE2));
printf("Le nombre de femmes : %d\n", combien('F', sexe, nbPers)) ;
printf("Le nb. d'hommes : %d\n", combien('M', sexe, nbPers));
printf("La taille moyen : %.2f metre\n",
moyenne(taille,nbPers)) ;
printf("Le poids moyen : %.1f kg\n",
moyenne(poids, nbPers));
return 0;
}
Execution :
Contenu des 3 tableaux :
indice taille poids sexe
0 1.72 65.4 F
1 1.86 76.1 M
2 1.58 59.9 F
3 1.76 73.4 F
4 1.70 81.5 M
Le nombre de personnes dont :
- la taille depasse 1.75 metre est 2
- le poids depasse 60.00 kg est 4
Le nombre de femmes : 3
Le nb. d'hommes : 2
--------------------------------
Process exited after 0.02253 seconds with return value 0
Appuyez sur une touche pour continuer...
Faites toutes les étapes pour convertir ce programme en Java.
Solution : démontrée en classe
Quelques étapes :
À partir d’un programme quasi-vide en Java nommé, par exemple, Methode5.java
-
Copier les fonctions écrites en C dans l’espace entre class Methode1 et l’en-tête de la méthode main
-
Copier le corps de int main du C (sauf return 0 ;) dans la méthode main
-
Avec les options
Edit
,Find and Repace
,Replace
Remplacez tous :
a) printf
par System.out.printf
b) const
par final
c) float
par double
d) tableau[]
par [] tableau
etc …
Enlevez les déclarations locales int i ;
mettez for(int i = 0 ;
etc …
Ajoutez la clause static
devant les en-têtes des méthodes.
- Jetez un coup d’œil et finalisez l’adaptation
Ce processus sera démontré en classe.
Finalement, vous obtenez la version Java suivant :
public class Methode5 {
static double moyenne(double[] tab, int nbElem)
{
double somme = 0.0;
for(int i = 0; i < nbElem; i++)
somme += tab[i];
return somme / nbElem;
}
static int nombre(double[] tableau, int nbElem, double borne)
{
int n = 0;
for(int i = 0; i < nbElem; i++)
if (tableau[i] > borne)
n++;
return n;
}
static int combien(char sexeVoulu, char [] sexe, int nbPers)
{
int n = 0;
for(int i = 0; i < nbPers; i++)
if (sexe[i] == sexeVoulu)
n++;
return n;
}
static void afficher(double [] taille, double[] poids, char [] sexe,
int nbPers)
{
System.out.printf("Contenu des 3 tableaux :\n\n");
System.out.printf("indice taille poids sexe\n");
for(int i = 0; i < nbPers; i++)
System.out.printf("%3d %8.2f %7.1f %5c\n", i, taille[i],
poids[i], sexe[i]) ;
System.out.printf("\n\n") ;
}
public static void main(String[] args) {
final double BORNE1 = 1.75,
BORNE2 = 60.0;
double [] taille = {1.72, 1.86, 1.58, 1.76, 1.70},
poids = { 65.4, 76.1, 59.9, 73.4, 81.5};
char [] sexe = { 'F', 'M', 'F', 'F', 'M'} ;
int nbPers = taille.length;
afficher(taille, poids, sexe, nbPers);
System.out.printf("Le nombre de personnes dont :\n");
System.out.printf(" - la taille depasse %.2f metre est %d\n",
BORNE1, nombre(taille, nbPers, BORNE1));
System.out.printf(" - le poids depasse %.2f kg est %d\n",
BORNE2, nombre(poids, nbPers, BORNE2));
System.out.printf("Le nombre de femmes : %d\n",
combien('F', sexe, nbPers)) ;
System.out.printf("Le nb. d'hommes : %d\n",
combien('M', sexe, nbPers));
System.out.printf("La taille moyen : %.2f metre\n",
moyenne(taille,nbPers)) ;
System.out.printf("Le poids moyen : %.1f kg\n",
moyenne(poids, nbPers));
}
}
Exécution :
--------------------Configuration: <Default>--------------------
Contenu des 3 tableaux :
indice taille poids sexe
0 1,72 65,4 F
1 1,86 76,1 M
2 1,58 59,9 F
3 1,76 73,4 F
4 1,70 81,5 M
Le nombre de personnes dont :
- la taille depasse 1,75 metre est 2
- le poids depasse 60,00 kg est 4
Le nombre de femmes : 3
Le nb. d'hommes : 2
La taille moyen : 1,72 metre
Le poids moyen : 71,3 kg
Process completed.
Classe Integer
Integer.MAX_VALUE
: l’entier le plus grand
Integer.MIN_VALUE
: l’entier le plus petit
Integer.parseInt("1234")
retourne 1234
etc . . .
Double.MAX_VALUE
: le réel le plus grand
Double.MIN_VALUE
: le réel le plus petit
Etc . . .
Math.PI
valeur PI
de la classe Math
qui vaut 3.14159
.
Math.sqrt(16.0)
racine carrée de 16.0 est 4.0
(square root : racine carrée)
Etc . . .
Classe String
C’est une classe du langage Java. Elle offre plusieurs méthodes pertinentes pour manipuler des chaînes de caractères.
Soit la déclaration :
String nomPre = "Charbonneau Pascale",
codePerm = "CHAP17549403" ;// née le 17 avril 1994
(on ajoute 50 au mois de naissance pour une étudiante)
Notez les indices des caractères du code permanent :
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
C | H | A | P | 1 | 7 | 5 | 4 | 9 | 4 |
Pour IFT 1810, on se limite à ces méthodes suivantes :
-
codePerm.length()
retourne 12 (nombre de caractères) -
codePerm.charAt(0)
retourne le caractère ‘C’ ( le caractère à l’indice 0 ) -
codePerm.charAt(6)
retourne le caractère ‘5’ -
codePerm.substring(0, 4)
retourne “CHAP” (la sous-chaîne entre l’indice 0 inclus, l’indice 4 exclu) -
codePerm.substring(6, 8)
retourne “54” -
codePerm.substring(4)
retourne “17549403” (la sous-chaîne à partir de l’indice 4 jusqu’à la fin de la chaîne) -
codePerm.indexOf('C')
retourne 0 -
codePerm.indexOf('1')
retourne 4 -
codePerm.indexOf('4')
retourne 7 (malgré les deux 4) -
codePerm.indexOf('z')
retourne -1 (la lettre ‘z’ est introuvable) -
codePerm.indexOf("CHA")
retourne 0 -
codePerm.indexOf("94")
retourne 8 -
codePerm.indexOf("Bonjour")
retourne -1 -
nomPre.toUpperCase()
retourne “CHARBONNEAU PASCALE” -
nomPre.toLowerCase()
retourne “charbonneau pascale”
Exemple 1 : (voir l’exécution pour comprendre l’exemple. Attention au changement de ligne sous Word) :
/* Fichier Ex1String : exemple sur les chaînes de caractères
*
*/
public class Ex1String {
public static void main(String[] args) {
String codePermanent = "TREP23119006" ;
// Tremblay Pierre né le 23 novembre 1990
System.out.printf("Le marqueur pour indices:
012345678901234567890123456789\n");
System.out.printf("La chaîne telle quelle : %s\n",
codePermanent);
System.out.printf("La chaîne en MAJUSCULEs : %s\n",
codePermanent.toUpperCase());
System.out.printf("La chaîne en minuscules : %s\n",
codePermanent.toLowerCase());
System.out.printf("La longueur : %d caractères\n\n",
codePermanent.length());
System.out.printf("Le caractère à l'indice 3 : %c\n",
codePermanent.charAt(3));
System.out.printf("La sous-chaîne codePermanent.substring(0, 3)
vaut %s\n", codePermanent.substring(0, 3));
System.out.printf("La sous-chaîne codePermanent.substring(8)
vaut: %s\n", codePermanent.substring(8));
int anneeNaissance = 1900 +
Integer.parseInt( codePermanent.substring(8,10));
System.out.printf("L'année de naissance : %d\n",
anneeNaissance);
int k = codePermanent.indexOf('R');
System.out.printf("On trouve la lettre R à l'indice %d\n", k);
k = codePermanent.indexOf('Z');
if (k == -1)
System.out.printf("On ne trouve pas la lettre Z : indice
vaut %d\n", k);
k = codePermanent.indexOf("P2311");
if ( k >= 0)
System.out.printf("On trouve la sous-chaîne P2311 à l'indice
%d\n", k);
k = codePermanent.indexOf("777");
if (k == -1)
System.out.printf("On ne trouve pas la sous-chaîne 777 et
l'indice vaut %d\n", k);
} // fin de main
} // fin de Ex1String
/*
--------------------Configuration: <Default>--------------------
Le marqueur pour indices: 012345678901234567890123456789
La chaîne telle quelle : TREP23119006
La chaîne en MAJUSCULEs : TREP23119006
La chaîne en minuscules : trep23119006
La longueur : 12 caractères
Le caractère à l'indice 3 : P
La sous-chaîne codePermanent.substring(0, 3) vaut TRE
La sous-chaîne codePermanent.substring(8) vaut: 9006
L'année de naissance : 1990
On trouve la lettre R à l'indice 1
On ne trouve pas la lettre Z : indice vaut -1
On trouve la sous-chaîne P2311 à l'indice 3
On ne trouve pas la sous-chaîne 777 et l'indice vaut -1
Process completed.
*/
Exemple 2 : (voir l’exécution pour comprendre l’exemple. Attention au changement de ligne sous Word) :
/* Fichier Ex2String : exemple sur les chaînes de caractères
*/
public class Ex2String {
// méthode qui compte et retourne le nombre de voyelles
// dans une phrase déjà transformée en majuscules
static int nbVoy(String phrase)
{
int n = 0;
for(int i = 0; i < phrase.length();i++)
switch ( phrase.charAt(i))
{ case 'A' : case 'E' : case 'I' :
case 'O' : case 'U' : case 'Y' : n++;
}
return n;
}
// méthode qui compte et retourne le nombre de voyelles
// dans une phrase : une autre manière de travail
static int nb2Voy(String phrase)
{
int n = 0;
String voyelles = "AaEeIiOoUuYy";
for(int i = 0; i < phrase.length();i++)
if ( voyelles.indexOf( phrase.charAt(i)) >= 0)
n++;
return n;
}
public static void main(String[] args) {
String ch = "Bonjour tout le monde!";
System.out.printf("Le marqueur pour indices:
012345678901234567890123456789\n");
System.out.printf("La chaîne telle quelle : %s\n", ch);
System.out.printf("La chaîne en MAJUSCULEs : %s\n",
ch.toUpperCase());
System.out.printf("La chaîne en minuscules : %s\n",
ch.toLowerCase());
System.out.printf("La longueur : %d caractères\n\n",
ch.length());
System.out.printf("Le caractère à l'indice 3 : %c\n",
ch.charAt(3));
System.out.printf("La sous-chaîne ch.substring(0, 3) vaut %s\n",
ch.substring(0, 3));
System.out.printf("La sous-chaîne ch.substring(8) vaut: %s\n",
ch.substring(8));
System.out.printf("Le nombre de voyelles : %d\n",
nbVoy(ch.toUpperCase()));
System.out.printf("Le nombre de voyelles (solution 2): %d\n\n",
nb2Voy(ch));
System.out.printf("La recherche d'un caractère dans la chaîne :
%d\n", ch.indexOf('j'));
System.out.printf("La recherche d'un caractère dans la chaîne :
%d\n\n", ch.indexOf('w'));
System.out.printf("La recherche de la sous chaîne mon: %d\n",
ch.indexOf("mon"));
System.out.printf("La recherche de tremblay: %d\n\n",
ch.indexOf("tremblay"));
}
}
/*
-------------------Configuration: <Default>--------------------
Le marqueur pour indices: 012345678901234567890123456789
La chaîne telle quelle : Bonjour tout le monde!
La chaîne en MAJUSCULEs : BONJOUR TOUT LE MONDE!
La chaîne en minuscules : bonjour tout le monde!
La longueur : 22 caractères
Le caractère à l'indice 3 : j
La sous-chaîne ch.substring(0, 3) vaut Bon
La sous-chaîne ch.substring(8) vaut: tout le monde!
Le nombre de voyelles : 8
Le nombre de voyelles (solution 2): 8
La recherche d'un caractère dans la chaîne : 3
La recherche d'un caractère dans la chaîne : -1
La recherche de mon: 16
La recherche de tremblay: -1
Process completed.
*/
Exemple 3 : (voir l’exécution pour comprendre l’exemple. Attention au changement de ligne sous Word) :
public class Ex3String {
// affichier EXPLICITEMENT le nom du mois de naissance
static void afficherMois(String leMois)
{
String[] mois = { "Janvier", "Fevrier", "Mars", "Avril",
"Mai", "Juin", "Juillet", "Aout",
"Septembre", "Octobre", "Novembre", "Decembre" };
int rangMois = Integer.parseInt(leMois) % 50 -1;
System.out.printf("Né(e) au mois de %s\n", mois[rangMois]);
}
public static void main(String[] args) {
String nomPre = "Leblanc Nicole",
codePerm = "LEBN27539005"; // code permanent
System.out.printf("Nom et prenom :\n");
System.out.printf(" - tel quel :%s\n", nomPre);
System.out.printf(" - en majuscules :%s\n", nomPre.toUpperCase());
System.out.printf(" - en minuscules :%s\n\n", nomPre.toLowerCase());
// Integer.parseInt("75"), par exemple, return 75
int anneeNais = 1900 + Integer.parseInt( codePerm.substring(8, 10));
System.out.printf("L'annee de naissance : %d\n", anneeNais);
// opérateur conditionnel
String sexe = codePerm.charAt(6) >= '5' ? "feminin" : "masculin";
System.out.printf("Le sexe %s\n", sexe);
afficherMois(codePerm.substring(6,8));
}
}
/* Compilation et Exécution:
--------------------Configuration: <Default>--------------------
Nom et prenom :
- tel quel :Leblanc Nicole
- en majuscules :LEBLANC NICOLE
- en minuscules :leblanc nicole
L'annee de naissance : 1990
Le sexe feminin
Né(e) au mois de Mars
Process completed.
*/
Exemple 4 : (voir l’exécution pour comprendre l’exemple. Attention au changement de ligne sous Word) :
/* Fichier Telephone.java
* expliqué en classe
*
* Utile pour le numéro C du TP3 et pour une question au final
*/
public class Telephone {
// Cette fonction affiche les chiffres impairs dans un numéro de tél.
static void afficherImpairs(String telephone, String nom)
{
System.out.printf("Les chiffres impairs dans %10s : ",nom);
for(char c = '1' ; c <= '9'; c+=2)
if (telephone.indexOf(c) >= 0)
System.out.printf("%c ", c);
System.out.printf("\n");
}
static char maxi(String telephone)
{
char plusGrandChif = '0' ;
for(int i = 0; i < telephone.length(); i++)
if (telephone.charAt(i) > plusGrandChif)
plusGrandChif = telephone.charAt(i);
return plusGrandChif;
}
public static void main(String[] args) {
String telUDM = "5143436111", telJean = "4501234567";
afficherImpairs(telUDM, "telUDM");
afficherImpairs(telJean, "telJean");
System.out.printf("Le chiffre le plus grand dans le numero %s
est %c\n", telUDM, maxi(telUDM));
System.out.printf("Le chiffre le plus grand dans le numero %s
est %c\n", telJean, maxi(telJean));
//System.out.printf("Bienvenue au Java et à la POO\n");
}
}
/* Exécution :
--------------------Configuration: <Default>--------------------
Les chiffres impairs dans telUDM : 1 3 5
Les chiffres impairs dans telJean : 1 3 5 7
Le chiffre le plus grand dans le numero 5143436111 est 6
Le chiffre le plus grand dans le numero 4501234567 est 7
Process completed.
*/