String w int

dział ogólny

String w int

Nowy postprzez Koziol » czwartek, 26 listopada 2009, 19:28

Poszukuję sposobu na konwersję ze stringa w int.

Mianowicie na bazie napisu ma powstawać indywidualny kod liczbowy (coś ala suma md5 ale tylko na liczbach bez liter).

Z góry dziękuje za pomoc.
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
Podziękował : 8
Otrzymał podziękowań: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    NieznanyNieznana

Re: String w int

Nowy postprzez Cyfrowy Baron » piątek, 27 listopada 2009, 08:30

A możesz to napisać dokładniej o co Tobie chodzi, gdyż konwersja ze String do int jest bardzo prosta:

Kod: Zaznacz cały
String liczba = "10";
int x = liczba.ToInt();
int y = (int)liczba;
int z = StrToInt(liczba);


► patrz serwis: Cyfrowy Baron dział - porady:
łańcuchy znaków
Zmienne
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: String w int

Nowy postprzez Koziol » piątek, 27 listopada 2009, 10:30

Chce na podstawie identyfiaktora tak jak np tutaj "Koziol" stworzyć unikalny identyfikator liczbowy, czytaj Kozioł zmienić na liczbę.
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
Podziękował : 8
Otrzymał podziękowań: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    NieznanyNieznana

Re: String w int

Nowy postprzez Cyfrowy Baron » piątek, 27 listopada 2009, 12:37

No to nie ma na to jakichś gotowych algorytmów, sam musisz sobie coś takiego stworzyć. Stwórz dwie tablice w jednej litery w drugiej cyfry, każdej literze przypisz liczbę:

Kod: Zaznacz cały
int __fastcall CreateID(String name)
{
AnsiString litery[] = {"a", "b", "c", "d", "e"};
int            liczby[] = {0, 1, 2, 3, 4};
int ID = 0;

  for(unsigned int i = 0; i < ARRAYSIZE(litery); i++)
  {
   if(name[i].LowerCase() == litery[i].LowerCase()) // można też if(SameText(name[i], litery[i]))
   {
    ID = ID + liczby[i];
   }
  }

return ID;
}
//-------------------------------------------------------------------
void __fastcall TForm1::Button1(TObject *Sender)
{
  int Identyfikator = CreateID("Kozioł");
}


W przykładzie ograniczyłem się do 5 liter, gdyż nie chce mi się pisać więcej, ale musisz stworzyć taką tablicę dla całego alfabetu, a jeżeli nazwa może zawierać dodatkowo cyfry to musisz umieścić w niej cyfry, jeżeli nazwa może zawierać jakieś znaki to musisz umieścić w niej też takie znaki.
Tablica litery i tablica liczby muszą zawierać taką samą liczbę elementów, czyli każdemu znakowi z tablicy litery przypisujesz jakąś liczbę w tablicy liczby.



Znacznie prościej będzie jednak wykorzystać fakt, że każdy znak z tabeli ASCII ma już przyporządkowaną jakąś wartość:

Kod: Zaznacz cały
//---------------------------------------------------------------------------
int CreateID(const String name)
{
int ID = 0;
PChar litery;
litery = name.c_str();

while(*litery != '\0')
{
  ID = ID + (int)*litery;
  litery++;
}
return ID;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Caption = (String)CreateID("Koziol");
}
//---------------------------------------------------------------------------
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: String w int

Nowy postprzez polymorphism » piątek, 27 listopada 2009, 13:29

No to nie ma na to jakichś gotowych algorytmów

Jak nie ma? Jest chociażby algorytm CRC32. W sieci spokojnie znajdzie różne implementacje tego algorytmu.



Kod: Zaznacz cały
AnsiString litery[] = {"a", "b", "c", "d", "e"};

Ech Baron, Baron. Nie można tak?
Kod: Zaznacz cały
const char *litery = "abcde";

Czysto, schludnie, optymalnie.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: String w int

Nowy postprzez Cyfrowy Baron » piątek, 27 listopada 2009, 15:20

Kod: Zaznacz cały
Ech Baron, Baron. Nie można tak?


Można! Można też tak:

Kod: Zaznacz cały
int __fastcall CreateID(String name)
{
const AnsiString litery = "abcde";
int ID = 0;

for(unsigned int i = 1; i <= litery.Length(); i++)
{
  int x = name.Pos(litery[i]);
  if(x >= 0)
  {
    ID = ID + i;
  }
}

return ID;
}
//-------------------------------------------------------------------
void __fastcall TForm1::Button1(TObject *Sender)
{
      int Identyfikator = CreateID("Kozioł");
}



To oczywiście nie wyczerpuje możliwości. Podałem dwa rozwiązania, z czego drugie jest lepsze od pierwszego dając ten sam efekt, ale pierwsze rozwiązanie pozwala rozwinąć pomysł i zastosować różne kombinacje liczb i liter, poza tym widzę, że Kozioł jest początkującym programistą, wiec chciałem go w ten sposób nauczyć czegoś nowego.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: String w int

Nowy postprzez Koziol » piątek, 27 listopada 2009, 15:32

CRC32 będzie tu nieco lepszą metodą - korzystając z kodów ascii bądź przypisywania własnych kodów może dojść do duplikacji identyfikatora, a z tego co udało mi sie na szybko przeczytać w crc32 nie ma takiej możliwości.



W każdym razie dowiedziałem sie kilku ciekawych rzeczy odnośnie łańcuchów znaku - tu ukłon w kierunku Cyfrowego Barona.

Jeszcze raz dziękuje za pomoc.



A tak odbiegając od tematu. Ostatnio zaczęła się robić nie ciekawa atmosfera na forum (np. wymiana zdań powyżej) moim zdaniem nie należy krytykować pomysłów innych każdy stara sie pomóc na jakiś sposób, a druga sprawa ilu programistow tyle algorytmów i sposobów podejścia do tematu. Kończąc wywód nie kłóćmy się, a dyskutujmy szukając najlepszego rozwiązania. :)
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
Podziękował : 8
Otrzymał podziękowań: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    NieznanyNieznana

Re: String w int

Nowy postprzez Witold » piątek, 27 listopada 2009, 16:16

Koziol napisał(a):A tak odbiegając od tematu. Ostatnio zaczęła się robić nie ciekawa atmosfera na forum (np. wymiana zdań powyżej) moim zdaniem nie należy krytykować pomysłów innych każdy stara sie pomóc na jakiś sposób, a druga sprawa ilu programistow tyle algorytmów i sposobów podejścia do tematu. Kończąc wywód nie kłóćmy się, a dyskutujmy szukając najlepszego rozwiązania. :)


Ale wtedy ktoś kto uczy się z forum będzie mógł nauczyć niewłaściwych wzorców (niewydajnych , niezrozumiałych dla innych), do tego osoba która źle coś napisze nawet może się o tym nie dowiedzieć. CB zrobił kilka błędów np.: name[i].LowerCase() , for(unsigned int i = 0; dla AnsiStringa (dla którego pierwszy znak to 1), niepotrzebne konwersje (akurat dla funkcji hash’ujących to może mieć znaczenie), gdy nikt tego nie zgłosi będzie lepiej ?
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
Podziękował : 1
Otrzymał podziękowań: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: String w int

Nowy postprzez Koziol » piątek, 27 listopada 2009, 19:38

Znalazłem pewien kod do crc32 mianowicie:
Kod: Zaznacz cały
#define QUOTIENT 0x04c11db7
unsigned int crc32_init(unsigned char *data, int len)
{
    unsigned int        result;
    int                 i,j;
    unsigned char       octet;

    if (len < 4) abort();

    result = *data++ << 24;
    result |= *data++ << 16;
    result |= *data++ << 8;
    result |= *data++;
    result = ~ result;
    len -=4;

    for (i=0; i<len; i++)
    {
        octet = *(data++);
        for (j=0; j<8; j++)
        {
            if (result & 0x80000000)
            {
                result = (result << 1) ^ QUOTIENT ^ (octet >> 7);
            }
            else
            {
                result = (result << 1) ^ (octet >> 7);
            }
            octet <<= 1;
        }
    }

    return ~result;             /* The complement of the remainder */
}

Nie rozumiem tylko dwóch rzeczy w nim:
Kod: Zaznacz cały
    result = *data++ << 24;
    result |= *data++ << 16;
    result |= *data++ << 8;
    result |= *data++;

Czemu pierwszych 4 znaków nie można traktować tak samo jak pozostałych tylko trzeba przesynąć je o 24,16 i 8 bitów, a ostatniego nie ruszać.
Kod: Zaznacz cały
    result = ~ result;

Po co następnie negujemy wynik pierwszych 4 znaków?



Nie wiem gdzie ty w tym wątku masz kłótnie? :|

To jest tylko i wyłącznie prywatne odczucie ;)
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
Podziękował : 8
Otrzymał podziękowań: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    NieznanyNieznana

Re: String w int

Nowy postprzez polymorphism » piątek, 27 listopada 2009, 20:01

TU masz inną, optymalniejszą implementację.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 5 gości