Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1869 connectés 

  FORUM HardWare.fr
  Programmation
  Algo

  aide urgent

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

aide urgent

n°2241989
sk nesrine
Posté le 02-11-2014 à 12:46:36  profilanswer
 

un algo qui permet de lire un entier N strictement positif et qui vérifie si les chiffres de N forment une suite (progression) croissante, décroissante ou aucune des deux
Exemple:
Le nombre 5789 a des chiffres en progression croissante
Le nombre 744 a des chiffres en progression décroissante
Le nombre 187 a des chiffres qui ne forment pas une progression ni croissante ni décroissante.

mood
Publicité
Posté le 02-11-2014 à 12:46:36  profilanswer
 

n°2241995
gilou
Modérateur
Modzilla
Posté le 02-11-2014 à 13:24:37  profilanswer
 

Je te donne un indice: utiliser la différence entre deux chiffres successifs.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2242014
par l'anne​au de l'ia
word master
Posté le 02-11-2014 à 19:21:33  profilanswer
 

Bonjour,
 
Je ferais plutôt une comparaison de grandeur avec > et < tant que les chiffre sont < ou > c'est décroissant ou croissant.


---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
n°2242064
rufo
Pas me confondre avec Lycos!
Posté le 03-11-2014 à 10:48:58  profilanswer
 

par l'anneau de l'ia a écrit :

Bonjour,
 
Je ferais plutôt une comparaison de grandeur avec > et < tant que les chiffre sont < ou > c'est décroissant ou croissant.


Ca revient globalement au même de faire la différence et de regarder le signe du résultat ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2242073
gilou
Modérateur
Modzilla
Posté le 03-11-2014 à 12:32:57  profilanswer
 

Surtout qu'en plus, au niveau du code assembleur ou micro-processeur, une comparaison, ça a de forte chances d'être implémenté comme une différence suivi d'une comparaison à 0.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2242090
par l'anne​au de l'ia
word master
Posté le 03-11-2014 à 15:58:40  profilanswer
 

rufo a écrit :


Ca revient globalement au même de faire la différence et de regarder le signe du résultat ;)


 

gilou a écrit :

Surtout qu'en plus, au niveau du code assembleur ou micro-processeur, une comparaison, ça a de forte chances d'être implémenté comme une différence suivi d'une comparaison à 0.
A+,


 
Peut-être mais ça demande probablement d'avantage d'instructions.


---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
n°2242139
khoyo
Posté le 03-11-2014 à 22:47:11  profilanswer
 

Oui mais ca te le sais pas, le seul qui sait ca c'est ton compilateur (si tu sais pas exactement vers quel plateforme tu compile).
 
Donc comme tu sais pas, bah t'écris if(x>y), et ton compilateur feras probablement le boulot mieux que toi.
 
Sauf si tu t'appelle John Carmack. Dans ce cas, toute mes excuses.

n°2242144
blazkowicz
Posté le 04-11-2014 à 00:20:16  profilanswer
 

Les nombres sont représentés comment : chaîne de caractère, décimal codé binaire, voire une liste?
 
on peut convertir le nombre en chaîne et s'amuser à comparer directement les caractères entre eux en tenant compte du fait que l'ordre est le même dans les caractères ASCII :D
 
en tout cas cela paraît facile et l'intérêt doit être de ne boucler qu'une fois, en s'arrêtant avant la fin quand ça ne sert plus à rien.
on doit aussi pouvoir faire un truc sympa en récursif? :o

n°2242145
gilou
Modérateur
Modzilla
Posté le 04-11-2014 à 03:43:44  profilanswer
 

blazkowicz a écrit :

on peut convertir le nombre en chaîne et s'amuser à comparer directement les caractères entre eux en tenant compte du fait que l'ordre est le même dans les caractères ASCII :D

Il y a rien de risible la dedans, c'est le plus générique, car tu peux bosser avec des nombres de taille quelconque, plus grands que ton maxint, comme 111122223333444455556666777788889999. Et ça marche encore si c'est un nombre en hexadecimal.  
A+,
 
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2242167
khoyo
Posté le 04-11-2014 à 11:53:45  profilanswer
 

Convertir en char*, c'est pas non plus le plus efficace du monde pour faire autre chose que de la comparaison avec après.
 
Si vraiment tu veux des gros nombres, y'a GMP

mood
Publicité
Posté le 04-11-2014 à 11:53:45  profilanswer
 

n°2242169
par l'anne​au de l'ia
word master
Posté le 04-11-2014 à 12:15:31  profilanswer
 

khoyo a écrit :

Oui mais ca te le sais pas, le seul qui sait ca c'est ton compilateur (si tu sais pas exactement vers quel plateforme tu compile).
 
Donc comme tu sais pas, bah t'écris if(x>y), et ton compilateur feras probablement le boulot mieux que toi.
 
Sauf si tu t'appelle John Carmack. Dans ce cas, toute mes excuses.


 
Là n'été pas mon idée.
Je pensais au code que nous allons écrire vous et moi pour réaliser ce programmme dans deux méthode différente.


---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
n°2242175
par l'anne​au de l'ia
word master
Posté le 04-11-2014 à 13:16:41  profilanswer
 

Code :
  1. -- Logical_Number --
  2. with Text_Io;
  3. with Ada.Characters.Handling;
  4. use Ada.Characters.Handling;
  5. procedure Logical_Number is
  6.  
  7.   -- Return the string value of any positive.
  8.   function Image_Number (Number : in Positive) return String is
  9.      
  10.      Img : String := Positive'Image(Number);
  11.   begin
  12.  
  13.      return Img;
  14.   end Image_Number;          
  15.  
  16.   -- Return positive value of decimal digit value.
  17.   function Value_Char (Char : in Character) return Positive is
  18.      
  19.   begin
  20.      
  21.      if not Is_Decimal_Digit(Char) then
  22.      raise Constraint_Error;
  23.      end if;
  24.      return Positive'Value(Char & "" );
  25.   end Value_Char;
  26.  
  27.   -- Return True if the number is progressive.
  28.   function Is_Progressive (Number : in Positive) return Boolean is
  29.  
  30.      Char_Index : Positive := 2;
  31.   begin    
  32.      
  33.      for Char_Pos in 3..Image_Number(Number)'Last loop
  34.      if not (((Value_Char(Image_Number(Number)(Char_Pos)) - Value_Char(Image_Number(Number)(Char_Index)))) >= 0)  then
  35.         return False;
  36.      end if;
  37.      Char_Index := Char_Pos;
  38.      end loop;
  39.      return True;
  40.   end Is_Progressive;
  41.  
  42.   -- Return true if the number is depressive.
  43.   function Is_Depressive (Number : in Positive) return Boolean is
  44.  
  45.      Char_Index : Positive := 2;
  46.   begin    
  47.      
  48.      for Char_Pos in 3..Image_Number(Number)'Last loop
  49.      if not (((Value_Char(Image_Number(Number)(Char_Pos)) - Value_Char(Image_Number(Number)(Char_Index)))) <= 0) then
  50.         return False;
  51.      end if;
  52.      Char_Index := Char_Pos;
  53.      end loop;
  54.      return True;
  55.   end Is_Depressive;
  56.  
  57.  
  58.  
  59.   -- Testing values.
  60.   Progressive_Number : Positive := 123456789;
  61.   Depressive_Number  : Positive := 987654321;
  62.   Other_Number      : Positive := 573194628;          
  63. begin
  64.   if Is_Progressive(Progressive_Number) then
  65.      Text_Io.Put_Line("Progressive_Number is progressive number." );
  66.   end if;
  67.  
  68.   if Is_Depressive(Depressive_Number) then
  69.      Text_Io.Put_Line("Depressive_Number is depressive number." );
  70.   end if;
  71.      
  72.   if Is_Progressive(Other_Number) then
  73.      Text_Io.Put_Line("Other_Number is progressive number." );
  74.   elsif Is_Depressive(Other_Number) then
  75.      Text_Io.Put_Line("Other_Number is depressive number." );
  76.   else
  77.      Text_Io.Put_Line("Other_Number is not logical number." );
  78.   end if;
  79. end Logical_Number;


 
Résultat :
 


Progressive_Number is progressive number.
Depressive_Number is depressive number.
Other_Number is not logical number.


 
Non, je ne compterai pas les instructions.
 
 
Edit : je corrige mon code, enfin, ce que je sais faire.

Message cité 2 fois
Message édité par par l'anneau de l'ia le 04-11-2014 à 23:06:35

---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
n°2242185
khoyo
Posté le 04-11-2014 à 14:30:49  profilanswer
 

par l'anneau de l'ia a écrit :


 
Là n'été pas mon idée.
Je pensais au code que nous allons écrire vous et moi pour réaliser ce programmme dans deux méthode différente.


 
Mouais, dans ce cas on compare if(machin - truc < 0) par rapport a if(machin<truc)
 
La différence est pas énorme...

n°2242187
par l'anne​au de l'ia
word master
Posté le 04-11-2014 à 14:37:00  profilanswer
 

khoyo a écrit :


 
Mouais, dans ce cas on compare if(machin - truc < 0) par rapport a if(machin<truc)
 
La différence est pas énorme...


 
pour un nombre d'un chiffre non, juste 1, mais pour un nombre de 10 chiffre ça fait déjà 10.
 
C'est pas le même poin de vue, je te l'accorde.

Message cité 1 fois
Message édité par par l'anneau de l'ia le 04-11-2014 à 14:38:25

---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
n°2242190
par l'anne​au de l'ia
word master
Posté le 04-11-2014 à 14:46:15  profilanswer
 


J'ai oublié un truc.
 
Pour les nombre avec des répétition de chiffre, tel 1122333444 il suffis d'ajouté un '=' aux comparaison pour tester "<=" (inférieur ou égal) et suppérieur ou égal.


---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
n°2242193
blazkowicz
Posté le 04-11-2014 à 14:51:29  profilanswer
 

Une petite version à la con faite en caml  (à copier-coller dans l'interpréteur interactif ocaml, au rythme que vous voulez, à chaque ;; une évaluation)

 

Par fainéantise, les nombres sont des listes de int. (sinon il faudrait fouiller pour trouver une fonction de conversion ou la faire soi-même)
Par simplicité tant pis on boucle deux fois.
C'est accidentellement polymorphique à tous éléments qui auraient une relation d'ordre, en tout cas du <=.

 

/edit : je crois que les récursions s'arrêtent toutes seules en cas de faux? (lazy evaluation)

 
Code :
  1. let a1 = [1;2;2;3;4;5;6;6;7;8;9];;
  2. let a2 = [9;5;2;2;];;
  3. let a3 = [1;4;9;3;7;3;2];;
  4.  
  5. let rec is_progressive l = match l with
  6.           | [] -> true
  7.           | [x]-> true
  8.           | [x;y]-> x<=y
  9.           | (h1::h2::t) -> (h1<=h2) && is_progressive (h2::t);;
  10.          
  11.  
  12. let rec is_degressive l = match l with
  13.           | [] -> true
  14.           | [x]-> true
  15.           | [x;y]-> x>=y
  16.           | (h1::h2::t) -> (h1>=h2) && is_degressive (h2::t);;
  17.  
  18. is_progressive a1;;
  19. is_progressive a2;;
  20. is_progressive a3;;
  21.  
  22. is_degressive a1;;
  23. is_degressive a2;;
  24. is_degressive a3;;
  25.  
  26.  
  27. type progressivity = Progressive|Degressive|Both|None;;
  28.  
  29. let return_progressivity n =
  30.   let prog = is_progressive n and degr = is_degressive n in
  31.     if (prog && degr) then Both else
  32.     if prog then Progressive else
  33.     if degr then Degressive else
  34.     None;;
  35.  
  36. return_progressivity a1;;
  37. return_progressivity a2;;
  38. return_progressivity a3;;
  39. return_progressivity [0;0;0;0;0;0;0;0];;
  40.  
  41. return_progressivity ['a';'c';'f';'f';'g';'h'];;
  42.  
  43. return_progressivity [true;true;false;false];;
  44. return_progressivity [true;false;true];;
  45. return_progressivity [false;true];;
 


Bonus : même mon type "progressivity" accepte de se faire mouliner par les fonctions :lol:, avec comme ordre l'ordre dans lequel j'ai déclaré les quatre valeurs possibles (ce qui n'a pas trop de sens dans l'état où c'est)

 

return_progressivity [Progressive];;
return_progressivity [Degressive];;
return_progressivity [Progressive;Degressive];;
return_progressivity [None;Degressive;Progressive;Both];;
return_progressivity [None;Both];;

 


/edit : plagiat sur internet d'une fonction qui transforme une chaîne de caractères en liste de caractères,

 
Code :
  1. let explode s =
  2.  let rec exp i l =
  3.    if i < 0 then l else exp (i - 1) (s.[i] :: l) in
  4.  exp (String.length s - 1) [];;
 

ensuite

Code :
  1. let number_progressivity n = return_progressivity(explode(string_of_int n));;
  2.  
  3. number_progressivity 13423423;;
  4. number_progressivity 87774;;


Message édité par blazkowicz le 04-11-2014 à 15:29:17
n°2242205
khoyo
Posté le 04-11-2014 à 15:46:25  profilanswer
 

par l'anneau de l'ia a écrit :


 
pour un nombre d'un chiffre non, juste 1, mais pour un nombre de 10 chiffre ça fait déjà 10.
 
C'est pas le même poin de vue, je te l'accorde.


 
Justement non, puisque un bon compilateur optimise ça et produit probablement un binaire identique.
 
Donc la seul différence est dans le code source... Et comme si tu code bien, tu n’écris cette comparaison qu'une seule fois, bah la différence...

n°2242207
par l'anne​au de l'ia
word master
Posté le 04-11-2014 à 15:53:52  profilanswer
 

khoyo a écrit :


 
Justement non, puisque un bon compilateur optimise ça et produit probablement un binaire identique.


 
 
T'as pas comme une incohérence dans tes propos ?


---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
n°2242209
khoyo
Posté le 04-11-2014 à 15:59:50  profilanswer
 

Depend du compilo, dépend du langage. Quel version est la plus efficace qui sait ?
 
En général ca va être la même chose.
 
Et de toute façon, "Premature optimization is the root of all evil"

n°2242211
blazkowicz
Posté le 04-11-2014 à 16:06:45  profilanswer
 

par l'anneau de l'ia a écrit :


Non, je ne compterai pas les instructions.

 

Je me demande si le return False dans la boucle fait se retourner Dijsktra dans sa tombe? (sorte de goto déguisé)
Cela dit je trouve ça bien pour faire ça et le langage est vraiment clair et net avec les end, end if, end loop etc.
Ca change de la soupe d'accolades.

Message cité 1 fois
Message édité par blazkowicz le 04-11-2014 à 16:14:20
n°2242213
par l'anne​au de l'ia
word master
Posté le 04-11-2014 à 16:24:32  profilanswer
 

blazkowicz a écrit :


 
Je me demande si le return False dans la boucle fait se retourner Dijsktra dans sa tombe? (sorte de goto déguisé)
Cela dit je trouve ça bien pour faire ça et le langage est vraiment clair et net avec les end, end if, end loop etc.
Ca change de la soupe d'accolades.


 
Tu peux même coder A* en une centaine de ligne il me semble (hors logistique).
J'aime beaucoup ce langage ; j'ai trop rien pour comparer, mais le C me casse la tête par exemple, alors qu'avec Ada, j'écris comme je pense.


---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
n°2242250
par l'anne​au de l'ia
word master
Posté le 04-11-2014 à 22:39:31  profilanswer
 

gilou a écrit :

Il y a rien de risible la dedans, c'est le plus générique, car tu peux bosser avec des nombres de taille quelconque, plus grands que ton maxint, comme 111122223333444455556666777788889999. Et ça marche encore si c'est un nombre en hexadecimal.  
A+,
 
 


 
 
Voici un code Ada corepondant :
 

Code :
  1. -- Logical String --
  2. -- Entrez un entier et appuyez sur Entree.
  3. with Text_Io;
  4. procedure Logical_String is
  5.   Number : String := Text_Io.Get_Line;
  6.   Pro : Boolean := false;
  7.   Dep : Boolean := False;
  8. begin
  9.   for I in 1..Number'Last-1 loop
  10.      if (Character'Pos(Number(I)) - Character'Pos(Number(I+1))) < 0 then         
  11.      if Dep then
  12.         Text_Io.Put_Line("le nombre " & Number & "est incertain." );        
  13.         return;
  14.      else
  15.         Pro := True;
  16.      end if;
  17.      elsif (Character'Pos(Number(I)) - Character'Pos(Number(I+1))) > 0 then    
  18.      if Pro then                    
  19.         Text_Io.Put_Line("le nombre " & Number & "est incertain." );        
  20.         return;
  21.      else
  22.         Dep := True;
  23.      end if;
  24.      end if;      
  25.   end loop;  
  26.   if Pro then
  27.      Text_Io.Put_Line("le nombre " & Number & " est croissant." );
  28.   elsif Dep then
  29.      Text_Io.Put_Line("le nombre " & Number & " est decroissant." );
  30.   end if;
  31.   Text_Io.Put("Appuyez sur Entree" );
  32.   Text_Io.Skip_Line;      
  33. end Logical_String;


 
 :)
 
 
Edit : correction faite, ma réflexion à changé, ici il est indispensable de comparer avec 0.
Peut-être que dans le code précédent c'est pareil.


Message édité par par l'anneau de l'ia le 04-11-2014 à 23:00:39

---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
n°2242253
gilou
Modérateur
Modzilla
Posté le 04-11-2014 à 23:28:27  profilanswer
 

Moi je ferais ainsi en Perl:
 

Code :
  1. use v5.14;
  2. use bigint;
  3. use List::Util qw(reduce);
  4.  
  5. sub checknum {
  6.  $_ = shift;
  7.  if (/^\d*$/) {
  8.    no bigint;
  9.    my @v = (0, 0, 0);
  10.    reduce { $v[($a<=>$b)+1] = 1; $b } (/\d/g);  # l'essentiel du travail est condensé en cette ligne
  11.    given (4*$v[0]+2*$v[2]+$v[1]) {
  12.      when(0) {print "Entree vide\n";}
  13.      when(1) {print "Suite de chiffres constante\n";}
  14.      when(2) {print "Suite de chiffres strictement decroissante\n";}
  15.      when(3) {print "Suite de chiffres decroissante\n";}
  16.      when(4) {print "Suite de chiffres strictement croissante\n";}
  17.      when(5) {print "Suite de chiffres croissante\n";}
  18.      default {print "Suite de chiffres ni croissante ni decroissante\n";}
  19.    }
  20.  }
  21.  else {
  22.    print "Entree invalide\n";
  23.  }
  24. }
  25.  
  26. # Test avec un grand nombre et un grand nombre en texte
  27. checknum(333444444444444444455556666777788899);
  28. print "\n";
  29. checknum("998887777666655554444444444444444333" );


 
A+,


Message édité par gilou le 04-11-2014 à 23:34:37

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Algo

  aide urgent

 

Sujets relatifs
J'ai vraiment besoin d'aide ! C'est urgent !besoir d'aide URGENT en Javascript
besoin d'aide (URGENT) pour une macro-EXCEL VBA[MySQL] Urgent, PB export dans la BDD !
Aide HTML/PHP/ SQL ( Urgent pour BAC:! )aide choix cms svp urgent!
Besoin d'aide pour Mikrobasic [URGENT]Pré-remplir un envoi de mail avec mailto
Problème cible / iframeURGENT !!! Recherche aide concernant AMFPHP (remoting) pour projetGTA4
Plus de sujets relatifs à : aide urgent


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR