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

Messages postés
90
Date d'inscription
samedi 5 juin 2010
Dernière intervention
6 mars 2015
- 22 nov. 2010 à 15:51 - Dernière réponse :
Messages postés
90
Date d'inscription
samedi 5 juin 2010
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.
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
Messages postés
14227
Date d'inscription
lundi 11 juillet 2005
Dernière intervention
16 novembre 2018
- 22 nov. 2010 à 16:37
3
Merci
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

Merci BunoCS 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 86 internautes ce mois-ci

Commenter la réponse de BunoCS
Meilleure réponse
Messages postés
11
Date d'inscription
vendredi 2 avril 2004
Dernière intervention
27 novembre 2010
- 24 nov. 2010 à 22:05
3
Merci
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.

Merci cs_Ballesteros 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 86 internautes ce mois-ci

Commenter la réponse de cs_Ballesteros
Messages postés
90
Date d'inscription
samedi 5 juin 2010
Dernière intervention
6 mars 2015
- 23 nov. 2010 à 10:03
0
Merci
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.
Commenter la réponse de cs_mervat
Messages postés
14227
Date d'inscription
lundi 11 juillet 2005
Dernière intervention
16 novembre 2018
- 25 nov. 2010 à 09:28
0
Merci
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
Commenter la réponse de BunoCS
Messages postés
90
Date d'inscription
samedi 5 juin 2010
Dernière intervention
6 mars 2015
- 25 nov. 2010 à 10:44
0
Merci
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
Commenter la réponse de cs_mervat

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.