SlideShare une entreprise Scribd logo
1  sur  11
Télécharger pour lire hors ligne
TD 1: C++,
NOUVELLES
POSSIBILITÉS
OBJECTIFS :
Découvrir les nouvelles possibilités apportées par le
langage C++ par rapport au langage C qui ne sont pas
véritablement liée à la Programmation Orientée Objet.
Exercice N°1
Écrire le programme suivant (correct en C comme en C++), en ne faisant appel qu'aux nouvelles possibilités du
langage C++ :
#include <stdio.h>
#include <malloc.h>
#define NbrValeurs 25
int main()
{
float *Valeurs, Somme=0.0;
int i;
/*réservation d’un espace mémoire pour les valeurs*/
Valeurs=(float *)malloc(sizeof(float)*NbrValeurs);
for(i=0;i<NbrValeurs;i++)
{
printf("donner la moyenne N°%dn”,i);
scanf("%f",&Valeurs[i]);
Somme= Somme + Valeurs[i];
}
printf("La somme de ces %d réels=%f", NbrValeurs,
Somme);
free(Valeurs);
return 0 ;
}
Correction
include <iostream>
using namespace std;
const int NbrValeurs =25;
int main()
{
float *Valeurs, Somme=0.0;
//réservation d’un espace mémoire pour les valeurs
Valeurs= new float[NbrValeurs];
for(int i=0;i<NbrValeurs;i++)
{
cout<<"donner la moyenne N°"<<i<<endl; cin>>Valeurs[i];
Somme= Somme + Valeurs[i];
}
cout<<"La somme de ces"<<NbrValeurs<<" réels="<<Somme;
delete []Valeurs;
return 0;
}
Exercice N°2
Soient les déclarations (C++) suivantes :
int fct (int) ; // fonction 1
int fct (float) ; // fonction 2
void fct (int, float) ; // fonction 3
void fct (float, int) ; // fonction 4
int n, p ;
float x, y ;
char c ;
double z ;
Les appels suivants sont-ils corrects et, si oui, quelles seront
les fonctions effectivement appelées et les conversions
éventuellement mises en place ?
a) fct (n) ;
b) fct (n, x) ;
c) fct (x) ;
d) fct (x, n) ;
e) fct (c) ;
f) fct (n, p) ;
g) fct (n, c) ;
h) fct (n, z) ;
i) fct (z, z) ;
Correction
Appel Correct ? Prototype Appelé Conversion
a) fct (n) ; Oui Fonction1 Aucune
b) fct (n, x) ; Oui Fonction3 Aucune
c) fct (x) ; Oui Fonction2 Aucune
d) fct (x, n) ; Oui Fonction4 Aucune
e) fct (c) ; Oui Fonction1 Char->int
f) fct (n, p) ; Non (ambigüité : deux prototypes sont possibles avec le
même nombre de conversions)
g) fct (n, c) ; Non (ambigüité : deux prototypes sont
possibles avec le même nombre de conversions)
h) fct (n, z) ; Oui Fonction3 Double->float
i) fct (z, z) ; Non (ambigüité : deux prototypes sont possibles avec le
même nombre de conversions)
Exercice N°3
• Remplir le tableau suivant en indiquant si chacun de ces appels est
correct ou non pour les prototypes 1, 2, 3, 4.
Soient les prototypes de fonctions suivants :
•void f (int x) ;
•void f (int &x) ;
•void f (const int & x) ;
•void f (int *x) ;
et soient les déclarations suivantes :
int n1(7) ;
int *n2=new int(9) ;
int &n3=*new int (13) ;
const int n4(18) ;
const int *n5=new int(15) ;
const int &n6=*new int(14) ;
Appel Prototype 1 Prototype 2 Prototype 3 Prototype 4
f(n1)
f(&n1)
f(n2)
f(*n2)
f(n3)
f(&n3)
f(n4)
f(&n4)
f(n5)
f(*n5)
f(n6)
f(&n6)
Correction
Soient les prototypes de fonctions suivants :
•void f (int x) ;
•void f (int &x) ;
•void f (const int & x) ;
• void f (int *x) ;
et soient les déclarations suivantes :
int n1(7) ;
int *n2=new int(9) ;
int &n3=*new int (13) ;
const int n4(18) ;
const int *n5=new int(15) ;
const int &n6=*new int(14) ;
Exercice N°4
• Soit le programme suivant :
int g1=1;
int g2=1;
int *ptr;
int *& f3(int x=1);
int *f1(int &x)
{x++;
return (&x);}
int &f2(int *&p)
{p=&g1;
(*p)++;
return *f3();}
int *& f3(int x)
{x++;
(*ptr)+=x;
return ptr;}
int main(){
1. ptr=&g2;
2. int &a=*ptr;
3. int *ptr1=f1(a);
4. (*ptr1)++;
5. int *&ptr2=f3(f2(ptr1));
6. (*ptr1)++;
7. (*ptr2)++;
return 0 ;}
Donner un tableau indiquant la valeur des variables g1, g2, ptr, ptr1, ptr2, et a après chacune des instructions numérotées
de 1 à 7.
Correction
g1 g2 ptr *ptr ptr1 *ptr1 ptr2 *ptr2 a
1 1 1 &g2 1 N.D N.D N.D N.D N.D
2 1 1 & g2 1 N.D N.D N.D N.D 1
3 1 2 & g2 2 & g2 2 N.D N.D 2
4 1 3 & g2 3 & g2 3 N.D N.D 3
5 2 11 & g2 11 &g1 2 & g2 11 11
6 3 11 & g2 11 & g1 3 & g2 11 11
7
3 12 & g2 12 & g1 3 & g2 12 12
Exercice N°5
Soit le programme suivant :
int g1=0;
int g2=0;
int *ptr;
int *& f4(int x=0);
int f1(int *p)
{ p=&g2;
(*p)++;
return (*p);}
int &f2(int *&p)
{ p=&g2;
(*p)++;
return *f4();}
int *f3(int &x)
{ x++;
return (&x);}
int *& f4(int x){
x++;
(*ptr)+=x;
return ptr;}
int main(){
1. ptr=&g1;
2. int &a=*ptr;
3. int *ptr1=f3(a);
4. (*ptr1)++;
5. int *&ptr2=f4(f2(ptr1));
6. (*ptr1)++;
7. (*ptr2)++;
8. a+=f1(ptr2);
9. (*ptr2)++ ;
return 0 ;}
Donner la valeur des variables g1, g2, ptr, ptr1, ptr2, et a après les instructions numérotées de 1 à 9.
Correction
g1 g2 ptr *ptr ptr1 *ptr1 ptr2 *ptr2 a
1 0 0 &g1 0 N.D N.D N.D N.D N.D
2 0 0 &g1 0 N.D N.D N.D N.D 0
3 1 0 &g1 1 &g1 1 N.D N.D 1
4 2 0 &g1 2 &g1 2 N.D N.D 2
5 7 1 &g1 7 &g2 1 &g1 7 7
6 7 2 &g1 7 &g2 2 &g1 7 7
7 8 2 &g1 8 &g2 2 &g1 8 8
8 11 3 &g1 11 &g2 3 &g1 11 11
9 12 3 &g1 12 &g2 3 &g1 12 12

Contenu connexe

Tendances

Chapitre 3 _Conception et analyse d’algorithme-DPR.pdf
Chapitre 3 _Conception et analyse d’algorithme-DPR.pdfChapitre 3 _Conception et analyse d’algorithme-DPR.pdf
Chapitre 3 _Conception et analyse d’algorithme-DPR.pdf
MbarkiIsraa
 
Chapitre 2 -Complexité des problèmes avec correction.pdf
Chapitre 2 -Complexité des problèmes avec correction.pdfChapitre 2 -Complexité des problèmes avec correction.pdf
Chapitre 2 -Complexité des problèmes avec correction.pdf
MbarkiIsraa
 
Seance 3- Programmation en langage C
Seance 3- Programmation en langage C Seance 3- Programmation en langage C
Seance 3- Programmation en langage C
Fahad Golra
 
(GLII-Spécification, vérification et qualité-chapitres 1 et 2-2013-2014.pdf
(GLII-Spécification, vérification et qualité-chapitres 1 et 2-2013-2014.pdf(GLII-Spécification, vérification et qualité-chapitres 1 et 2-2013-2014.pdf
(GLII-Spécification, vérification et qualité-chapitres 1 et 2-2013-2014.pdf
MbarkiIsraa
 
Devoirs Algorithme + correction pour 4 si
Devoirs Algorithme + correction pour 4 siDevoirs Algorithme + correction pour 4 si
Devoirs Algorithme + correction pour 4 si
Narûtö Bàl'Sèm
 

Tendances (20)

Chapitre 3 _Conception et analyse d’algorithme-DPR.pdf
Chapitre 3 _Conception et analyse d’algorithme-DPR.pdfChapitre 3 _Conception et analyse d’algorithme-DPR.pdf
Chapitre 3 _Conception et analyse d’algorithme-DPR.pdf
 
Scikit learn: apprentissage statistique en Python
Scikit learn: apprentissage statistique en PythonScikit learn: apprentissage statistique en Python
Scikit learn: apprentissage statistique en Python
 
Formulaire derivees
Formulaire deriveesFormulaire derivees
Formulaire derivees
 
[1312.5602] Playing Atari with Deep Reinforcement Learning
[1312.5602] Playing Atari with Deep Reinforcement Learning[1312.5602] Playing Atari with Deep Reinforcement Learning
[1312.5602] Playing Atari with Deep Reinforcement Learning
 
Chapitre5: Classes et objets
Chapitre5: Classes et objetsChapitre5: Classes et objets
Chapitre5: Classes et objets
 
艾鍗學院單晶片韌體-I2C EEPROM 操作
艾鍗學院單晶片韌體-I2C EEPROM 操作艾鍗學院單晶片韌體-I2C EEPROM 操作
艾鍗學院單晶片韌體-I2C EEPROM 操作
 
Ppt introdutif start up week
Ppt introdutif start up weekPpt introdutif start up week
Ppt introdutif start up week
 
Exercices_Python_Fenni_2023 -corrigé.pdf
Exercices_Python_Fenni_2023 -corrigé.pdfExercices_Python_Fenni_2023 -corrigé.pdf
Exercices_Python_Fenni_2023 -corrigé.pdf
 
Exercices pascal tous les chapitres
Exercices pascal tous les chapitresExercices pascal tous les chapitres
Exercices pascal tous les chapitres
 
Chapitre4: Pointeurs et références
Chapitre4: Pointeurs et références Chapitre4: Pointeurs et références
Chapitre4: Pointeurs et références
 
Chapitre 2 -Complexité des problèmes avec correction.pdf
Chapitre 2 -Complexité des problèmes avec correction.pdfChapitre 2 -Complexité des problèmes avec correction.pdf
Chapitre 2 -Complexité des problèmes avec correction.pdf
 
Seance 3- Programmation en langage C
Seance 3- Programmation en langage C Seance 3- Programmation en langage C
Seance 3- Programmation en langage C
 
Résumé Algorithme et Programmation
Résumé Algorithme et ProgrammationRésumé Algorithme et Programmation
Résumé Algorithme et Programmation
 
Exercices corriges nombres_complexes
Exercices corriges nombres_complexesExercices corriges nombres_complexes
Exercices corriges nombres_complexes
 
Programmation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationProgrammation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulation
 
(GLII-Spécification, vérification et qualité-chapitres 1 et 2-2013-2014.pdf
(GLII-Spécification, vérification et qualité-chapitres 1 et 2-2013-2014.pdf(GLII-Spécification, vérification et qualité-chapitres 1 et 2-2013-2014.pdf
(GLII-Spécification, vérification et qualité-chapitres 1 et 2-2013-2014.pdf
 
Devoirs Algorithme + correction pour 4 si
Devoirs Algorithme + correction pour 4 siDevoirs Algorithme + correction pour 4 si
Devoirs Algorithme + correction pour 4 si
 
5.4 Arbres et forêts aléatoires
5.4 Arbres et forêts aléatoires5.4 Arbres et forêts aléatoires
5.4 Arbres et forêts aléatoires
 
expression lambda
expression lambdaexpression lambda
expression lambda
 
Contribution du capital intellectuel à la réussite de la communication des va...
Contribution du capital intellectuel à la réussite de la communication des va...Contribution du capital intellectuel à la réussite de la communication des va...
Contribution du capital intellectuel à la réussite de la communication des va...
 

Similaire à Correction-TD1.pdf

Exercices en langage c
Exercices en langage cExercices en langage c
Exercices en langage c
Daoua Lotfi
 
Ch8 correction exercices (1)
Ch8 correction exercices (1)Ch8 correction exercices (1)
Ch8 correction exercices (1)
abdellah12
 
Exercicescorrigesdivers
ExercicescorrigesdiversExercicescorrigesdivers
Exercicescorrigesdivers
Karim Amane
 

Similaire à Correction-TD1.pdf (20)

Cours de C++ / Tronc commun deuxième année ISIMA
Cours de C++ / Tronc commun deuxième année ISIMACours de C++ / Tronc commun deuxième année ISIMA
Cours de C++ / Tronc commun deuxième année ISIMA
 
Série sous programmes (bac scientifique)
Série sous programmes (bac scientifique)Série sous programmes (bac scientifique)
Série sous programmes (bac scientifique)
 
02 Spécificité du C++ COURS SYS SYSSSSSS
02 Spécificité du C++  COURS SYS SYSSSSSS02 Spécificité du C++  COURS SYS SYSSSSSS
02 Spécificité du C++ COURS SYS SYSSSSSS
 
C4 fonctions
C4 fonctionsC4 fonctions
C4 fonctions
 
C++11 en 12 exemples simples
C++11 en 12 exemples simplesC++11 en 12 exemples simples
C++11 en 12 exemples simples
 
Récursivité
RécursivitéRécursivité
Récursivité
 
Cours structures des données (langage c)
Cours structures des données (langage c)Cours structures des données (langage c)
Cours structures des données (langage c)
 
cours algorithme
cours algorithmecours algorithme
cours algorithme
 
C++11
C++11C++11
C++11
 
Exercices en langage c
Exercices en langage cExercices en langage c
Exercices en langage c
 
Ch8 correction exercices (1)
Ch8 correction exercices (1)Ch8 correction exercices (1)
Ch8 correction exercices (1)
 
condition et boucle (2).pptx
condition et boucle  (2).pptxcondition et boucle  (2).pptx
condition et boucle (2).pptx
 
C1 - Langage C - ISIMA - Première partie
C1 - Langage C - ISIMA - Première partieC1 - Langage C - ISIMA - Première partie
C1 - Langage C - ISIMA - Première partie
 
Les nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneLes nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ Moderne
 
TableauxDynamiques.pdf
TableauxDynamiques.pdfTableauxDynamiques.pdf
TableauxDynamiques.pdf
 
TableauxDynamiques.pdf
TableauxDynamiques.pdfTableauxDynamiques.pdf
TableauxDynamiques.pdf
 
Formation Langage c.pptx
Formation Langage c.pptxFormation Langage c.pptx
Formation Langage c.pptx
 
eExercices corrigesdivers
eExercices corrigesdiverseExercices corrigesdivers
eExercices corrigesdivers
 
Exercicescorrigesdivers
ExercicescorrigesdiversExercicescorrigesdivers
Exercicescorrigesdivers
 
Chapitre 04 : les fonctions
Chapitre 04 : les fonctionsChapitre 04 : les fonctions
Chapitre 04 : les fonctions
 

Plus de MbarkiIsraa (16)

NP-complet.ppt
NP-complet.pptNP-complet.ppt
NP-complet.ppt
 
Format.pptx
Format.pptxFormat.pptx
Format.pptx
 
correctionTD2JAVA.pdf
correctionTD2JAVA.pdfcorrectionTD2JAVA.pdf
correctionTD2JAVA.pdf
 
correctionTD-1-vhdl2947.pptx
correctionTD-1-vhdl2947.pptxcorrectionTD-1-vhdl2947.pptx
correctionTD-1-vhdl2947.pptx
 
PCD YasBas.pptx
PCD YasBas.pptxPCD YasBas.pptx
PCD YasBas.pptx
 
PLNE.pptx
PLNE.pptxPLNE.pptx
PLNE.pptx
 
Chapitre3_Partie1.pdf
Chapitre3_Partie1.pdfChapitre3_Partie1.pdf
Chapitre3_Partie1.pdf
 
Chapitre2_Partie1.pdf
Chapitre2_Partie1.pdfChapitre2_Partie1.pdf
Chapitre2_Partie1.pdf
 
support_cours.pdf
support_cours.pdfsupport_cours.pdf
support_cours.pdf
 
c h02EspaceProbTr.pdf
c h02EspaceProbTr.pdfc h02EspaceProbTr.pdf
c h02EspaceProbTr.pdf
 
Ordonnanc-Proc_Threads (1).pdf
Ordonnanc-Proc_Threads (1).pdfOrdonnanc-Proc_Threads (1).pdf
Ordonnanc-Proc_Threads (1).pdf
 
prog_reg.pptx
prog_reg.pptxprog_reg.pptx
prog_reg.pptx
 
correctionTD-2-vhdl2949.pptx
correctionTD-2-vhdl2949.pptxcorrectionTD-2-vhdl2949.pptx
correctionTD-2-vhdl2949.pptx
 
Complexité_ENSI_2011.ppt
Complexité_ENSI_2011.pptComplexité_ENSI_2011.ppt
Complexité_ENSI_2011.ppt
 
DiagrammeSequence&DiagrammaEtatTransition&DiagrammeActivité.pdf
DiagrammeSequence&DiagrammaEtatTransition&DiagrammeActivité.pdfDiagrammeSequence&DiagrammaEtatTransition&DiagrammeActivité.pdf
DiagrammeSequence&DiagrammaEtatTransition&DiagrammeActivité.pdf
 
UML.Objet.4pp.pdf
UML.Objet.4pp.pdfUML.Objet.4pp.pdf
UML.Objet.4pp.pdf
 

Correction-TD1.pdf

  • 1. TD 1: C++, NOUVELLES POSSIBILITÉS OBJECTIFS : Découvrir les nouvelles possibilités apportées par le langage C++ par rapport au langage C qui ne sont pas véritablement liée à la Programmation Orientée Objet.
  • 2. Exercice N°1 Écrire le programme suivant (correct en C comme en C++), en ne faisant appel qu'aux nouvelles possibilités du langage C++ : #include <stdio.h> #include <malloc.h> #define NbrValeurs 25 int main() { float *Valeurs, Somme=0.0; int i; /*réservation d’un espace mémoire pour les valeurs*/ Valeurs=(float *)malloc(sizeof(float)*NbrValeurs); for(i=0;i<NbrValeurs;i++) { printf("donner la moyenne N°%dn”,i); scanf("%f",&Valeurs[i]); Somme= Somme + Valeurs[i]; } printf("La somme de ces %d réels=%f", NbrValeurs, Somme); free(Valeurs); return 0 ; }
  • 3. Correction include <iostream> using namespace std; const int NbrValeurs =25; int main() { float *Valeurs, Somme=0.0; //réservation d’un espace mémoire pour les valeurs Valeurs= new float[NbrValeurs]; for(int i=0;i<NbrValeurs;i++) { cout<<"donner la moyenne N°"<<i<<endl; cin>>Valeurs[i]; Somme= Somme + Valeurs[i]; } cout<<"La somme de ces"<<NbrValeurs<<" réels="<<Somme; delete []Valeurs; return 0; }
  • 4. Exercice N°2 Soient les déclarations (C++) suivantes : int fct (int) ; // fonction 1 int fct (float) ; // fonction 2 void fct (int, float) ; // fonction 3 void fct (float, int) ; // fonction 4 int n, p ; float x, y ; char c ; double z ; Les appels suivants sont-ils corrects et, si oui, quelles seront les fonctions effectivement appelées et les conversions éventuellement mises en place ? a) fct (n) ; b) fct (n, x) ; c) fct (x) ; d) fct (x, n) ; e) fct (c) ; f) fct (n, p) ; g) fct (n, c) ; h) fct (n, z) ; i) fct (z, z) ;
  • 5. Correction Appel Correct ? Prototype Appelé Conversion a) fct (n) ; Oui Fonction1 Aucune b) fct (n, x) ; Oui Fonction3 Aucune c) fct (x) ; Oui Fonction2 Aucune d) fct (x, n) ; Oui Fonction4 Aucune e) fct (c) ; Oui Fonction1 Char->int f) fct (n, p) ; Non (ambigüité : deux prototypes sont possibles avec le même nombre de conversions) g) fct (n, c) ; Non (ambigüité : deux prototypes sont possibles avec le même nombre de conversions) h) fct (n, z) ; Oui Fonction3 Double->float i) fct (z, z) ; Non (ambigüité : deux prototypes sont possibles avec le même nombre de conversions)
  • 6. Exercice N°3 • Remplir le tableau suivant en indiquant si chacun de ces appels est correct ou non pour les prototypes 1, 2, 3, 4. Soient les prototypes de fonctions suivants : •void f (int x) ; •void f (int &x) ; •void f (const int & x) ; •void f (int *x) ; et soient les déclarations suivantes : int n1(7) ; int *n2=new int(9) ; int &n3=*new int (13) ; const int n4(18) ; const int *n5=new int(15) ; const int &n6=*new int(14) ; Appel Prototype 1 Prototype 2 Prototype 3 Prototype 4 f(n1) f(&n1) f(n2) f(*n2) f(n3) f(&n3) f(n4) f(&n4) f(n5) f(*n5) f(n6) f(&n6)
  • 7. Correction Soient les prototypes de fonctions suivants : •void f (int x) ; •void f (int &x) ; •void f (const int & x) ; • void f (int *x) ; et soient les déclarations suivantes : int n1(7) ; int *n2=new int(9) ; int &n3=*new int (13) ; const int n4(18) ; const int *n5=new int(15) ; const int &n6=*new int(14) ;
  • 8. Exercice N°4 • Soit le programme suivant : int g1=1; int g2=1; int *ptr; int *& f3(int x=1); int *f1(int &x) {x++; return (&x);} int &f2(int *&p) {p=&g1; (*p)++; return *f3();} int *& f3(int x) {x++; (*ptr)+=x; return ptr;} int main(){ 1. ptr=&g2; 2. int &a=*ptr; 3. int *ptr1=f1(a); 4. (*ptr1)++; 5. int *&ptr2=f3(f2(ptr1)); 6. (*ptr1)++; 7. (*ptr2)++; return 0 ;} Donner un tableau indiquant la valeur des variables g1, g2, ptr, ptr1, ptr2, et a après chacune des instructions numérotées de 1 à 7.
  • 9. Correction g1 g2 ptr *ptr ptr1 *ptr1 ptr2 *ptr2 a 1 1 1 &g2 1 N.D N.D N.D N.D N.D 2 1 1 & g2 1 N.D N.D N.D N.D 1 3 1 2 & g2 2 & g2 2 N.D N.D 2 4 1 3 & g2 3 & g2 3 N.D N.D 3 5 2 11 & g2 11 &g1 2 & g2 11 11 6 3 11 & g2 11 & g1 3 & g2 11 11 7 3 12 & g2 12 & g1 3 & g2 12 12
  • 10. Exercice N°5 Soit le programme suivant : int g1=0; int g2=0; int *ptr; int *& f4(int x=0); int f1(int *p) { p=&g2; (*p)++; return (*p);} int &f2(int *&p) { p=&g2; (*p)++; return *f4();} int *f3(int &x) { x++; return (&x);} int *& f4(int x){ x++; (*ptr)+=x; return ptr;} int main(){ 1. ptr=&g1; 2. int &a=*ptr; 3. int *ptr1=f3(a); 4. (*ptr1)++; 5. int *&ptr2=f4(f2(ptr1)); 6. (*ptr1)++; 7. (*ptr2)++; 8. a+=f1(ptr2); 9. (*ptr2)++ ; return 0 ;} Donner la valeur des variables g1, g2, ptr, ptr1, ptr2, et a après les instructions numérotées de 1 à 9.
  • 11. Correction g1 g2 ptr *ptr ptr1 *ptr1 ptr2 *ptr2 a 1 0 0 &g1 0 N.D N.D N.D N.D N.D 2 0 0 &g1 0 N.D N.D N.D N.D 0 3 1 0 &g1 1 &g1 1 N.D N.D 1 4 2 0 &g1 2 &g1 2 N.D N.D 2 5 7 1 &g1 7 &g2 1 &g1 7 7 6 7 2 &g1 7 &g2 2 &g1 7 7 7 8 2 &g1 8 &g2 2 &g1 8 8 8 11 3 &g1 11 &g2 3 &g1 11 11 9 12 3 &g1 12 &g2 3 &g1 12 12