• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

zwracanie przez wskaźnik oraz referencje

Object Storage Arubacloud
0 głosów
1,283 wizyt
pytanie zadane 21 lutego 2016 w C i C++ przez dichloroetylobenzen Użytkownik (850 p.)

Chciałabym aby program zwracał mi sumę liczb przez wskaźnik oraz iloczyn przez referencje liczb dodatnich w tablicy dwuwymiarowej znajdującej się nad główną przekątną, Najpierw zaczęłam od iloczynu, ale program zwraca mi ciągle wartość którą przypiszę w mainie (ja ją tam zeruje więc wyskakuje zero), nie wiem co powinnam poprawić, z kolei ze wskaźnikiem to już w ogóle pogubiłam, gdzie gwiazdka, gdzie ampersand. Pomoże mi ktoś to poprawić żeby działało poprawnie? 

#include <iostream>

using namespace std;
void wyswietl_tab (int tab[][3]);
void licz_dod_nadprzekatna (int tab[3][3], int *suma, int &iloczyn);
int main()
{   int A[3][3]={{1,3, 2},{4,5, 3},{2,3, 4}};
    wyswietl_tab (A);
    int suma=0;
    int iloczyn=0;
    licz_dod_nadprzekatna (A, &suma, iloczyn);
    cout << "suma wynosi: "<<suma<<" a iloczyn wynosi: " << iloczyn<< endl; 
    return 0;
}
void wyswietl_tab (int tab[][3])
{
    for (int i=0; i<3; i++)
    {
        for (int j=0; j<3; j++)
        {
            cout<<tab[i][j];
        }
        cout <<endl;
    }
}

void licz_dod_nadprzekatna (int tab[3][3], int *suma, int &iloczyn)
{
    for (int i=0; i<3; i++)
    {
        for (int j=0; j<3; j++)
    {
        if (i<j && tab[i][j]>0)
      {
        *suma=+tab[i][j]; // tu chyba nie powinno być * ale inaczej się nie kompiluje wcale, pewnie gdzieś wyżej błąd
        iloczyn*=tab[i][j];
      }
    }
    }

}

 

2 odpowiedzi

0 głosów
odpowiedź 21 lutego 2016 przez mariush Dyskutant (7,860 p.)
wybrane 21 lutego 2016 przez dichloroetylobenzen
 
Najlepsza

Iloczyn wynosi 0, bo przekazujesz 0 do funkcji.

iloczyn*=tab[i][j];

Z racji, że na samym początku iloczyn wynosił 0 (bo taką wartość przekazujesz do funkcji) na końcu dalej będzie wynosił 0.

Spróbuj zmienić w mainie iloczyn na 1. Powinno działać.

komentarz 21 lutego 2016 przez dichloroetylobenzen Użytkownik (850 p.)
tak, rzeczywiście teraz działa prawidłowo, dziękuje :)

powiesz mi jeszcze co poprawić w tej sumie?
komentarz 21 lutego 2016 przez mariush Dyskutant (7,860 p.)
*suma=+tab[i][j];

Zamień =+ na +=

komentarz 21 lutego 2016 przez dichloroetylobenzen Użytkownik (850 p.)
ale głupota :D dziękuje jeszcze raz ;)
+1 głos
odpowiedź 21 lutego 2016 przez Sedi Stary wyjadacz (10,200 p.)
edycja 24 lutego 2016 przez Sedi

Kolega @mariush dobrze zauważył, że przekazujesz 0. 0 razy cokolwiek daje 0:P

Widzę, że koleżankę czeka mała powtórka z wskaźników i referencji ;]

Wskaźniki są banalne, jak i referencja i całe programowanie, więc napiszę tak:

  • W mainie masz błąd. Twoje:
int suma=0;
  • Nie jest wskaźnikiem. Wskaźnik w C++ piszesz w ten sposób:
int * suma;
  • Pamiętaj jednak, że takiego zapisu jak powyżej nie wolno Ci do żadnej funkcji przesyłać. Dlaczego ? 
  • Wskaźnik to zmienna, która zawiera w sobie adres INNEJ zmiennej. Więc musisz stworzyć do niej jakąś zmienną. Dopiero taki kod:
int suma;
int *wskaznik_Do_Sumy;
wskaznik_Do_Sumy=&suma;///Deklaracja wskaznika bez gwiazdki jest jego adresem

byłby poprawny. 

  • Krótkie wyjaśnienie zapis:
wskaznik_Do_Sumy=&suma;

oznacza:

  • Przesyłam do wskaźnika adres zmiennej suma. Ampersand, czyli :
&
  • Oznacza w C++ dwie rzeczy, Po pierwsze adres, po drugie referencję. Od tej pory, każda zmiana zmiennej suma, zmieni wskaźnik. Tak samo zmiana wskaznika zmieni sumę. Przeanalizuj poniższy kod, który przygotowałem specjalnie dla Ciebie i powinnaś szybko to zrozumieć :
int *wskaznik;
    int suma=10;
    wskaznik=&suma;
    *wskaznik=100;

    std::cout<<"Jak to jest mozliwe? Wynosze 100! "<<suma<<'\n';
    suma=15;
    std::cout<<"Jak to jest mozliwe? Wynosze 15! "<<*wskaznik<<'\n';
  • Co do referencji... Jest ona prawie analogiczna jak wskaźnik, z tym że wskaźnik, to zmienna, która ma w sobie adres innej zmiennej. Natomiast refrencja, to po prostu inna nazwa dla zmiennej. Tak przykładowa referencja. O ile we wskaźnikach mogłem zapisać poniżej wskaźnika jego przypisanie do zmiennej, tak tutaj muszę od razu przy stwarzaniu muszę mieć przypisaną jakąś zmienną. Gdy tego nie zrobisz, kompilator wywali Ci błędy.
int suma;
    int &refre=suma;
    suma=14;
    std::cout<<refre;
  • Dlaczego więc wymyślono referencję, skoro są wskaźniki ? Cóż, powódów jest kilka. Najważniejszy z nich to bezpieczeństwo. Zabawa wskaźnikami, to trochę jak żonglowanie otwartymi grantami. Pytanie jest nie, czy wybuchną, ale kiedy. Referencja jest też niesamowicie przydatna przy klasach. Przy zaawansowanych projektach, wskaźniki potrafią namieszać, jak kobieta przy programowaniu ;]
  • Dzięki referencji można przesyłać oryginały wraz z adresem. Wskaźniki zmieniają tylko wartość, natomiast referencje już adres(gdyż sa po prostu inną nazwą).

Co do Twojego kodu... Serce mi krwawi, gdy go czytam, ale spokojnie :) Jeszcze jedna rzecz. Polecenie jest trochę mało precyzyjne. Zwracanie w programowaniu oznacza polecenie return. Są dwa możliwe przypadki. Po pierwsze funkcja będzie zwracała referencję, więc kod wyglądałby w ten sposób:

#include <iostream>

int &zwroc_Referencje (int &refs)
{

refs=15;

return refs;
}
int main()
{
int suma=10;
std::cout<<zwroc_Referencje(suma)<<'\n';


return 0;
}

Kod pisany z ręki, więc błędy mogą być ;] Wskaźniki możesz zrobić analogicznie jak referencję. Może trochę trudniej będzie, ale powinnaś dać radę :)  Przeanalizuj na spokojnie to co napisałem, a powinno być dobrze. Pozdrawiam :)

Podobne pytania

0 głosów
0 odpowiedzi 163 wizyt
pytanie zadane 15 marca 2016 w C i C++ przez falauthy Stary wyjadacz (11,550 p.)
0 głosów
2 odpowiedzi 1,177 wizyt
pytanie zadane 7 grudnia 2017 w C i C++ przez Mihost Nowicjusz (240 p.)
0 głosów
2 odpowiedzi 1,265 wizyt

92,568 zapytań

141,420 odpowiedzi

319,622 komentarzy

61,954 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...