Parent directory
acceder au document
/*******************************************************************************
author: Pierre-Emmanuel Périllon
date: 30/05/2007
encoding: utf8
level: beginner+
langage: C++ (without class), comments in french
licence: Creative common by+nc+sa. see http://creativecommons.org/
website: http://tutorat.univ-lyon1.fr/
build: g++ -Wall if3_2005_janvier.cpp -o out
********************************************************************************


PARTIE 1************************************************************************
types élémentaires:
bool, char, int, long, fload, double + "void".

modificateurs de types:
unsigned, const, * déréférencement

constructeur de type
struct, union, enum + typedef

il existe 3 types passages de parametre : par copie, par référence et par
adresse. La méthode par adresse n'est pas au programme d'if3, la référence
n'existe pas en C "pur".

*/

#include <iostream>
#include <string>

using namespace std;

/*
* ?
*/
void passageCopie( int a)
{
cout << "\t passageCopie: reçu " << a ;
a = 1;
cout << ", modifie " << a << "." << endl;
}

/*
* ?
*/
void passageReference( int &a)
{
cout << "\t passageReference: reçu " << a;
a = 2;
cout << ", modifie " << a << "." << endl;
}

/*
* ?
*/
void passageAdresse( int * a)
{
cout << "\t passageAdresse: reçu " << *a;
*a = 3;
cout << ", modifie " << *a << "." << endl;
}

/*
* ?
*/
void observer ()
{
int b = 0;
cout << "observation de la vie d'une même variable dans un programme" << endl;
cout << "main: " << b << endl;
passageCopie(b);

cout << "main: " << b << endl;
passageReference(b);

cout << "main: " << b << endl;
passageAdresse(&b);

cout << "main: " << b << endl;
}





/*
PARTIE 2 ***********************************************************************

analyse de chaine
*/

/*
* ?
*/
void extraireSousChaine( const char src[], char dest[], int ran, int lon)
{
int i = 0;
int j = 0;

while ( src[i] != '\0' )
{
if ( i >= ran )
{
if ( i < ran + lon )
{
dest [ j ] = src [ i ];
j = j + 1 ;
}
else
{
break; // sort de la boucle while
}
}
i++;
}


dest[j]= '\0';


}

/*
* ?
*/
void extraireToutesSousChaine( const char tab[], int taille )
{
int i = 0;
int len;
char buffer[200];

//precondition
if ( taille > 200 )
{
cout << "analyserSousChaine() precondition taille > 200 échoue" << endl;
exit(1);
}

len = strlen(tab);
if ( taille > len )
{
cout << "analyserSousChaine() precondition taille > len échoue" << endl;
exit(1);
}

//calculs
for ( i = 0 ; i <= (len - taille) ; i++ )
{
extraireSousChaine( tab, buffer, i , taille);
cout << buffer << endl;
}
}

/*
* ?
*/
int analyserSousChaine( const char src[], char fragment[] )
{
char buffer[200];
int i = 0;
int len = strlen(src);
int taille = strlen(fragment);


//precondition
if ( taille > 200 )
{
cout << "analyserSousChaine() precondition taille <= 200 échoue" << endl;
return -2;
}

if ( taille > len )
{
cout << "analyserSousChaine() precondition taille <= len échoue" << endl;
return -3;
}

//calculs
for ( i = 0 ; i <= (len - taille) ; i++ )
{
extraireSousChaine( src, buffer, i , taille);
if ( 0 == strcmp( fragment , buffer) )
{
// renvoyer la position de la sous chaine
return i;
}
}
// si on arrive ici c'est qu'on a rien trouvé.
return -1;
}

/*
* ?
*/
void analyseur( const char src[], char fragment[] )
{

int i = analyserSousChaine( src , fragment );

if ( i >= 0 )
{
cout << "\"" << fragment << "\" a ete trouve dans la chaine \"" << src << "\" a la position " << i << "." <<endl;
}
else if (-1 == i )
{
cout << "\"" << fragment << "\" n'a pas ete trouve dans la chaine \"" << src << "\"" <<endl;
}
else
{
cout << "Une erreur a provoque l'abandon d'une analyse.";
}
cout << endl;
}


/*
* ?
*/
int main(){
char p[200] = "# toto n'est pas content #";//«»
char q[200];

q[199] = '\0'; // comme on n'initialise pas la chaine, on ajoute au moins un charactere de stop.

observer ();

cout << "EXERCICE 2 ---------------------" << endl;
cout << "initial:" << p << endl;
extraireSousChaine( p, q, 2 , 4 );
cout <<"sous chaine r=4 l=2:"<< q << endl;

extraireSousChaine( p, q, 0 , 100 );
cout <<"sous chaine r=0 l=100:"<< q << endl;

extraireSousChaine( p, q, 6 , 5 );
cout <<"sous chaine r=6 l=5:"<< q << endl;

cout << "EXERCICE 3 ---------------------" << endl;

extraireToutesSousChaine(p, 4);

cout << "EXERCICE 4 ---------------------" << endl;
analyseur( p, "content" );
analyseur( p, "toto" );
analyseur( p, "ie" );
analyseur( p, "iechkjckjvhqs shfqskdjhfqsl hfqklsjhfdqljhsdfqj kj" );
analyseur( "Rédigez l'algorithme complet capable de vérifier qu'une chaîne de caractères est présente",
"Rédigez l'" );
analyseur( "Rédigez l'algorithme complet capable de vérifier qu'une chaîne de caractères est présente",
" présente" );
analyseur( "Rédigez l'algorithme complet capable de vérifier qu'une chaîne de caractères est présente",
" présent" );
analyseur( "Rédigez l'algorithme complet capable de vérifier qu'une chaîne de caractères est présente",
"nte" );
cout << "--------------------------------" << endl << endl;
return 0;
}
acceder au document