C++ : INCOMPATIBILITES ENTRE C ET C++ (Cours et Exercices Corrigés)
Monday, June 6, 2011     17:19
  • Mon @ IP: 54.145.118.24



retour

Poster un commentaire ou une réponse

INCOMPATIBILITES ENTRE C ET C++ (Cours et Exercices Corrigés)

  Omar :
nb posts:290
nb discussions:42
inscrit le :23-01-2015
le 28-01-2015 à 09:42:38

Dans ce premier chapitre sont exposés les «plus» et les différences du C++ par rapport au C, sans toutefois aborder la programmation orientée objet (P.O.O.) qui sera vue lors d’un prochain chapitre.


I- COMMENTAIRES

En C++, les commentaires s’écrivent derrière un // et se terminent avec la fin de la ligne.

Exemple:void main()// ceci est un commentaire
{// noter que le qualificatif «void» est obligatoire
int n=2;// devant «main()»
}


II- LE QUALIFICATIF « CONST »

En C++, de telles déclarations de tableaux sont autorisées:

const int taille = 5;
char tab1[taille];
float tab2[taille + 1][taille *2];


III- DECLARATION DES VARIABLES

En C++, on peut déclarer les variables LOCALES au moment où on en a besoin. Si une variable locale est déclarée au début d’un bloc, sa portée est limitée à ce bloc.

Exemple:
void main()
{
for ( int i = 0;i<10;i++ )// la variable i est connue de toute la fonction{// «main()»
int j;// la variable j n’est connue que du bloc
...;
...;
}
}

Ce exemple est équivalent à:
void main()
{
int i;
for ( i = 0;i<10;i++ )// la variable i est connue de toute la fonction{// « main() »
int j;// la variable j n’est connue que du bloc
...;
...;
}
}

Cette possibilité autorise une gestion plus précise de la mémoire, mais peut nuire à la structuration des programmes.

IV- LES NOUVELLES POSSIBILITES D’ENTREES/SORTIES

On peut utiliser en C++ les fonctions d’entrées/sorties classiques du C (printf, scanf, puts, gets, putc, getc ...), à condition de déclarer le fichier d’en-tête stdio.h.

Il existe de nouvelles possibilités en C++, à condition de déclarer le fichier d’en-tête iostream.h.
Ces nouvelles possibilités ne nécessitent pas de FORMATAGE des données.

Sortie sur écran: l’opérateur cout:

Exemples:cout << "BONJOUR";// équivalent à puts("BONJOUR");

int n = 25;
cout << "Valeur: ";// équivalent à puts("Valeur");
cout << n;// équivalent à printf("%d",n);

On peut encore écrire directement:
cout <<"Valeur:" << n;

cout <<"\n ";// pour aller à la ligne

char c = ‘a’;
cout << c;// affiche le caractère, il faut utiliser
// printf (formatage), pour obtenir le code ASCII

Cette notation sera justifiée lors du chapitre sur les flots.
L’opérateur cout permet d’afficher des nombres entiers ou réels, des caractères, des chaînes de caractères, des pointeurs autre que de type *char (valeur de l’adresse).

  Omar :
nb posts:290
nb discussions:42
inscrit le :23-01-2015
le 28-01-2015 à 09:43:08

Exemple (à tester) et exercice I-1:
#include <iostream.h>
#include <conio.h>
void main()
{
int i,n=25,*p;
char *tc="On essaie cout !";
float x = 123.456;
cout<<"BONJOUR\n";
cout<<tc<<"\n";
cout<<"BONJOUR\n"<<tc<<"\n";
cout<<"n= "<<n<<" x= "<<x<<" p= "<<p<<"\n";
getch() ;
}

  Omar :
nb posts:290
nb discussions:42
inscrit le :23-01-2015
le 28-01-2015 à 09:43:21

Saisie clavier: l’opérateur cin:

Exemples:int n;
cout<<"Saisir un entier: ";
cin >> n;// équivalent à scanf("%d",&n);

int a, b;
cin >> a >> b;// saisie de 2 entiers séparés par un Retour Charriot

Cette notation sera justifiée lors du chapitre sur les flots.
L’opérateur cin permet de saisir des nombres entiers ou réels, des caractères, des chaînes de caractères.

Exemple (à tester) et exercice I-2:

Tester cet exemple plusieurs fois, notamment en effectuant des saisies erronées de sorte d’évaluer les « anomalies » de fonctionnement de cin.

#include <iostream.h>
#include <conio.h>
void main()
{
int n;
char tc[30],c;
float x;
cout<<"Saisir un entier:";
cin>>n;
cout<<"Saisir un réel:";
cin>>x;
cout<<"Saisir une phrase:";
cin>>tc;
cout<<"Saisir une lettre:";
cin>>c;
cout<<"Relecture: "<<n<<" "<<x<<" "<<tc<<" "<<c<<"\n"; getch() ;
}

  Omar :
nb posts:290
nb discussions:42
inscrit le :23-01-2015
le 28-01-2015 à 09:43:43

V- LES CONVERSIONS DE TYPE

Le langage C++ autorise les conversions de type entre variables de type char, int, float, double:

Exemple:

void main()
{
char c=0x56,d=25,e;
int i=0x1234,j;
float r=678.9,s;
j = c;// j vaut 0x0056
j = r;// j vaut 678
s = d;// s vaut 25.0
e = i;// e vaut 0x34
}

Une conversion de type float --> int ou char est dite dégradante
Une conversion de type int ou char --> float est dite non dégradante


VI- LES CONVERSIONS DE TYPE LORS D’APPEL A FONCTION

Le C++, contrairement au C, autorise, dans une certaine mesure, le non-respect du type des arguments lors d’un appel à fonction: le compilateur opère alors une conversion de type.

Exemple:
double ma_fonction(int u, float f)
{
.....;// fonction avec passage de deux paramètres
.....;
}

void main()
{
char c; int i, j; float r; double r1, r2, r3, r4;
r1 = ma_fonction( i, r );// appel standard
r2 = ma_fonction( c, r);// appel correct, c est converti en int
r3 = ma_fonction( i, j);// appel correct, j est converti en float
r4 = ma_fonction( r, j);// appel correct, r est converti en int
// et j est converti en float
}

Exercice I-3:

Ecrire une fonction float puissance(float x,int n) qui renvoie xn. La mettre en oeuvre en utilisant les propriétés de conversion de type.


Publicité

  Omar :
nb posts:290
nb discussions:42
inscrit le :23-01-2015
le 28-01-2015 à 09:43:58

VII- LES ARGUMENTS PAR DEFAUT

En C++, on peut préciser la valeur prise par défaut par un argument de fonction. Lors de l’appel à cette fonction, si on omet l’argument, il prendra la valeur indiquée par défaut, dans le cas contraire, cette valeur par défaut est ignorée.

Exemple:void f1(int n = 3)// par défaut le paramètre n vaut 3
{
....;
}

void f2(int n, float x = 2.35)// par défaut le paramètre x vaut 2.35
{
....;
}

void f3(char c, int n = 3, float x = 2.35)// par défaut le paramètre n vaut 3
{// et le paramètre x vaut 2.35
....;
}

void main()
{
char a = 0; int i = 2; float r = 5.6;
f1(i);// l’argument n vaut 2, l’initialisation par défaut est ignorée
f1();// l’argument n prend la valeur par défaut
f2(i,r);// les initialisations par défaut sont ignorées
f2(i);// le second paramètre prend la valeur par défaut
// f2(); interdit
f3(a, i, r);// les initialisations par défaut sont ignorées
f3(a, i);// le troisième paramètre prend la valeur par défaut
f3(a);// le deuxième et la troisième paramètres prennent les valeurs }// par défaut

Remarque:

Les arguments, dont la valeur est fournie par défaut, doivent OBLIGATOIREMENT se situer en fin de liste.
La déclaration suivante est interdite:void f4(char c=2, int n)
{
....;
}

Exercice I-4:

Reprendre l’exercice précédent. Par défaut, la fonction puissance devra fournir x4.

  Omar :
nb posts:290
nb discussions:42
inscrit le :23-01-2015
le 28-01-2015 à 09:44:13

VIII- LA SURDEFINITION DES FONCTIONS

Le C++ autorise la définition de fonctions différentes et portant le même nom. Dans ce cas, il faut les différencier par le type des arguments.

Exemple (à tester) et exercice I-5:

#include <iostream.h>
#include <conio.h>
void test(int n = 0,float x = 2.5)
{
cout <<"Fonction N°1 : ";
cout << "n= "<<n<<" x="<<x<<"\n";
}

void test(float x = 4.1,int n = 2)
{
cout <<"Fonction N°2 : ";
cout << "n= "<<n<<" x="<<x<<"\n";
}

void main()
{
int i = 5; float r = 3.2;
test(i,r);// fonction N°1
test(r,i);// fonction N°2
test(i);// fonction N°1
test(r);// fonction N°2

// les appels suivants, ambigüs, sont rejetés par le compilateur
// test();
// test (i,i);
// test (r,r);
// les inialisations par défaut de x à la valeur 4.1
// et de n à 0 sont inutilisables
getch() ;}

Exemple (à tester) et exercice I-6:

#include <iostream.h>
#include <conio.h>
void essai(float x,char c,int n=0)
{cout<<"Fonction N°1: x = "<<x<<" c = "<<c<<" n = "<<n<<"\n";}

void essai(float x,int n)
{cout<<"Fonction N°2: x = "<<x<<" n = "<<n<<"\n";}

void main()
{
char l='z';int u=4;float y = 2.0;
essai(y,l,u); // fonction N°1
essai(y,l);// fonction N°1
essai(y,u);// fonction N°2
essai(u,u);// fonction N°2
essai(u,l);// fonction N°1
// essai(y,y); rejet par le complateur
essai(y,y,u);// fonction N°1
getch() ;}

Exercice I-7:

Ecrire une fonction void affiche (float x, int n = 0) qui affiche xn (avec en particulier x0 = 1 et donc, 00 = 1).
Ecrire une autre fonction void affiche(int n, float x=0) qui affiche xn (avec en particulier 0n = 0 et donc, 00 = 0).
Les mettre en oeuvre dans le programme principal, en utilisant la propriété de surdéfinition.

Remarque: Cet exemple conduit à une erreur de compilation lors d’appel de type mn avec m et n entiers.

  Omar :
nb posts:290
nb discussions:42
inscrit le :23-01-2015
le 28-01-2015 à 09:44:29

IX- LES OPERATEURS new ET delete

Ces deux opérateurs remplacent malloc et free (que l’on peut toujours utiliser). Ils permettent donc de réserver de la place en mémoire, et d’en libérer.

Exemples:int *ad;// déclaration d’un pointeur sur un entier
ad = new int;// réservation de place en mémoire pour un entier

On aurait pu déclarer directementint *ad = new int;

char *adc;
adc = new char[100]; // réservation de place en mémoire pour 100 caractères

On aurait pu déclarer directementchar *adc = new char[100];

int *adi;
adi = new int[40]; // réservation de place en mémoire pour 40 entiers

On aurait pu déclarer directementint *adi = new int[40];

delete ad;// libération de place
delete adc;
delete adi;

Exemple (à tester) et exercice I-8:
#include <iostream.h> // new et delete
#include <conio.h> // verifier en testant que cin et cout posent les
// memes pb que scanf et printf (flux d'E-S)
void main()
{
int *ad = new int;
char *adc;
adc = new char[25];

cout<<"Entrer un nombre:";
cin>>*ad;
cout<<"Voici ce nombre:"<<*ad;

cout<<"\nEntrer une phrase:";
cin>>adc;
cout<<"Voici cette phrase:"<<adc;

delete ad;
delete adc;
getch() ;}

Exercice I-9:

Déclarer un tableau de 5 réels. Calculer et afficher leur moyenne.

Remarques:

- Il ne faut pas utiliser conjointement malloc et delete ou bien new et free.
- En TURBO C++, l’opérateur new permet de réserver au maximum 64 Koctets en mémoire; la fonction set_new_handler permet de gérer

  Omar :
nb posts:290
nb discussions:42
inscrit le :23-01-2015
le 28-01-2015 à 09:44:48

X- NOTION DE REFERENCE

En C, la notation &n signifie « l’adresse de la variable n »
En C++, cette notation possède deux significations:
- Il peut toujours s’agir de l’adresse de la variable n
- Il peut aussi s’agir de la référence à n
Seul le contexte du programme permet de déterminer s’il s’agit de l’une ou l’autre des deux significations.

Exemple:int n;
int &p = n;// p est une référence à n
// p occupe le même emplacement mémoire que n
n = 3;
cout<< p;// l’affichage donnera 3
XI -PASSAGE DE PARAMETRE PAR REFERENCE

Rappel:

En C, comme en C++, un sous-programme ne peut modifier la valeur d’une variable locale passée en argument de fonction. Pour se faire, en C, il faut passer l’adresse de la variable.

Exemple (à tester) et exercices I-10 et I-11:

#include <iostream.h> // passage par valeur
#include <conio.h>
void echange(int a,int b)
{
int tampon;
tampon = b; b = a; a = tampon;
cout<<"Pendant l'échange: a = "<<a<<" b = "<<b<<"\n";
}
void main()
{
int u=5,v=3;
cout<<"Avant echange: u = "<<u<<" v = "<<v<<"\n";
echange(u,v);
cout<<"Apres echange: u = "<<u<<" v = "<<v<<"\n";
getch() ;}

L’échange n’a pas lieu.

#include <iostream.h>// passage par adresse
#include <conio.h>
void echange(int *a,int *b)
{
int tampon;
tampon = *b; *b = *a; *a = tampon;
cout<<"Pendant l'échange: a = "<<*a<<" b = "<<*b<<"\n";
}
void main()
{
int u=5,v=3;
cout<<"Avant echange: u = "<<u<<" v = "<<v<<"\n";
echange(&u,&v);
cout<<"Apres echange: u = "<<u<<" v = "<<v<<"\n";
getch() ;}

L’échange a lieu.

En C++, on préférera le passage par référence:

Exemple (à tester) et exercice I-12:
#include <iostream.h> //passage par référence
#include <conio.h>
void echange(int &a,int &b) // référence à a et b
{
int tampon;
tampon = b; b = a; a = tampon;
cout<<"Pendant l'échange: a = "<<a<<" b = "<<b<<"\n";
}

void main()
{
int u=5,v=3;
cout<<"Avant echange: u = "<<u<<" v = "<<v<<"\n";
echange(u,v);
cout<<"Apres echange: u = "<<u<<" v = "<<v<<"\n";
getch() ;}

L’échange a lieu. Le compilateur prend en charge le passage par adresse si celui-ci est nécessaire.
Remarquer la simplification de l’écriture de la fonction.

  Omar :
nb posts:290
nb discussions:42
inscrit le :23-01-2015
le 28-01-2015 à 09:45:05

XII- CORRIGE DES EXERCICES

Exercice I-3:

#include <iostream.h>
#include <conio.h>
float puissance(float x,int n)
{
float resultat=1;
for(int i=1;i<=n;i++)resultat = resultat * x;
return resultat;
}

void main()
{
char c=5;int i=10,j=6; float r=2.456,r1,r2,r3,r4,r5;
r1 = puissance(r,j);
r2 = puissance(r,c);
r3 = puissance(j,i);
r4 = puissance(j,r);
r5 = puissance(0,4);
cout << "r1 = " <<r1<<"\n";
cout << "r2 = " <<r2<<"\n";
cout << "r3 = " <<r3<<"\n";
cout << "r4 = " <<r4<<"\n";
cout << "r5 = " <<r5<<"\n";
getch() ;}

Exercice I-4:

#include <iostream.h>
#include <conio.h>
float puissance(float x,int n=4)
{
float resultat=1;
for(int i=1;i<=n;i++)resultat = resultat * x;
return resultat;
}
void main()
{
int j=6; float r=2.456,r1,r2,r3,r4,r5;
r1 = puissance(r,j);
r2 = puissance(r);
r3 = puissance(1.4,j);
r4 = puissance(1.4);
cout << "r1 = " <<r1<<"\n";
cout << "r2 = " <<r2<<"\n";
cout << "r3 = " <<r3<<"\n";
cout << "r4 = " <<r4<<"\n";
getch() ;}

Exercice I-7:

#include <iostream.h>
#include <conio.h>
void affiche(float x,int n=0)
{int i = 1;float resultat = 1;
for(;i<=n;i++)resultat = resultat * x;
cout << "x = "<<x<< " n = " << n << " resultat = " << resultat <<"\n";}

void affiche(int n,float x=0)
{int i = 1;float resultat = 1;
if (n!=0){for(;i<=n;i++)resultat = resultat * x;}
else (resultat = 0);
cout << "n = "<<n<< " x = " << x << " resultat = " << resultat <<"\n";
}
void main()
{
int u=4,v=0;float y = 2.0,z=0;
affiche(u);
affiche(y);
affiche(y,u);
affiche(u,y);
affiche(v,z);
affiche(z,v);
getch() ;}

  Omar :
nb posts:290
nb discussions:42
inscrit le :23-01-2015
le 28-01-2015 à 09:45:16

Exercice I-9:

#include <iostream.h>
#include <conio.h>
void main()
{
float moyenne =0,*tab = new float[5];
int i=0;
for(;i<5;i++)
{
cout<<"Entrer un nombre: ";
cin>>tab[i];
moyenne = moyenne + tab[i];
}
moyenne = moyenne/5;
cout <<"Moyenne = "<<moyenne<<"\n";
delete tab;
getch() ;}


Publicité

  Omar :
nb posts:290
nb discussions:42
inscrit le :23-01-2015
le 28-01-2015 à 09:45:27

Exercices exécutables:

  Omar :
nb posts:290
nb discussions:42
inscrit le :23-01-2015
le 28-01-2015 à 09:46:29

Exi_1.cpp

  Omar :
nb posts:290
nb discussions:42
inscrit le :23-01-2015
le 28-01-2015 à 09:50:05

EXI_2.CPP

  Omar :
nb posts:290
nb discussions:42
inscrit le :23-01-2015
le 28-01-2015 à 09:50:11

EXI_3.CPP

  Omar :
nb posts:290
nb discussions:42
inscrit le :23-01-2015
le 28-01-2015 à 09:50:19

EXI_4.CPP

  Omar :
nb posts:290
nb discussions:42
inscrit le :23-01-2015
le 28-01-2015 à 09:50:27

EXI_5.CPP


Publicité

  Omar :
nb posts:290
nb discussions:42
inscrit le :23-01-2015
le 28-01-2015 à 09:50:35

EXI_6.CPP

  Omar :
nb posts:290
nb discussions:42
inscrit le :23-01-2015
le 28-01-2015 à 09:50:46

EXI_7.CPP

  Omar :
nb posts:290
nb discussions:42
inscrit le :23-01-2015
le 28-01-2015 à 09:50:55

EXI_8.CPP

  Omar :
nb posts:290
nb discussions:42
inscrit le :23-01-2015
le 28-01-2015 à 09:51:05

EXI_9.CPP

  Omar :
nb posts:290
nb discussions:42
inscrit le :23-01-2015
le 28-01-2015 à 09:51:14

EXI_10.CPP

  Omar :
nb posts:290
nb discussions:42
inscrit le :23-01-2015
le 28-01-2015 à 09:51:22

EXI_11.CPP

  Omar :
nb posts:290
nb discussions:42
inscrit le :23-01-2015
le 28-01-2015 à 09:51:33

EXI_12.CPP

Poster un commentaire ou une réponse :
Poster
     Ajouter un document à la discussion:
       

Actualité informatique et High-Tech

16-10-2015               lire

Dropbox propose aussi un outil d'écriture collaborative à son service

16-10-2015               lire

Bientôt des DRM dans des JPEG

17-04-2015               lire

Google propose une requête pour retrouver son téléphone

17-04-2015               lire

Youtube prépare une offre payante sans publicité

17-04-2015               lire

Sony Pictures : Des milliers de mails et documents confidentiels dévoilés

07-04-2015               lire

T411 bloqué par les FAI français

07-04-2015               lire

NVIDIA publie un pilote correctif et met à jour SHIELD Hub ainsi que GeForce Experience

07-04-2015               lire

Linkedin acquiert la start-up Refresh

03-04-2015               lire

Chromebit, la clé USB Google et Asus qui transforme n’importe quel écran en ordinateur

03-04-2015               lire

Une personne aurait pu supprimer toutes les vidéos d’une chaine Youtube en quelques secondes

03-04-2015               lire

Firefox 37 apporte un cryptage complémentaire à HTTPS

03-04-2015               lire

Windows XP, ce système qui ne veut pas mourir

02-04-2015               lire

Piratage de Labio.fr : le laboratoire répond à nos questions et ne payera pas la rançon

02-04-2015               lire

AWS lance des instances géantes avec 48 To de stockage

02-04-2015               lire

WhatsApp ajoute les appels gratuits et illimités à son application

31-03-2015               lire

Nadim Kobeissi : de Cryptocat à Peerio, du piratage au doctorat

31-03-2015               lire

L'Université de Nantes inaugure son datacenter modulaire taillé pour le HPC

31-03-2015               lire

GitHub victime d’une attaque DDoS majeure

27-03-2015               lire

Googlinette : les recherches de Google en devinettes

27-03-2015               lire

F8 : Facebook ouvre Messenger au e-commerce

27-03-2015               lire

À la SNCF, une fuite de données simple comme une touche F5

23-03-2015               lire

Des satellites GPS de Boeing affectés par une erreur technique

23-03-2015               lire

Plus de 700 000 routeurs ADSL vulnérables au piratage

23-03-2015               lire

Twitter sous le coup d’une action collective pour discrimination

22-03-2015               lire

Les montres connectées étaient déjà présentes dans les films, séries et dessins animés

22-03-2015               lire

Une Audi autonome va traverser les USA de SF à New York

20-03-2015               lire

Éclipse du Soleil : comment la suivre en direct sur Internet

20-03-2015               lire

Projet Leap : des bus 2.0 à San Francisco

20-03-2015               lire

Nvidia dévoile Drive PX, un système de conduite autonome

17-03-2015               lire

Embarquez pour Apollo 11, expérience virtuelle hors du commun

16-03-2015               lire

Ce jour où Google a exposé les données de 282 867 domaines

16-03-2015               lire

Yahoo publie le code de son plug-in de chiffrement mail

16-03-2015               lire

Après un an sans mise à jour, HAWKEN revient à la vie

12-03-2015               lire

Le big data au service du séquençage ADN pour accélérer les diagnostics

12-03-2015               lire

Clap de fin pour PlayStation Mobile

12-03-2015               lire

Apple : retour à la normale après une panne de plus de 11 heures

12-03-2015               lire

Ericsson va supprimer 2 200 postes en Suède

12-03-2015               lire

Le plan de Fleur Pellerin contre le piratage sur Internet

10-03-2015               lire

Apple Watch, Watch Edition et Watch Sport : de 399 à 18.000 euros !

10-03-2015               lire

Apple présente le “nouveau MacBook” qui remplace le MacBook Air

09-03-2015               lire

Google développe une version d'Android pour la réalité virtuelle

09-03-2015               lire

Quand la MPAA demande à Google de déréférencer son propre site

09-03-2015               lire

Heroes of the Dorm : un tournoi HotS avec 450 000 $ de bourses d'études à gagner

09-03-2015               lire

1 milliard d'adresses mails volées, 2 pirates inculpés

09-03-2015               lire

VMware accusé de violation de code Linux

09-03-2015               lire

Les drones civils bientôt immatriculés ?

05-03-2015               lire

7 sites qui permettent d’envoyer des fichiers de + ou – 2 Go

04-03-2015               lire

Smartphones : Apple passe en tête devant Samsung56% des consommateurs inquiets pour leurs données en Europe

04-03-2015               lire

Smartphones : Apple passe en tête devant Samsung

04-03-2015               lire

MWC 2015 : Onevisage pésente un scan facial 3D pour smartphones

04-03-2015               lire

Caméras sportives : Xiaomi s'attaque au monopole GoPro

04-03-2015               lire

Yi Camera, la caméra embarquée de Xiaomi à moins de 60€

04-03-2015               lire

Faille FREAK : quand des connexions SSL/TLS se contentent d'un chiffrement RSA sur... 512 bits

04-03-2015               lire

Bientôt des pubs sur Google Play (Android)

28-02-2015               lire

En partenariat avec "Positive Technologies", Esprit a l'honneur d'inviter ses étudiants à la 1ère édition de l’événement ESPRIT HACK DAYS dans les locaux d'ESPRIT Chotrana 2 et ce le 03 et le 04 Mars 2015.

28-02-2015               lire

La direction des stages d’ESPRIT et Ernst & Young ont le plaisir d'inviter ses étudiants à la journée de l’entreprise du mercredi 4 mars 2015 dans la salle E5 d’ESPRIT Factory.

25-02-2015               lire

Adobe fête les 25 ans de son logiciel Photoshop

25-02-2015               lire

Linux 4.0 : gros numéro et petite version

Haut de page.