Kombinace písmen, znaků a čísel v C – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Kombinace písmen, znaků a čísel v C – C / C++ – Fórum – Programujte.comKombinace písmen, znaků a čísel v C – C / C++ – Fórum – Programujte.com

 

Mad Matt
~ Anonymní uživatel
1 příspěvek
29. 11. 2014   #1
-
0
-

   

Ano jsem úplná lama a potřebuji poradit  Ve firmě potřebuji přidělit různá majetková a sériová čísla. Tudíž musím v kódu definovat např. že chci vytisknout kombinace všech písmen abecedy o délce 8 znaků. Tzn. mám v zásobníku ABCDEFGHIJKLMNOPQRSTUVWXYZ a vytisknou se mi třeba tyto kombinace: LVJKMQIF, SIJKLMXG, AABBCCDD atd. Samozřejmě v nějakém logickém pořadí   

Prosím poraďte.

Tento kód jsem našel na webu, snad bude jako základ stačit.

# include <stdio.h>

/* Function to swap values at two pointers */
void swap (char *x, char *y)
{
    char temp;
    temp = *x;
    *x = *y;
    *y = temp;
}
  
/* Function to print permutations of string
   This function takes three parameters:
   1. String
   2. Starting index of the string
   3. Ending index of the string. */
void permute(char *a, int i, int n)
{
   int j;
   if (i == n)
     printf("%s\n", a);
   else
   {
        for (j = i; j <= n; j++)
       {
          swap((a+i), (a+j));
          permute(a, i+1, n);
          swap((a+i), (a+j)); //backtrack
       }
   }
}
 
/* Driver program to test above functions */
int main()
{
   char a[] = "ABC"; 
   permute(a, 0, 2);
   getchar();
   return 0;
}

 Výsledek:

root@vaio:/home/madmatt/Plocha# ./combo
ABC
ACB
BAC
BCA
CBA
CAB
Nahlásit jako SPAM
IP: 89.103.149.–
ondrej39+1
Věrný člen
29. 11. 2014   #2
-
+1
-
Zajímavé

Těch 8znakých kombinací je přes 200 miliard, 26^8, opravdu chceš tisknout 200 miliard údajů?

Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
ingiraxo+15
Grafoman
29. 11. 2014   #3
-
0
-

#1 Mad Matt
myslim, že na to jdeš trochu špatně... máš přidělit nějaká 8 místná ID a pokud mají být v rozmezí A-Z, tak zační jednoduše od AAAAAAAA, AAAAAAB,... a jen zvedej podlední znak (stejně jako binary)... případně tomu dej prefix první 3 znaky XYZAAAAA, XYZAAAAB,... protože těch kombinací je tolik, že to je šumák

tyhle přidělený ID si někam ukládej a vypiš pouze ty přidělený, případně si udělej fci na vygenerování nového následujícího ID

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
vitamin+8
Grafoman
29. 11. 2014   #4
-
0
-

Nestailo by pridelovat obycejne cisla a pred vypisom ich skonvertovat do 26 ciselnej sustavy, ako znakovu sadu pouzit 'A' - 'Z'?

Nahlásit jako SPAM
IP: 95.105.229.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
ingiraxo+15
Grafoman
29. 11. 2014   #5
-
0
-

já bych to řešil asi takto (nelíbí se mi náhodný kombinace těch znaků), přijde mi lepší mít nějaké pořadí, když už teda nemůžou být čísla, ale písmena

#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <stack>

using namespace std;

class IdGenerator
{
public:
    IdGenerator(int length, char first, char last, string prefix)
        : length(length), first(first), last(last), prefix(prefix)
    {
    }
    IdGenerator(int length, char first, char last)
        : IdGenerator(length, first, last, "")
    {
    }
    string generateNew()
    {
        string id = generate();
        ids.push_back(id);
        return id;
    }
    vector<string>::const_iterator begin() const { return ids.begin(); }
    vector<string>::const_iterator end() const { return ids.end(); }
    int size() const { return ids.size(); }

private:
    vector<string> ids;
    string prefix;
    char first;
    char last;
    int length;

    string generate()
    {
        string id;

        if (ids.empty()) {
            id = string(length, first);
        } else {
            id = ids.back().substr(prefix.size());
            id = increment(id, length - 1);
        }
        if (!prefix.empty()) {
            id = prefix + id;
        }
        return id;
    }
    string increment(string id, int pos)
    {
        stack<int> stack;
        stack.push(pos);

        // nelibi se mi rekurze...
        while (!stack.empty()) {
            int p = stack.top();
            char* c = &id.at(p);
            stack.pop();

            if (*c < last) {
                (*c)++;
            } else {
                *c = first;
                stack.push(pos - 1);
            }
        }
        return id;
    }
};

int main()
{
    // prefix 111 (nepovinne), rozmezi A-Z, 5 znaku
    // 111AAAAA,111AAAAB,...,111AAABA,...
    IdGenerator gen(5, 'A', 'Z', "111");

    // vygeneruje postoupnost 1000 ID
    for (int i = 0; i < 1000; i++) {
        string newId = gen.generateNew();
    }

    // vypise vsechny pridelene ID
    auto it = gen.begin();
    for (; it != gen.end(); it++) {
        cout << *it << endl;
    }
    return EXIT_SUCCESS;
}
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 30 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý