Analiza numeru i jego podział na części [GUI w C++]


(guic++) #1

Witam szanownych forumowiczów.

Wiem że jest sporo podobnych tematów w internecie ale dotyczą one programowania w konsoli , a mi wielki problem sprawia przesiadka z konsoli na GUI (prawdę mówiąc z konsolą też nie najlepiej mi idzie).

Muszę napisać w Visual C++ w GUI program który na podstawie numeru seryjnego jakiegoś tam elementu poda informacje o nim.

Mój problem polega na tym że nie wiem jak skonwertować numer wpisany do textBoxa na tablicę liczb ( wydaje mi się że to jest najłatwiejsze rozwiązanie) i jak podzielić go później na kilka kilku(2-4)cyfrowych części które będą analizowane oddzielnie przez rożne funkcje w programie.

Bardzo proszę o pomoc gdyż jest to dla mnie bardzo ważne.

Za pomoc z góry dziękuję.

Marek


(Rolek0) #2

Jak wygląda taki numer i jak chcesz go podzielić?


(Messc87) #3

Pytanie jest bardzo ogólne, ale:

zastosuj nagłówki z biblioteki standardowej C++

i , stwórz stringa, do którego zapiszesz wersję tekstową numeru z textBoxa, za pomocą metody at(int) obiektu string wybierasz poszczególne znaki ciągu i za pomocą operatora << przekierowujesz je do obiektu stringstream (jego deklaracja znajduje się w nagłówku ). Następnie z obiektu typu stringstream operatorem >> przekierowujesz dane do zmiennej typu int. W ten sposób otrzymujesz liczbę typu int stworzoną ze zwykłego tekstu typu const char*.

W praktyce

string liczbaTekst (L"nie znam WinAPI(??), nie wiem jak wydobyć stałą tekstową z textBoxa");

stringstream strumien;

strumien << liczbaTekst.at(0) << liczbaTekst.at(1) .......itd.;


int kodCzescPierwsza;

strumien >> kodCzescPierwsza;


strumien.empty();

Do podzielenia liczby w formacie tekstowym możesz zastosować algorytmy z biblioteki standardowej + iteratory. Proste, ale trzeba umieć, ale niestety nie wiem jaki twój kod liczbowy ma format, stały, czy zmienny. Jeśli stały typu 1234-1234-1234-234-23 to wystarczy zwykłe at(i). Hmmm, właściwie jeśli poszczególne człony oddzielone są znakiem, np. “-”, to można by przejechać po takim stringu w pętli zamiast używać iteratorów i algorytmów.


(guic++) #4

trochę niewiele mi to mówi z tymi nagłówkami,

Ogólnie program ma działać tak:

1)wpisujesz kod np: 011996801390 i wciskasz “PRZYCISK”

2)program na podstawie konkretnej części numeru wyświetla:

01 - “pierwsza (słownie) seria”

1996 - “rok produkcji:1996”

80 - “benzynowy” (jeśli będzie np: 170 - pokaże:“disel”)

1390 - “pojemność: 1390ccm”

ewentualnie mogę polecić użytkownikowi oddzielenie spacją poszczególnych części np 11 2222 33 4444


(Messc87) #5

Ok, rozumiem, nie znasz zbyt dobrze C++a

Z nagłówkami miałem na myśli to, że włączasz je do swojego projektu, czyli

#include 

#include 


using std::string;

using std::stringstream;


// const char* napisZTextBoxa

// napis z textBoxa jest teraz w stringu w postaci tekstu

string napisTekst(napisZTextBoxa);


stringstream strumien;


int tablicaKodow[4]


if(napisTekst.size() == 12)

{

  strumien << napisTekst.at(0) << napisTekst.at(1);

  strumien >> tablicaKodow[0];


  //(...) dalej analogicznie

}

To wszystko, walidację danych wpisanych przez użytkownika wymyśl sam.


(guic++) #6

zawsze (2 dni) wydawało mi się że te nagłówki #include … to są tylko do konsoli

Dziękuję Ci BARDZO za pomoc, może uda mi się to jakoś zrobić i zaliczyć


([alex]) #7
string number="011996801390";

istringstream sin(number.insert(8," ").insert(6," ").insert(2," "));

int seria,rok,typ,pojemnosc;

sin>>seria>>rok>>typ>>pojemnosc;

(Messc87) #8

Ooo, elegancko. Lepsze od mojego łopatologicznego podejścia.


(Rolek0) #9

Można też tak

string number="011996801390";

int seria = stoi(number.substr(0, 2));

int rok = stoi(number.substr(2, 4));

int typ = stoi(number.substr(6, 2));

int pojemnosc = stoi(number.substr(8, 4));

lub jeśli twój kompilator nie obsługuje C++11

string number="011996801390";

int seria = atoi(number.substr(0, 2).c_str());

int rok = atoi(number.substr(2, 4).c_str());

int typ = atoi(number.substr(6, 2).c_str());

int pojemnosc = atoi(number.substr(8, 4).c_str());

atoi jest w nagłówku (lub jak kto woli); std::stoi w .