I Quelques points d'algorithmique

Documents pareils
1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

Algorithmique et Programmation, IMA

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Conventions d écriture et outils de mise au point

Introduction au langage C

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Compression de Données - Algorithme de Huffman Document de Conception

Recherche dans un tableau

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Java Licence Professionnelle CISII,

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Les structures de données. Rajae El Ouazzani

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

Initiation. àl algorithmique et à la programmation. en C

Le prototype de la fonction main()

Programmation en langage C


Algorithmique, Structures de données et langage C

I. Introduction aux fonctions : les fonctions standards

Algorithmique & Langage C IUT GEII S1. Notes de cours (première partie) cours_algo_lgc1.17.odp. Licence

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Quelques éléments de compilation en C et makefiles

Chapitre 1 : La gestion dynamique de la mémoire

Bases de programmation. Cours 5. Structurer les données

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

INITIATION A LA PROGRAMMATION

Les chaînes de caractères

Travaux Dirigés n 1 : chaînes de caractères

SUPPORT DE COURS. Langage C

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Cours Programmation Système

Cours Langage C/C++ Programmation modulaire

Langage C. Patrick Corde. 22 juin Patrick Corde ( Patrick.Corde@idris.fr ) Langage C 22 juin / 289

Le langage C. Séance n 4

Programmation système I Les entrées/sorties

Programmation C. J.-F. Lalande. 15 novembre 2012

1.6- Génération de nombres aléatoires

Complexité. Licence Informatique - Semestre 2 - Algorithmique et Programmation

Algorithmes et Programmes. Introduction à l informatiquel. Cycle de vie d'un programme (d'un logiciel) Cycle de vie d'un programme (d'un logiciel)

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

INF111. Initiation à la programmation impérative en C amini/cours/l1/inf111/ Massih-Reza Amini

Cours de C. Allocation dynamique. Sébastien Paumier

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

3IS - Système d'exploitation linux - Programmation système

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

#include <stdio.h> #include <stdlib.h> struct cell { int clef; struct cell *suiv; };

Rappels Entrées -Sorties

Programmation Classique en langage C

Programmation système en C/C++

introduction Chapitre 5 Récursivité Exemples mathématiques Fonction factorielle ø est un arbre (vide) Images récursives

Architecture des Systèmes d Information Architecture des Systèmes d Information

Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers.

Langage Éric Guérin 5 octobre 2010

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Plan du cours. Historique du langage Nouveautés de Java 7

Arbres binaires de recherche

Algorithmique I. Algorithmique I p.1/??

ACTIVITÉ DE PROGRAMMATION

UE Programmation Impérative Licence 2ème Année

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

Le Langage C Licence Professionnelle Qualité Logiciel Pr. Mouad BEN MAMOUN ben_mamoun@fsr.ac.ma Année universitaire 2011/2012

Cours d Algorithmique et de Langage C v 3.0

Programmation en C. École Nationale Supérieure de Techniques Avancées. Pierre-Alain Fouque et David Pointcheval

UE C avancé cours 1: introduction et révisions

Programmation C++ (débutant)/instructions for, while et do...while

Cours 6 : Tubes anonymes et nommés

Généralités sur le Langage Java et éléments syntaxiques.

Les structures. Chapitre 3

Anis ASSÈS Mejdi BLAGHGI Mohamed Hédi ElHajjej Mohamed Salah Karouia

Chap III : Les tableaux

Les processus légers : threads. Système L3, /31

Initiation à la programmation en Python

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

MINIMUM. connaissances nécessaires à la programmation des microcontrôleurs PIC18 en langage C (une introduction au langage c A.N.S.

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

CRÉER UNE BASE DE DONNÉES AVEC OPEN OFFICE BASE

TD3: tableaux avancées, première classe et chaînes

Gestion de la mémoire

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Arguments d un programme

Les arbres binaires de recherche

Notes du cours 4M056 Programmation en C et C++ Vincent Lemaire et Damien Simon

Cours de Programmation Impérative: Zones de mémoires et pointeurs

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Utilisation d objets : String et ArrayList

1 de 46. Algorithmique. Trouver et Trier. Florent Hivert. Mél : Florent.Hivert@lri.fr Page personnelle : hivert

Grandes lignes ASTRÉE. Logiciels critiques. Outils de certification classiques. Inspection manuelle. Definition. Test

COMPARAISONDESLANGAGESC, C++, JAVA ET

Cours de programmation avancée. Le langage C. Université du Luxembourg

La programmation des PIC en C. Les fonctions, les interruptions.

TP2 : tableaux dynamiques et listes chaînées

Programmation impérative

Transcription:

I Quelques points d'algorithmique 1) Types Type "simple" : Identificateur commençant par une majuscule = Description du type Les principaux types : les entiers naturels (int, long, long long) ou relatifs (précisé unsigned devant), les réels (float, double), les caractères (char) à noter qu'un mot est un tableau de caractères : char[nb_caracteres] et que les booléens sont à définir de la manière suivante : typedef enum {FAUX,VRAI Booleen; Type énumération : spécifie la liste des valeurs du type (voir booléen) Type composé Construit à partir d autres types -> Notion de composant Type des composants Organisation de ces composants accès à ces composants Structure : Regroupement d informations de différents types Les composants sont appelés champs Opérations : Exemple : Sur le composé : l affectation et l accès aux composants Sur les composants : celles autorisées sur leurs types typedef enum {TSP, TEM Specialite; typedef struct { char prenom[longueur]; int age; Specialite spe; Eleve; eleve.spe dit si eleve est TSP ou TEM 2) 3 principaux schémas a) schéma conditionel if (CONDITION) { ALORS INSTRUCTION; optionnel :

else { INSTRUCTION; b) schéma itératif "Tant que" while (CONDITION) { INSTRUCTION; c) schéma itératif "Pour" for (i=debut;i<fin;i++) { INSTRUCTION; 3) Récursivité Principé : Fonction définie à partir d'elle-même. On doit aussi avoir une condition d'arrêt. Elle est donc souvent construite avec un si. Exemple : <----- Condition d'arrêt (n<=1) <----- Appel à elle-même II Exemple classique : les tris 1) Tri par sélection Principe : Dans notre tableau à trier, on a une première partie trié (initialement vide), et une autre trié. A chaque itération, on va chercher le minimum de la partie non triée pour le placer à la suite de la partie triée. Complexité O(n 2 )

procédure tri_selection(tableau t, entier n) pour i de 1 à n - 1 min i pour j de i + 1 à n si t[j] < t[min], alors min j si min i, alors échanger t[i] et t[min] fin procédure 2) Tri par insertion Principe : comme pour le prix par sélection, on a une partie triée et une non triée. Cette fois ci, on prend le premier élément de la liste non triée et on vient le placer à la bonne position dans la partie triée Complexité O(n 2 ) procédure tri_insertion(tableau T, entier n) pour i de 1 à n-1 x T[i] j i tant que j > 0 et T[j - 1] > x T[j] T[j - 1] j j - 1 fin tant que T[j] x fin procédure 3) Tri à bulles A chaque itération, on compare deux éléments consécutifs et on les inverse si l'ordre n'est pas le bon. Complexité O(n 2 ) procédure tri_bulle(tableau T) n = longueur(t) pour i de n - 1 à 1 aucun_échange = vrai pour j de 1 à i si T[j] > T[j + 1], alors échanger T[j] et T[j + 1] aucun_échange = faux fin si si aucun_échange : fin procédure fin procédure 4) Tri rapide Ici, on choisit un pivot (de la manière qu'on veut : premier, dernier, le milieu). Puis on partitionne le tableau à trier suivant si les éléments sont inférieurs ou supérieurs au pivot. On se rappelle récursivement sur les deux sous-tableaux, le pivot et alors à sa position finale. Complexité O(nlog(n)) partitionner(tableau T, premier, dernier, pivot)

échanger T[pivot] et T[dernier] j := premier pour i de premier à dernier - 1 si T[i] <= T[dernier] alors échanger T[i] et T[j] j := j + 1 échanger T[dernier] et T[j] renvoyer j tri_rapide(tableau t, entier premier, entier dernier) début si premier < dernier alors pivot := choix_pivot(t, premier, dernier) pivot := partitionner(t, premier, dernier, pivot) tri_rapide(t,premier, pivot-1) tri_rapide(t, pivot+1, dernier) fin si fin 5) Tri fusion Le principe est de diviser le tableau en deux, puis diviser chaque sous-tableaux en deux par récursivité, et ainsi de suite, jusqu'à ce qu'il n'y est plus qu'un élément. Il est alors bien placé dans son sous-tableau, on fusionne alors les sous-tableaux deux à deux en veillant à conservé l'ordre. Complexité O(nlog(n)) fonction scinder(liste0) : si longueur(liste0) <= 1, renvoyer le couple (liste0, liste_vide) sinon, soient e1 et e2 les deux premiers éléments de liste0, et reste le reste de liste0 soit (liste1, liste2) = scinder(reste) renvoyer le couple de listes (liste de tête : e1 et de queue : liste1, liste de tête : e2 et de queue : liste2) fonction fusionner(liste1, liste2) : si la liste1 est vide, renvoyer liste 2 sinon si la liste2 est vide, renvoyer liste 1 sinon si tête(liste 1) <= tête(liste2), renvoyer la liste de tête : tête(liste1) et de queue : fusionner(queue(liste1),liste2) sinon, renvoyer la liste de tête : tête(liste2) et de queue : fusionner(liste1,queue(liste2)) fonction trifusion(liste0) : si longueur(liste0) <= 1, renvoyer liste0 sinon, soit (liste1, liste2) = scinder(liste0) renvoyer fusionner(trifusion(liste1), trifusion(liste2))

III Un Programme 1) stdlib.h et stdio.h stdlib : contient la définition des constantes symboliques EXIT_SUCCESS (=0) et EXIT_FAILURE (= 1) En cas de déroulement normal, la fonction main renvoie EXIT_SUCCESS, sinon EXIT_FAILURE. stdio : contient les fonctions de base printf et scanf 2) scanf et printf scanf : permet la saisie d'une donnée. Lorsque l'on demande à l'utilisateur de rentrer une valeur pour une variable, on l'utilise de la façon suivante : scanf("%d", &NOM_DE_LA_VARIABLE); ( %d pour int, %ld pour long, %f pour float,%lf pour double,%c pour char, %s chaîne de caractères ) printf : permet d'afficher un texte et/ou des variables (dépend du type). Exemple : printf("%d", NOM_DE_LA_VARIABLE) ; 3) la fonction main, fonction et procédure Fonction : renvoie une valeur grâce à un return, de nimporte quel type du moment que c'est celle annoncé avant le nom de la fonction Procédure : fonction de type void (vide), ne renvoie donc rien par un return, peut en renvoyer par utilisation des parametres en resultat La fonction main doit être de type int, ne prendre aucun paramètre en entrée, et finir par un "return EXIT_SUCCESS" (ou un return EXIT_FAILURE si il y a un cas où le programme plante) int main () { blablabla; return EXIT_SUCCESS; 4) passage de paramètres Paramètres données : Type_resultat nomdelafonction ( Type_parametres_donnée parametre) Paramètres résultats Type_resultat nomdelafonction ( Type_parametres_resultats *parametre) Le "*" signifie qu'on donne en réalité l'adresse du paramètre, le * peut se traduire par "objet adressé par", ce qui permet de récupérer le resultat dans une autre fonction sans utiliser return. Ceci peut être pratique lorsqu'on veut renvoyer plusieurs résultats à la fonction main.

Le "&" peut être traduit par "l'adresse de cet objet", il est souvent utilisé lorsqu'on fait appel à une fonction utilisant des paramètres résultats (exemple scanf) int main () { fonction(donnée1, donnée2, &donnée_resultat); 5) modules, compilation et makefile Lorsqu'on programme en module on utilise des fichiers.h et des fichiers.c Les fichiers.c contiennent le code des fonctions que vous programmez, l'utilisateur n'y a pas accès. Les fichiers.h contiennent la declaration des fonctions présentes dans le fichier.c et est accessible à l'utilisateur, ainsi il peut utiliser les fonctions sans en voir le code et comprendre comment elles marchent. Dans un.h : on met le prototype des fonctions, c'est-à- dire leur type, nom et arguments (exemple : int factorielle(int n);) les constantes, headers et bibliothèques (exemple : #DEFINE N 10 ou #include"stdio.h") Dans le.c : on met surtout la définition des fonctions -> moins il y a de choses, mieux c'est! Pour compiler un.c seul : gcc -Wall FICHIERACOMPILER.c -o FICHIERCOMPLIE On peut avoir besoin des plusieurs fichiers.c dans un autre fichier.c, on les compile alors pour en faire des fichiers.o : gcc -Wall FICHIERACOMPILER.c Les fichiers.o sont des morceaux d'éxécutable, ils seront rassemblés lors de l'édition de liens. Makefile : Le makefile est un fichier texte contenant les instructions dans l'ordre pour compiler l'intégralité des modules programmés et en faire un éxécutable. Pour faire un makefile qui compile plusieurs fichiers : Imaginons la situation suivante : un fichier usecomplexe.c dans lequel on déclare une fonction usecomplexe qui a besoin d'un autre fichier complexe.o. On va d'abord dire à la machine de générer usecomplexe puis chacuns des.o. usecomplexe: usecomplexe.o complexe.o gcc -Wall usecomplexe.o complexe.o -o usecomplexe usecomplexe.o: usecomplexe.c usecomplexe.h gcc -Wall usecomplexe.c -c usecomplexe.o complexe.o: complexe.c complexe.h gcc -Wall complexe.c -c complexe.o Lorqu'on utilise une librairie, ajouter l'option -lnom-librairie (juste avant le-o pour le makefile)

Un makefile doit être constitué de déclarations sur deux lignes : module_cible : liste des modules dont il a besoin <TAB> gcc etc PS : n'écrivez pas <TAB>, faites simplement une tabulation ces déclarations se font de la manière suivante : les cibles n'ont besoin que de modules situés en dessous dans le makefile Exemple : prgm_principal : prgm1.o prgm2.o gcc -Wall prgm1.o prgm2.o -o prgm_principal prgm1.o : prgm2.h prgm1.c gcc -Wall prgm1.c prgm2.o : prgm2.h prgm2.c gcc -Wall prgm2.c On utilise la commande make qui lit le fichier makefile et execute les instructions de compilations (et seulement les nécessaires) Lorsqu'on utilise une librairie, dans le terminal, si il n'arrive pas à trouver la libraire, utiliser la commande export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. pour exporter la variable du chemin. IV Les pointeurs 1) Qu'est ce qu'un pointeur Lorsqu'on déclare une variable(int a par exemple), un espace mémoire est reservé. On a donc deux choses différentes : le contenu de cet espace (a) et son adresse (&a). Un pointeur est une variable qui contient cette adresse, c'est une sorte de flèche qui pointe vers notre espace mémoire. On déclare un pointeur de la mainière suivante : int pointeur; le symbole "*" signifie qu'on utilise un pointeur pointeur est donc une adresse, et si on veut utiliser le contenu de l'espace vers lequel il pointe, on utilise *pointeur exemple : la fonction echanger void echanger ( int *pt1, int *pt2) { int aux = *pt1; *pt1=*pt2; *pt2= aux;

malloc et free : dans l'exemple suivant, on peut avoir besoin d'un espace mémoire inconnu au moment de l'écriture du programme. Pour résoudre se problème, il faut demander au processeur de nous donner de l'espace grâce à la fonction malloc, qui revoie un pointeur *void sur notre espace reservé exemple : t=malloc(nbelements*sizeof(int)) On veut ici une place pour un certain nombre d'entiers, défini par l'utilisateur durant l'éxécution. On utilise free(t); pour rednre de nouveau cet espace libre après notre utilisation. 2) Interêts : exemple du tableau dynamique On peut avoir envie d'écrire un programme sur des tableaux de tailles choisis par l'utilisateur, pour cela on utilise les tableaux dynamiques. #include <stdlib.h> // malloc renvoie un pointeur générique (void *) #include <stdio.h> // pour printf et scanf int main() { int nbelements, i, *t1d; // t1d est un pointeur sur int printf("nombre d éléments : "); scanf("%d",&nbelements); if((t1d=malloc(nbelements*sizeof(int)))==null) { // allocation mémoire printf("erreur allocation mémoire"); // test de la valeur de retour return EXIT_FAILURE; // NULL si échec for (i=0;i<nbelements;i++) { // même utilisation qu un tableau statique printf("t1d[%d]? ",i); scanf("%d ",&t1d[i]); // &t1d[i] ou t1d+i free ( t1d ); // désallocation return EXIT_SUCCESS; Enfin, de manière plus pragmatique, si on travaille avec des objets lourds, il est moins coûteux de donner à une fonction un pointeur vers l'objet que l'objet lui même. Trucs et astuces : En c, au lieu d'écrire i=i+1, on écrit i++. De même, i+=5 ~ i=i+5. types Caractère, Entier, Réel char, int, double Définitions d objets objet1, objet2 : NomType NomType objet1, objet2 ; Actions simples instruction expression ; Actions composées ( N>1) instruction 1... { expression 1 ;...

instruction N expression N ; Affectation var valeur var = valeur ; Conditionnelle (1èreforme) si condition alors 1 sinon 2 fsi if ( condition ) 1 else 2 Itération (forme canonique) tant que condition faire ftq while ( condition ) Itération (variante) faire tant que ( condition ) do while ( condition ) ; Itération (schéma pour) pour i = val1 : Naturel à val2 pas h fpour i for (i=val1 ; i<=val2 ; i=i+h) Deux opérateurs div mod / // opérandes de type entier % Deux s simples saisir ( x ) afficher ( y ) scanf ("%d", &x ) ; printf ("%d ", y ) ;