Creation d un programme en C

Bonsoir

je dois realiser un programme en C qui permet de trouver des combinaisons de chiffres

Pourrais-je avoir des explications ?

Merci.

Et nous ?
Ta question n’est pas super claire. :thinking:

1 J'aime

je desire ecrire une fonction qui affiche dans l ordre croissant toutes les differentes combinaisons de trois chiffres differents dans l ordre croissant
012,013,014,015,015,016,017,018,019,023…789

je voudrai avoir des explications et des idees pour debuter ce programme

Bonjour,

Je te conseille de partir sur un algorithme simple.
Le plus simple que je vois est un truc de ce genre :

initialiser variable nombre à 0
initialiser variable texte de longueur 3
tant que nombre strictement inférieur à 1000
| convertir nombre en texte avec complément à gauche avec des zéros et le mettre dans la variable texte
| si le premier caractère de texte n'est pas égale au deuxième et que le deuxième n'est pas égal au premier et si le premier n'est pas égal au troisième
| | afficher texte
| fin si
| incrémenter nombre
fin tant que

Après, mes compétences en C sont un peu rouillées, mais je pense que tu peux commencer par un truc du genre :

include <stdio.h>

Tu peux aussi en profiter pour vérifier que tu as bien un compilateur de C pour pouvoir compiler le code que tu auras produit.

1 J'aime

Ne pas oublier la condition sur l’ordre des chiffres.
Tu peux le faire avec trois boucles emboîtées :

Pour i de 0 à 7, faire :
| Pour j de i+1 à 8, faire :
| | Pour k de j+1 à 9, faire :
| | | Afficher "%d%d%d",(i,j,k)
| | Fin Pour k
| Fin Pour j
Fin Pour i

La dernière ligne est à finir de traduire en C.

2 J'aime

Ah oui, en effet, je viens de voir le message de @nicola et, nous sommes parti⋅e⋅s dans deux direction opposées. C’est à cause de ça :

Je suis parti⋅e du principe que tu avais collé deux fois le même texte et que tu veux les combinaisons de trois chiffres différents dans l’ordre croissant et @nicola est parti⋅e du principe que tu voulais toutes les combinaisons de trois chiffres différents dans l’ordre croissant, dans l’ordre croissant.
Effectivement, vu ton exemple, qui semble exclure les combinaisons 021, 879, 897, 978 et 987, je me demande qui a bien compris ta demande…

Merci pour le compilateur j ai gcc

Merci Almtesh de me faire remarquer cette ligne de trop dans la reformulation de ma requete

Voici la reformulation

je desire ecrire une fonction qui affiche dans l ordre croissant toutes les differentes combinaisons de trois chiffres differents dans l ordre croissant
012,013,014,015,015,016,017,018,019,023…789

je voudrai avoir des explications et des idees pour debuter ce programme

Regarde mon pseudo-code, il me semble qu’il répond à ta question.

1 J'aime

Je viens d’implémenter le pseudo-code de @nicola et je confirme qu’il semble faire exactement ce que tu veux :

012
013
014
015
016
017
018
019
023
024
025
026
027
028
029
034
035
036
037
038
039
045
046
047
048
049
056
057
058
059
067
068
069
078
079
089
123
124
125
126
127
128
129
134
135
136
137
138
139
145
146
147
148
149
156
157
158
159
167
168
169
178
179
189
234
235
236
237
238
239
245
246
247
248
249
256
257
258
259
267
268
269
278
279
289
345
346
347
348
349
356
357
358
359
367
368
369
378
379
389
456
457
458
459
467
468
469
478
479
489
567
568
569
578
579
589
678
679
689
789

et non, je n’ai pas fait l’implémentation de test en C.

int ma_variable=12;
printf("%03d",ma_variable);

%03d signifie que l’on souhaite afficher la valeur de ma_variable sur 3 chiffres et si le nombre n’a besoin que de un ou deux chiffres il est complété à gauche par des 0.

C’est bien sur un exemple avec une valeur particulière. Pour toutes les autres valeurs, tu peux employer une boucle: for(int ma_variable=0; ma_variable<=789; ma_variable++){

}

Le programme complet enregistré par exemple dans test.c:

#include<stdio.h>
void main(){
for(int a=0; a<=789; a++){
    printf("%03d\n",a);
    }
}

Je te laisse deviner le rôle de \n en le supprimant ou en le remplaçant par un espace :slightly_smiling_face:

Dans un terminal linux:
gcc test.c (pour compiler le code source)
./a.out (pour lancer le fichier exécutable produit)

Oui, c’est vrai, mais il faut manipuler les trois chiffres indépendamment, il est donc plus pertinent d’avoir une variable par chiffre, comme proposé ici :

J’ai testé et je vois, au hasard, la valeur 320, qui ne correspond pas du tout à la liste que j’ai faite par rapport à ce que j’ai compris du besoin.

A mauvais énoncé, mauvais exemple ou réponse :slightly_smiling_face: !

En aucun cas @Pat66 à mentionné la valeur particulière 320 ni même de manipuler les trois chiffres indépendamment. Pour @nicola la question n’est pas claire; @Pat66 reformule clairement sa demande sans préciser qu’il faille manipuler les trois chiffres indépendamment et qu’il y aurait des valeurs particulières à écarter.
Ce n’est pas pour rien que les cours de français existent ! Il ne faut pas les négliger et penser à relire la demande, notamment quand on pense avoir trouvé la solution pour s’assurer que l’on a bien répondu.
Quand on écrit ici, il faut savoir que tous ceux portant un intérêt sur Debian sont susceptibles de lire les messages, pas seulement quelques personnes de la même école ayant reçu le même sujet et reformulé maladroitement ou trop partiellement ici.
Qu’en pense @Pat66 ? C’est je pense plus particulièrement à lui de réagir à présent pour savoir si on répond bien à sa demande; à défaut, il pourrait alors s’exprimer et apporter des précisions utiles qu’il aurait éventuellement oublié.

L’ouvreur du fil a quand même clairement expliqué que les trois chiffres devaient être distincts et dans l’ordre croissant.
Donc en fait, on s’en fout si on utilise trois variables indépendantes ou non ou une seule, ce qui compte est que le programme réponde à la question en un temps raisonnable.

Non absolument pas, relis le premier et le troisième message du fil, ou en d’autres termes les deux premiers messages de @Pat66.

Je ne sais pas ce qu’il te faut de plus. :wink:
Alors oui, on peut pinailler sur l’ordre : s’applique-t-il aux chiffres eux-mêmes ou aux nombres engendrés ? Ben les deux, on dirait.

Oui, tu as raison. C’est d’ailleurs pour ça que 020 est exclu (2 zéros) et 021 aussi car 1 est inférieur à 2.

On pourrait utiliser une simple boucle for i in range(1000), transformer en une chaîne, ajouter le nombre de zéros qui va bien devant (ljust) et tester si les chiffres sont différents (len(set(truc))==len(truc)) et bien rangés (sorted(truc)==list(truc)).
Avantage, on peut étendre le programme à 2 ou 5 chiffres.
Inconvénient, il est moins efficace puisqu’il a du déchet.

J’ai pas souvenir de for i in range en C mais en Python, oui.
On peut faire une boucle générale puis une autre imbriquée de la longueur de la chaine du nombre ou l’on scruterait chaque digit s’il est inférieur au suivant.