Combinaisons possibles C(n,k)

Résolu
cs_mervat Messages postés 90 Date d'inscription samedi 5 juin 2010 Statut Membre Dernière intervention 6 mars 2015 - 22 nov. 2010 à 15:51
cs_mervat Messages postés 90 Date d'inscription samedi 5 juin 2010 Statut Membre Dernière intervention 6 mars 2015 - 25 nov. 2010 à 10:44
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

BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
22 nov. 2010 à 16:37
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
3
cs_Ballesteros Messages postés 11 Date d'inscription vendredi 2 avril 2004 Statut Membre Dernière intervention 27 novembre 2010
24 nov. 2010 à 22:05
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.
3
cs_mervat Messages postés 90 Date d'inscription samedi 5 juin 2010 Statut Membre Dernière intervention 6 mars 2015
23 nov. 2010 à 10:03
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.
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
25 nov. 2010 à 09:28
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_mervat Messages postés 90 Date d'inscription samedi 5 juin 2010 Statut Membre Dernière intervention 6 mars 2015
25 nov. 2010 à 10:44
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
0
Rejoignez-nous