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
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
A voir également:
- Algorithme
- Logiciel algorithme gratuit - Télécharger - Édition & Programmation
- Logiciel algorithme euromillion - Télécharger - Loisirs créatifs
- Code ascii algorithme - Guide
- Algorithme euromillion excel gratuit - Forum Algorithmes / Méthodes
- Tri d'une matrice algorithme - Forum C
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
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...
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
5 juil. 2011 à 19:16
Franchement, c'est très facile, puisqu'il suffit de diviser par 60...
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.
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.
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
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:
De plus, une simple division remplace aisément la boucle, à condition de compléter avec un Mod dans l'appelant:
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 :
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.
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.
- 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.
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
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...
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...
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
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.
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.
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.
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
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.
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.