Discussion:
Demarrage difficile
(trop ancien pour répondre)
Turboclick
2012-08-24 11:35:23 UTC
Permalink
Bonjour,

cela fait 3 semaines que j'essaye de me mettre au caml et il me manque
un déclic.

J'ai du mal a assimiler comment on peut se passer de variables
modifiable pour faire un programme.

Quelqu'un pourrait-il m'écrire un programme simple qui affecte une
valeur demandée dans une variable genre somme de deux entiers ou
n'importe quel autre programme que je vois comment ca marche svp ?

J'ai l'habitude du c et j'avoue que j'y arrive pas.

Merci beaucoup de votre aide.
Nicolas George
2012-08-24 13:30:54 UTC
Permalink
Turboclick , dans le message
Post by Turboclick
Quelqu'un pourrait-il m'écrire un programme simple qui affecte une
valeur demandée dans une variable genre somme de deux entiers ou
n'importe quel autre programme que je vois comment ca marche svp ?
On n'a besoin d'avoir une variable qui change de valeur que si le programme
passe plusieurs fois au même endroit. Ceci n'arrive, en C, qu'avec un saut,
un goto ou toute autre forme de sucre syntaxique similaire.

En Caml, la manière naturelle de passer plusieurs fois au même endroit n'est
pas de faire un saut mais un appel de fonction récursif. Ainsi, pour
calculer une somme d'entiers :

int t = 0;
int i;
for (i = 0; i < 100; i++)
t += i;

Ce qui se traduit, en enlevant le sucre syntaxique (je simplifie pour le cas
d'espèce) :

int t = 0;
int i = 0;
debut:
t += i;
i++;
if (i < 100)
goto debut;

On peut éliminer la modification des variables en dehors du saut :

int t = 0;
int i = 0;
debut:
int nouveau_t = t + i;
int nouveau_i = i + 1;
if (i < 100) {
t = nouveau_t;
i = nouveau_i;
goto debut;
}

Et on peut traduire en Caml :

let rec somme t i = (* correspond au label debut *)
let nouveau_t = t + i in
let nouveau_i = i + 1 in
if i < 100 then
somme nouveau_t nouveau_i (* sauter en changeant les variables *)
else
t (* donner le résultat *)
let t = somme 0 0 (* les valeurs initiales *)
Turboclick
2012-08-24 14:38:11 UTC
Permalink
Merci beaucoup de ton aide mais à vrai dire, tous les exemples que je
vois ressemblent un peu au tiens, c'est a dire que j'ai du mal a les
integrer dans un schéma standard parce que je n'ai que la fonction et
pas le programme dans son ensemble.

J'ai pas mal étudié avant la syntaxe caml et je connais la
récursivité etc mais je n'arrive pas à integrer le tout dans un
programme.


Par exemple, que donnerai le programme en c suivant ?


void main ()

{

int a, b;

printf("Veuillez entrer a :");
scanf("%i",a);
printf("\nVeuillez entrer b :");
scanf("%i",b);

printf("\n\nresultat : %i", a+b);

]

Cela m'aiderait à comprendre.

Merci encore
Nicolas George
2012-08-24 15:15:44 UTC
Permalink
Turboclick , dans le message
Post by Turboclick
void main ()
main doit retourner un int.
Post by Turboclick
{
int a, b;
printf("Veuillez entrer a :");
scanf("%i",a);
Il faut prendre l'adresse de a et de b.
Post by Turboclick
printf("\nVeuillez entrer b :");
scanf("%i",b);
printf("\n\nresultat : %i", a+b);
let main () =
let () = print_string "Veuillez entrer a : " in
let a = input_int () in
let () = print_string "Veuillez entrer b : " in
let b = input_int () in
let () = print_string "Resultat : " in
let () = print_int (a + b) in
let () = print_newline () in
()

Mais les entrées-sorties, c'est fondamentalement non-fonctionnel, donc il
est normal qu'un programme qui en fasse n'ait pas l'air fonctionnel.
Loading...