Programma per le combinazioni di un nome

di il
2 risposte

Programma per le combinazioni di un nome

Salve a tutti ho fatto questo programma che stampa le combinazioni di un nome in ordine, dalla prima all'ultima. Un esempio scrivo "Manuel",metto k=3, stampa man-mau-mae-mal-mnu-mne-mnl-mue-mul-mel. In pratica sposta sempre di uno l'ultima lettera. Se avessi messo il k=4, avrebbe stampato manu-mane-ecc.. Se avessi messo il k=2 allora ma-mn-mu-me-ecc..

Funziona bene il programma solo che dovrebbe stampare altre combinazioni in più ovvero quelle eliminando la m, quindi anu-ane-anl.

In pratica dovrei sommare le combinazioni che mi vengono di manuel più le combinazioni di anuel più le combinazioni di nuel più quelle di uel.

Purtroppo non riesco ad eliminare la m e fargli stampare le successive combinazioni.
Per stamparle tutte devo scrivere manuel, poi rifar partire il programma e scrivere anuel, rifarlo partire e scrivere nuel così via. Invece vorrei che me le stampasse tutte quante solo scrivendo manuel. Le combinazioni infatti se le sommo vengono 20 che corrispondono se le calcolo con il binomio di newton.
#include <iostream>

using namespace std;
char v[50];
int p;
int i2;
int i;
int n;
int k;
int e;
int f;
int q;
char z;
int t;
int y;
int s;
int main()
{
cout<<"Inserisci il numero di caratteri del nome: ";
    cin>>n;
    q=n;
    cout<<"Inserisci il nome di "<<n<<" lettere: ";
    for(i=0;i<n;i++){
                     cin>>v[i];} 
cout<<"Inserisci il numero di elementi che deve avere ogni combinazione: "; 
  cin>>k;
  cout<<"Le possibili combinazioni sono: "<<endl;
  for(p=0;p!=q-2;p++){
  s=k;
  t=k;
  f=k;
  y=k;
  z=v[y-1]; 
  for(e=0;e<n+1-k;e++){
                     i=0;
                     do{
                                cout<<v[i];
                                i=i+1;}
                                while(i!=k);
                                cout<<endl;
                     v[s-1]=v[t];
                     t=t+1;
                     }
                     v[y-1]=z;
                     y=y+1;
                     for(i2=0;i2<n+1-k;i2++){
                     v[f-2]=v[f-1];
                     f=f+1;}
                     v[n-1]=0;
                     n=n-1;
                      cout<<endl;         
                    }
                    system("pause");
                   return 0;                 
}

2 Risposte

  • Re: Programma per le combinazioni di un nome

    Io l'ho scritto in C e non in ++
    
    #include <stdio.h>
    #include <string.h>
    
    #define MAX 64
    int main (void)
    {
      char buff[MAX],*pbuff;
      char tokn[MAX];
      int l,k;
      int i,j,p;
      
      printf ("Digita il nome: ");
      scanf ("%s",&buff);
      
      l=strlen(buff);
      
      printf ("Digita k (1..%d): ",l);
      scanf ("%d",&k);
      if (k<1 || k>l)
        return 1;
      
      pbuff=&buff[0];
      do 
      {
        for (i=0;i<l-(k-1);i++)
        {
          p=0;
          tokn[p++]=*pbuff;
          for (j=i+1; j<i+k && j<l;j++)
            tokn[p++]=*(pbuff+j);
          tokn[p]='\0';
    
          do
          {
            printf ("%s\n",tokn);
            tokn[p-1]=*(pbuff+j);
          }while (j++<l);
        }
        
        pbuff++;
        l--;
      }while (l);
      
      return(0);   
    }
    
    Output:
    
    Digita il nome: manuel
    Digita k (1..6): 3
    man
    mau
    mae
    mal
    mnu
    mne
    mnl
    mue
    mul
    mel
    anu
    ane
    anl
    aue
    aul
    ael
    nue
    nul
    nel
    uel
    
    Digita il nome: manuel
    Digita k (1..6): 4
    manu
    mane
    manl
    mnue
    mnul
    muel
    anue
    anul
    auel
    nuel
    
    Digita il nome: manuel
    Digita k (1..6): 5
    manue
    manul
    mnuel
    anuel
    
    Digita il nome: manuel
    Digita k (1..6): 6
    manuel
    
    
  • Re: Programma per le combinazioni di un nome

    Perfetto funziona benissimo..

    Solo che ora mi servirebbe in c++ e non sono capace a tradurlo..
Devi accedere o registrarti per scrivere nel forum
2 risposte