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 :

Tableau Tableau

  1. L’indice commence par 0 (zéro)

  2. La boucle for est largement utilisée pour traiter les tableaux.

  3. 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

  1. Copier les fonctions écrites en C dans l’espace entre class Methode1 et l’en-tête de la méthode main

  2. Copier le corps de int main du C (sauf return 0 ;) dans la méthode main

  3. 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.

  1. 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.


*/