http://www.saphir-control.fr/
|
name=input("Donnez le nom de l"'article","string");
while %t
data=input("Donnez son prix, son poids et le nombre en stock");
if size(data,"*")==3 then break,end
mprintf("Saisie incorrecte !\n");
end
mprintf("\n%s prix=%.2fF, poids=%.2fkg, stock=%d\n",name,data)
Ici le premier appel à la fonction input avec l'option
"string" attend la saisie d'une chaîne de
caractères et le suivant, dans la boucle infinie while %t,
attendent un vecteur de nombres. Le dialogue utilisateur sera alors :
Donnez le nom de l'article-->Chaise Donnez son prix, son poids et le nombre en stock-->850.99 5.3 1000 Chaise, prix=850.99F, poids=5.30kg, stock=1000On notera dans cet exemple l'usage du format %.nf qui précise le format %f en fixant le nombre n de décimales affichées.
Donnez le nom de l'article-->Chaise Donnez son prix, son poids et le nombre en stock-->850.99 5.3 1000 Chaise, prix=850.99F, poids=5.30kg, stock=1000
mprintf("Donnez le nom de l"'article,"+..
" son prix, son poids et le nombre en stock\n")
while %t
[n,name,prix,poids,nombre]=mscanf("%s %f %f %d")
if n==4 then break,end
mprintf("Saisie incorrecte !\n");
end
mprintf("\n%s prix=%.2fF, poids=%.2fkg, stock=%d\n",..
name,prix,poids,nombre)
la séquence / représente le << home
directory >> de l'utilisateur, tandis que SCI/ est une
abreviation pour le chemin du repertoire principal de Scilab.
[fd,err]=mopen(file,mode,swap)file est une chaîne de caractères contenant le chemin du fichier. Par exemple " /Scilab/dat01" Le paramètre mode permet de spécifier si le fichier doit être ouvert en lecture seule ("r"), en écriture seule ("w"), en complétion (écriture à la fin "a") ou en lecture/écrirure ("r+"). La valeur par défaut de mode est ("rb"). L'ajout du caractère "b" spécifie que les données numériques stockées dans le fichier sont représentées par leurs codes binaires. En l'abscence de cette option, les données numériques sont supposées être représentées par leur représentation formattée. Par défaut, Scilab suppose que la représentation des nombres dans les fichiers binaires correspond au format IEEE little endian 2, la conversion au format interne du processeur étant alors faite automatiquement. L'option swap=0 permet de désactiver cette conversion implicite. La fonction mopen retourne l'identificateur du fichier fd et éventuellement un indicateur d'erreur.
-->fd1=mopen("SCI/scilab.star","r")
fd1 =
2.
-->[fd2,err]=mopen(TMPDIR+"/out","wb")
err =
0.
fd2 =
3.
dispfiles.dia La fonction dispfiles permet d'examiner les fichiers
ouverts. On remarque ici que les fichiers peuvent être de deux types C
(C) ou fortran (F77). Ce dernier type existe pour permettre
de manipuler les fichiers créés par ou pour d'autres logiciels
écrits en fortran (voir la section 4). La
fonction Scilab file permet d'acquérir les chemins des fichiers
ouverts et leurs propriétés. Le nombre de fichiers pouvant
être ouverts simultanément est limité, aussi il faut penser
à fermer les fichiers qui ne sont plus utiles. Cela peut être fait
par la fonction mclose qui doit être utilisée à la
fin du traitement du fichier pour déconnecter le fichier de
l'environnement Scilab. Si fd est une unité logique
associée à un fichier, mclose(fd) ferme ce fichier. Il
faut noter que les fichiers ouverts ne sont pas fermés automatiquement
lorsqu'une erreur survient lors de l'exécution d'une instruction Scilab.
L'instruction mclose(file()) ferme tous les fichiers ouverts.
# ;
unction [ftyp,fd]=open_ppm(fil)
fd=mopen(fil,"rb") //ouverture du fichier
h=mgetl(fd,1) //lecture du type
//test du type qui doit être:
// P1, P4 : image noir et blanc
// P2, P5 : image en niveau de gris
// P3, P6 : image couleur
ftyp=find(h=="P"+string(1:6))
if ftyp==[] then
error("Ce n"'est pas un fichier de type PBM, PGM ou PPM");
end
endfunction
On retrouve ici l'usage de la fonction mopen et l'on découvre
celui de la fonction mgetl qui permet de lire une ou plusieurs lignes
du fichier comme du texte. Les lignes de textes sont supposées
terminées par des marques de fin de ligne (pour lire une chaîne de
caractères de longueur donnée on peut utiliser la fonction
mgetstr).
function head=ppm_get_comments(fd)
head=[];
while %t
pos=mtell(fd);//mémorise la position courante
ligne=mgetl(fd,1) //lit une ligne comme du texte
first=part(ligne,1) //le premier caractère de la ligne
if first ~="#" then //est une ligne de commentaire
mseek(pos,fd) //positionnement au point mémorisé
break
end
head=[head;ligne]
end
endfunction
Les fonctions mtell et mseek utilisées ci-dessus
permettent respectivement de mémoriser la position courante dans un
fichier et de la (re-)positionner. function [sz,nc]=ppm_get_size(fd,ftyp)
// Dimensions de l'image
ligne=mgetl(fd,1);
execstr("sz=["+ligne+"]");
// Nombre de couleurs
if and(ftyp~=[1,4]) then
ligne=mgetl(fd,1);
execstr("nc="+ligne);
else
nc=[];
end
endfunction
On observe ici l'usage de la fonction execstr qui permet
d'évaluer une instruction Scilab donnée par une chaîne de
caractères. function img=ppm_get_bin(fd,ftyp,sz)
select ftyp
case 4 then //blanc et noir
t=mgeti((sz(1)*sz(2))/8,'uc',fd);
f=uint8(2.^(0:7))
img=matrix([(t&f(8))/f(8);(t&f(7))/f(7);
(t&f(6))/f(6);(t&f(5))/f(5);
(t&f(4))/f(4);(t&f(3))/f(3);
(t&f(2))/f(2);(t&f(1))/f(1)],sz);
case 5 then // niveau de gris
img=matrix(mgeti(sz(1)*sz(2),'uc',fd),sz)
case 6 then // couleur
img=matrix(mgeti(3*sz(1)*sz(2),'uc',fd),[3,sz])
end
endfunction
Dans le cas << noir et blanc >> les pixels sont stockés
à raison de 8 pixels par octet. l'opérateur & appliqué
à des variables de type entier effectue le << ET >> bit
à bit de ses deux opérandes. La fonction mgeti permet de
lire des nombres entiers codés sur 1, 2 ou 4 octets dans un fichier
binaire et de retourner un vecteur d'entiers de type correspondant. La fonction
mget dont la syntaxe et le fonctionnement ressemblent à celles
de mgeti permet de lire des données flottantes ou
entières et les convertit automatiquement en un vecteur Scilab standard.
Le premier argument de ces fonctions donne le nombre d'entiers à lire,
le second le type des données que l'on souhaite lire : | Type | Code | Type | Code |
| char (un octet) | "c" | unsigned char | "uc" |
| short (deux octets) | "s" | unsigned short | "us" |
| int (4 octets) | "i" | unsigned int | "ui" |
| float (4 octets) | "f" | double (8 octets) | "d" |
function gray_image(img)
xset("colormap",graycolormap(double(max(img))+1))
xset("wdim",size(img,1),size(img,2)) //taille de la fenêtre
xsetech(arect=0*[1 1 1 1]) //suppression des marges
Matplot(img',"020") //affichage
endfunction

function img=ppm_get_ascii(fd,ftyp,sz) //Lit les valeurs des pixels pour une image ASCII if or(ftyp==[4 5]) then //N&B ou niveau de gris img=matrix(uint8(mfscanf(sz(1)*sz(2),fd,"%i ")),sz) else img=matrix(uint8(mfscanf(3*sz(1)*sz(2),fd,"%i ")),[3,sz]) end endfunctionCet exemple montre un usage simple de la fonction mfscanf basée sur la procédure C fscanf. Cette fonction a un comportement comparable à la fonction mscanf vue précédemment, si ce n'est de lire les valeurs dans un fichier désigné par fd plutôt que sur l'écran. Dans cet exemple, il est nécessaire de lire une grande quantité de données et l'usage d'une boucle interpretée pour effectuer cette lecture ne serait pas efficace. Cette boucle est réalisée par la fonction elle même. Le premier argument de la fonction mfscanf donne le nombre de fois ou il faut itérer le format de lecture %i. Dans cet exemple les données à lire sont toutes de même type, mais il est évidemment possible de lire des fichiers contenant des données de types hétérogènes :
fd=mopen("articles.dat","r");
[n,nom,prix,poids,nombre,code]=mfscanf(-1,fd,"%s %f %f %f %d %s");
mclose(fd)
permet de lire l'ensemble des données du fichier. La valeur -1
passée comme premier argument de mfscanf indique que l'on
souhaite lire toutes les lignes du fichier.
nom = ["Table_chene";"Table_hetre";"Chaise_chene";"Chaise_hetre"];
prix = [ 3999 ; 2071 ; 850.99 ; 649 ];
poids = [ 45.4 ; 45 ; 5.3 ; 5 ];
nombre = [ 59 ; 23 ; 1000 ; 623 ] ;
code = ["TC" ;"TH" ;"CC" ;"CH" ] ;
fd=mopen("articles.dat","w");
mfprintf(fd,"%s %.2f %.1f %d %s\n",nom,prix,poids,nombre,code);
mclose(fd)
This document was translated from LATEX by HEVEA.