Algorithme

Fermé
femme - 5 juil. 2011 à 19:04
nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 - 6 juil. 2011 à 17:52
Bonjour,
je suis étudiante en Informatique à l'institut nigérien d'enseigne, technologique au NIGER je voudrais une résolution de mes exercices d'algorithme


5 réponses

nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 138
5 juil. 2011 à 19:07
ici, on ne donne que des conseils, en programmation il faut avant tout comprendre par soi-même, ou passer son chemin...
0
écrire un algorithme qui permettant de convertir un temps donné en heures ; minutes et secondes
0
nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 138
5 juil. 2011 à 19:16
Franchement, c'est très facile, puisqu'il suffit de diviser par 60...
0
Profil bloqué
5 juil. 2011 à 23:58
Ce programme en Pascal répond à votre question essayez de vous en inspirer.
Bonne chance.

program Conversion;

{$APPTYPE CONSOLE}

uses
SysUtils;

function Convertir(Temps, Parametre : Cardinal) : Cardinal;
var X, P, U : Cardinal;
begin
X := Temps;
P := Parametre;
U := 0;
while X >= P do begin
U := U + 1;
X := X - P;
end;
Result := U;
end;

var Temps : Cardinal;
Reste : Cardinal;
H, Min, Sec, Parametre : Cardinal;

begin

// Le temps donné est supposé en Secondes

WriteLn('Entrez la valeur a convertir');
ReadLn(Temps);

parametre := 3600;

H := Convertir (Temps, Parametre);
Reste := Temps - (H * 3600);

Parametre := 60;
Min := Convertir (Reste, Parametre);
Sec := Reste - (Min * 60);

WriteLn('Heures : ', H);
WriteLn('Minutes : ', Min);
WriteLn('Secondes : ', Sec);

ReadLn;

{ TODO -oUser -cConsole Main : placez le code ici }
end.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 138
Modifié par nicocorico le 6/07/2011 à 18:16
Je me permet un petit commentaire sur ce programme:
Dans l'appel d'une fonction, les paramètres sont transférés tant que possible par les registres, il est donc inutile et lourd de les recharger dans des variables locales, idem pour le résultat... La fonction devient ainsi:
function Convertir(Temps, Parametre : Cardinal) : Cardinal;    
begin    
  Result := 0;    
  while Temps >= Parametre do    
  begin    
     Result := Result + 1;    
     Temps:= Temps - Parametre;     
  end;    
end;   

De plus, une simple division remplace aisément la boucle, à condition de compléter avec un Mod dans l'appelant:
function Convertir(Temps, Parametre : Cardinal) : Cardinal;    
begin    
  If Parametre > 0 then  Result := Temps div Parametre else Result:= 0;    
end;  

Idem pour le corps, il est inutile de passer par des variables, et même par la fonction, et la fonction Mod est plus élégante, le programme devient alors :
program Conversion;    

{$APPTYPE CONSOLE}    

uses  SysUtils;    
var Temps : Cardinal;    

begin    
// Le temps donné est supposé en Secondes    

  WriteLn('Entrez la valeur a convertir');    
  ReadLn(Temps);    

  WriteLn('Heures : ', Temps div 3600);    
  WriteLn('Minutes : ', (Temps div 60) mod 60);    
  WriteLn('Secondes : ', Temps mod 60);    

  ReadLn;    
end. 
0
Profil bloqué
6 juil. 2011 à 09:49
si tu prétends avoir la meilleur approche tu aurais répondu à l'interessé sans détours.

- Pour te corriger : Quand on copie les variables globales dans des locales on allège le temps d'exécution et on optimise la mémoire, tu peux t'en convaincre en utilisant un gestionnaire de mémoire et un chrono de temps d'exécution pour comparer les approches possibles.

- Un algorithme optimisé ne recours à la division que sous contrainte, il n'est pas le cas ici, car la division est le traitement le plus pénible pour un micropresseur.
0
nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 138
6 juil. 2011 à 12:30
Je ne prétend rien du tout, je suis simplement passionné d'optimisation et j'ai du mal à ne pas réagir à ce sujet...
Et j'insiste sur le fait que l'idéal est d'avoir les données dans les registres, d'autant plus qu'elles y sont déjà lors de l'appel de la fonction, l'accès mémoire étant systématiquement pénalisé par leur fréquence moindre, même en mémoire cache.
Et je ne connais pas de meilleure optimisation de la mémoire que celle qui consiste à ne pas s'en servir !
Sans compter que ça oblige à ajouter des instructions...

Quant à la division, bien sûr qu'il faut l'éviter, et même lui préférer la multiplication tant que possible, mais elle est par contre toujours compétitive par rapport à une boucle, forte de son temps d'éxécution compris entre 1 et 3 cycles proc.
C'est à peu près le temps que prendra chaque passage dans la boucle, qui pourra atteindre 59 itérations...
0
nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 138
6 juil. 2011 à 13:09
Je viens de me rendre compte que tu penses que la fonction travaille sur les variables globales, mais en fait quand tu appelles une fonction, les 3 premiers paramètres sont chargés dans les registres, 2 si c'est une fonction objet.
Sinon je suis d'accord avec toi qu'il faut privilégier les variables locales aux globales, car les locales sont indexées sur EBP ou ESP, et leur adresse tiens sur un octet au lieu de 4 pour les globales, donc le code est plus compact.
0
Profil bloqué
6 juil. 2011 à 14:56
Il est visible que tu essaies d'exercer une paternité en renvoyant à chaque occasion les demandeurs à sec, si tu avais l'intention de servir la communauté tu aurais humblement répondu de ton choix sans polémique, mais le cas reflète un état d'ame qu'on risque de nous bruler à force de chercher trop briller plus que son éclat le permet.
0
nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 138
Modifié par nicocorico le 6/07/2011 à 17:53
Oui mais en fait c'est pas un forum de psycho là, et je m'excuse si je t'ai piqué dans ton orgueil, c'était pas le but.
Et si j'avais pas l'intention de servir la communauté, comme tu dis, je ferais autre chose que de répondre, j'ai un programme sur le feu.
0