[C++] zwrót wartości z funkcji.

Big_Boss1997
Użytkownik
Użytkownik
Posty: 149
Rejestracja: 27 gru 2016, o 09:02
Płeć: Mężczyzna
Lokalizacja: Krakow
Podziękował: 64 razy

[C++] zwrót wartości z funkcji.

Post autor: Big_Boss1997 »

Dzień dobry. Proszę pomóc z taką rzeczą: Mamy tablicę liczb:

Kod: Zaznacz cały

int tabl[6] = {1, 2, 3, 4, 5, 6};
I funkcje (Generate), która sprawdza, czy ciąg liczb, który jest podany przez użytkownika, jest permutacją zbioru. Jeżeli jest - wyświetli "Tak". Ale jak można zrobić tak, żeby ta funcja zwróciła jakąś wartość, żeby potem mógł w main() napisać jakiś warunek (np. "Jeżeli ten ciąg liczb jest permutacją, to ...") ?

Kod: Zaznacz cały

void Swap(int a,int b)
{
    int t=tabl[a];
    tabl[a]=tabl[b];
    tabl[b]=t;
}

void Generate(int k)
{
    int n = 0;
    
        for(int i=0;i<6;i++){
            if (tabl[i] == tabl1[i]){
                n++;
            }
        }
            if (n == 6){
                cout << "Tak";
            } else {
    
        for(int j=k;j<6;j++)
        {
            Swap(k,j);
            Generate(k+1);
            Swap(k,j);
            
        }
        
            }
            
    
}
karpiuch
Użytkownik
Użytkownik
Posty: 249
Rejestracja: 18 maja 2013, o 22:20
Płeć: Mężczyzna
Lokalizacja: Zamość
Podziękował: 29 razy
Pomógł: 3 razy

Re: [C++] zwrót wartości z funkcji.

Post autor: karpiuch »

Żeby funkcja mogła zwracać wartość musisz nadać jej typ zwracanej wartości, czyli:

Kod: Zaznacz cały

typ_zwracanej_wartosci nazwa_funkcji(parametry)
typy zwracanej wartości to np. int, float itp. Natomiast na końcu funkcji musisz umieścić słowo kluczowe return.
Oto przykład:

Kod: Zaznacz cały

float dodawanie(float a, float b)
{
   return a+b;
}
W mainie tworzysz zmienną typu float i nadajesz jej wartość zwróconą przez funkcję:

Kod: Zaznacz cały

float c;
c=dodawanie(a,b);
Ostatnio zmieniony 5 lis 2017, o 19:31 przez karpiuch, łącznie zmieniany 1 raz.
Big_Boss1997
Użytkownik
Użytkownik
Posty: 149
Rejestracja: 27 gru 2016, o 09:02
Płeć: Mężczyzna
Lokalizacja: Krakow
Podziękował: 64 razy

Re: [C++] zwrót wartości z funkcji.

Post autor: Big_Boss1997 »

karpiuch, no to wiem, ale wydaje mi że, mając funcję rekurencyjną, to nie można zwrócić wartość?
karpiuch
Użytkownik
Użytkownik
Posty: 249
Rejestracja: 18 maja 2013, o 22:20
Płeć: Mężczyzna
Lokalizacja: Zamość
Podziękował: 29 razy
Pomógł: 3 razy

Re: [C++] zwrót wartości z funkcji.

Post autor: karpiuch »

No tak, nie zauważyłem, przepraszam.
To teraz powiedz mi dokładniej co chcesz przekazać do maina z tej funkcji?
Big_Boss1997
Użytkownik
Użytkownik
Posty: 149
Rejestracja: 27 gru 2016, o 09:02
Płeć: Mężczyzna
Lokalizacja: Krakow
Podziękował: 64 razy

Re: [C++] zwrót wartości z funkcji.

Post autor: Big_Boss1997 »

karpiuch, chcę napisać warunek if (<warunek>). Za pomocą tej funkcji sprawdzam coś, a potem chcę otrzymać, czy to co sprawdzaliśmy w niej jest true lub false.
bartek118
Użytkownik
Użytkownik
Posty: 5974
Rejestracja: 28 lut 2010, o 19:45
Płeć: Mężczyzna
Lokalizacja: Toruń
Podziękował: 15 razy
Pomógł: 1251 razy

Re: [C++] zwrót wartości z funkcji.

Post autor: bartek118 »

Big_Boss1997 pisze:karpiuch, chcę napisać warunek if (<warunek>). Za pomocą tej funkcji sprawdzam coś, a potem chcę otrzymać, czy to co sprawdzaliśmy w niej jest true lub false.
Rozwiązanie na szybko - stwórz zmienną globalną typu bool, w której zapiszesz wartość sprawdzanego wyrażenia.
karpiuch
Użytkownik
Użytkownik
Posty: 249
Rejestracja: 18 maja 2013, o 22:20
Płeć: Mężczyzna
Lokalizacja: Zamość
Podziękował: 29 razy
Pomógł: 3 razy

Re: [C++] zwrót wartości z funkcji.

Post autor: karpiuch »

bartek118 pisze:
Big_Boss1997 pisze:karpiuch, chcę napisać warunek if (<warunek>). Za pomocą tej funkcji sprawdzam coś, a potem chcę otrzymać, czy to co sprawdzaliśmy w niej jest true lub false.
Rozwiązanie na szybko - stwórz zmienną globalną typu bool, w której zapiszesz wartość sprawdzanego wyrażenia.

Albo bawić się w wskaźniki, na pomysł wyżej nie wpadłem, a również dobry
Big_Boss1997
Użytkownik
Użytkownik
Posty: 149
Rejestracja: 27 gru 2016, o 09:02
Płeć: Mężczyzna
Lokalizacja: Krakow
Podziękował: 64 razy

Re: [C++] zwrót wartości z funkcji.

Post autor: Big_Boss1997 »

bartek118, ale jeżeli zmienimy globalną zmienną w funckcji, ona zmienia i poza niej?
karpiuch
Użytkownik
Użytkownik
Posty: 249
Rejestracja: 18 maja 2013, o 22:20
Płeć: Mężczyzna
Lokalizacja: Zamość
Podziękował: 29 razy
Pomógł: 3 razy

Re: [C++] zwrót wartości z funkcji.

Post autor: karpiuch »

Tak, jesli jej nie przesłonisz w funkcji to jej wartość zmienia się globalnie, czyli poza nią też.
Big_Boss1997
Użytkownik
Użytkownik
Posty: 149
Rejestracja: 27 gru 2016, o 09:02
Płeć: Mężczyzna
Lokalizacja: Krakow
Podziękował: 64 razy

Re: [C++] zwrót wartości z funkcji.

Post autor: Big_Boss1997 »

karpiuch, można przykład jak stworzyć tą zmienną, bo u mnie nie wychodzi. Zawsza zwraca false:

Kod: Zaznacz cały

bool test = false;
void Generate(int k)
{
    int n = 0, test = 0;
    
        for(int i=0;i<6;i++){
            if (tabl[i] == tabl1[i]){
                n++;
            }
        }
            if (n == 6){
                test = true;
            } else {
    
        for(int j=k;j<6;j++)
        {
            Swap(k,j);
            Generate(k+1);
            Swap(k,j);
            
        }
        
            }
            
    
}
Ponury123
Użytkownik
Użytkownik
Posty: 128
Rejestracja: 5 lip 2015, o 14:48
Płeć: Mężczyzna
Lokalizacja: nie wiem
Podziękował: 11 razy
Pomógł: 24 razy

Re: [C++] zwrót wartości z funkcji.

Post autor: Ponury123 »

Big_Boss1997, wywal deklaracje zmiennej

Kod: Zaznacz cały

 int test = 0
(4 linia kodu). Zawsze zwraca false bo funkcja jest źle napisana. Nie wiem z jakiego IDE korzystasz, ale znajdź sobie jak w nim odpalić debugger-a i prześledź co dokładnie dzieje się podczas działania programu. Jak zmieniają się dane w tablicach.



-- 5 lis 2017, o 22:56 --

Albo inaczej bo jeszcze Cie przypadkiem w błąd wprowadzę.
Funkcja którą napisałeś działa jak ma działać, trochę nie optymalnie, ale działa.

Kod: Zaznacz cały

void Generate(int k)
{
    int n = 0;

    for (int i = 0; i < 6; i++) {
        if (tabl[i] == tabl1[i]) {
            n++;
        }
    }
    if (n == 6) {
        test = true;
    }
    else {
    	
        for (int j = k; j < 6; j++) {
            Swap(k, j);
            Generate(k + 1);
            Swap(k, j);
        }
    }
}
Natomiast zawsze zwraca false bo wewnątrz funkcji miałeś deklarację

Kod: Zaznacz cały

int test = 0
więc przypisanie

Kod: Zaznacz cały

test = true
odwoływało się właśnie do tej zmiennej lokalnej, a nie globalnego bool-a.
Ostatnio zmieniony 5 lis 2017, o 22:01 przez Ponury123, łącznie zmieniany 1 raz.
Big_Boss1997
Użytkownik
Użytkownik
Posty: 149
Rejestracja: 27 gru 2016, o 09:02
Płeć: Mężczyzna
Lokalizacja: Krakow
Podziękował: 64 razy

Re: [C++] zwrót wartości z funkcji.

Post autor: Big_Boss1997 »

Kod: Zaznacz cały

cout <<"n : " <<n<<endl;
Ponury123, hmm, a dlaczego po dodaniu tej linii moja funkcja nie działa poprawnie?)

P.S.: nie wiem jak nie zauważyłem test'a w funkcji))
Ponury123
Użytkownik
Użytkownik
Posty: 128
Rejestracja: 5 lip 2015, o 14:48
Płeć: Mężczyzna
Lokalizacja: nie wiem
Podziękował: 11 razy
Pomógł: 24 razy

Re: [C++] zwrót wartości z funkcji.

Post autor: Ponury123 »

Big_Boss1997, właściwie to powinna zwraca ci false bo pewnie wyświetlasz nie ta zmienna test co powinieneś.

-- 5 lis 2017, o 23:09 --

powinna działać poprawnie*

-- 5 lis 2017, o 23:13 --

Kurde, wybacz, ale coś się dzieje ze stronką. Nie widziałem, że pytałeś o

Kod: Zaznacz cały

cout <<"n : " <<n<<endl;
.

Co to tego to nie twierdziłem, że po dodaniu tej lini funkcja nie będzie działać poprawnie. chodziło mi o to byś zobaczył jak wile operacji wykonujesz.
Ostatnio zmieniony 5 lis 2017, o 22:14 przez Ponury123, łącznie zmieniany 1 raz.
Big_Boss1997
Użytkownik
Użytkownik
Posty: 149
Rejestracja: 27 gru 2016, o 09:02
Płeć: Mężczyzna
Lokalizacja: Krakow
Podziękował: 64 razy

Re: [C++] zwrót wartości z funkcji.

Post autor: Big_Boss1997 »

Ponury123, dzięki. I jescze mówileś, że troche nioptymalnie napisałem. Miałem pomysły, jak lepiej będzie?
Ponury123
Użytkownik
Użytkownik
Posty: 128
Rejestracja: 5 lip 2015, o 14:48
Płeć: Mężczyzna
Lokalizacja: nie wiem
Podziękował: 11 razy
Pomógł: 24 razy

Re: [C++] zwrót wartości z funkcji.

Post autor: Ponury123 »

Wielokrotnie porównujesz elementy obu tablic, można by np. zrobić warunek przerwania jeśli znajdziemy element w tablicy A którego nie ma w tablicy B zamiast próbować zrobić z nich identyczny łańcuch.

-- 5 lis 2017, o 23:31 --

Ja bym zrobił funkcje która pobiera dwie tablice, i wykonuje następujące operacje

Kod: Zaznacz cały

1. sprawdzam czy wielkość tablic jest taka sama(bo rozumiem, że konieczna jest taka sama ilość elementów by jeden zbiór był permutacją drugiego). Jeśli nie przerywam - ograniczam ilość operacji. 

2. dla każdego elementu tablicy A sprawdzam kolejne elementy tablicy B. Jeśli znajdę taki sam, inkrementuje o jeden i jednocześnie usuwam znaleziony element tablicy B(zbędne jeśli zakładamy że każdy element jest inny). 
Jeśli dojdę do końca tablicy B i nie znajdę takiego samego elementu przerywam funkcje, bo to oznacza, że na pewno dany zbiór nie jest permutacją drugiego. 

W najgorszym przypadku będę miał  ilość porównań = wielkość tablicy^2.   

ODPOWIEDZ