réseau informatique
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Le deal à ne pas rater :
Bon plan achat en duo : 2ème robot cuiseur Moulinex Companion ...
600 €
Voir le deal

indroduction au language C

Aller en bas

indroduction au language C Empty indroduction au language C

Message par dare_devil Ven 15 Fév - 8:13

indroduction au language C C

Connaissances de base


regardons ce petit programme :

#include <stdio.h>
#define TVA 18.6
void main(void)
{
float HT,TTC;
puts ("veuillez entrer le prix H.T.");
scanf("%f",&HT);
TTC=HT*(1+(TVA/100));
printf("prix T.T.C. %f\n",TTC);
}

On trouve dans ce programme :

* des directives du pré processeur (commençant par #)

#include : inclure le fichier définissant (on préfère dire déclarant) les fonctions standard d'entrées/sorties (en anglais STanDard In/Out), qui feront le lien entre le programme et la console (clavier/écran). Dans cet exemple il s'agit de puts, scanf et printf.

#define : définit une constante. A chaque fois que le compilateur rencontrera, dans sa traduction de la suite du fichier en langage machine, le mot TVA, ces trois lettres seront remplacées par 18.6. Ces transformation sont faites dans une première passe (appelée pré compilation), où l'on ne fait que du "traitement de texte", c'est à dire des remplacements d'un texte par un autre sans chercher à en comprendre la signification.

* une entête de fonction. Dans ce cas on ne possède qu'une seule fonction, la fonction principale (main function). Cette ligne est obligatoire en C, elle définit le "point d'entrée" du programme, c'est à dire l'endroit où débutera l'exécution du programme.

* un "bloc d'instructions", délimité par des accolades {}, et comportant :

* des déclarations de variables, sous la forme : type listevariables;

Une variable est un case mémoire de l'ordinateur, que l'on se réserve pour notre programme. On définit le nom que l'on choisit pour chaque variable, ainsi que son type, ici float, c'est à dire réel (type dit à virgule flottante, d'où ce nom). Les trois types scalaires de base du C sont l'entier (int), le réel (float) et le caractère (char). On ne peut jamais utiliser de variable sans l'avoir déclarée auparavant. Une faute de frappe devrait donc être facilement détectée, à condition d'avoir choisi des noms de variables suffisamment différents (et de plus d'une lettre).

* des instructions, toutes terminées par un ;. Une instruction est un ordre élémentaire que l'on donne à la machine, qui manipulera les données (variables) du programme, ici soit par appel de fonctions (puts, scanf, printf) soit par affectation (=).

Détaillons les 4 instructions de notre programme :

puts affiche à l'écran le texte qu'on lui donne (entre parenthèses, comme tout ce que l'on donne à une fonction, et entre guillemets, comme toute constante texte en C).

scanf attend que l'on entre une valeur au clavier, puis la met dans la mémoire (on préfère dire variable) HT, sous format réel (%f).

une affectation : on commence par diviser TVA par 100 (à cause des parenthèses), puis on y ajoute 1, puis on le multiplie par le contenu de la variable HT. Le résultat de ce calcul est stocké (affecté) dans la variable cible TTC. Une affectation se fait toujours dans le même sens : on détermine (évalue) tout d'abord la valeur à droite du signe =, en faisant tous les calculs nécessaires, puis elle est transférée dans la mémoire dont le nom est indiqué à gauche du =. On peut donc placer une expression complexe à droite du =, mais à sa gauche seul un nom de variable est possible, aucune opération.

printf affichera enfin le résultat stocké dans TTC.
Fonctions d'entrées/sorties les plus utilisées

Le langage C se veut totalement indépendant du matériel sur lequel il est implanté. Les entrées sorties, bien que nécessaires à tout programme (il faut lui donner les données de départ et connaître les résultats), ne font donc pas partie intégrante du langage. On a simplement prévu des bibliothèques de fonctions de base, qui sont néanmoins standardisées, c'est à dire que sur chaque compilateur on dispose de ces bibliothèques, contenant les même fonctions (du moins du même nom et faisant apparemment la même chose, mais programmées différemment en fonction du matériel). Ces bibliothèques ont été définies par la norme ANSI, on peut donc les utiliser tout en restant portable. Nous détaillerons la bibliothèque STDIO.H. Sous Turbo C on utilise en plus CONIO.H

Je détaille beaucoup ces fonctions, et si vous n'êtes qu'au début du cours vous ne pourrez pas tout comprendre (je vous autorise même à passer au chapitre suivant). Sachez simplement qu'au fur et à mesure de votre progression vous pourrez retourner ici pour trouver plus de détails. Dans un premier temps, seuls printf et scanf vous seront nécessaires. En fait, dès les premiers cours, les étudiants me demandent toujours "comment afficher ceci...", c'est pourquoi je mets ces détails ici. De toute façon je n'ai pas besoin de me justifier, bon sang qui c'est le chef ici ?

char putchar(char) : affiche sur l'écran (ou du moins stdout) le caractère fourni en argument (entre parenthèses). stdout est l'écran, ou un fichier si on a redirigé l'écran (en rajoutant ">nomfichier" derrière l'appel du programme, sous DOS ou UNIX). Si besoin est, cette fonction retourne le caractère affiché ou EOF en cas d'erreur.

char getchar(void) : attend le prochain appui sur le clavier, et rend le caractère qui a été saisi. Mais attention certains systèmes d'exploitation ne transmetent au programme les informations du clavier qu'après l'appui de la touche entrée (retour chariot). Le retour chariot est lui aussi transmis. De même, si l'on vient de saisir une valeur numérique, le prochain getchar prendra en compte le retour chariot ou espace qui terminait le nombre. Je conseille donc en général la boucle :

do reponse=getchar(); while (reponse<=32);

qui élimine le retour chariot (et les autres caractères spéciaux).

Sous Turbo C, char getch(void) : attend le prochain appui sur le clavier, et rend le caractère qui a été saisi. (sans attendre le retour chariot), getche(void) fait en plus un écho du caractère à l'écran.

Dans STDIO.H, on trouve des fonctions plus évoluées, pouvant traiter plusieurs caractères à la suite, et les transformer pour en faire une chaîne de caractères ou une valeur numérique, entière ou réelle par exemple. Les entrées sont dites "bufférisées", c'est à dire que le texte n'est pas transmis, et peut donc encore être modifié, avant le retour chariot.

puts(chaîne) affiche, sur stdout, la chaîne de caractères puis positionne le curseur en début de ligne suivante. puts retourne EOF en cas d'erreur.

gets(chaîne) lecture d'une chaîne sur stdin. Tous les caractères peuvent être entrés, y compris les blancs. La saisie est terminée par un retour chariot. Gets retourne un pointeur sur le premier caractère entré (donc égal à son paramètre d'entrée, ou le pointeur NULL en cas d'erreur. Attention, gets ne vérifie pas s'il y a eu débordement de buffer, contrairement à fgets (le débordement est une méthode utilisée pour pirater votre ordinateur). On écrira donc plutôt : fgets(chaine,sizeof(chaine),stdin);

printf(format,listevaleurs) affiche la liste de valeurs (variables ou expressions) dans le format choisi. Le format est une chaîne de caractères entre guillemets (double quote "), dans laquelle se trouve un texte qui sera écrit tel quel, des spécifications de format (débutant par %) qui seront remplacées par la valeur effective des variables, dans l'ordre donné dans listevaleurs, et de caractères spéciaux (\). Printf retourne le nombre de caractères écrits, ou EOF en cas de problème.

Une spécification de format est de la forme :

% [flag][largeur][.précision][modificateur]type (entre [] facultatifs)

Le flag peut valoir : - (cadrage à gauche, rajout de blancs si nécessaire à droite), + (impression du signe, même pour les positifs), blanc (impression d'un blanc devant un nombre positif, à la place du signe), 0 (la justification d'un nombre se ferra par rajout de 0 à gauche au lieu de blancs). D'autres Flags sont possibles mais moins utiles, pour plus de détails voir l'aide en ligne de Turbo C.

La largeur est le nombre minimal de caractères à écrire (des blancs sont rajoutés si nécessaire). Si le texte à écrire est plus long, il est néanmoins écrit en totalité. En donnant le signe * comme largeur, le prochain argument de la liste de valeurs donnera la largeur (ex printf("%*f",largeur,réel)).

La précision définit, pour les réels, le nombre de chiffres après la virgule (doit être inférieur à la largeur). Dans la cas d'entiers, indique le nombre minimal de chiffes désiré (ajout de 0 sinon), alors que pour une chaîne (%s), elle indique la longueur maximale imprimée (tronqué si trop long). La précision peut, comme la largeur, être variable en donnant .*

Le modificateur peut être : h (short, pour les entiers), l (long pour les entiers, double pour les réels), L (long double pour les réels).

Le type est : c (char), s (chaîne de caractères, jusqu'au \0), d (int), u (entier non signé), x ou X (entier affiché en hexadécimal), o (entier affiché en octal), f (réel en virgule fixe), e ou E (réel en notation exponentielle), g ou G (réel en f si possible, e sinon), p (pointeur), % (pour afficher le signe %).

Les caractères spéciaux utilisables dans le format sont \t (tabulation), \n (retour à la ligne), \\ (signe \), \nb tout code ASCII, en décimal, hexa ou octal (\32=\040=\0x20=' '). Essayez printf("\007");

scanf(format,listeadresse) lecture au clavier de valeurs, dans le format spécifié. Les arguments sont des pointeurs sur les variables résultats (dans le cas de variables scalaires, les précéder par l'opérateur &). Scanf retourne le nombre de valeurs effectivement lues et mémorisées (pas les %*).

Le format peut contenir (entre ") : du texte (il devra être tapé exactement ainsi par l'utilisateur, et ne sera pas stocké), des séparateurs blancs (l'utilisateur devra taper un ou plusieurs blancs, tabulations, retours à la ligne), et des spécifications de format, sous la forme %[*][largeur][modificateur] type.

* signifie que la valeur sera lue mais ne sera pas stockée (ex scanf("%d%*c%d",&i,&j) : lecture de deux entiers séparés par n'importe quel caractère)

la largeur est la largeur maximale lue, scanf s'arrête avant s'il trouve un séparateur (blanc, tab, CR).

les modificateurs et types sont les mêmes que pour printf (excepté d,o,x : pour entiers short, D,O,X pour long). Dans le cas des chaînes (%s), le blanc est également un séparateur. On ne pourra donc pas entrer une chaîne avec des blancs par scanf, il faut utiliser gets.

Scanf lit dans stdin en considérant les retours chariot (CR) comme des blancs. on peut donc séparer par des CR plusieurs valeurs demandées dans le même scanf. Mais de même, si scanf a pu lire tous ses arguments sans arriver à la fin de la ligne, la suite servira au prochain scanf. Utilisez "fflush(stdin)" ou même "gets(bidon)" avant (pour être sur de commencer sur une nouvelle ligne) ou après scanf (pour ignorer la fin de la ligne) si nécessaire.

On dispose aussi de sprintf(chaîne, format, listevaleurs) qui permet d'écrire dans une chaîne plutôt que sur l'écran, et donc faire des conversions numériques ->ASCII; et de sscanf(chaîne, format,l isteadresse) qui lit dans une chaîne plutôt qu'au clavier. On possède encore d'autres fonctions dans STDIO, en particulier pour gérer les fichiers. Sous Linux vous en trouverez la liste par "man 3 stdio".
poster par devils_may_cry
écrit par Patrick TRAU
dare_devil
dare_devil
Admin
Admin

Messages : 80
Date d'inscription : 13/02/2008

Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
Ne ratez plus aucun deal !
Abonnez-vous pour recevoir par notification une sélection des meilleurs deals chaque jour.
IgnorerAutoriser