• Aucun résultat trouvé

Algorithmique et Langage C

N/A
N/A
Protected

Academic year: 2022

Partager "Algorithmique et Langage C"

Copied!
27
0
0

Texte intégral

(1)

Algorithmique et Langage C

www.polytech.unice.fr/žvg/index-xidian.html

Granet Vincent - Vincent.Granet@univ-cotedazur.fr

Xi’an - Octobre 2019 - Avril 2020

(2)

Problème

1 Les données que manipule un programme sont placées en mémoire centrale etdisparaissentà la fin de son exécution.

2 la mémoire centrale de l’ordinateur a une capacité finie, et un programme ne pourra pas mémoriser des données d’une taille supérieureà celle de la mémoire centrale.

Solution

les fichierspermettent de conserver de l’information sur des supports externes (e.g.disques), et utilisent les mécanismes d’entrée/sortiedu SGF sous-jacent

il existe plusieursmodèlesde fichiers. Nous étudierons ici le modèle

(3)

Définition

Les fichiersséquentiels modélisent la notion desuite d’éléments telles que l’on ne peut accéder à un élément qu’après avoir accédé à tous ceux qui le précédent.

Opérations

Les opérations de base sont lalectureet l’écriture. À tout moment,un seul élément est accessible à la fois, qui est à laposition courante.

Les opérations de lecture ou d’écriture, permettent de modifier cette position courante pour accéder à l’élément suivant.

son

(4)

Déclaration

v a r i a b l e f : f i c h i e r de T

Le typeTdes éléments est quelconque (sauf, en général, fichier,i.e.pas de fichier de fichiers)

Le nombre d’éléments d’un fichiern’est pas fixépar la déclaration. Il pourravarier.

Ci-dessous, la variable chentest un fichier d’entiers

v a r i a b l e fichent : f i c h i e r de entier

(5)

Notation

Pour exprimer lasémantiquedes opérations sur un fichierf deT, on définit :

&l’opérateur de concaténation ; f↑l’élément à la position courante

f tous les éléments qui précèdent la position courante

f tous les éléments à partir de la position courante

f=f&f, etf↑= premier(f) f=<3 6−21 17>,f=<>

fdf(f)⇒f =<>

son

(6)

Mode écriture

Ouverture :initÉcriture

{} initÉcriture(f) { f=<> et fdf(f) }

Écriture :écrire

{ f=x,e=tT,fdf(f) } écrire(f, e) { f=x &<t>,fdf(f) }

+fdf(f)est toujoursvraiavant et après une écriture Fermeture :fermer

{ f=f } fermer(f) { f=f et fn'est plus accessible }

(7)

Création de fichiers : algorithme

v a r i a b l e f : f i c h i e r de T {initialisation}

initÉcriture(f) t a n t q u e B f a i r e

{calculer un nouvel élément de type T } calculer(e)

{l'écrire à la fin du fichier}

écrire(f,e) f i n t a n t q u e fermer(f)

son

(8)

Création de fichiers : exemple

{ création d'un fichier de n entiers tirés aléatoirement}

v a r i a b l e f : f i c h i e r de entier

{Antécédent : n>0}

{Conséquent : i=n et f suite de n entiers tirés au hasard}

initÉcriture(f) i 0

t a n t q u e i 6= n f a i r e i i + 1

écrire(f,random()) f i n t a n t q u e

fermer(f)

(9)

Mode lecture

Ouverture :initLecture

{f=<>} initLecture(f) { fdf(f) et f=f=<> }

ou

{f=x } initLecture(f) { f=f,f=<>, non fdf(f),f= premier(x) }

Fermeture :fermer

{ f=f } fermer(f) { f=f,fn'est plus accessible }

son

(10)

Mode lecture Lecture :lire

{f=x,f=<t>, non fdf(f),f=t } lire(f,e)

{f=x&<t>,f=<>,fdf(f),e=t }

ou

{f=x,f=<t>&y, non fdf(f),f=t } lire(f,e)

{f=x&<t>,

f=y, non fdf(f),f= premier(y),e=t }

(11)

Consultation de fichiers : algorithme

{initialisation}

InitLecture(f)

t a n t q u e non fdf(f) f a i r e

{ fest l'élément courant du fichier lu}

lire(f,e) traiter(e) f i n t a n t q u e { fdf(f) } fermer(f)

son

(12)

Consultation de fichiers : exemple

{pré−condition : f fichier de réels}

{post−condition : somme = somme des réels contenus dans le fichier f } f o n c t i o n somme(donnée f : f i c h i e r de réels) : réel

v a r i a b l e s e, som: réels InitLecture(f)

som 0

t a n t q u e non fdf(f) f a i r e

{som = somme des éléments de f et non fdf(f)}

lire(f, e) som som + e f i n t a n t q u e

{ som = somme des éléments de f etfdf(f) } fermer(f)

r e n d r e som

(13)

Fichiers de texte

rôle fondamental dans la communication entre le programme et les utilisateurs humains

fichier decaractèresqui possède une structure de lignes (suite de lignes) - prédicatfdln

possibilités de lectures ou d’écritures de valeurs différentes du type caractères⇒conversionsde type

v a r i a b l e f : f i c h i e r de texte écrire(f, 125) '1' '2 '5'

fichiersstandard:entréestandard,sortiestandard etsortie d’erreur standard

son

(14)

Les fichiers en C

mis en œuvre par le support d’exécution

un fichier est vu comme unesuite linéaire d’octetssans structure particulière

les éléments d’un fichierne sont donc pas typés, c’est au programmeur d’en assurer la gestion

FILEdescripteur de fichier défini dansstdio.h EOFcette constante représente la fin de fichier son

(15)

Ouverture

FILE fopen(const char f, const char m)pour ouvrir le fichier de nomfselon le modem("r","w", ...)

renvoie unpointeursur le descripteur de fichier ouvert, ouNULLen cas d’erreur

Fermeture

int fclose(FILE fd)pour fermer le fichier de descripteurfd renvoie0si pas d’erreur de fermeture, etEOFen cas d’erreur son

(16)

Exemple

# i n c l u d e <stdio.h>

# i n c l u d e <stdlib.h>

# i n c l u d e <errno.h>

....

FILE in;

// ouvrir le chier "nom_ chier" en lecture i f ((in = fopen("nom_fichier", "r")) == NULL) {

perror("nom_fichier");

exit(errno);

}

.... // lire les éléments du chier // fermer le chier

i f (fclose(in)==EOF) { perror("nom_fichier");

exit(errno);

(17)

fgetc et fputc

int fgetc(FILE fd)renvoie le prochain octetlusur le fichier de descripteurfd, ouEOFen fin de fichier

int fputc(int c, FILE fd)écritl’octetcdans le fichier de descripteurfdet renvoie l’octet écrit ouEOFen cas d’erreur

int ungetc(int c, FILE fd)remet le caractèrecdans le fichier de descripteurfdet renvoie l’octetcouEOFen cas d’erreur

rappel: en C le typecharesttoujourscodé sur 8 bits.

problème:EOFbien souvent égal à -1

représentation du typechar: signée, non signée, pseudo-non signée

son

(18)

Exemple

FILE in, out;

i n t c;/ et pas de type char !!!! /

// ouverture des chiers ....

// recopie de in dans out

w h i l e ((c=fgetc(in))!=EOF)

fputc(c, out);

// fermeture des chiers ....

(19)

fread et fwrite

le type des éléments d’un fichier doit être géré par le programmeur int fread(void ptr, int s, int n, FILE fd)lits×noctets depuis le flotfdet les range à l’adresseptr

int fwrite(void ptr, int s, int n, FILE fd)prends×n octets à l’adresseptret lesécritdans le flotfd

ces 2 fonctions renvoient le nombre d’élémentseffectivementlus ou écrits.

lafin de fichierest déterminée par une valeur de retour defreadégale à 0

mais aussi avec la fonction booléenneint feof(FILE fd) son

(20)

Création d’un fichier de n entiers longs

/

Rôle : crée le fichier f avec n entiers tirés de façon aléaoire /

v o i d creerFich(c h a r f, i n t n) { FILE fd;

// ouvrir le chier "f" en écriture i f ((fd = fopen(f, "w")) == NULL) {

perror(f);

exit(errno);

}

srandom(times(NULL));

f o r (i n t i=0; i<n; i++) {

l o n g x = random();

fwrite(&x, s i z e o f(l o n g), 1, fd);

}

(21)

/

Rôle : renvoie le nombre d'entiers pairs contenus dans f /

i n t nbEntiersPairs(c h a r f) {

FILE fd;

i n t n=0; l o n g x;

// ouvrir le chier "f" en lecture i f ((fd = fopen(f, "r")) == NULL) {

perror(f);

exit(errno);

}

w h i l e (fread(&x, s i z e o f(l o n g), 1, fd)>0) i f ((x&1)==0) n++;

// n de chier de fd fclose(fd);

r e t u r n n;

}

(22)

fgets et fputs

pour lire ou écrire une chaîne de caractères

char fgets(char s, int n, FILE fd)lit au plusncaractères dans le flotfdet renvoie une chaîne formée de ces caractères.'\0'est ajouté

int fputs(const char s, FILE fd)écrit dans le flotfdla chaîne de caractèress. En cas d’erreur. le fonction renvoieEOF

son

(23)

fputs

/ Rôle : écrit la chaîne s dans le flot fd / i n t fputs (c o n s t c h a r s, FILE fd) {

c o n s t i n t lg = strlen (s);

r e t u r n fwrite(s, 1, lg, fd)!=lg ? EOF : 0;

}

son

(24)

Fichiers de texte pas de type prédéfini

simples fichiers de caractères (fgetc,fputc) fin de ligne'\n'

entrées/sorties formatéesfprintfetfscanf

directives de conversion,e.g."%d","%f","%lf","%c","%s", ... et des modificateurs,e.g."%2.1f", ...

son

(25)

i n t fprintf(FILE fd, c o n s t c h a r format, ...)

i n t fscanf(FILE fd, c o n s t c h a r format, ...)

ces 2 fonctions renvoient le nombre de valeurs écrites ou lues, ouEOF en cas d’erreur

Exemple

FILE in, out;

i n t n;

c h a r nom[MAX];

...

fscanf(in, "%s %d", nom, &n);

fprintf(out, "%s %d\n", nom, n);

(26)

Fichiers standard

entrée standard (stdin) sortie standard (stdout) sortie erreur standard (stderr)

/ fonctions d'écriture sur stdout / i n t putchar(i n t c)

i n t puts(c h a r s)

i n t printf(c o n s t c h a r format, ...) / fonctions de lecture sur stdin / i n t getchar(v o i d)

c h a r gets(c h a r s);

(27)

fichiers standard : exemple

c h a r nom[MAXALPHA];

d o u b l e note1, note2;

// parcourir l'entrée standard.

// chaque ligne contient un nom et 2 notes (double)

w h i l e (scanf("%s %lf %lf", nom, &note1, &note2)>0) // écrire sur la sortie standard le nom et la // moyenne des 2 notes

printf("%s %.2f\n", nom, (note1+note2)/2);

son

Références

Documents relatifs

La qualit´ e de la r´ edaction, la clart´ e et la pr´ ecision des raisonnements interviendront pour une part importante dans l’appr´ eciation des copies.. Int´ egrales de Wallis

Soit f une fonction continue et positive d´ efinie sur l’intervalle [a; b] et x un nombre r´ eel quelconque de

Société spécialisée dans la vente par correspondance de biscuits et chocolats, HORIZON 2000 sou- haitait optimiser la gestion de son stock et de ses préparations de commandes dans

Lebois par ses qualités d'aspect et par la diversité de ses mises en œuvre est en mesure d'établir cette transition entre bâti ancien et édifice nouveau en raison de son

[r]

Un nombre entier naturel non nul n est dit parfait si la somme des diviseurs de n qui sont supérieurs ou égaux à 1 est égale au double de n. Par exemple, 6 est un

[r]

GtkWidget* gtk_label_new(const gchar* str); crée un objet GtkLabel de libellé str void gtk_label_set_label(GtkLabel* label, const gchar* str); affecte le libellé str au label