Średnia arytmetyczna elementów w tablicy

1

Część, to mój pierwszy post, mam nadzieję, że wygląda jak należy. Mam zadanie do rozwiązania i utknąłem. Ostatnia pętla oczywiście nie działa ponieważ mieszam wartości z adresami. Nie mam pomysłu jak to rozwiązać i czy w ogóle idę w dobrą stronę.

Treść zadania: Napisz program, który oblicza średnią arytmetyczną elementów leżących pomiędzy elementem minimalnym i maksymalnym w tablicy liczb całkowitych. Przyjmij, że maksymalny rozmiar tablicy to 20. Zadanie należy rozwiązać w oparciu o wskaźniki (bez używania operatora []).

#include <iostream>
#include <ctime>
using namespace std;

int main()
{
    int n, tab[20];
    int *wn = &n;
    int *wtab = tab;
    cout << "Podaj rozmiar tablicy: ";
    cin >> *wn;
    srand(time(NULL));
    for (int i = 0; i < *wn; i++)
        {
            *wtab = rand()%10;
            wtab++;
        }
    wtab = tab;
    for (int i = 0; i < *wn; i++)
        cout << *(wtab + i) << " ";
    
    int *min;
    min = tab;

    for (int i = 0; i < *wn; i++)
        if (*(wtab + i) < *min)
        min = wtab + i;


    int *max;
    max = tab;

    for (int i = 0; i < *wn; i++)
        if (*(wtab + i) > *max)
        max = wtab + i;

    cout << endl << "Skrajne elementy tablicy to " << *min << " " << *max << endl;


    int suma = 0;
    for (int i = (min + 1); i < max; i++)
        suma = suma + (*(wtab + i));

    cout << "Srednia to " << (suma/ (min - max));

}
5
int tablica[20];
int poczatek = 0, koniec = 19;
int suma = 0;

cin >> poczatek >> koniec;
// tutaj jakas walidacja czy nie przekroczylo zakresu (0-19)
for (int i = poczatek; i < koniec ; i++)
{
  suma += *(tablica + poczatek);
}

cout << "srednia to " << suma / (koniec - suma + 1)

albo uzyc https://en.cppreference.com/w/cpp/algorithm/accumulate wtedy jeszcze prosciej (bo nie musisz robic sam petli) a da sie jeszcze polaczyc ze streamem (np cin >>) to wtedy w ogole jednolinijkowiec ;)

EDIT: ups chyba zle zrozumialem pomiędzy elementem minimalnym i maksymalnym w tablicy liczb całkowitych. ale mozesz uzyc std::min i std::max by To wyciagnac na ktorych sa indeksach i nadal moj kod powyzej bedzie dzialal (zrob sobie z tego funkcje)

4

Zadanie należy rozwiązać w oparciu o wskaźniki (bez używania operatora []).

Co za sadyzm...

Ogółem:

  1. zapewne zadanie chce, abyś operował na wskaźnikach i je przesuwał, a nie emulował operator[] za pomocą *(a+b)
  2. wn jest całkowicie zbędne, nawet w tak sformułowanym zadaniu. Używaj po prostu n.
  3. ostatnia pętla to pewnie ma być coś w stylu for(int* x = min; x <= max; x++) suma += *x;
  4. masz off by one. Jeśli min i max to ta sama liczba, to dzielisz przez zero (a powinno być jeden), więc suma/(min-max+1), ale
  5. co jeśli min > max? Na potrzeby zadania musisz to obsłużyć jakoś, zarówno do sumowania jak i do obliczania średniej

PS: sam pierwszy post wzorowy, żeby każdy tak ładnie pytał...

A tak idiomatycznie, jeśli interesuje Cię nauka:

    auto [min_el, max_el] = minmax_element(arr.cbegin(), arr.cend());
    assert(min_el != arr.cend());
    auto b = min(min_el, max_el);
    auto e = max(min_el, max_el) + 1;
    auto sum = accumulate(b, e, 0);
    auto avg = static_cast<double>(sum) / (distance(b, e) + 1);

https://wandbox.org/permlink/XwMz8PHtMpVY2F6R

0

Ok, dzięki za odpowiedzi. Dokończyłem to w ten sposób. Z tego co potestowałem to wydaje mi się, że działa jak należy.

float suma = 0;

    if (((max - min)-1) > 0)
    {
        for(int *x = (min+1); x < max; x++) suma += *x;
        cout << "srednia to " << suma / ((max - min)-1);
    }
    else if (((min - max) - 1) > 0)
    {
        for(int *x = (max+1); x < min; x++) suma += *x;
        cout << "srednia to " << suma / ((min - max)-1);
    }
    else if (((min - max) - 1) == 0 || ((max - min) - 1) == 0 )
        cout << "Brak elementow pomiedzy min i max";

2

Po kiego tak komplikować? Wystarczy:

if(min>max) swap(max,min);
size_t count=(max-min)-1;
if(count) 
{
    suma double suma=0;
    while(++min<max) suma+=*min;
    cout<<"srednia to "<<suma/count;
}
else cout<<"Brak elementow pomiedzy min i max";
0

Ogółem nawet jak nie ma między nimi elementów (czyli są tym samym elementem) to cały czas można policzyć średnią. Średnia z jednego elementu = ten element.

0

@_13th_Dragon: Dlatego, że to jedne z pierwszych ćwiczeń które robię i staram się korzystać z tego co znam, a to size_t pierwszy raz widzę na oczy.

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