Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    [C/C++]-Aiuto per programma di calcolo

    dunque, sono stato vago nel titolo xke se no era troppo lungo! Allora, sto impazzendo da una settimana per un programma idiota ma che mi serve urgentemente e non riesco a saltarne fuori. Dunque...
    In questo programma io devo inserire una stringa di caratteri, per esempio UBS. Lui deve calcolarmi quante possibilita ho di cambiare le lettere, cioè di fare le combinazioni possibili. [lasciate stare le parole con le doppie lettere tipo mamma, o casa...]. Le combinazioni si trovano facilmente con il fattoriale del numero di lettere ke compongono la stringa ma poi non riesco a far scrivere e a calcolare tutte le possibili combinazioni. Ovvero:

    -Inserisco UBS come stringa.

    Il programma mi scrive:

    UBS
    USB
    BUS
    BSU
    SBU
    SUB

    Spero di essere stato chiaro, se qualcuno sa aiutarmi, magari trovando qualche link con le sorgenti del programma [se è in c++ e meglio altrimenti cerkerò di convertirlo] oppure se qualcuno lo sa fare o l'ha già fatto spero sia gentile nel passarmi le sorgenti.
    Ringrazio anticipatamente e spero in risposte positive xke non so piu dove sbattere la testa ormai...
    #include <cervello.h>

  2. #2
    Scusa non puoi mettere la parola in un array (in cui ogni lettera ha un indice ) e poi generare tutte le possibili permutazioni degli indici?
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  3. #3
    permutazioni inzomma?
    La stupidità umana e l'universo sono infinite.
    Della seconda non sono certo(Einstein)

    Gnu/Linux User

  4. #4
    permutazioni inzomma?
    Lucas,ma la tua è una domanda o una risposta?Io gli sto suggerendo di usare un algoritmo per le permutazioni (cerdo di averlo pure in C da qualche parte,senza stare a spremersi per scriverlo),tu gli stai suggerendo lo stesso?Oppure non ho capito
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  5. #5
    no un attimo... io prendo la stringa di inizio e la metto in un vettore di caratteri. E fin li ok, poi trovo il fattoriale in modo da sapere quante combinazioni posso avere in totale. Ma poi non so più andare avanti. Cioè in realtà avevo idea di come fare, con il random. Ma non posso farlo per il semplice fatto ke non posso usare il random xke con parole piccole ci starebbe poco ma quando ho un disastro di numeri il processore frigge un po.. insomma devo fare il programma in modo piu preciso possibile. Avevo pensato di generare in modo random e di confrontare se la parola uscente la ho già altrimenti andava avanti a generare.. purtroppo non posso fare cosi.
    Se hai le sorgenti mi faresti un gran favore, poi le guardo e ci faccio l'algoritmo. Vi ringrazio

    Help me
    #include <cervello.h>

  6. #6
    Ora cerco e se lo trovo te lo passo all'istante
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  7. #7
    codice:
    #include <stdio.h>
    #include <string.h>
    
    //prototipi di funzione
    void Swap(char* string,int i,int j);
    void Permutations(char *string,int i ,int n);
    
    
    void main()
    {
    	char s[256];//poi per lungezze maggiori ti arrangi tu ma tanto il tempo di  esecuzione 
    	            //cresce col fattoriale e non conviene esagerare con la lungezza....
    	printf("Dammi la stringa (max 255 caratteri):");
    	scanf("%s",s);
    	Permutations(s,0,(int)strlen(s)-1);
    }
    
    
    //Genera ricorsivamente le permutazioni
    void Permutations(char *string,int i ,int n)
    {
    	int j;
    	if(i==n)
    	{
    		for(j=0;j<=n;j++)
    			printf("%c",string[j]);
    		printf("\n");
    	}
    	else
    	{
    		for( j = i ; j<=n ; j++ )
    		{
    			Swap(string,i,j);
    			Permutations(string,i+1,n);
    			Swap(string,i,j);
    		}
    	}
    }
    
    //Effettua un semplice scambio di posizione
    void Swap(char* string,int i,int j)
    {
    	int temp;
    	temp = string[i];
    	string[i] = string[j];
    	string[j] = temp;
    }
    Toh...!Dimmi se ti va bene.
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  8. #8
    Utente bannato
    Registrato dal
    Sep 2003
    Messaggi
    1,012
    Ehmm...

    io ho tentato di aiutarti ma ho capito male.

    Alla fine mi è venuto un programma che genera tutte le combinazioni possibili con un insieme di lettere. Come un password generator a forza bruta, circa!

    Ora ho capito che ho sbagliato tutto ma il codice può essere interessante lo stesso visto che ci ho bazzilato 2 ore!

    codice:
    #include <iostream>
    #include <string>
    // per system("PAUSE") e exit()
    #include <cstdlib>
    
    using namespace std;
    
    void disp();
    void init(char *a, int n);
    void show();
    void filltable();
    
    int tot_chars;
    int *vals;
    string parola;
    
    void main()
    {
    	cout << "Ciao, questo programma serve per visualizzare tutte le combinazioni possibili con i caratteri di una parola anche ripetendoli. La lunghezza è quella della parola data." << endl;
    	cout << "Autore: Andrea Fogari" << endl;
    	cout << "Inserisci la parola o frase e premi invio." << endl;
    	cout << "Sono anche ammessi spazi e caratteri ripetuti, che saranno ripetuti anche nelle combinazioni." << endl;
    	cout << "Premi solo invio se vuoi cifre da 0 a 9." << endl;
    	// 40 caratteri dovrebbero bastare a fondere qualsiasi computer
    	char buf[40]; cin.getline(buf,40); parola = buf;
    	filltable();
    	disp();
    	delete [] vals;
    	cout << "Grazie e arrivederci." << endl;
    }
    
    void filltable()
    {
    	int i;
    	if(parola.size() == 0)
    	{
    		cout << "Quante cifre devono avere i numeri?" << endl;
    		do {
    			cin >> tot_chars;
    		} while (tot_chars <= 0);
    		vals = new int[tot_chars];
    		if(!vals)
    		{
    			cout << "Memoria insufficiente!!!"<<endl;
    			system("PAUSE");
    			exit(1);
    		}
    		// Riempie la tabella con cifre da 0 a 9
    		for(i=0; i<10; i++)
    			parola += i + '0';
    
    	}
    	else
    	{
    		tot_chars = parola.size();
    		vals = new int[tot_chars];
    		if(!vals)
    		{
    			cout << "Memoria insufficiente!!!"<<endl;
    			system("PAUSE");
    			exit(1);
    		}
    	}
    	// Inizializza tutto con il primo valore
    	for(i=0; i<tot_chars; i++)
    		vals[i] = 0;
    }
    
    void disp()
    {
    	int last = tot_chars - 1;
    	int pos = last;
    	bool end_flag;
    
    	// Mostra la combinazione attuale (tutti zeri)
    	show();
    	for(end_flag = false; !end_flag; )
    	{
    		// Incrementa il valore alla posizione corrente
    		vals[pos]++;
    		// Mostra la combinazione attuale
    		show();
    		// Torna alla prima posizione.
    		pos = last;
    		// Vado avanti finchè non trovo un valore che non sia l'ultimo
    		while (vals[pos]==(parola.size()-1))
    		{
    			// Imposto la posizione corrente a 0
    			vals[pos] = 0;
    			// precedente
    			pos--;
    			// Se sono arrivato prima dell'inizio del vettore, 
    			// cioè anche il primo carattere era un valore finale (come 9)
    			// allora ho finito.
    			if(pos < 0) end_flag = true;
    		}
    
    	}
    }
    
    void show()
    {
    	for(int i=0; i<tot_chars; i++)
    	{
    		cout<<parola[vals[i]];
    	}
    	cout << endl;
    }
    Forse c'è ancora qualche bug...

  9. #9
    ragazzi siete mitici.. grazie infinite. Oggi ho finito il mio dato ke mi era venuto un colpo di genio, ma vedrò anke i vostri nn vi preoccupate, grazie ankora e scusate se vi ho fatto perdere tempo.. vi posto il mio

    codice:
    #include <iostream.h>
    #include <stdio.h>
    #include <conio.h>
    
    #define mx	10		   // dimensione massima della parola
    #define dim	256		// dimensione dell'alfabeto
    
    /*
    	genera la statistica dei caratteri di stringa[] (frequenza) in freq[] e
       restituisce la lunghezza della stringa
    */
    
    int fact(char stringa[], int freq[])
    {
    	int l;
       
    	for(int i=0; i<dim; i++)	 // azzera le frequenze
    		freq[i]=0;
    	for(l=0; stringa[l]!='\0'; l++)   // conta le occorrenze dei car. in stringa[]
    		freq[stringa[l]]++;
    	return l;					    // l e' la lunghezza di stringa[]
    }
    
    /*
    	aggiunge un carattere in posizione n nell'anagramma a prelevandolo
    	dal pool di caratteri disponibili descritto da freq[]
    */
    
    void calcola(int freq[], char anagramma[], int lung, int n, int &x)
    {
    	int c;
    
    	if(n<lung)                             // altri caratteri da aggiungere?
       {
    		for(c=0; c<dim; c++)                // controlla tutti i caratteri
          {
    			if(freq[c]>0)                    // il carattere e' disponibile?
          	{
    				anagramma[n]=c;				   // lo appendo all'anagramma
    				freq[c]--;
    				calcola(freq, anagramma, lung, n+1, x);  // prova ad aggiungere un altro carattere
    				freq[c]++;
             }
          }
       }
       else
       {                                 		// anagramma trovato
       	anagramma[n]='\0';             		// aggiungi terminatore di stringa
       	printf(anagramma);
          printf("%c",179);
          x=x+lung+1;                         // stampa l'anagramma
          if (x>55)
          {
          	cout<<"\n";
             x=0;
          }
       }
    }
    
    void main()
    {
    	int  x, len;
    	char parola[mx];	                     // parola iniziale
    	char anagramma[mx];                    // anagramma
    	int  frequenza[dim];	                  // vettore di occorrenze
    
    	printf("Anagrammi.\n");
    	printf("Introduci una parola: ");
    	gets(parola);
       len=fact(parola, frequenza);	          // calcola la freq. dei simboli dell'alfabeto
    	printf("Anagrammi possibili: \n\n");
       x=0;                                    // parte grafica [quel minimo ke c'e!]
    	calcola(frequenza, anagramma, len, 0, x);  // stampa tutti gli anagrammi
       getchar();
    }
    #include <cervello.h>

  10. #10
    Non prendertela ma la tua soluzione mi sembra un pò "macchinosa"...
    A rischio di sembrare presuntuoso la mi mi sembra più efficiente.Cosa ne pensi?
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.