[C++] Prosta modyfikacja programu, kombinacje liczb


(Marcinf388) #1

Witam. Nie wiem czy jest nawet sens tworzyć temat dla takiego małego problemu, ale skoro w SB tak mi poradzono… :wink:

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;}

Z góry dzięki za odpowiedź. :slight_smile:


(Martini M) #2

Witam,

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.


(Prezes333) #3

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”.


(Marcinf388) #4

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.