Liste de  cours langage c

Initiation language C sous Linux : fichiers ps


Télécharger



Initiation language C sous Linux : fichiers ps

formation informatique

Introduction

GNU/Linux a envahi le monde des ordinateurs comme une tempête. Il fut un temps où les utilisateurs d’ordinateurs étaient obligés de faire leur choix parmi des systèmes d’exploitation et des applications propriétaires. Ils n’avaient aucun moyen



de corriger ou d’améliorer ces programmes, ne pouvaient pas regarder « sous le capot », et étaient souvent forcés d’accepter des licences restrictives. GNU/Linux et d’autres systèmes open source ont changé cet état de faits – désormais, les utilisateurs de PC, les administrateurs et les développeurs peuvent choisir un environnement complet gratuit avec des outils, des applications et l’accès au code source.

Une grande partie du succès de GNU/Linux est liée à sa nature open source. Comme le code source des programmes est disponible pour le public, tout un chacun peut prendre part au développement, que ce soit en corrigeant un petit bogue ou en développant et distribuant une application majeure complète. Cette opportunité a attiré des milliers de développeurs compétents de par le monde pour contribuer à de nouveaux composants et améliorations pour GNU/Linux, à un tel point que les systèmes GNU/Linux modernes peuvent rivaliser avec les fonctionnalités de n’importe quel système propriétaire et les distributions incluent des milliers de programmes et d’applications se répartissant sur plusieurs CD-ROM ou DVD.

Le succès de GNU/Linux a également avalisé la philosophie UNIX. La plupart des Interfaces de Programmation d’Application (Application Programming Interfaces, API) introduites dans les UNIX AT&T et BSD survivent dans Linux et constituent les fondations sur lesquelles sont construits les programmes. La philosophie UNIX de faire fonctionner de concert beaucoup de petits programmes orientés ligne de commande est le principe d’organisation qui rend GNU/Li­nux si puissant. Même lorsque ces programmes sont encapsulés dans des interfaces graphiques simples à utiliser, les commandes sous-jacentes sont toujours disponibles pour les utilisateurs confirmés et les scripts.

Une application GNU/Linux puissante exploite la puissance de ces API et de ces com­mandes au niveau de son fonctionnement interne. Les API GNU/Linux donnent accès à des fonctionnalités sophistiquées comme la communication interprocessus, le multithreading et la communication réseau hautes performances. Et beaucoup de problèmes peuvent être résolus simplement en assemblant des commandes et des programmes existants au moyen de scripts.

GNU et Linux

D’où vient le nom GNU/Linux? Vous avez certainement déjà entendu parler de Linux auparavant et vous avez peut-être entendu parler du Projet GNU. Vous n’avez peut-être jamais entendu le nom GNU/Linux, bien que vous soyez probablement familier avec le système auquel il se réfère.

Linux vient de Linus Torvalds, le créateur et l’auteur original du noyau1 à la base du fonctionnement d’un système GNU/Linux. Le noyau est le programme qui effectue les opérations de base d’un système d’exploitation: il contrôle et fait l’interface avec le matériel, gère l’allocation de la mémoire et des autres ressources, permet à plusieurs programmes de s’exécuter en même temps, gère le système de fichiers et caetera.

Le noyau en lui-même n’offre pas de fonctionnalités utiles à l’utilisateur. Il ne peut même pas afficher une invite pour que celui-ci entre des commandes élémentaires. Il n’offre aucun moyen de gérer ou d’éditer les fichiers, de communiquer avec d’autres ordinateurs ou d’écrire des programmes. Ces tâches requièrent l’utilisation d’une large gamme d’autres produits comme les shells de commande, les utilitaires de fichiers, les éditeurs et les compilateurs. La plupart de ces programmes utilisent à leur tour des bibliothèques de fonctions comme la bibliothèque contenant les fonctions standards du C qui ne sont pas incluses dans le noyau.formation informatique

Sur les systèmes GNU/Linux, la plupart de ces programmes sont des logiciels développés dans le cadre du Projet GNU2. Une grande partie de ces logiciels ont précédé le noyau Linux. Le but du projet GNU est de « développer un système d’exploitation de type UNIX qui soit un logiciel libre » (d’après le site Web du Projet GNU,

Le noyau Linux et les logiciels du Projet GNU ont prouvé qu’ils sont une combinaison puissante. Bien que cette association soit souvent appelée « Linux » par raccourci, le système complet ne pourrait fonctionner sans les logiciels GNU, pas plus qu’ils ne pourraient fonctionner sans le noyau. Pour cette raison, dans ce livre, nous ferons référence au système complet par le nom GNU/Linux, excepté lorsque nous parlerons spécifiquement du noyau Linux.

...

Les variables (1 partie)

2.1 printf : fonction indispensable pour afficher le contenu d'une variable

programme7.c

#include <stdio.h>

int main ()

{

printf ("Coucou c'est moi\n");

/* Affiche Coucou c'est moi à l'écran */

getchar();

/* Attendre l'appui d'une touche */

return (0);

1

On pourrait dire que la fonction printf est la même que l'instruction puts vue précédemment mais il n'en est rien... Celle-ci est beaucoup, beaucoup, beaucoup plus puissante.

Syntaxe : La syntaxe de printf est très complexe et pourrait à elle seule faire l'objet d'un

cours, nous en verrons donc des applications au fur et à mesure des besoins.

2.2 Variable

Comme son nom l'indique une variable est quelque chose qui varie. C'est vrai mais ce n'est pas suffisant. Une variable peut être considérée comme une boîte dans laquelle on met des données que l'on peut lire ou écrire.

La manière la plus facile de lire le contenu d'une variable est la fonction printf que l'on a aperçue précédemment. La manière la plus simple de donner une valeur à une variable est l'opérateur mathématique =. Écrire dans une variable ayant déjà une valeur revient à la modifier.

Une variable ne peut contenir qu'une seule chose à la fois. Si vous mettez une seconde donnée dans la variable, la précédente est effacée.

2.3 Déclaration d'une variable

La déclaration d'une variable se fait simplement en écrivant :

<son type> <son nom> ;

Exemples de type de variables : char : caractère

int : entier

2.4 Application : exemple

programme8.c

#include <stdio.h> int main () {

int i;

/* i : variable de type entier */ char car;

/* car: variable de type caractère */

i = 65;

/* i vaut 65 */

car = 'E';

/* car vaut E */

printf ("i vaut %d.\n", i);

/* Affiche la valeur de i */

printf ("car vaut %c.\n",car);

/* Affiche la valeur de car */

getchar();

/* Attendre l'appui d'une touche */

return (0);

}

Explications :

  1. On met dans la variable i la valeur 65.
  2. On met dans la variable car la valeur de E.

Note : En informatique, tout n'est que nombre, je dis donc la valeur de E et non E car c'est le code Ascii de E qui est sauvegardé dans cette variable. Nous reviendrons là dessus un peu plus tard.

  1. printf ("i vaut %d.\n", i) ; : %d signifie que l'on attend une valeur entière, le pro-gramme va donc remplacer le %d par la valeur de i.
  2. printf ("car vaut %c \n", car) ; : %c signifie que l'on attend une valeur de type carac-tère, le programme va donc remplacer le %c par la valeur de car. \n permet de réaliser un retour chariot c'est à dire un retour à la ligne.

2.5 Utilisation multiple du %

Le code « %x » signifie que le compilateur C doit remplacer ce code par la valeur correspondante (qui lui est fourni dans la suite de l'instruction) en la transformant dans le type x. Cette transformation est appelé un cast.

Exemple :

int i;

i =65;

printf ("Le caractère %d est %c",i,i);

nous donnera l'affichage suivant :

Le caractère 65 est A.

Le %d est remplacé par la valeur numérique de i c'est à dire 65.

Le %c est remplacé par la valeur alphanumérique (ASCII) de i c'est à dire A (cf. Table Ascii en

Annexe).

2.6 Exercices d'applications directes

  1. En utilisant ce qui a été fait précédemment, faîtes afficher les valeurs 70, 82, 185 et 30.
  2. En utilisant ce qui a été fait précédemment, faîtes afficher, les caractères c, o, u, C, O, U.

2.7 Réutilisation d'une variable

On peut réutiliser une variable autant de fois que l'on veut, la précédente valeur étant effacée : — i = 3 ; i = 5 ; i = 7 ; donnera au final pour valeur de i la valeur 7.

— car = 'E' ; car = 'G' ; car = 'h' ; donnera au final pour valeur de car la valeur de 'h'.

2.8 Caractères spéciaux

Certains caractères utilisés par la fonction printf (« % » par exemple) ou même tout simplement pour déclarer une variable (' pour les caractères par exemple) obligent à utiliser le caractère de suffixe \ pour pouvoir être affichés.

Exemple : Pour afficher un % avec printf j'écrirai :

printf("La réduction était de 20

\%") ;

Pour déclarer un caractère avec la valeur ' (prononcée quote en informatique et non pas apostrophe (français)), on écrira :

char car; car = '\";

2.9 Exercices à réaliser

  1. Faire un programme qui réalise l'affichage suivant en utilisant les variables. Aide : Sans retour chariot, on affiche à la suite.

Coucou

  1. De la même façon, réaliser un programme qui réalise l'affichage suivant :

C'est rigolo

Rappel : Pour mettre une variable c égale à ' on écrit c='\"

  1. Ecrire un programme qui écrit :

Qc Hamlet says "To be or not to be, that is the question." > avec les " bien sûr.

Rappel : Pour pouvoir afficher un caractère de syntaxe C, par exemple ", on utilise le caractère \ comme préfixe à ce caractère. Pour obtenir un ", on utilise donc \".

Corrigés des exercices du chapitre 2

Faites afficher, en utilisant ce qui a été fait précédemment, les valeurs 70, 82, 185 et 30.

programme9.c

Faites afficher, en utilisant ce qui a été fait précédemment, les caractères c, o, u, C, O, U.

programme10.c

...

Chapitre 3 e

Les variables (2 partie)

Durant tout ce chapitre, nous aurons pour but simple, mais complet et complexe dans sa pro¬grammation, de faire une malheureuse calculatrice.

Attention: Afin de pouvoir utiliser la bibliothèque mathématique du C (#include <math.h»,

il est nécessaire d'ajouter au moment de l'édition de liens -lm ce qui nous donne :

gcc -o monprog monprog.o -lm

3.1 Exercice de mise en bouche

Ecrire un programme qui :

— écrit « Calculatrice : » et saute 2 lignes;

— écrit « Valeur de a : » et saute 1 ligne;

— attend l'appui d'une touche;

— écrit « Valeur de b : » et saute 1 ligne;

— attend l'appui d'une touche;

— écrit « Valeur de a + b : » ;

Pas à pas, nous allons maintenant réaliser notre petit programme de calculatrice.

3.2 Déclaration des variables

Complétez le programme en :

— déclarant 2 variables a et b de type int (entier) ;

— assignant à ces deux variables les valeurs 36 et 54 ;

— faisant afficher le résultat de la somme de a + b (et non pas en faisant afficher 90 !).

Pour faire afficher le résultat il est possible d'utiliser la fonction printf directement ou indirec¬tement en utilisant une troisième variable. Pour plus de facilité, nous allons utiliser un affichage direct. Celui-ci s'effectue de la façon suivante :

 printf ("Valeur de a + b : %d",a+b) ; Le %d est remplacé par la valeur de a+b.

3.3 Saisie des variables

Si une calculatrice se limitait à exécuter la somme de deux nombres fixes, le boulier serait encore de mise.

Pour saisir une variable, il est nécessaire d'utiliser la fonction scanf. La fonction scanf s'utilise de la façon suivante :

Saisie de la valeur a : scanf ("%d", &a) ;

Comme pour printf, on reconnaît le %d pour la saisie d'un nombre entier. Le & devant le a signifie que l'on va écrire dans la variable a.

Aïe... En fait &a signifie « l'adresse mémoire de a ». La fonction scanf va donc écrire dans

l'emplacement mémoire (la petite boîte contenant la variable) de a. Si l'on oublie le &, on écrira chez quelqu'un d'autre, à une autre adresse. Et là ça peut faire mal, très mal...Mais ceci est une autre histoire.

Nous allons maintenant saisir les variables a et b. Pour exemple, je mets ici le code pour la saisie de a, la saisie de b reste à faire par vos soins à titre d'exercice.

/* Saisie de la valeur de a */ printf ("Valeur de a :\n"); scanf ("%d",&a);

Il est conseillé d'initialiser les variables avant de les utiliser. Au début du programme, après leur déclaration, assignez à a et à b la valeur 0.

Exemple : a = 0 ;

Si tout s'est bien passé, vous avez maintenant entre les mains une super calculatrice qui réalise des additions!

N.B. Appuyez sur la touche Enter (Entrée) après avoir tapé votre valeur.

Pour aller plus rapidement, il est possible d'initialiser une variable dans le même temps que sa déclaration. Pour cela, rien de plus simple, ajoutez à la fin de la déclaration = suivi de la valeur d'initialisation :

Exemple : int i = 10 ;

Evolution du logiciel : exercice Aïe aïe aïe, dur dur d'être informaticien. J'ai envie de faire une super calculatrice et je me dis qu'en fait la simplicité qui a eu lieue tout à l'heure n'est pas forcément adaptée à l'évolution désirée.

Déclarer une troisième valeur de type int (penser à l'initialiser à 0) que l'on nommera bête-ment s comme somme. Une fois les valeurs de a et b saisies, initialisez s avec la valeur de a + b. Comme en mathématiques élémentaires. Affichez la valeur de s. On devrait avoir les même résultats qu'auparavant, bien sûr.

 Exercices d'application : Réalisez 2 petits programmes qui font :

— la soustraction de 2 nombres;

— la multiplication de 2 nombres.

Un nouveau type : les nombres à virgule ou flottants (float). Le type float permet de déclarer un nombre à virgule. Transformez les 3 précédents programmes en utilisant le type float au lieu du type int et %f pour saisir les valeurs de a et b, et pour afficher le résultat.

Petite aide : Ce petit morceau de programme saisit la valeur de a et la fait afficher :

float a;

printf ("Saisie de a ~"); scanf ("%f",&a);

printf ("\na vaut . %f",a); getchar ();

Pour un affichage plus agréable il est possible de fixer le nombre de chiffres après la virgule de la façon suivante : %.[nombre de chiffres après la virgule]f

Exemple : printf ("%.2f",a) ;

Ouah, les 4 opérations!!! Créer un quatrième programme qui réalise la division de deux nombres. Tester avec une division par 0 ! ! ! La solution à ce petit problème sera vu dans le cours sur les conditions (if).

Exercices à réaliser Compléter les 4 programmes afin de réaliser les opérations suivantes :

s = a + b + c

s = a -b-c

s = a / b / c

s = a * b * c

où a,b et c sont des nombres à virgules (float).

La fonction abs permet d'obtenir la valeur absolue d'un nombre entier. Utiliser cette fonction pour calculer la valeur absolue de (a-b).

Exemple d'utilisation de abs : S = abs (a-b) ;

La fonction ceil permet d'obtenir l'arrondi entier supérieur d'un nombre réel. Utiliser cette fonc¬tion pour calculer l'arrondi supérieur de (a / b).

Exemple d'utilisation de ceil : S = ceil (a/b) ;

Corrigés des exercices du chapitre 3

Soustraction de 2 nombres

programme14.c

#include <stdio.h> #include <math.h>

int main () {

int a,b; /* Déclaration des variables */

int d; /* Différence entre les 2 nombres */

a=0; /* Initialisation des variables */

b=0;

printf("Calculatrice :\n\n"); printf("Valeur de a : "); scanf("%d",&a);

printf("\n");

printf("Valeur de b : "); scanf("%d",&b);

d=a-b;

printf("Valeur de a-b : %d\n",d); /* Affichage de la différence */

getchar (); return (0);

}

Multiplication de 2 nombres

programme15.c

#include <stdio.h> #include <math.h>

int main () {

int a,b; /* Déclaration des variables */

int m; /* Résultat de la multiplication */

a=0; /* Initialisation des variables */

b=0;

printf("Calculatrice :\n\n");

printf("Valeur de a : ");

scanf("%d",&a); printf("\n");

printf("Valeur de b : ");

scanf("%d",&b);

m = a*b;

printf("Valeur de a*b : %d\n", m); /* Affichage de la multiplication */

getchar (); return (0);

}

Transformez les 3 précédents programmes avec le type float Aucune difficulté dans cet exercice, je ne mettrai ici la correction que de la multiplication, les autres opérations se réalisent sur le même schéma.

programme16.c

#include <stdio.h> #include <math.h>

int main () {

float a,b; /* Déclaration des variables */

float m; /* Résultat de la multiplication */

a=0; /* Initialisation des variables */

b=0;

printf("Calculatrice :\n\n"); printf("Valeur de a : "); scanf("%f",&a);

printf("\n");

printf("Valeur de b : "); scanf("%f",&b);

m = a*b;

printf("Valeur de a*b : %f\n", m); /* Affichage de la multiplication */

getchar (); return (0);

}

Pour l'addition :

m = a + b;

printf ("Valeur de a+b : %f", m);

Pour la soustraction :

m = a - b;

printf ("Valeur de a-b : %f", m);

Calculer la somme a + b + c

programme17.c

#include <stdio.h> #include <math.h>

int main () {

float a,b,c,s; /* Déclaration des variables */

a=0; /* Initialisation des variables */

b=0; c=0; s=0;

printf("Saisie de a : "); scanf("%f",&a);

printf("Saisie de b : "); /* Saisie variables flottantes */

scanf("%f",&b);

printf("Saisie de c : ");

scanf("%f",&c);

s = a+b+c; /* Calcul de la somme */

printf("Valeur de s : %.2f\n",s); /* Affichage de la somme */

getchar (); return (0);

}

Calculer la différence a - b - c

d = a-b-c; /* Calcul de la différence */

printf("Valeur de d : %.2f\n",d); /* Affichage de la différence */

Calculer la multiplication a * b * c

m = a*b*c; /* Calcul de la multiplication */

printf("Valeur de m : %.2f\n",m); /* Affiche la multiplication */

Calculer la division a / b / c

d = a/b/c; /* Calcul de la division */

printf("Valeur de d : %.2f\n",d); /* Affichage de la division */

Calculer la valeur absolue de a - b

r=abs(a-b); /* Calcul de la valeur absolue */

printf("Valeur de r : %f\n",r); /* Affiche la valeur absolue */

Calculer l'arrondi de a + b

c=ceil(a/b); /* Calcul de l'arrondi */

printf("Valeur de c : %f\n",c); /* Affichage de l'arrondi */

Il aurait été possible d'utiliser %d du fait que l'arrondi est un nombre entier!

 Chapitre 4

Les conditions

4.1 Exercice de mise en bouche

Ecrire un programme qui met en application le théorème de Pythagore pour calculer l'hypothénuse d'un triangle rectangle.

Rappel : Dans un triangle rectangle, l'hypothénuse (le plus grand côté) peut se calculer en applicant la formule suivante :

h yp othén use Vla 2 + b2

où a et b sont les longueurs des côtés adjacents à l'angle droit.

Notes : — La racine carrée s'obtient par l'utilisation de la fonction sqrt (valeur) contenue dans la bibliothèque math.h. (#include <math.h» peut s'obtenir par a*a.

Méthodologie : 1. Rechercher les variables nécessaires et les déclarer dans le programme.

  1. Faire saisir a au clavier.
  2. Faire saisir b au clavier.
  3. Effectuer l'opération de la racine carrée et afficher le résultat.

Attention: Afin de pouvoir utiliser la bibliothèque mathématique du C (#include <math.h»,

il est nécessaire d'ajouter au moment de l'édition de liens -lm ce qui nous donne :

gcc -o monprog monprog.o -lm

4.2 Les conditions : Si Alors Sinon

if (condition vraie)

{

instructions 1

}

else

{

instructions 2

}

si (condition vraie)

{ alors

faire instructions 1

}

sinon

{

faire instructions 2

}

Les conditions s'expriment avec des opérateurs logiques.

4.3 Opérateurs logiques

Ils servent à comparer deux nombres entre eux.

Libellé Opérateur

Inférieur <

Supérieur >

Egal __

Différent !_

Inférieur ou égal <_

Supérieur ou égal >_

4.4 Opérateurs logiques purs

Ce sont des opérateurs logiques permettant de combiner des expressions logiques.

Libellé Opérateur

Et (and) &&

Ou (or) ~~

Non (not) !

~ se nomme en informatique un pipe (prononcer païpe).

4.5 Vrai ou faux

La valeur Vrai peut être assimilée à la valeur numérique 1 ou à toute valeur non nulle. La valeur Faux peut être assimilée à la valeur numérique 0. L'opérateur Ou (11) correspond alors à une addition.

Ou Vrai Faux + 1 0

Vrai Vrai Vrai 1 2 1

Faux Vrai Faux 0 1 0

Chapitre 5

Mise au point

5.1 Prologue

L'objet de ce cours est de réaliser un petit break dans l'apprentissage du C et de s'attacher à voir ce que l'on est capable de réaliser avec le peu de moyen que l'on a.

Ce cours sera donc constitué de 3 exercices de difficulté croissante avec apprentissage d'une nouvelle fonction et d'un exercice complet de programmation.

5.2 Exercice 1

Réaliser un programme qui saisisse un nombre et indique à l'utilisateur si celui-ci est plus grand ou plus petit qu'un autre nombre fixé par le programme.

Exemple :

si (nbre_saisi<10) alors "plus petit"

Reprendre l'exercice du chapitre 4 qui disait si un nombre est strictement positif, strictement négatif ou nul.

5.3 Retour sur getchar()

La fonction getchar () permet d'attendre la frappe d'un caractère au clavier, de le lire et de le renvoyer. 2 utilisations peuvent être faites de getchar (), la première est celle permettant d'attendre la frappe d'une touche sans se soucier de sa valeur, la seconde est celle permettant de lire un caractère au clavier.

 Exemples :

  1. Attente getchar () ;
  2. Saisie d'un caractère char car; car = getchar () ;

A chaque fois, getchar () effectue le même traitement :

— Attendre la frappe d'une touche au clavier suivi d'un retour chariot (Entrée). — Renvoyer le caractère frappé.

~~

Dans le 1 cas, ce caractère n'est simplement pas récupéré.

5.4 Boucle Faire ... Tant que (vrai)

Do ... while, traduisez par Faire ... Tant que permet de réaliser une suite d'instructions tant qu'une condition ou un ensemble de conditions est rempli.

Exemple :

programme21.c

#include <stdio.h>

int main () {

char car; int sortie;

do

{

printf ("Tapez S pour sortir !\n");

/* On saisit un caractère */ car = getchar ();

/* On le compare pour savoir si l'on peut sortir */ sortie = ((car == 's') || (car == 'S')); } while (!sortie);

return (0);

}

Rappel :

— Un nombre entier vaut la valeur logique vraie si celui-ci est différent de 0. — Un nombre entier vaut la valeur logique faux si celui-ci est égal à 0. — || signifie un ou logique (or).

Remarque : Cette utilisation n'est pas très belle, le retour chariot utilisé pour la saisie du caractère étant renvoyé et interprété nous donne un affichage double. Malgré celà, au niveau de ce cours, nous nous en contenterons.

91