Witam. Nie wiem czy jest nawet sens tworzyć temat dla takiego małego problemu, ale skoro w SB tak mi poradzono…
Znalazłem pewien program, który losuje kombinacje liczb z podanego zbioru (1,2,3) i wypisuje je bez powtórzeń na ekranie. Prosiłbym o zmodyfikowanie tego programu tak, by zamiast korzystać z trzech liczb korzystał z pięciu (1,2,3,4,5) i wyświetlał wszystkie kombinacje tych pięciu cyfr bez powtórzeń na ekranie. Zwracam się do was, ponieważ dopiero ‘wchodzę’ w ten świat i jedyne co wiem to to, że należy zwiększyć ilość elementów zadeklarowanych w tablicy. Dalej wychodzą mi powtórzenia. Oto kod programu:
#include
#include
using namespace std;
int tab[3] = {1,2,3};
inline int check(int n){
if(n > 2) n %= 3;
return n;}
int main(int argc, char *argv[]){
// inicjalizacja
for(int i = 0; i < 3; i++) cout << tab[check(i)] << tab[check(i+1)] << tab[check(i+2)] << endl;
system("PAUSE");
return EXIT_SUCCESS;}
Moja taka rada z punktu widzenia programisty. Najpierw trzeba zrozumieć co program dokładnie robi. Na pewno niczego nie losuje!
Zwiększenie liczności zbioru to tak, ale i samych elementów:
int tab[5] = {1,2,3,4,5};
Jeżeli nie znasz liczności zbioru to możesz to zapisać w taki sposób:
int tab[] = {1,2,3,4,5};
Jest jedna wada takiego rozwiązania trzeba we wszystkich miejscach pamiętać o tym ile zbiór ma elementów. Można to sobie uprościć (w razie powiększenia ilości trzeba by modyfikować wszystkie miejsca) a jak się zastosuje takie coś:
#define MAXELEM 5
można tego używać później w pętlach i tablicach w taki sposób:
int tab[MAXELEM];
for(int i=0; i < MAXELEM; i++)
i teraz poprawki będzie wymagało tylko jedno miejsce to przy słowie define.
Zamiast tablicy możesz użyć std::vector. Tu już nie musisz pamiętać o ilości wstawionych elementów. Ale o kontenerach (vector, lista) proponuję poczytać samemu.
A jeżeli chodzi o przeróbkę to na pewno nie nauczysz się lepiej i szybciej jak kombinując samemu. Najpierw zrozum co robi powyższy program. Później przeprowadź analizę na papierze, a później opisz sobie słownie wyniki i obserwacje analizy. Takie pytanie kontrolne: ile powinno się wyświetlić możliwych wyników przy kryteriach jakie podałeś dla zbioru 5 elementów?
W miarę możliwości mogę pomóc, ale na pewno nie zrobię tego o co prosiłeś - nie napiszę/nie zmodyfikuję tego za Ciebie, bo się w ten sposób niczego na stałe nie nauczysz.
W razie pytań pisz, postaram się odpowiedzieć, ale nie proś o zrobienie czegoś za Ciebie.
Z tego co widzę, to ten program nie losuje wszystkich permutacji liczb 1,2,3. Jeśli chcesz żeby program działał identycznie dla 5 jak twój to zrób coś takiego:
#include
#include
using namespace std;
int tab[5] = {1,2,3,4,5};
inline int check(int n){
if(n > 4) n %= 5;
return n;}
int main(int argc, char *argv[]){
// inicjalizacja
for(int i = 0; i < 5; i++) cout << tab[check(i)] << tab[check(i+1)] << tab[check(i+2)] << tab[check(i+3)] << tab[check(i+4)] << endl;
system("PAUSE");
return EXIT_SUCCESS;}
Ale jeszcze raz przypominam, że to nie są wszystkie permutacje. Twój program dla 3 daje wyniki “1,2,3” “2,3,1” i “3,1,2”, brakuje jeszcze “1,3,2” “2,1,3” i “3,2,1”.
Szczerze mówiąc to ja z C++ nie miałem jeszcze nic wspólnego i mój zakres programowania ogranicza się tylko do podstaw (?) Pascala, tak więc można mnie określić jednym słowem - noob, C++ dopiero zacznę niedługo. Dopiero teraz uświadomiłem sobie, że podany w pierwszym poście program nie wyświetla wszystkich możliwych kombinacji cyfr. Jednak rozumiem Cię, wiem jak potrafi wkurzyć ktoś, kto prosi tylko o gotowce bo mu się nie chce zrobić. W moim przypadku było trochę inaczej, nie znam języka a programu potrzebowałem na mus teraz. Pobawiłem się przez ten czas w TP i spróbowałem coś napisać, jednak nie wyszło to tak perfekcyjnie, jak w znalezionym programie C++:
#include
#include
#include
using namespace std;
time_t start,end;
void char_permutation(char str[],char append[])
{
int length=strlen(str);
if(length)
{
time (&start);
for(int i=0;i
{
char* str1=new char[length+1];
int cnt;
int cnt2;
for(cnt=0,cnt2=0;cnt
{
if(cnt==i)
{
str1[cnt]=str[++cnt2];
continue;
}
else
str1[cnt]=str[cnt2];
}
str1[cnt]='\0';
int alength=strlen(append);
char* append1=new char [alength+2];
strncpy(append1,append,alength);
append1[alength]=str[i];
append1[alength+1]='\0';
char_permutation(str1,append1);
delete [] str1;
delete [] append1;
}
time (&end);
}
else
{
cout<
}
}
int main()
{
int ile;
cout << "Podaj ile elementow chcesz permutowac? ";
cin >> ile;
char str[ile];
for (int i = 0; i < ile; i++){
cout << "Podaj znaki do permutacji: ";
cin >> str[i];
}
cout << "Tablica ma postac: \n";
for (int i = 0; i < ile; i++ ){
cout << str[i];
}
cout << endl;
char append[]="\0";
char_permutation(str,append);
cout << "Czas dzialania programu: " << end - start << endl;
system("PAUSE");
return EXIT_SUCCESS;
}
Ten działa rewelacyjnie, zanim dojdę do takiego poziomu minie trochę czasu a gonił mnie termin, by mieć taką permutację. Dzięki za specjalistyczną pomoc, na pewno się przyda nawet, jeśli nie była ona wielka. Pozdrawiam.