Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Une astuce qui ne sert à rien ! | |
| | Auteur | Message |
---|
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Une astuce qui ne sert à rien ! Ven 1 Fév 2013 - 0:00 | |
| Salut tout le monde. N’ayant rien de mieux à faire, je vous propose cette astuce qui ne sert à rien. Certains langages possèdent la fonction SWAP(X,Y) qui échange le contenu de X avec celui de Y et Y avec celui de X. Si le langage (comme PANORAMIC) ne possède pas une telle fonction, il est très facile de s’en sortir avec le code suivant, par exemple : - Code:
-
dim x,y,temp x = 10 : y = 30 print "avant l'échange : x = ";x;" y = ";y ' échanger X et Y : pour cela on utilise une 3ème variable intermédiare temp = x : x = y : y = temp print "après l'échange : x = ";x;" y = ";y
Question :Pouvez-vous réaliser la même chose sans passer par une variable intermédiaire ?Moi, je peux ! Avant de cliquer sur spoiler, réfléchissez à cette question trois secondes ou deux heurs si ça vous chante ! - Spoiler:
' Astuce pour échanger la valeur de 2 variables sans passer par une troisième dim x,y x = 10 : y = 30 : print "avant l'échange : x = ";x;" y = ";y x = x + y : y = x - y : x = x - y : print "après l'échange : x = ";x;" y = ";y
Si vous avez des astuces de ce genre, je suis preneur. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Une astuce qui ne sert à rien ! Ven 1 Fév 2013 - 0:42 | |
| | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Ven 1 Fév 2013 - 0:48 | |
| Je te confirme que c'est une astuce qui ne sert à rien, enfin si ... "à rien" donc finalement à quelque chose. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Une astuce qui ne sert à rien ! Ven 1 Fév 2013 - 1:06 | |
| Dans le même genre, une variable "toggle-switch": elle prend alternativement les valeurs 1 ou 0, associées à "vrai" ou "faux: - Code:
-
dim flag% ... flag% ayant une valeur quelconque entre 0 et 1, comment la basculer à l'autre valeur ? if flag%=0 flag% = 1 else flag% = 0 end_if
ou alors, l' astuce: - Spoiler:
flag% = 1 - flag%
| |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Une astuce qui ne sert à rien ! Ven 1 Fév 2013 - 1:25 | |
| Ça c’est l’élégance par excellence ! | |
| | | Invité Invité
| Sujet: Re: Une astuce qui ne sert à rien ! Ven 1 Fév 2013 - 4:02 | |
| Pour le dernier cas, je ne fais pas comme cela (à condition que l'un des cas soit 0) pour -1 et 0: flag%=-1-flag% pour 1 et 0: : flag%=1-flag% |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Une astuce qui ne sert à rien ! Ven 1 Fév 2013 - 10:53 | |
| La fonction MAX(X,Y) retourne le plus grand de X et Y. Comment obtenir la même chose sans utiliser MAX(X,Y) ni IF...THEN...ELSE ? - Spoiler:
' trouver le maximum de 2 nombres sans utiliser la fonction MAX() dim x,y,m x = 10 : y = 7 print " Sans utiliser la fonction MAX()" m = (x+y+abs(x-y))/2 : print " Le maximun de ",x;" et de ";y;" est : ";m
La fonction MAX() de PANORAMIC est limitée à 2 nombres. Comment obtenir le plus grand nombre parmi 4 nombres : en utilisant la fonction MAX(X,Y) ? en se passant de la fonction MAX(X,y) ? - Spoiler:
' trouver le maximum de 4 nombres dim x,y,z,u,m x = 5 : y = 3 : z = 22 : u = 14 ' En utilisant la fonction MAX() m = max(max(max(x,y),z),u) print " En utilisant la fonction MAX()" print "Le maximum de ";x;" "; y;" ";z;" ";u;" est : ";m ' En se passant de la fonction MAX() m = (x+y+abs(x-y))/2 : m = (m+z+abs(m-z))/2 : m = (m+u+abs(m-u))/2 print : print " Sans utiliser la fonction MAX()" print "Le maximum de ";x;" "; y;" ";z;" ";u;" est : ";m
| |
| | | Invité Invité
| Sujet: Re: Une astuce qui ne sert à rien ! Ven 1 Fév 2013 - 11:15 | |
| Pour faire suite à mon exemple précédent, mais avec 2 nombres imposés: - Code:
-
dim a%,i% , j% ' variation entre 2 nombres i%=-10 :' 1er nb de référence j%=50 :' 2ème nb de référence
j%= j%+i%
for a%= 1 to 5 i%=j% - i% : message i% next a% |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Une astuce qui ne sert à rien ! Ven 1 Fév 2013 - 11:27 | |
| Vous avez déjà voulu utiliser SELECT-CASE avec des valeurs en chaîne de caractères ? C'est une vrai galère car ces commandes n'acceptent que des valeurs numériques. On fait alors toute une gymnastique pour déduire une valeur numérique à partir de la chaîne selon laquelle on veut poursuivre. J'ai trouvé un mécanisme parfaitement opérationnel, mais c'est un peu plus complexe que les petites formules arithmétiques dont on parlait jusqu'ici. Il y a un peu de préparation, et l'utilisation de KGF.dll. Mais une fois le cadre posé, la sélection se fait en 2 lignes: - Spoiler:
' asctuces.bas ' ' ce programme montre comment simuler un SELECT-CASE avec ' des valeurs en chaîne de caractère. On utilise une LIST cachée ' pour garder toutes les valeurs possibles, une par ligne, ' puis la fonction SerachListBox de KGF.dll pour trouver l'indice ' qui est alors utilisé comme indice pour la commande SELECT.
' initialisation générale (juste un exemple) label fin_data dim x%, s$ data "Janvier","Février","Mars","Avril","Mai","Juin","Juillet" data "Août","Septembre","Octobre","Novembre","Décembre" list 10 : hide 10 on_error_goto fin_data while 1=1 : ' boucle jusqu'à la fin des data read s$ : item_add 10,s$ end_while fin_data: off_error_goto
' charger KGF.dll KGF_initialize("KGF.dll")
s$ = "Mai" : ' choisir un mois
' *** les deux lignes suivantes sont l'astuce proprement-dite: SearchListBox(handle(10),0,s$) : ' déterminer son numéro select SearchListBox case 1: print "1 = Janvier" case 2: print "2 = Février" case 3: print "3 = Mars" case 4: print "4 = Avril" case 5: print "5 = Mai" case 6: print "6 = Juin" case 7: print "7 = Juillet" case 8: print "8 = Août" case 9: print "9 = Septembre" case 10: print "10 = Octobre" case 11: print "11 = Novembre" case 12: print "12 = Décembre" end_select end
#INCLUDE "KGF_SUB.bas"
| |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: RE Ven 1 Fév 2013 - 15:45 | |
| Je crois que l'on peut le faire en panoramic... - Spoiler:
declarations() interface() Remp_dlist() end ' ------------------------------------------------------------------------------ Sub declarations() dim i% label Clic End_Sub ' ------------------------------------------------------------------------------ sub interface() Objets("form",0,1,0,0,350,100,0,"Find Index") Objets("Alpha",1,1,5,10,0,0,0,"Entrez un mois de l'année (sans accents)") Objets("Edit",2,1,20,10,0,0,0,"") Objets("Alpha",3,1,20,170,0,0,0,"Valeur :") Objets("Dlist",4,1,0,0,0,0,0,"") Objets("button",5,1,20,140,20,20,0,"V") on_click 5,Clic end_sub ' ------------------------------------------------------------------------------ Sub Remp_dlist() dim_local x%,a$ for x%=1 to 12 read a$ item_add 4,a$ next x% End_Sub ' ------------------------------------------------------------------------------ data "JANVIER","FEVRIER","MARS","AVRIL","MAI","JUIN","JUILLET" data "AOUT","SEPTEMBRE","OCTOBRE","NOVEMBRE","DECEMBRE" ' ------------------------------------------------------------------------------ Clic: Valeur() return ' ------------------------------------------------------------------------------ Sub Valeur() dim_local b$,b%,x% b$=upper$(text$(2)) for x%=1 to 12 if item_read$(4,x%)=b$ b%= x% exit_for end_if next x% caption 3,"Valeur :"+str$(x%) End_Sub ' ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ SUB Objets(obj$,No%,V%,T%,L%,W%,H%,P%,C$) DIM_LOCAL indx% ' Création de l'objet IF VARIABLE("T_obj$") = 0 DIM T_obj$ T_obj$="01SCENE3D;02BUTTON;03EDIT;04MEMO;05COMBO;06ALPHA;07FORM;08LIST;09PICTURE;" T_obj$=T_obj$+"10CHECK;11OPTION;12MAIN_MENU;13SUB_MENU;14SOUND;15MOVIE;16TRACK_BAR;" T_obj$=T_obj$+"17OPEN_DIALOG;18SAVE_DIALOG;19SCROLL_BAR;20PROGRESS_BAR;21SPIN;" T_obj$=T_obj$+"22GRID;23CONTAINER;24;25;26DLIST;27SCENE2D;28TIMER;29;30;31;" T_obj$=T_obj$+"32CONTAINER_OPTION;33;34;35;36;37;38;39;40;41IMAGE;" END_IF indx% = INSTR(T_obj$,UPPER$(obj$)+";"): indx% = VAL(MID$(T_obj$,indx%-2,2)) if indx%<>7 and NO%=0 then NO%=NO%+1 SELECT indx% CASE 1: SCENE3D No% CASE 2: BUTTON No% :Caption No%,C$ CASE 3: EDIT No% CASE 4: MEMO No% CASE 5: COMBO No% CASE 6: ALPHA No% :Caption No%,C$ CASE 7: IF No%>0 :FORM No% :end_if:Caption No%,C$ CASE 8: LIST No% CASE 9: PICTURE No% CASE 10: CHECK No% :Caption No%,C$ CASE 11: OPTION No% :Caption No%,C$ CASE 12: MAIN_MENU No% CASE 13: SUB_MENU No% :Caption No%,C$ CASE 14: SOUND No% CASE 15: MOVIE No% CASE 16: TRACK_BAR No% CASE 17: OPEN_DIALOG No% CASE 18: SAVE_DIALOG No% CASE 19: SCROLL_BAR No% CASE 20: PROGRESS_BAR No% CASE 21: SPIN No% CASE 22: GRID No% CASE 23: CONTAINER No% :Caption No%,C$ CASE 26: DLIST No% CASE 27: SCENE2D No% CASE 28: TIMER No% CASE 32: CONTAINER_OPTION No% :Caption No%,C$ CASE 41: IMAGE No% END_SELECT ' Visibilité If V% = 0 Then hide NO% ' Dimensions If H% > 0 Then Height NO%,H% If W% > 0 Then Width NO%,W% ' Placement If indx% = 7 If T% > 0 : Top NO%,T% : Else : Top NO%,(Screen_y-H%)/2 : End_If If L% > 0 : Left NO%,L%: Else : Left NO%,(Screen_x-W%)/2: End_If Else If T% > 0 then Top NO%,T% If L% > 0 then Left NO%,L% End_If ' filiation If P% > 0 then Parent NO%,P% END_SUB
| |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Une astuce qui ne sert à rien ! Ven 1 Fév 2013 - 21:16 | |
| Exact ! Très belle astuce que de mettre la valeur numérique juste devant le critère de recherche, dans la chaîne de référence ! Bravo ! | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Une astuce qui ne sert à rien ! Ven 1 Fév 2013 - 22:10 | |
| | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Une astuce qui ne sert à rien ! Ven 1 Fév 2013 - 22:46 | |
| Ben toute cette gymnastique de programmation aurait pu nous être épargnée si SELECT …CASE…END_SELECT fonctionnait comme on le désirait ! | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Sam 2 Fév 2013 - 1:08 | |
| @ JL35, Promis monsieur, j'ai pas copié... Je n'avais pas fait attention, c' est possible. mais quoi de plus ressemblant qu'un bout de code à un autre bout de code ? | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Une astuce qui ne sert à rien ! Sam 2 Fév 2013 - 1:16 | |
| Les grandes idées se rejoignent ! | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Sam 2 Fév 2013 - 1:56 | |
| C'est ce qui rend utile le forum. Un bout par ci, un bout par là et on y retrouve de quoi solutionner nos problèmes. L'autre soir, je me suis pris à vouloir ré-inventer la roue. J'ai vite arrêté... ...la mienne était carré. | |
| | | Contenu sponsorisé
| Sujet: Re: Une astuce qui ne sert à rien ! | |
| |
| | | | Une astuce qui ne sert à rien ! | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |