Bonjour tout le monde!
Donc voilà, je suis en train de travailler sur mon TD d'informatique depuis hier, et je me retrouve un peu bloqué, car je pense ne pas avoir fait le programme comme mon professeur l'aurait attendu...

En clair, notre programme int2strbin(x) a pour effet de retourner un nombre x (un entier) sous sa forme binaire (sous forme de chaîne).

Donc voici mon programme, avec le maximum de commentaires possibles :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
int2strbin<-function(x){
acc=0
# on définit un accumulateur
nbr=x
# on associe a nbr la valeur choisie pour x
while(nbr>0){
# cette boucle va définir entre autres le nombre de caractères que possédera notre nombre sous forme binaire
# car je n'ai pas trouvé une autre possibilité que de traduire un nombre décimal sous forme "binaire" à
# travers un algorithme, afin de transformer le nombre final en chaîne à l'aide de toString() 
nbr=nbr%/%2
# cette ligne de calcul pour finir la boucle
acc=acc+1
# l'accumulateur qui nous servira à la prochaine boucle
}
options("scipen" = acc+1)
# j'ai utilisé cette fonction, car vu que je renvoyais un nombre décimal sous forme "binaire", j'avais des
# résultats sous forme x*1e+n, donc cette ligne corrige ce souci
binbr=0
# on définit une variable binbr
i=0
# on définit i qui sera utilisée pour multiplier le reste de la division par 1e+i
while(i<=acc){
binbr=binbr+x%%2*10**i
# on associe à binbr le reste de la division par 2 de x à la puissance 10^(i)
x=x%/%2
# on fait une division euclidienne de x par 2
i=i+1
# on rajoute 1 à i pour avoir le chiffre suivant de notre nombre binaire obtenu par binbr
}
print(toString(binbr))
# on affiche le résultat sous forme de chaîne
}
résultat en little endian:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
> int2strbin(3456)
[1] "110110000000"
> int2strbin(42)
[1] "101010"

Le souci, c'est que dans le même exercice, les questions précédentes nous demandaient de programmer un programme nous permettant d'afficher le résultat de la somme des chiffres d'un nombre n de base b à partir de sa forme décimale.
Comme ceci:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
somch<-function(x,n){
acc=0
while(x>n-1){
acc=x%%n+acc
x=x%/%n
}
return(acc+x)
}
résultats:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
> somch(42,2)
[1] 3
> somch(42,10)
[1] 6
> somch(42,16)
[1] 12
Est-ce que la somme des chiffres d'un nombre n de base b a un lien avec le programme demandé au début du topic ? Sachant que notre professeur souhaite que nous ayons le résultat sous forme d'une chaîne en binaire en big et little endian.

Merci pour vos futures réponses!


EDIT: VERSION FINALE


Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
45
46
47
48
49
int2strbin<-function(x){
acc=0
# on définit un accumulateur
nbr=x
# on associe a nbr la valeur choisie pour x
while(nbr>0){
# cette boucle va définir entre autre le nombre de caractères que possédera notre nombre sous forme binaire
# car je n'ai pas trouver une autre possibilité que de traduire un nombre décimal sous forme "binaire" à
# travers un algorithme, afin de transformer le nombre final en chaîne à l'aide de toString()
nbr=nbr%/%2
# cette ligne de calcul pour finir la boucle
acc=acc+1
# l'accumulateur qui nous servira à la prochaine boucle
}
options("scipen" = acc+1)
# j'ai utilisé cette fonction, car vu que je renvoyais un nombre décimal sous forme "binaire", j'avais des
# résultats sous forme x*1e+n, donc cette ligne corrige ce soucis
binbr=0
# on définit une variable binbr
i=0
# on définit i qui sera utilisé pour multiplier le reste de la division par 1e+i
while(i<=acc){
binbr=binbr+x%%2*10**i
# on associe à binbr le reste de la division par 2 de x à la puissance 10^(i)
x=x%/%2
# on fait une division euclidienne de x par 2
i=i+1
# on rajoute 1 à i pour avoir le chiffre suivant de notre nombre binaire obtenu par binbr
}
print("little endian:")
print(toString(binbr))
# on affiche le résultat sous forme de chaîne
binbr8<-utf8ToInt(toString(binbr))
# on traduis la chaine en binaire en un vecteur  traduis en ascii
binbr8p<-binbr8
# on stock binbr8 dans une nouvelle variable bnbr8p
i=1
# on définit une variable i=1
while(i<=acc){
# commencement de la boucle, on rappelle que acc contient le nombre de caractère présent dans la chaine bianaire
binbr8[i]<-binbr8p[acc+1-i]
# on replace le ieme caractere de binbr8 par le acc+1-ieme caractère de binbr8p
i=i+1
# système d'accumulation pour clore la boucle
}
print("Big endian:")
print(intToUtf8(binbr8))
# et voilà! nous avons le résultat en big endian.
}