Bonjour,
Je découvre Pascal et j'ai beau chercher (peut être mal :aie: ) je ne trouve pas d'opérateur d'échange. Ce langage ne dispose pas de cet opérateur ?
Merci d'éclairer ma lanterne ? :)
Version imprimable
Bonjour,
Je découvre Pascal et j'ai beau chercher (peut être mal :aie: ) je ne trouve pas d'opérateur d'échange. Ce langage ne dispose pas de cet opérateur ?
Merci d'éclairer ma lanterne ? :)
Non il n'existe pas, il faut passer par une variable intermédiaire :)
Merci de ta réponse :) , j'aurai encore pu continuer à chercher longtemps :mouarf:
Salut, il n'a y a pas d'opérateur d'echange mais si ce que tu veux echanger sont des nombres il y a une astuce pour le faire sans 3e variable:
ouCode:
1
2
3
4
5
6
7
8
9 Var a,b: integer; begin a:= 2; b:= 5; b:= b-a; // 5 - 2 = 3 a:= a+b; // 2 + 3 = 5 b:= a-b; // 5 - 3 = 2 end;
Ca épargne une variable et ça ne demande pas plus d'instructions qu'avec une 3e variable.Code:
1
2
3
4 a:= a+b; // 2 + 5 = 7 b:= a-b; // 7 - 5 = 2 a:= a-b; // 7 - 2 = 5
Bonjour,
C'est une solution assez connue, mais qui a ses propres défauts:Citation:
Envoyé par Mushroom7
- ne marche que sur les types scalaires (en réels, on risque fort d'avoir des approximations lors des calculs)
- et même dans ce cas des scalaires, se méfier des dépassements de capacité, qui peuvent conduire à des erreurs grossières.
Donc, ça marche, mais il faut absolument être sûr de ce qu'on fait.
Alors que la solution avec une variable temporaire marche pour tous les types, et ne pose aucun problème.
Il y a plusieurs années j'avais été confronté au même problème et j'avais codé une série de fonctions (avec troisième variable) selon le type des variables : EchangeInt ; EchangeReal, EchangeChar etc.
Tu les intégres dans une unit perso et voilà. C'est utile quand on a pas mal de fonction d'échange à utiliser dans un programme.
En fait, ce que je désirai faire c'est un programme qui avec quatre variables imposées me permet de permuter de manière cyclique à droite les valeurs contenues dans celles-ci.
Après avoir compris qu'il n'y avait pas d'opérateur d'échange, j'ai donc créé une variable supplémentaire qui me sert de variable de stockage (temp).
Merci de vos conseils :)
Code:
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
31 program cycl_droi; var a,b,c,d,cpt,temp: integer; begin writeln('Entrez 4 valeurs positives entieres'); writeln; readln(a,b,c,d); writeln; cpt:=0; temp:=0; repeat begin writeln('a a pour valeur : ',' ',a); writeln('b a pour valeur : ',' ',b); writeln('c a pour valeur : ',' ',c); writeln('d a pour valeur : ',' ',d); writeln; writeln('temp a pour valeur : ',' ',temp); writeln('cpt a pour valeur : ',cpt); writeln('-----------------'); writeln; temp:=d; d:=c; c:=b; b:=a; a:=temp; cpt:=cpt+1; end; until cpt>4; readln end.
Bonjour,
Conseil : prends l'habitude d'indenter ton code, comme ceci, par exemple
J'y ai ajouté quelques petits commentaires.Code:
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44 program cycl_droi; var a,b,c,d,cpt,temp: integer; begin writeln('Entrez 4 valeurs positives entieres'); writeln; readln(a,b,c,d); writeln; cpt:=0; temp:=0; { des lignes vides pour aérer le code [pas trop quand même] ici on sépare la boucle repeat du reste. } { à propos de la boucle repeat, comme on connaît le nombre de tours à faire, avant d'entrer dans la boucle, on devrait plutôt utiliser une boucle for } repeat { begin supprimé, car inutile, le bloc repeat until se suffit à lui-même} writeln('a a pour valeur : ',' ',a); writeln('b a pour valeur : ',' ',b); writeln('c a pour valeur : ',' ',c); writeln('d a pour valeur : ',' ',d); writeln; writeln('temp a pour valeur : ',' ',temp); writeln('cpt a pour valeur : ',cpt); writeln('-----------------'); writeln; { et quelques petits commentaires ne font pas de mal : permutation des valeurs, temp sert de relai } temp:=d; d:=c; c:=b; b:=a; a:=temp; cpt:=cpt+1; { end; supprimé, car inutile, voir le begin plus haut } until cpt>4; readln end.
Ok, merci :) c'est vrai que ta version est plus claire à lire.
Je vais faire une grande pancarte pour mettre au-dessus de mon écran :
"indentez-indentez : il en restera toujours quelque chose" ;)
Pour l'écriture du code, je ne connais pas encore les subtilités des "begin-end" ce qui fait que j'ai la manie d'en mettre un peu partout :aie:
J'ai pris bonne note de tes infos :P
Est-ce que inc(cpt); est portable ?Citation:
Envoyé par thewho
Normalement oui
Euh, par normalement, tu veux dire Pascal ISO ? ou c'est seulement TP ?Citation:
Envoyé par wormful_sickfoot
Disons que tous les compilateurs modernes implémentent les mêmes instructions que TP, donc le standard c'est la version TP du Pascal, par facilité. On doit trouver inc() dans tous les compilateurs modernes je pense.
OK. A défaut de 'standard' au sens ISO du terme, on peut dire que TP est la version "d'usage", c'est ça ?Citation:
Envoyé par wormful_sickfoot
Tout à fait, comme tous les autres compilateurs se sont alignés sur lui ;)
OK, merci. (je me remet à jour après 20 ans de C)Citation:
Envoyé par wormful_sickfoot