Está en la página 1de 8

Interrogation théorique C++ (NVS, SMB) - janvier 2007 – page 1

Graduats en informatique
Deuxième année Année 2006-2007
Informatique de Gestion – Informatique & systèmes 11 janvier 2007

INTERROGATION THÉORIQUE DE LANGAGE C++

DIRECTIVES :
 Le compilateur de référence est le compilateur C++ Ansi de Borland C++Builder5
 Les copies seront remises au plus tôt à 9H et au plus tard à 10H30.
 Ne dégrafez pas les feuilles SVP. Si vous avez une question à poser, faites-le par écrit sur la feuille de couleur.
 Répondez sur les feuilles en annexe de manière complète, lisible, compréhensible, et sans ambiguïté.

QUESTION 1 (50 points)


Analyser chaque code ci-dessous. Pour chacun d'entre eux, s'il y a erreur de compilation, dites où
(quelle ligne) et pourquoi; sinon, s'il y a erreur à l'exécution dites où et pourquoi. Quand c'est
possible, donnez la ou les valeurs affichées à l'exécution. Chaque code vaut 2 points.

REPONDEZ SUR LE DOCUMENT SPECIAL

NB: Il n'y a pas d'erreur de type point-virgule manquant, accolade manquante ou superflue, faute
d'orthographe dans les identificateurs, espacement fautif, ...

Code 1
01 #include <iostream.h>
02 class Test {
03 int value ;
04 public :
05 Test ( int v ) : value(v) { }
06 Test ( const Test & v ) : value (v.value) { }
07 int get() { return value; }
08 };
09 int main ()
10 {
11 Test a(9);
12 Test b(a) ;
13 cout<< b.get() <<endl;
14 return 0;
15 }
Code 2
01 #include <iostream.h>
02 int main()
03 {
04 float tabF[] = { 1.2 , 2.3 , 3.4 , 4.5 , 5.6 , 6.7 };
05 float * ptrF = tabF , res;
06 ptrF += sizeof(float) ;
07 res = *ptrF;
08 cout << res << endl;
09 return 0;
10 }
Code 3
01 #include <iostream.h>
02 int main ()
03 {
04 const int val = 5;
05 int * ptrInt = &val;
06 *ptrInt = 7 ;
07 cout<< val <<endl;
08 return 0;
09 }
Interrogation théorique C++ (NVS, SMB) - janvier 2007 – page 2

Code 4
01 #include<iostream.h>
02 class Ex {
03 private :
04 int val;
05 public :
06 Ex ( int s ) { val = s ; }
07 int get() { return val; }
08 Ex ( const Ex & s ) { val = s.val; }
09 };
10 int main ()
11 {
12 Ex un(10);
13 Ex deux;
14 cout<< deux.get() + un.get() <<endl;
15 return 0;
16 }
Code 5
01 #include <iostream.h>
02 class Classe {
03 public :
04 Classe ( int v=5 ) : val(v) {}
05 int getVal() { return val; }
06 private :
07 int val;
08 };
09 int main()
10 {
11 Classe objet();
12 int i = objet.getVal();
13 cout << i << endl;
14 return 0;
15 }
Code 6
01 #include <iostream.h>
02 int main()
03 {
04 int tab[] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 };
05 char * ptrChar = (char *)&tab[0];
06 ptrChar = ptrChar + sizeof(int);
07 cout << *(int *)ptrChar << endl;
08 return 0;
09 }
Code 7
01 #include <iostream.h>
02 int main()
03 {
04 int val = 7;
05 int & ref = val;
06 val++;
07 cout << ref << endl;
08 return 0;
09 }
Code 8
01 #include <iostream.h>
02 int main()
03 {
04 double * const p ;
05 double d = 3 ;
06 p = &d ;
07 cout << ++(*p) << endl ;
08 return 0 ;
09 }
Interrogation théorique C++ (NVS, SMB) - janvier 2007 – page 3

Code 9
01 #include <iostream.h>
02 #include <string.h>
03 int main ()
04 {
05 char str[] = "A+B-C/D*E";
06 char * t = strtok(str,"+");
07 t = strtok(str,"-");
08 cout << t << endl;
09 return 0;
10 }
Code 10
01 #include <iostream.h>
02 int & minOf ( int a , int b )
03 {
04 if ( a < b )
05 return a;
06 else
07 return b;
08 }
09 int main()
10 {
11 int x = 9, y = 6, z;
12 z = minOf(x,y);
13 cout << z << endl;
14 return 0;
15 }
Code 11
01 #include <iostream.h>
02 int parDefaut ( int a, int b, int c=5 );
03 int main()
04 {
05 int res = parDefaut(1);
06 cout << res << endl;
07 return 0;
08 }
09 int parDefaut ( int x, int y, int z )
10 { return x+y+z ; }
Code 12
01 #include <iostream.h>
02 int main(int x, char** y)
03 {
04 int val = 8;
05 int * ptrInt = &val;
06 int & ref = *ptrInt;
07 val--;
08 cout << ref << endl;
09 return 0;
10 }
Code 13
01 #include <iostream.h>
02 float & brol ( float & f )
03 {
04 f *= 2 ;
05 return f ;
06 }
07 int main()
08 {
09 float x = 12.5 ;
10 cout << x << " " ;
11 cout << brol(x) << " " ;
12 cout << x << endl ;
13 return 0 ;
14 }
Interrogation théorique C++ (NVS, SMB) - janvier 2007 – page 4
Code 14
01 #include <iostream.h>
02 class P
03 {
04 int * tab;
05 unsigned size;
06 public :
07 P ( unsigned nb )
08 {
09 if ( nb == 0 ) nb = 1;
10 int * tab = new int[nb];
11 size = nb;
12 for ( nb=0; nb<size; nb++ ) tab[nb]=0;
13 }
14 void putAt(unsigned i, int val) { tab[i]=val; }
15 int getAt(unsigned i) { return tab[i]; }
16 };
17 int main()
18 {
19 P test(10);
20 test.putAt(5,-9);
21 cout << test.getAt(5) << endl;
22 return 0;
23 }
Code 15
01 #include <iostream.h>
02 int main()
03 {
04 const double * p ;
05 double d = 3 ;
06 p = &d ;
07 cout << ++(*p) << endl ;
08 return 0 ;
09 }
Code 16
01 #include <iostream.h>
02 int main()
03 {
04 double * p ;
05 double d = 3 ;
06 p = &d ;
07 cout << ++(*p) << endl ;
08 return 0 ;
09 }
Code 17
01 #include <iostream.h>
02 struct Truc
03 {
04 unsigned short us ;
05 public :
06 Truc( unsigned short i = 3 ) : us(i) { }
07 unsigned short get() { return us; }
08 } ;
09 int main()
10 {
11 Truc * t = new Truc() ;
12 cout << t.get() + t.us << endl ;
13 return 0 ;
14 }
Interrogation théorique C++ (NVS, SMB) - janvier 2007 – page 5

Code 18
01 #include <iostream.h>
02 void affiche ( const char * ctrl )
03 {
04 char * str = "012345" ;
05 int i = 0 ;
06 while (*ctrl != '\0')
07 {
08 cout << str + i << endl ;
09 ++i ;
10 ++ctrl ;
11 }
12 }
13 int main()
14 {
15 char * ch = "bye" ;
16 affiche(ch) ;
17 return 0 ;
18 }
Code 19
01 #include <iostream.h>
02 class Base
03 {
04 protected : int basePro;
05 public : Base () { basePro = 5; }
06 };
07 class Derive : public Base
08 {
09 private : int derivePri;
10 public : Derive () { derivePri = 20 ; }
11 int getVal()
12 {
13 Base b;
14 int val = derivePri;
15 val += b.basePro;
16 return val;
17 }
18 };
19 int main ()
20 {
21 Derive derive;
22 cout << derive.getVal() << endl;
23 return 0;
24 }
Code 20
01 #include <iostream.h>
02 float & brol ( float & f )
03 {
04 f *= 2 ;
05 return f ;
06 }
07 int main()
08 {
09 float x = 12.5 ;
10 cout << x << " " ;
11 cout << ++brol(++x) << " " ;
12 cout << x << endl ;
13 return 0 ;
14 }
Interrogation théorique C++ (NVS, SMB) - janvier 2007 – page 6

Code 21
01 #include <iostream.h>
02 class Brol
03 {
04 public :
05 Brol() { p = new int(4); }
06 ~Brol() { delete p; }
07 private :
08 int * p;
09 public :
10 int get() const { return *p; }
11 } ;
12 int main()
13 {
14 Brol b ;
15 cout << b.get() << endl ;
16 return 0 ;
17 }
Code 22
01 #include <iostream.h>
02 class NVS
03 {
04 private :
05 double d ;
06 public :
07 NVS( double i = 8.3 ) { d = i; }
08 void set( double i ) { d = i; }
09 double get() { return d; }
10 } ;
11 int main()
12 {
13 NVS x[4] ;
14 unsigned i = 0 ;
15 do
16 {
17 x[i].set(3*i) ;
18 i += 2 ;
19 }
20 while (i < 4) ;
21 for (i = 0 ; i < 4 ; ++i)
22 {
23 cout << x[i].get() << endl ;
24 }
25 return 0 ;
26 }
Code 23
01 #include <iostream.h>
02 float & brol ( float & f )
03 {
04 f *= 2 ;
05 return f ;
06 }
07 int main()
08 {
09 float x = 12.5 ;
10 cout << x << " " ;
11 cout << brol(x)++ << " " ;
12 cout << x << endl ;
13 return 0 ;
14 }
Interrogation théorique C++ (NVS, SMB) - janvier 2007 – page 7

Code 24
01 #include <iostream.h>
02 union Foo
03 {
04 signed char sc ;
05 unsigned short us ;
06 } ;
07 int main()
08 {
09 Foo f ;
10 f.sc = -13 ;
11 switch ( sizeof(f) )
12 {
13 case sizeof(signed char) : cout << "sc" << endl ; break ;
14 case sizeof(unsigned short) : cout << "us" << endl ; break ;
15 default : cout << "??" << endl ;
16 }
17 return 0 ;
18 }
Code 25
01 #include <iostream.h>
02 struct Machin
03 {
04 long double ld ;
05 public :
06 Machin( long double i ) { ld = i; }
07 long double get() { return ld; }
08 } ;
09 int main()
10 {
11 Machin m(12) ;
12 cout << m.get() + m.ld << endl ;
13 return 0 ;
14 }
Interrogation théorique C++ (NVS, SMB) - janvier 2007 – page 8

QUESTION 2 ( 15 points )

Le but du code suivant est de trier le tableau tabStr en majeur de manière croissante sur la
taille des chaînes et en mineur de manière décroissante sur l’ordre alphabétique.
Ce code utilise une pseudo-fonction (macro) dont le nom est NBELEM et dont l’expansion
est telle que si vous ajoutez une ou plusieurs chaînes correctes au tableau tabStr, il ne faudra
rien changer au reste du code pour que le tri et l’afffichage fonctionnent correctement. Notez
qu’il n’y a pas besoin d’inclure d’autres headers que ceux déjà inclus.

Ecrivez le code nécessaire pour chaque point (A, B, C) sur la feuille en annexe.

#include <iostream.h>
#include <stdlib.h>
#include <string.h>

// A : définition de la pseudo-fonction NBELEM

// B : définition de la fonction utilisée par qsort

int main ( int argc, char * argv[] )


{
char tabStr [][15] = {
"BZUT", "AZARE", "AZUR", "BZUTE", "AZAR", "BZIT", "AXE" ,"ZO", "AZA"
};

// affichage du tableau avant le tri


for ( int i=0; i< NBELEM(tabStr); i++ )
cout<<tabStr[i]<<endl

/*
TRI du tableau
en majeur : croissant sur la taille des chaînes
en mineur : décroissant sur l'ordre alphabétique
*/

// C : appel de la fonction standard qsort

// affichage du tableau après le tri


for ( int i=0; i< NBELEM(tabStr); i++ )
cout<<tabStr[i]<<endl;

system("pause");
return 0;
}

QUESTION 3 ( 15 points )

Ecrivez sur la feuille en annexe, le code probable de la fonction standard strcmp dont le
prototype est

int strcmp ( const char * s1, const char * s2 ) ;

También podría gustarte