[ RzR | INDEX | SEARCH | ME | TOOLS | WEB DESIGN | VISUAL | ARTICLES | MUSIC | E-M@IL ]

PROGRAMATION EN C / C++

Voila quelques notes en vracs pour les debutants en language C

JEUX D'INSTRUCTION

/**
 * Exemple d'instructions C/C++
 **/
// commentaire sur une ligne 

int main() { 		//fonction principale
	int a = 4; 
	int b = 2;

	if ( a < 0 ) { // condition
		a=5; 
	} else {	// contre condition
		b=3;
	}
	
	
	while ( a != b ) { // boucle
		b=b+1;
	}
	
	for (int i=0;i<5;i++) { // boucle indexée
		b=b+a;
	}
	
	switch (b) { // branchement multiple 
		case 0 : a = -1; break;
		case 1 : a = 0 ; break;
		default : a = b; break;
	}
	
	do { 
		a=b+2;
	} while ( a < b ); // si condition re-boucle

	return a; // retour de valeur
}

TYPES

int, char, float, double

Le reste est plus exotique et dépands plus du compilateur/OS :
bytes, unsigned char, signed bytes, long, short ... & boolean (C++)

OPERATEURS

affectation
=
Operateurs Aritmetiques :
+,-,*,/,% : addition, soustraction, multiplication, division, modulo (reste div)
Incrementation: i++ (eq. i'=i+1; return i; )
--i (eq i'=i-1; return i'; )
+= : addition + affectation (idem -= , *= ; /= , %= ; <<= )
Operateurs Logiques :
|| : OU logique
&& : ET logique
&= : ET bit à bit+affectation
|=: OU bit à bit+affectation
^= : OU exclusif bit à bit+affectation
<<= : décalage à gauche puis affectation (resp >>= )
.
'' regroupement d'expressssions
.
?: condition ternere

Addresse / Contenus

int a : variable a , son adresse est : &a

int* a : a est une ad dont le contenu est de type int
int *a : le contenu de l'adresse a est de type int (identique)

int *a;
&(*a) = a;

char a;
&a; => l'add reservee pour a
*(&a) = a;

Tableaux :

La notion de tableau est subtile il n'existe pas de 'type' tableau donc on a recours
 int tab[10]; /*
reservation en mem de 10 case pour contenir des int (10 octets)
la 1ere case est a l'ad 'tab' */

 tab[2] : /*
le valeur du contenu de la (0eme ,1eme ) 2eme case (soit 3cases)
le contenu de ( l'ad du 1er ele + 2 cases )
cette ad en obtenue par &(tab[2]) */


equivaut à :
char tab[10];	// 10 case reserve a partir de l'ad tab
*tab ; 		// le char qui est a l'ad tab
*(tab+3) ;	 // le char contenu a l'ad (tab+3)
(tab+6) ; 	// adresse = Ad(tab) + 6 * taille d'une case
tab[6];		// le char a la 6eme case <=> *(tab+6)
&tab[0] = tab = &*tab;

[] et * => contenus
& 	=> l'ad d'un contenu

----

void f (char d[]) ;	<=>	void f (char *d);
 dans les deux cas d est l'ad du 1er element (peut etre \0 )

----

char *t[];
t[] ; un tableau de case de meme type debutnat a l'ad t;
* t[] ; la valeur d'une case est prise comme adresse d'un contenu
char *t[] : de type char

t : 	l'ad du tableau (d'adresse de char)
(*t)	: l'ad du  0eme element du tab;
*(*t)	: le contenu de ( ^^^ ) 

t [] [] [] [] []   [ t[5] ]    [ *(t+6) ]   []    []
   \
    \
     \ [ *(*(t+0)) ]  [c] [h] [a] [i] [n] [e]     [  *((t[0])+6) ]        [\0]

Pour eviter cette notation lourde on simplifie par si on veux acceder a 'a'
char *t[];
char* x;

x = t[0]; // l'ad

printf("%c", *(x+4) );

Parametres de fonctions :

On passe en param dans les fonctions 
- des variables de longueur 1 ou 2 octets ( int, char ) si on veux passer plusieur vars, - soit un tableau de long n - il faut juste l'@ de ce tab - et la longeur - ou evetuellement la valeur du dernier element du tab ( ex %s => \0 ) On peux passer un tableau de tableau de pionteur de tableau de char mais il faut faire au plus simple !!!

E/S Formatees :


scanf nécessite:
	- @ où stocker la valeur
	- Type de cette val (-> taille ie %f=4octets ; %s...\0)
---

Mais on ne s'interesse pas aux @ mais aux valeurs,
(cad contenus de l'@ du type specifie dans le scanf )

printf nescessite
	- Type a reprenter %d %f %u %c %s
	- Valeur dans le type specifier
SAUF: %s => adresse de la chaine se terminant par \0

---
int a;         /* => %d */
scanf("%d", &a); /* on retrouve le type int%d et notre ad */

printf("%d", a ); /* notre typage suit la valeur (a) */
On ne parle plus d'adresse puisque on connais le contenu de l'@
soit la valeur de la variable a

---
int *a; 
a est une ad dont son contenu est de type int;

scanf("%d",a); 
/* a est bien une ad , le type (%d) est le meme que son contenu */

printf("%d",*a); 
/* printf opere sur une valeur , variable 
ici le contenu *a de l'ad a */

printf("%d",5); <=> printf("5");

Compilation


pour generer un executable (comprenssible par l' OS)
- il faut

.c / .cc => .o => .exe
         -c
* Pre-prossesing :
- Analyse lexicale / syntaxique (grammaire)
- interprete les #

* Compilation :
- traduire le source en lang evolue (C,pascal) 
  => langage simpliste (assembleur)

gcc -c f.c -o f.o
 => f.o

* Linker :
- Acrocher chaque objets

gcc -o runme utilise.o principal.o -lm (lib maths)
gcc -o runme utilise.o principal.o -lg++ (lib c++)

* Execution du fichier binaire :
% runme 

Automatisation de toutes ces etapes avec un fichier makefile

COMPILATION C++


pour generer un executable (comprenssible par l' OS)
- il faut

.cc / .cpp => .o => .exe
         -c
* Pre-prossesing :
- Analyse lexicale / syntaxique (grammaire)
- interprete les #

* Compilation :
- traduire le source en lang evolue (C,pascal) 
  => langage simpliste (assembleur)

% g++ -c -o f.o f.cpp
 => f.o

* Linker :
- Acrocher chaque objets

% g++ -o runme utilise.o principal.o -lm (lib maths)

* Execution du fichier binaire :
% ./runme 

----

Si on utilise des libraries
Par example la lib malib :
/lib-dir/include/malib.h
/lib-dir/lib/libmalib.so (ou /lib-dir/lib/libmalib.a)

Compil : g++ -c  -o f.o f.cpp -I/lib-dir/include
Link: g++ -o runme utilise.o principal.o -lmalib -L/lib-dir/lib

---
Automatisation de toutes ces etapes avec un fichier makefile

MISC

recopie de tableaux :
t[m][n];
v[m*m];

for(i ..m ) 
 for(i ..m ) 
   v[i*n+j] =   t[i][j];

CARACTERES SPECIAUX & SEQUENCES D'ECHAPEMENT

	\a 	alarme
	\b 	retour arrière (backspace)
	\f	saut de page (lineFeed)
	\n	rupture de ligne (newline)
	\r	retour chariot (cariage return)
	\t	tabulation horizontale
	\v	tabulation verticale
	\'	simple quote
	\"	double quote
	\\	backslash
	\?	point d'interrogation
	\0	fin de chaine

MACROPROCESSEUR

Fonction
#define min2(a,b) {  if (a > b) return a; return b; }

Symbole

#define RzR // definit le symbole 
#undef RzR  // annule le symbole, macro...

#ifdef RzR  // si s deja defini
[...]
#else	    // non definit
[...]
#endif

#ifndef [...] #else [...] #endif    // idem mais inverse :-)



#if [...]
#elif [...]
#endif 

#error [...] // genere une erreur

#line Numero ["NomFichier"] 
// pour modifier le numéro de la ligne courante 
// et le nom de fichier courant traité par le préprocesseur

#pragma : ?

Passage par Valeurs / References


/**
 * @author: Philippe.COVAL - http://rzr.online.fr/
 * @version: 2000.10.27/s
 **/
#include 

/**
 * Vieille methode C : passage par addresse
 **/
int decompose(int nb,int* u,int* c,int* d)  {
  int tu,tc,td; // variables temporaires pour un soucie de lisibilitee

  tc=nb/100;
  td=(nb/10-tc*10);
  tu=(nb-tc*100-td*10);

  *u = tu;
  *c = tc;
  *d = td;
}
/**
 * Local les valeurs retournees sont = a celle envoyées
 * donc inutile pour les fonctions , soit procedure
 **/
int decompose2(int nb,int u,int c,int d)  {
  int tu,tc,td; // variables temporaires pour un soucie de lisibilitee

  tc=nb/100;
  td=(nb/10-tc*10);
  tu=(nb-tc*100-td*10);

  u = tu;
  c = tc;
  d = td;
}

/**
 * Bonne Methode C++
 * la reference est l'equivalent du pointeur en C
 **/
int decompose3( const int nb,int &u,int &c,int &d)  {
  int tu,tc,td; // variables temporaires pour un soucie de lisibilitee

  tc=nb/100;
  td=(nb/10-tc*10);
  tu=(nb-tc*100-td*10);

  u = tu;
  c = tc;
  d = td;
}

int main() {
  int u=0,c=0,d=0;
  int n=423;
  decompose(n,&u,&c,&d);
  cout<,<"n="<,<n<,<endl;
  cout<,<"dn = "<,<c<,<" "<,<d<,<" "<,<u<,<endl; // dn = 4 2 3
  u=0,c=0,d=0;
  decompose2(n,u,c,d);
  cout<,<"dn = "<,<c<,<" "<,<d<,<" "<,<u<,<endl; // dn = 0 0 0
  u=0,c=0,d=0;
  decompose3(n,u,c,d);
  cout<,<"dn = "<,<c<,<" "<,<d<,<" "<,<u<,<endl; // dn = 4 2 3

  return 0;
}


http://rzr.online.fr/comp.htm - 1999 - Last modified: Sun Feb 8 18:14:02 CET 2004
Philippe.COVAL - http://rzr.online.fr - mailto:rzr(a)users.sf.net

[ RzR | INDEX | SEARCH | ME | TOOLS | WEB DESIGN | VISUAL | ARTICLES | MUSIC | E-M@IL ]