Chciałem napisać program, który zrobi słownik(7-znakowy, który jakby co mógłbym rozszerzyć). Słownik ma być zapisany do jakiegoś pliku *.txt. Niestety nie wiem co nie działa, gdyż ten temat jest dla mnie nowy. Niektóre informacje znalazłem w internecie, ale nie wiem jak je skleić. Czy możecie pomóc :o ? Oto kod:
#include
#include
#include
#include
using namespace std;
int main()
{
string nazwap, co;
cout << "7-literowy slownik: podaj nazwe i rozszerzenie np. plik.txt :";
cin >> nazwap;
ofstream plik( nazwap.c_str() );
char litera[63] = { "qwertyuioplkjhgfdsazxcvbnm1234567890QAZWSXEDCRFVTGBYHNUJMIKOLP" };
for( int z = 0, x = 0, c = 0, v = 0, b = 0, n = 0, m = 0; z < 63; m++ )
{
co = "";
cout << litera[z] << litera[x] << litera[c] << litera[v] << litera[b] << litera[n] << litera[m] << endl;
co = litera[z] + litera[x] + litera[c] + litera[v] + litera[b] + litera[n] + litera[m];
cin.ignore();
getline( cin, nazwap );
plik << nazwap;
plik.close();
if( m == 63 ) n++, m = 0;
if( n == 64 ) b++, n = 0;
if( b == 64 ) v++, b = 0;
if( v == 64 ) c++, v = 0;
if( c == 64 ) x++, c = 0;
if( x == 64 ) z++, x = 0;
if( z == 64 ) goto aaa;
}
aaa:
return 0;
}
W ogóle zamień to wszystko na 6 pętli for jedna w drugiej (będziesz mógł wywalić break)
Do czego służy string co?
Czemu w pętli wczytujesz coś do nazwap?
Czemu w pętli zamykasz plik?
Dodawanie znaków do siebie nie działa tak jak ci się wydaje. Operator + jest przeciążony dla std::string http://en.cppreference.com/w/cpp/string/basic_string/operator%2B. Dodawanie char’ów do siebie działa tak jak dodawanie liczb (znaki w kodowaniu ASCII mają swoje liczbowe reprezentacje; np
Dziękuję za cenne uwagi, zmienię to na 6 funkcji, oraz char na string. Odnośnie punktów 3), 4) oraz 5)- coś podobnego do tego, co zamieściłem w programie znalazłem w internecie. Niestety nie znalazłem opisu, nie wiem jak to dokładnie działa i właśnie to jest moim problemem. Jak użyć tego w moim programie?
Właśnie tak sobie pomyślałem i doszedłem do wniosku, że jednak nie chcesz pisać tego programu. Chcesz wygenerować wszystkie siedmioznakowe słowa jakie można poukładać ze znaków, które masz w tablicy “litera”. Tych słów jest 2198804731200. Każde zajmuje 7 znaków + znak końca linii, co daje 8 bajtów na słowo. Razem będzie 17590437849600 bajtów, czyli około 15 terabajtów.
A tu masz jak to powinno wyglądać:
#include
#include
int main()
{
const std::string litery("qwertyuioplkjhgfdsazxcvbnm1234567890QAZWSXEDCRFVTGBYHNUJMIKOLP");
std::ofstream plik("bla.txt");
for (std::string::const_iterator a = litery.begin(); a != litery.end(); ++a)
for (std::string::const_iterator b = litery.begin(); b != litery.end(); ++b)
for (std::string::const_iterator c = litery.begin(); c != litery.end(); ++c)
for (std::string::const_iterator d = litery.begin(); d != litery.end(); ++d)
for (std::string::const_iterator e = litery.begin(); e != litery.end(); ++e)
for (std::string::const_iterator f = litery.begin(); f != litery.end(); ++f)
for (std::string::const_iterator g = litery.begin(); g != litery.end(); ++g)
plik << *a << *b << *c << *d << *e << *f << *g << std::endl;
return 0;
}
Rzeczywiście, dziękuję, że mi to uświadomiłeś. Potrzebnaby była duża moc obliczeniowa oraz kilka dysków po kilka tera. Ale kod mogę wykorzystać do (dużo) mniejszego słownika.
Rzeczywiście, dziękuję, że mi to uświadomiłeś. Potrzebnaby była duża moc obliczeniowa oraz kilka dysków po kilka tera. Ale kod mogę wykorzystać do (dużo) mniejszego słownika.
Miało być tak samo dobre jak to co podałem wcześniej. Zrobiłem testy wydajnościowe i jednak się okazało, że twoja wersja jest nieznacznie szybsza. Zrobiłem jeszcze jedną wersję, którą na początku chciałem uniknąć myśląc że będzie gorsza, a jednak okazała się lepsza od wszystkich.
gcc (SUSE Linux) 4.7.1 20120723 [gcc-4_7-branch revision 189773] procesor: i5 460MKompilacja: “g++ -std=c++11 -O2 -march=native” Wynik działania programów przekierowałem do /dev/null żeby uniknąć opóźnień związanych z dyskiem lub terminalem. litery = “01” długość słowa = 25 moja poprzednia wersja:
Testy: Warunki podobne do poprzednich. Tym razem jeszcze przełączyłem się na init 3 oraz ustawiłem procesor w tryb performance. litery = “01” długość słowa = 26 mój
Warunki testowe takie same jak poprzednio. Twój program skompilowany poleceniem gcc -std=c99 -O2 -march=native litery = “01” długość słowa = 30 mój program:
Nic nie zmieniłem (z wyjątkiem danych wejściowych i formatowania). To nie ma prawa działać szybciej. Zrobiłeś tablicę wskaźników do char. Masz p, który jest wskaźnikiem do wskaźnika, a podwójna dereferencja jest cholernie kosztowną operacją. Masz wypisywanie znak po znaku, mimo że już na samym początku wyszło, że szybciej jest wypisać gotowy string.