Ilość zwracana przez parametr typu wskaźnikowego.

0

Cześć, mam taki problem. Napisałem program, który ma 4 tablice. Jedna z funkcji ma obliczać element maksymalny z tablicy X i Y i** ile razy on wystąpił.** Treść polecenia: obliczyć element maksymalny oraz ile razy on wystąpił w tablicy, wartość elementu
maksymalnego zwrócić przez return zaś** ilość przez parametr typu wskaźnikowego**, wypisać
obliczone wartości dla tablicy X i Y. Tutaj mam problem. Jak zwrócić wartość a nie adres?

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <Windows.h>


void losuj(int t[], int N, int p, int k)
{
    for (int i = 0; i < N; i++)
    {
        t[i] = p + rand() % (k - p + 1);
    }
}

void wypisz(int t[], int N)
{
    for (int i = 0; i < N; i++)
    {
        std::cout << t[i] << " ";
    }
}

int maksimum(int t[], int N, int *ile)
{
    int max = t[0];


    for (int i = 0; i < N; i++)
    {
        if (t[i] > max)
        {
            max = t[i];
        }

        else if (t[i] == max)
        {
            ile++;
        }
    }
    return max;
}



int main()
{
    srand(time(0));
    const int N = 5;
    int X[N], Y[N], Z[N], Q[N];

    int p, k, ilosc;

    std::cout << "Podaj zakres losowania: <p k>: ";
    std::cin >> p >> k;
    std::cout << "\n";

    std::cout << "Tablica X: ";
    losuj(X, N, p, k);
    wypisz(X, N);
    std::cout << "\n";

    std::cout << "\nTablica Y: ";
    losuj(Y, N, p, k);
    wypisz(Y, N);
    std::cout << "\n";

    std::cout << "\nTablica Z: ";
    losuj(Z, N, p, k);
    wypisz(Z, N);
    std::cout << "\n";


    for (int i = 0; i < N; ++i)
    {
        int tab[] = { X[i], Y[i], Z[i] };
        Q[i] = maksimum(tab, 3, ilosc);
    }
 
    std::cout << "\nTablica Q: ";
    wypisz(Q, N);
    std::cout << "\n"; 

    std::cout << "\nElement maksymalny w tablicy X wynosi: " << maksimum(X, N,ilosc) << " wystepuje on: " << ilosc << " raz/y";
    std::cout << "\nElement maksymalny w tablicy Y wynosi: " << maksimum(Y, N,ilosc) << " wystepuje on: " << ilosc << " raz/y";

    std::cin.ignore();
    std::cin.get();
    return EXIT_SUCCESS;
}

2

Jak zwrócić wartość a nie adres?

Przecież zwracasz wartość.

Problem masz ze zwracaniem przez out parameter.

3

A to Ci się kompiluje w ogóle? Funkcja int maksimum(int t[], int N, int *ile) zwraca ilosc przez wskaźnik, ale przy wywołaniu próbujesz przekazać wartość a nie adres. Poza tym w tejże funkcji inkrementujesz wskaźnik a nie wartość. Jeżeli nie chcesz robić większych zmian w kodzie to tak powinna wyglądać poprawiona funkcja maksimum

int maksimum(int t[], int N, int &ile)
{
    int max = t[0];

    for (int i = 0; i < N; i++)
    {
        if (t[i] > max)
        {
            max = t[i];
            ile = 1;
        }

        else if (t[i] == max)
        {
            ile++;
        }
    }
    return max;
}

Dodatkowo zmienną ilosc musisz zerować przed każdym jej wywołaniem

ilosc = 0;
std::cout << "\nElement maksymalny w tablicy X wynosi: " << maksimum(X, N,ilosc) << " wystepuje on: " << ilosc << " raz/y";
0

Pierwotnie kod wyglądąl tak:

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <Windows.h>


void losuj(int t[], int N, int p, int k)
{
    for (int i = 0; i < N; i++)
    {
        t[i] = p + rand() % (k - p + 1);
    }
}

void wypisz(int t[], int N)
{
    for (int i = 0; i < N; i++)
    {
        std::cout << t[i] << " ";
    }
}

int maksimum(int t[], int N, int *ile)
{
    int max = t[0];


    for (int i = 0; i < N; i++)
    {
        if (t[i] > max)
        {
            max = t[i];
        }

        else if (t[i] == max)
        {
            *ile++;
        }
    }
    return max;
}



int main()
{
    srand(time(0));
    const int N = 5;
    int X[N], Y[N], Z[N], Q[N];

    int p, k, ile;

    std::cout << "Podaj zakres losowania: <p k>: ";
    std::cin >> p >> k;
    std::cout << "\n";

    std::cout << "Tablica X: ";
    losuj(X, N, p, k);
    wypisz(X, N);
    std::cout << "\n";

    std::cout << "\nTablica Y: ";
    losuj(Y, N, p, k);
    wypisz(Y, N);
    std::cout << "\n";

    std::cout << "\nTablica Z: ";
    losuj(Z, N, p, k);
    wypisz(Z, N);
    std::cout << "\n";


    for (int i = 0; i < N; ++i)
    {
        int tab[] = { X[i], Y[i], Z[i] };
        Q[i] = maksimum(tab, 3, &ile);
    }
 
    std::cout << "\nTablica Q: ";
    wypisz(Q, N);
    std::cout << "\n"; 

    std::cout << "\nElement maksymalny w tablicy X wynosi: " << maksimum(X, N,&ile) << " wystepuje on: " << &ile << " raz/y";
    std::cout << "\nElement maksymalny w tablicy Y wynosi: " << maksimum(Y, N,&ile) << " wystepuje on: " << &ile << " raz/y";

    std::cin.ignore();
    std::cin.get();
    return EXIT_SUCCESS;
}

Jednak tylko w takiej formie się kompilował... Wiem oczywiście dlaczego zwraca mi adres wskaźnika. Natomiast pytanie brzmi : Co zrobić, aby zwrócił ile razy el.max. wystąpił?

3

@stefano_cx

Naniosłem Twoje poprawki (za co bardzo dziękuję) jednak teraz za każdym razem pokazuje "Element maksymalny w tablicy X wynosi: 16 wystepuje on: 0 raz/y"

Porównaj z tym https://wandbox.org/permlink/aUAQNYiKsc8YfLFb, wszystko działa.

Apropos drugiego kodu, nic dziwnego, że wypisywał Ci się adres zamiast wartości

std::cout << "\nElement maksymalny w tablicy X wynosi: " << maksimum(X, N,&ile) << " wystepuje on: " << &ile << " raz/y";
std::cout << "\nElement maksymalny w tablicy Y wynosi: " << maksimum(Y, N,&ile) << " wystepuje on: " << &ile << " raz/y";

Skoro właśnie tak zaprogramowałeś swój program. << &ile wyświetli Ci adres właśnie.

1

Można też tak:

pair<int,int> maksimum(int t[], int N)
{
    int max=t[0],int count=0;
    for(int i=0;i<N;++i)
    {
        if(t[i]==max) ++count;
        else if(t[i]>max)
        {
            max=t[i];
            count=1;
        }        
    }
    return make_pair(max,count);
}
0
_13th_Dragon napisał(a):

Można też tak:

pair<int,int> maksimum(int t[], int N)

Masz u mnie flaszkę.

@stefano_cx
Brzydki ten kod, i brzydkie zadanie.

Niby deklaracje jak C++, ale w rzeczywistości C, nie używa NIC z bardzo fajnych narzędzi C++
Jak np pair, ale jest wiele, wiele innych

UPDATE:
nawet w C można to zrobić wg mnie sennsowniej


struct Wynik {
   int maximum;
   int ilosc;
}

bool /* jest jakikolwiek wynik, albo void */ Funkcja(....., Wynik * wynik);

lub (ale się nie wykażesz argumentem wskaźnikowym )

Wynik Funkcja(....)
0

@_13th_Dragon: ilość zwrócić przez parametr typu wskaźnikowego

1 użytkowników online, w tym zalogowanych: 0, gości: 1