Combinaisons possibles C(n,k) [Résolu]

Signaler
Messages postés
90
Date d'inscription
samedi 5 juin 2010
Statut
Membre
Dernière intervention
6 mars 2015
-
Messages postés
90
Date d'inscription
samedi 5 juin 2010
Statut
Membre
Dernière intervention
6 mars 2015
-
bonjour,
je veux faire la combinaison de n entiers, j'ai trouvé ce code dans un forum qui convient à ce que je veux:
#include <string>
#include 
using namespace std;
typedef char* lpstrz ;
void combirec(int k, lpstrz l[], const string &s) {
  if (k==0) {
    cout << s << endl;
    return;
  }
  if (*l==0) return;
  if (s.empty())
  {
    combirec(k-1, l+1, *l);
  }
  else
  {
    combirec(k-1, l+1, s+","+*l);
  }
  combirec(k, l+1, s);
}
int main() {
  lpstrz tableau[] = {"1", "2", "3", "4", "5", 0};
  combirec(3, tableau, "" );
  return 0;
}

sauf que mon tableau ne contient pas 1,2,3,4,5 mais contient n éléments (n est déterminé par une autre fonction); j'ai fait ces modifications au main pour adapter ce code à mon problème:
int main() {
 
  int n = nombreLignes ("in.txt"); // fonction qui détermine le nbre de lignes d'un texte
  
  char j[10]; 
  lpstrz tableau[10];
  for (int i = 1; i <= n+1 ; i++) 
  
  {  if (i==n+1) 
 tableau [i] = "0";  // j'ai fait comme le code précédent, le dernier élément 0 
     else
 {
 sprintf (j,"%d",i); // pour convertir int en char car on va remplir un tableau de char
 tableau[i] = j; 
         }
   
  }
  
  combirec(3, tableau, "" );
  system ("pause");
  return 0;
}

avec ces modification, rien n'est affiché, pourrais je avoir votre aide pour savoir comment corriger ce code?
et merci d'avance.

5 réponses

Messages postés
14854
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
7 avril 2020
91
Hello,
sauf que mon tableau ne contient pas 1,2,3,4,5 mais contient n éléments (n est déterminé par une autre fonction);

Il va falloir que tu passes par une allocation dynamique: malloc() ou new.

lpstrz tableau[10];
  for (int i = 1; i <= n+1 ; i++)

Tu va avoir un souci si n > 10. Passes par une allocation dynamique

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Rejoignez mon réseau professionnel sur Viadeo
Messages postés
11
Date d'inscription
vendredi 2 avril 2004
Statut
Membre
Dernière intervention
27 novembre 2010

Est ce qu'il y a un interêt caché à travailler avec des char * pour passer des nombres ?? . Ca me semble assez hallucinant comme code que tu as trouvé, il faut utiliser un tableau d'entiers et tu t'éviteras un paquet d'ennuis.

Ensuite, c'est une bonne idée de faire une allocation dynamique plutôt qu'un tableau de taille 10. Si tu es en train d'apprendre le C++, il vaut mieux partir du principe que tu peux avoir plus que 10 éléments et tu devra alors choisir si tu tronques ta série à 10, ou si tu crée un tableau de la taille voulue. Pour tronquer il te suffirait de faire un min(n,10) avant de lancer ta boucle, ou alors faire une double condition dans le if (<n+1 && <10).

Autre chose, tu ne remplis pas l'index 0 de ton tableau, donc quand tu écrit tableau[n+1], tu es en dehors des limites de ton tableau. Ta boucle for doit être : for (int i=0;i<10;++i)
si jamais n<10, il faut que tu rajoute une condition pour mettre une valeur 'joker' dans ton tableau.
Messages postés
90
Date d'inscription
samedi 5 juin 2010
Statut
Membre
Dernière intervention
6 mars 2015

bonjour,
dans mon exemple je sais que n ne dépasse jamais 10 c'est pourquoi j'ai fait tableau [10], mais merci comme même je vais essayer de faire l'allocation dynamique.
Messages postés
14854
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
7 avril 2020
91
Est ce qu'il y a un interêt caché à travailler avec des char *

Tiens, je n'avais pas fait gaffe à ça...C'est clair que les int sont plus indiqués...

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Rejoignez mon réseau professionnel sur Viadeo
Messages postés
90
Date d'inscription
samedi 5 juin 2010
Statut
Membre
Dernière intervention
6 mars 2015

bonjour et merci beaucoup pour vos réponses, voila j'ai changé totalement le code, j'ai fait une allocation dynamique et un tableau de int au lieu de char *,
franchement j'ai trouvé le code sur le net et j'ai fait quelques modifications pour l'adapter à mon problème.

#include <stdio.h>
#include <stdlib.h>
#include <string>
#include 

void afficher( int *p, int n) {
  int i;
  for (i = 0; i < n; i++) std::cout << p[i] << " ";
  std::cout << std::endl;
}

void combi2(int cmb[], int n, int p , int i, int k) {
if (k == p) afficher(cmb,p);
else if (i < n) {
combi2(cmb,n,p,i+1,k);
cmb[k] = i;
combi2(cmb,n,p,i+1,k+1);
}
}

int main() {
  int n=5;  // dans mon cas n est donné par une fonction mais pour simplifier je vais       
           //  supposer que n= 5
  int *combi;
  combi=new int[n+1];
  combi2(combi,n+1,3,1,0);
  system ("pause");
  return 0;}

et le résultat sera:
345
245
235
234
145
135
134
125
124
123