1

Hello world,
Comment faire pour créer une fonction miroir, qui prenne un int en argument, n par exemple et retourne un int qui renvoie son miroir
Par exemple 42 -> 24 ou 4242 -> 2424
Je vois pas, à moins de faire une boucle avec des modulo & co ...

EDIT : euh, ne pas oublier de dire merci quand même ... merci, voilà c'est fait
programmeur sur TI ^^

mon blog sur les TI => clic

mon (p'tit) fofo sur les TI => clic

2

Tu peux pas faire une conversion :

int -> string
< travail sur la string >
string -> int

En général, les langages proposent facilement de manipuler les strings. Je connais pas Ocaml, mais c'est comme ça que je ferais.

3

Ta fonction doit être int -> int ? Sinon, en int -> string je verrais bien un truc comme ça :
let rec miroir x =
  let chiffre = x % 10 in
  let reste = x / 10 in
  if reste == 0 then
    string_of_int(chiffre)
  else
    string_of_int(chiffre) ^ (miroir reste)
;;


Enfin, tu peux toujours utiliser une fonction qui appelle cette fonction et renvoie le résultat converti en entier.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

4

Effectivement c'est possible de faire comme ça. Tu peux faire les conversions avec string_of_int et int_of_string, ensuite tu accèdes au caractère i d'une string s par s.[i] et tu le modifies par s.[i] <- c
pour connaître la longueur d'une chaîne tu as String.length et pour créer une nouvelle chaîne de longueur n String.create n

Par contre si on t'a demandé de faire ça dans le cadre d'un exercice de maths (autrement dit si on te demande pas un résultat mais un algo), tu n'es peut-être pas censé utiliser string_of_int et int_of_string vu que l'essentiel de l'algorithme se trouve dans ces deux fonctions cheeky

Si tu veux le faire à la main sans utiliser les conversions, il faudra effectivement utiliser des modulo & co, je ne vois en effet pas comment y échapper (enfin il y a peut-être une astuce que je ne vois pas, j'ai pas cherché très longuement), par contre une boucle n'est pas forcément le moyen le plus adapté, n'oublie pas qu'on peut faire des fonctions récursives très facilement et que c'est souvent plus simple.

Essaye de poster une idée un peu plus précise que « faire une boucle avec des modulo & co » et on pourra te dire si tu vas dans une bonne direction, si tu peux améliorer et comment, si tu as fait des erreurs... mais là dans le vide je ne peux pas te dire grand-chose de plus ^^

edit (cross) : Sasume > tu réalises que tu appelles "reste" le quotient ? tongue à part ça ta fonction marche, mais oui c'est int -> int qui est demandé, ceci dit on peut partir de ta fonction et chercher à la modifier pour obtenir un résultat entier smile. Je dirais qu'avec peut-être un paramètre en plus ça ne devrait pas être trop compliqué, cependant j'ai l'impression qu'il s'agit d'un exercice scolaire et j'aime pas donner des réponses toutes cuites ^^
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

5

!call SebRmv
--- Call : SebRmv appelé(e) sur ce topic ...


Pour une fois qu'on parle de Caml cheeky
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

6

Sally (./4) :
edit (cross) : Sasume > tu réalises que tu appelles "reste" le quotient ? tongue
Oui grin C’est ce qu’il reste à traiter… Je n’ai pas trouvé de meilleur identificateur.
à part ça ta fonction marche, mais oui c'est int -> int qui est demandé, ceci dit on peut partir de ta fonction et chercher à la modifier pour obtenir un résultat entier smile.
En fait je viens de penser qu’on peut faire simplement un int_of_string ((string_of_int chiffre) ^ (miroir reste)).
Oui, je donne la solution, j’avoue que c’est mal…
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

7

Oui oui mais bon il n'y a pas besoin de faire la moindre conversion pour résoudre ce problème hein tongue
Bon tant qu'on y est je vais aussi donner ma solution, une fois n'est pas coutume roll. En fait ton idée de départ est bonne, il faut bien récupérer un par un les chiffres du nombre de cette façon, mais pour les concaténer tu n'as pas besoin d'une conversion en chaîne de caractère, il suffit de calculer un résultat intermédiaire que tu multiplies par 10 à chaque fois avant de lui ajouter le nouveau chiffre (c'est à ce résultat intermédiaire que je pensais quand je parlais de paramètre supplémentaire à la fonction).
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

8

En effet smile
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

9

et d'abord précise ton problème

est-ce que c'est la représentation en décimal qu'il faut renverser?

10

oui, on entre un entier et ça renvoie un entier, on peut passer par les string mais il semblerait que ce soit plus de façon récursive avec un accumulateur ...
programmeur sur TI ^^

mon blog sur les TI => clic

mon (p'tit) fofo sur les TI => clic

11

Alors cf ./7
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

12

Oui l'accumulateur est le terme technique pour désigner le paramètre supplémentaire dont je parle smile
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

13

let rec miroir accu = function
   | 0-> accu
   | n -> miroir (accu * 10 + n mod 10) (n / 10)

let main() =
  begin
    Printf.printf "%i\n" (miroir 0 (int_of_string(Sys.argv.(1))));
    exit 0;
  end

let _ = main()


Ok, c'est bon j'ai réussi, merci à tout le monde, ça marche komilfo, c'est cool
Enfin je hais le caml x__x
programmeur sur TI ^^

mon blog sur les TI => clic

mon (p'tit) fofo sur les TI => clic

14

Bravo ! Scheme rulez !