Partage
  • Partager sur Facebook
  • Partager sur Twitter

Combinaison a 3 chiffres differents

Peu de piste

Sujet résolu
14 septembre 2008 à 10:52:46

Bonjour a tous!
Alors j'ai trouve un exo a faire, qui est le suivant:
Realiser un programme qui dans l'ordre croissant vous met les combinaisons de trois chiffres differents (sans les reutiliser) ex:

"012, 013, 014, 015, 016, 017, 018, 019, 023, ..., 789"
On aura donc ni "021" ou "102" ou encore "120" car ces 3 chiffres ont deja ete utilises pour "012"

Actuellement j'ai du mal a demarrer. Un fait evident les 3 chiffres doivent etre differents entre eux. Mais je commence a bloquer lorsque je me dis qu'il ne faut pas les reutiliser! En effet, je sais pas si il faut stocker quelque part ces chiffres en memoire ou pas.

Je n'ai donc pas de debut de code, eventuellement une esquisse de boucle dans laquelle les 3 chiffres sont differents mais c'est tout. Donc si vous avez des pistes de reflexion pour moi, conseils et autres, je suis prenneur!
Merci!




P.S.: Desole pour ne pas avoir mis les accents, mais j'ai un QWERTY et je ne sais donc pas comment les faires.
  • Partager sur Facebook
  • Partager sur Twitter
14 septembre 2008 à 11:02:34

Bonjour,

J'ai remarqué que les nombres ayant le chiffre des dizaines ou des unités inférieur à celui des centaines ne doivent pas être affichés car les 3 chiffres le composant ont déjà été utilisés ensemble.

Exemples :
102 ne doit pas être affiché car 0 (chiffre des dizaines) est inférieur à 1 (chiffres des centaines). Déjà utilisé pour 021.
342 ne doit pas être affiché car 2 (chiffre des unités) est inférieur à 3 (chiffre des centaines). Déjà utilisé pour 243.
ETC...

A partir de là, il est facile de programmer un petit algorithme, mais je te laisse faire ;)
  • Partager sur Facebook
  • Partager sur Twitter
14 septembre 2008 à 13:29:30

3 boucles (for) imbriquées.
Une boucle 1 qui fait varier une variable i (représentant les centaines) de 0 à 7.
A l'intérieur de la boucle 1, une boucle 2 qui fait varier une variable j (représentant les dizaines) de i+1 à 8.
A l'intérieur de la boucle 2, une boucle 3 qui fait varier une variable k (représentant les unités) de j+1 à 9.
Et dans la boucle 3, tu affiches le nombre 100*i+10*j+k (ou i puis j puis k, ça te posera pas de problème de 0)
  • Partager sur Facebook
  • Partager sur Twitter
14 septembre 2008 à 16:06:33

Salut Salut!
Apres avoir un peu bosse dessu, je suis arrive a cette conclusion, qu'il faut en fait reinitialise a la fin de la deuxieme boucle les valeurs de b et c car elles dependent de a. De ce fait, et d'apres vos reponses j'ai obtenu le code suivant:

int my_aff_comb()
{
    int a = 0, b = a + 1, c = a + 2;
    printf("%d%d%d\n",a, b, c);

    while(a!=7 && b!=8 && c!=9)
    {
        while(c!=9 && b<=8)
        {
            c++;

            if(c==9)
            {
                printf("%d%d%d\n",a, b, c);
                b++;
                c=b+1;


            }
            printf("%d%d%d\n",a, b, c);

            if(c==9 && b==8)
            {
                a++;
            }

        }
        b=a+1;
        c=a+1;

    }

}


Malheureusement il ne marche pas. La compilation s'arrete a 689 o_O et non 789 lol
Donc je l'ai dans...l'os.
Si quelqu'un sait d'ou vient mon erreur! N'hesitez pas, encore merci des reponses
  • Partager sur Facebook
  • Partager sur Twitter
14 septembre 2008 à 17:43:37

Mouai, je sais pas trop, tu te compliques pas mal la vie je pense.
En tout cas avec un a!=7 en condition c'est pas étonnant que tu rentres pas dans la boucle des 700. ;)
Pour aller au plus simple j'aurais fait ça :
int a, b, c;
for(a=0;a<=7;a++)
{
	for(b=a+1;b<=8;b++)
	{
		for(c=b+1;c<=9;c++)
		{
			printf("%d%d%d\n",a,b,c);
		}
	}
}
Ou ça si tu tiens absolument à utiliser des while
int k,j,i=0;
while(a<=7)
{
	b = a+1;
	while(b<=8)
	{
		c = b+1;
		while(c<=9)
		{
			printf("%d%d%d\n",a,b,c);
			c++;
		}
		b++;
	}
	a++;
}
  • Partager sur Facebook
  • Partager sur Twitter
14 septembre 2008 à 18:12:46

Tu pourrais peut etre recourrir à un tableau test de dix cases mémoires chacune représentant un chiffre. Initialise le à 0 et dès que tu utilise un chiffre mets la valeur de la case correspondante à 1. Comme cela tu pourras tester s'il a déjà été utilisé ou pas... Non?

Enfin c'est juste une piste...
  • Partager sur Facebook
  • Partager sur Twitter
14 septembre 2008 à 21:17:47

Ouais bien joue Cassoulet!
Lol en effet je me compliquais bien la vie, mais l'idee etait la! :lol:

Encore merci a tous ceux qui m'ont aide!
Bonne soiree

EDIT:Je crois avoir grasse a Cassoulet et a Sim++ trouve le bon code, enfin ce qu'on pourrait attendre:
int my_aff_comb()//affiche les differentes combinaisons de 3 chiffres differents
{
    int a, b, c;

        a=0;
        while(a<b<c)
        {
            while(a<=9)
            {
                b=a+1;
                while(b<=9)
                {
                    c=b+1;
                    while(c<=9)
                    {
                        printf("%d%d%d\n",a,b,c);
                        c++;
                    }
                    b++;
                }
                a++;
            }
        }
}



Et sinon generaliser pour plutot qu'avoir a, b, c une valeur n, qui par exemple en valant 3 serait equivalent a: a, b ,c. Possible?
  • Partager sur Facebook
  • Partager sur Twitter
15 septembre 2008 à 13:46:37

n = 100*a+10*b+c ? (pas sûr d'avoir bien compris la question)
Mais je sais pas si c'est possible d'afficher le premier zéro dans ce cas là, genre quand c'est 0 1 et 3 ça va afficher 13 au lieu de 013.

Tu peux te passer du "while(a<b<c)" car tu fais b=a+1, donc b sera toujours supérieur à a. ;) (pareil pour c=b+1 qui donne b<c)
Si tu veux laisser comme ça, faut penser à initialiser b et c avant la première boucle, sinon tu peux pas faire correctement la comparaison. Ça devrait pas compiler sans ça je pense.
  • Partager sur Facebook
  • Partager sur Twitter
15 septembre 2008 à 19:57:39

Lol si ca compile bien (ce qui apres remarque m'etonne aussi), mais en effet on s'en fou de la premiere boucle :lol:
Euh apres j'ai pas bien compris ton expressions de n
Car en fait n represente le nombre de chiffres differents pour realiser les combinaisons dans un ordre croissant. Donc a mon avis, l'idee est d'exprimer n et d'autres n+1, n+2...
Et donc c'est pour ca que lorsque n=3 c'est comme si on avait a, b et c. Mais je ne peut pas rajouter indefiniment de boucle. Donc je suis un peu bloque :euh:o_O
  • Partager sur Facebook
  • Partager sur Twitter
15 septembre 2008 à 22:20:37

Ah ok, j'avais mal compris pour n. ^^

Dans ce cas, je vois pas trop de solution simple :euh: c'est récursif et un peu moche.
Tu changes la constante n dans le main. (genre là c'est 5, comme si on avait a b c d e) (ça serait ptêtre un peu plus cool de le mettre en #define, on aurait pas besoin de le passer en parem de combin)
k c'est un indice qui permet de savoir à quel chiffre de la combinaison on est (a ou b ou c ou...).
num c'est la valeur à laquelle on initialise la boucle (ça correspond au a=0, b=a+1 et c=b+1 ce que j'avais posté tout à l'heure)
On affiche le résultat quand k = 1, ce qui signifique qu'on est arrivé au chiffre des unités de la combinaison. Si c'est pas le cas (le cas où on a pas encore bouclé jusqu'au dernier chiffre de la combinaison) on rappelle la fonction en changeant k par k-1. (on passe au chiffre d'après donc)

Bref ok j'explique pas très bien, j'ai pas trop le temps et je suis fatigué mais ça devrait fonctionner. Si quelqu'un a une solution plus simple et plus jolie, faut pas hésiter. :D
#include <stdio.h>

int combin(int n, int k, int tableau[])
{
	int num;
	if(n==k)
	{
		num=0;
	}
	else
	{
		num=tableau[n-k-1]+1;

	}
	for(tableau[n-k]=num;tableau[n-k]<=10-k;tableau[n-k]++)
	{
		if(k==1)
		{
			for(int i=0;i<n;i++)
			{
				printf("%d",tableau[i]);
			}
			printf("\n");
		}
		else
		{
			combin(n, k-1, tableau);
		}
	}
	return 0;
}

int main(int argc, char * argv[])
{
	const int n = 5;
	int tableau[n];
	combin(n, n, tableau);
	getchar();
	return 0;
}
PS : Evidemment si tu mets un n plus grand que 10, ça va rien t'afficher. ;)
  • Partager sur Facebook
  • Partager sur Twitter
16 septembre 2008 à 1:12:47

Ouep, en effet ca marche nikel (juste la definition de i que t'as introduit dans la boucle for, mais t'es fatigue je comprends :) )
Sinon pour compliquer les choses et te faire badder encore un plus je te disais que la fonction doit etre prototypee de la facon suivant:
"int my_aff_combn(int n);"
lol tu pourrais me sortir un truc portable ou pas?! ^^
Si t'as pas d'idee tant pis, je remet ca a plus tard. Mais si t'en a une ou une piste, hesite pas!
Bonne nuit.
  • Partager sur Facebook
  • Partager sur Twitter
16 septembre 2008 à 9:19:05

Et si tu essayais seul ? Y aura pas toujours quelqu'un pour te dire comment faire et te fournir un code tout fait. Et en plus en faisant seul, c'est là qu'on apprend le mieux.
  • Partager sur Facebook
  • Partager sur Twitter
Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
16 septembre 2008 à 21:15:47

Mais pourquoi tu me dis ca?
Pour le code j'ai pas demande de truc tout fait, uniquement des pistes de reflexion le code c'est moi qui l'est sorti tout seul. Et j'ai jamais demande a ce qu'on me donne le code!
Il est vrai que je mettais complique la vie, mais c'est tout.

Apres pour le n j'ai juste demande quelque chose de plus portable, une fois qu'il avait sorti le code, mais encore une fois je ne l'avais pas demande.
Donc desole mais je me devais de remettre des choses a leurs places.

Relis mes posts, tu t'en rendras compte toi meme.
Donc Merci de ne pas me prendre pour ce que je ne suis pas.
  • Partager sur Facebook
  • Partager sur Twitter
27 août 2012 à 12:29:57

Salut!
void my_aff_comb() {
char n1 = '0', n2 = '0', n3 = '0';

while(n1 <= '9') {
   while(n2 <= '9') {
      while(n3 <= '9') {
         if(n1 <= n2 || n2 <= n3) {
            write(0, &n1, 1);
            write(0, &n2, 1);
            write(0, &n3, 1);
            write(0, '\n', 1);
         }
         n3 = n3 + 1;
      }
      n3 = '0';
      n2 = n2 + 1;
   }
   n2 = '0';
   n1 = n1 + 1;
}

}


Je viens de le faire sans tester, je pense que l'algo est bon, il y peut etre une erreur de syntaxe que j'aurais pas vu, mais je pense que c'est bon
  • Partager sur Facebook
  • Partager sur Twitter
DNTUI
27 août 2012 à 13:32:55

ledenomejojo -> intérêt ?
Sérieusement, pourquoi utiliser les caractères, la fonction write et pas le raccourci de l'incrémentation ? Concours d'obfuscation ?
Et le déterrage, c'est pour le plaisir ?
Surtout que l'algo ne répond pas à l'exercice ('suffit de tester).
  • Partager sur Facebook
  • Partager sur Twitter
27 août 2012 à 15:21:03

Je connais cet exerice, et désolé de te contrarié, mais mon code correspond exactement à la demande de my_aff_comb().
Je connais cet exercice, c'est un exercice donné par épitech pendant la piscine le 3ème jour, c'est pourquoi je n'ai pas utiliser le raccourci de l'incrémentation, et la fonction write. épitech ne veux pas que l'on utilise la lib stdio ou stdlib donc faut faire avec les moyen qu'on a. c'est à dire pas de printf. et pour le raccourci de l'incrémentation, c'est la norme chez épitech, donc au cas ou les gens ferais Copier collé, il copierais un code à la norme d'épitech.
Voilà :)
  • Partager sur Facebook
  • Partager sur Twitter
DNTUI
27 août 2012 à 15:33:21

Merci pour l'aide avec 4 ans (!) de retard. Je suis sur que le PO t'en est reconnaissant.

Et quand bien même tu connaitrais l'exercice, ton code laisse à désirer.
  • Partager sur Facebook
  • Partager sur Twitter
Zeste de Savoirbépocode minimal  — Ge0 <3
27 août 2012 à 15:41:05

Répondre a une question sur un forum ne sert pas qu'à la personne qui à poser la question, ça sert aussi à ceux qui vont se la poser.
  • Partager sur Facebook
  • Partager sur Twitter
DNTUI
Anonyme
27 août 2012 à 15:46:19

Citation : ledenomejojo

c'est la norme chez épitech, donc au cas ou les gens ferais Copier collé, il copierais un code à la norme d'épitech.
Voilà :)


Trop cool, tu viens d'inventer l'anti-copié/collé.
Fallait y penser. :-°
  • Partager sur Facebook
  • Partager sur Twitter
27 août 2012 à 15:51:50

Citation : ledenomejojo

Je connais cet exerice, et désolé de te contrarié, mais mon code correspond exactement à la demande de my_aff_comb().


Citation : Enoncé

Realiser un programme qui dans l'ordre croissant vous met les combinaisons de trois chiffres differents


Non, ton code ne correspond pas à la demande de l'exercice de ugo188.

Citation : ledenomejojo

Je connais cet exercice, c'est un exercice donné par épitech pendant la piscine le 3ème jour, c'est pourquoi je n'ai pas utiliser le raccourci de l'incrémentation, et la fonction write. épitech ne veux pas que l'on utilise la lib stdio ou stdlib donc faut faire avec les moyen qu'on a. c'est à dire pas de printf. et pour le raccourci de l'incrémentation, c'est la norme chez épitech, donc au cas ou les gens ferais Copier collé, il copierais un code à la norme d'épitech.


Où est-il question d'Epitech ?

Citation : ledenomejojo

Répondre a une question sur un forum ne sert pas qu'à la personne qui à poser la question, ça sert aussi à ceux qui vont se la poser.


Dans ce cas, tout le monde devrait déterrer un sujet pour y ajouter sa réponse ? Si quelqu'un se "pose la question", comme tu le dis, il va chercher. Et s'il tombe sur ce sujet, il trouvera des éléments de réponse. S'il n'arrive toujours pas à ses fins, alors il peut créer un nouveau sujet pour présenter plus précisément son problème.

Enfin, il me semble que ugo188 a trouvé la réponse à son problème. Si quelqu'un d'autre a le même, il trouvera sûrement également sa réponse.
  • Partager sur Facebook
  • Partager sur Twitter
27 août 2012 à 16:00:22

Il est question d'épitech parce que cet exercice est donné par épitech. L’énoncer est le même et le prototype aussi.

Peut être que ugo188 a trouvé la réponse à son problème, mais, peut être que d'autre vont se poser la même question et tomber sur ce sujet qui aura plusieurs solution. Dont une solution pour les Tek (Tek = Personne qui étudie à épitech pour ceux qui ne savent pas) qui ne comprend pas de for, ni de printf.
  • Partager sur Facebook
  • Partager sur Twitter
DNTUI
27 août 2012 à 16:03:03

Citation : Nelxiost

Citation : ledenomejojo

Je connais cet exercice, c'est un exercice donné par épitech pendant la piscine le 3ème jour, c'est pourquoi je n'ai pas utiliser le raccourci de l'incrémentation, et la fonction write. épitech ne veux pas que l'on utilise la lib stdio ou stdlib donc faut faire avec les moyen qu'on a. c'est à dire pas de printf. et pour le raccourci de l'incrémentation, c'est la norme chez épitech, donc au cas ou les gens ferais Copier collé, il copierais un code à la norme d'épitech.


Où est-il question d'Epitech ?



Epitech est partout :p
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
27 août 2012 à 16:55:34

Comme quoi à Epitech on apprend à coder salement.
  • Partager sur Facebook
  • Partager sur Twitter
27 août 2012 à 17:07:59

Citation : Gwenn

Comme quoi à Epitech on apprend à coder salement.


+1

Citation : ledenomejojo

Il est question d'épitech parce que cet exercice est donné par épitech. L’énoncer est le même et le prototype aussi.


Epitech donne peut-être un exercice identique à celui-ci, mais qui te dit que c'est le cas pour ugo188 ?

Citation : ledenomejojo

Peut être que ugo188 a trouvé la réponse à son problème, mais, peut être que d'autre vont se poser la même question et tomber sur ce sujet qui aura plusieurs solution.


Vive l'auto-citation :

Citation : Nelxiost

Si quelqu'un se "pose la question", comme tu le dis, il va chercher. Et s'il tombe sur ce sujet, il trouvera des éléments de réponse. S'il n'arrive toujours pas à ses fins, alors il peut créer un nouveau sujet pour présenter plus précisément son problème.



Citation : ledenomejojo

Dont une solution pour les Tek (Tek = Personne qui étudie à épitech pour ceux qui ne savent pas) qui ne comprend pas de for, ni de printf.


Simple curiosité : jusqu'à combien d'années (d'études) Epitech impose cette règle ?
  • Partager sur Facebook
  • Partager sur Twitter
27 août 2012 à 17:26:51

@Gwenn -> Je ne suis pas à épitech et je n'y ai jamais été.

@Nelxiost -> Comme j'ai dis à Gwenn, je ne suis pas d'épitech, donc je ne sais pas combien de temps épitech impose ces règles, je connais juste les exercices qui sont demandé pour la piscine les 3 premières semaines.

Et c'est à quel endroit de mon code vous fait dire que c'est codé salement ?
  • Partager sur Facebook
  • Partager sur Twitter
DNTUI
Anonyme
27 août 2012 à 17:32:04

Indentation dégueulasse, boucle while là où la sémantique du langage exige un for (tu double la longueur du code en le rendant moins lisible, par trois fois, et c'est stupide), constantes magiques, mauvais noms de variables et utilisation de 3 writes séparés là où un seul suffit, et encore on parle d'un code de 10 lignes qui n'exige aucune réflexion alors j'imagine pas sur un vrai programme...
C'est peut-être conforme au standard Epitech mais c'est en tout cas un code dégueulasse.
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
27 août 2012 à 17:32:20

Entre la ligne 0 et 22.
  • Partager sur Facebook
  • Partager sur Twitter
27 août 2012 à 17:50:58

Je m'ennuyais :
Pour rappel, voici le code :
void my_aff_comb() {
char n1 = '0', n2 = '0', n3 = '0';

while(n1 <= '9') {
   while(n2 <= '9') {
      while(n3 <= '9') {
         if(n1 <= n2 || n2 <= n3) {
            write(0, &n1, 1);
            write(0, &n2, 1);
            write(0, &n3, 1);
            write(0, '\n', 1);
         }
         n3 = n3 + 1;
      }
      n3 = '0';
      n2 = n2 + 1;
   }
   n2 = '0';
   n1 = n1 + 1;
}

}

Déjà, on voit des fautes d'indentation en lignes 2 et 4.
Ensuite, tes incrémentations devraient utiliser le raccourci, tout simplement parcequ'il est plus lisible.
La fonction write est mal utilisée. Je ne l'ai moi-même jamais utilisée, mais d'après une simple recherche, le premier argument devrait être 1, pour "standard output", et le second devrait être une chaîne terminée par un caractère nul. Aussi, tu envoies un caractère comme second argument l.11, or il faut une adresse (comme dans les 3 autres appels).
Enfin, toutes tes boucles while peuvent être remplacées par des boucles for, plus lisibles.

Comme je te l'ai dis, ton code ne correspond pas à l'attente, car il donne des nombres dont plusieurs chiffres sont identiques (deux fautes dans la condition du if).

En transformant ton code, je suis parvenu à ça (j'ai pas trop cherché, hein) :
void my_aff_comb()
{
    char n1[] = "_", n2[] = "_", n3[] = "_";

    for (n1[0] = '0'; n1[0] <= '9'; n1[0]++) {
        for (n2[0] = '0'; n2[0] <= '9'; n2[0]++) {
            for(n3[0] = '0'; n3[0] <= '9'; n3[0]++) {
                if(n1[0] < n2[0] && n2[0] < n3[0]) {
                    write(1, n1, 1);
                    write(1, n2, 1);
                    write(1, n3, 1);
                    write(1, "\n", 1);
                }
            }
        }
    }
}

... ce qui répond bien à l'exercice (mais qui reste sale).

Note : je ne suis pas sûr de la nécessité d'utiliser des chaînes, et j'ai la flemme de tester. De toutes façons, je n'utiliserais pas write() pour un tel exercice.


PS : Je suis tout à fait d'accord avec Gwenn et Hod
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
27 août 2012 à 17:54:28

Citation : Gwenn

Comme quoi à Epitech on apprend à coder salement.



Gwenn, je t'aime, et j'espère que cette phrase [la tienne] sera gravée dans le Panthéon un jour. ♥
  • Partager sur Facebook
  • Partager sur Twitter
27 août 2012 à 17:57:29

Pour les boucle, je veux bien. mais comme je donnais une réponse pour les gens d'épitech, je n'ai pas mis de for car il est interdi pour cet exercice d'utiliser un for. Et pour write écrit plusieur fois alors qu'on peut le faire en une seule fois, bah je savais pas, je débute en C donc voilà :/
  • Partager sur Facebook
  • Partager sur Twitter
DNTUI