Mediana (własna metoda)

0

Witam. Mam problem z napisaniem własnej metody w której zawierałby się kod liczący medianę. Nie bardzo wiem jak wprowadzić liczby z klawiatury do tablicy. Nie bardzo rozumiem również jak stworzyć zależność między ilością liczb a wielkością tablicy (aby potem obliczyć mediane z 2 środkowych liczb - ilość parzysta, wyciągnąć środkową - ilość nieparzysta). Z góry dziękuję za pomoc i pozdrawiam

0

Jak to jak?
int liczba = int.Parse(Console.Readline()) - tak czytasz liczby
Wielkość tablicy to liczba, którą podałeś jako jej rozmiar. Teraz musisz tylko przeszukać całą tablicę, wybrać konkretne elementy i obliczyć medianę.

0

Console.ReadLine - odczyt z klawiatury
double.Parse - konwersja odczytanego tekstu do liczby
List<double> - zamiast tablicy, lista pozwala na dynamiczne dodawanie nowych elementów (metodą Add)

0

Napisałem taki program, jednak on nie działa, gdyż ciągle wyświetla mi mediana=-1. W czym leży problem?

Console.WriteLine("Podaj rozmair tablicy");
int n=Convert.ToInt32(Console.ReadLine());
int[] tablica = new int[n];
Random x = new Random(100);
for (int i = 0; i < n; i++)
{
tablica[i] = x.Next(100);
Console.WriteLine(i);
}

     int mediana;
     mediana = System.Array.IndexOf(tablica,tablica.Length / 2);

// tutaj powinno być zaokrąglanie liczb w gorę
Console.WriteLine("Mediana to " + mediana);

Napisałem, to gdyż chciałem sprawdzić samo obliczenie mediany dla liczb nieparzystych. Niestety i z tym sobie nie poradziłem. Niestety nadal nie wiem jak wprowadzić kilka liczb z klawiatury. Każdą muszę zadeklarować? np. int a=Convert.ToInt16(Console.ReadLine()); i tak samo z b,c,d,e itp? A co w przypadku jeśli nie wiemy ile liczb będziemy wpisywać?
Generalnie mam za zadanie: Utworzyć własną metodę która będzie liczyła medianę.
Szukałem w internecie, niestety nie znalałem rozwiązań moich problemów.
Nie proszę o cały kod, proszę o jego kawałek, bądź kilka wskazówek.
Z góry pozdrawiam

0

Niestety nadal nie wiem jak wprowadzić kilka liczb z klawiatury. Każdą muszę zadeklarować? np. int a=Convert.ToInt16(Console.ReadLine());

Słyszałeś o pętlach? Poczytaj sobie np. o while albo for.

A co w przypadku jeśli nie wiemy ile liczb będziemy wpisywać?

Odpowiedział ci już @somekind:

List<double> - zamiast tablicy, lista pozwala na dynamiczne dodawanie nowych elementów (metodą Add)

Napisałem taki program, jednak on nie działa, gdyż ciągle wyświetla mi mediana=-1. W czym leży problem?

Wyjaśnij proszę własnymi słowami, co uczyniłeś w tej linijce:
mediana = System.Array.IndexOf(tablica,tablica.Length / 2);
i jak to się ma do tego, czym faktycznie jest mediana.

0

1.Owszem o pętlach słyszałem, jednak z mojej wiedzy wynika, iż np. dzięki pętli for możemy zwiększać coś o stałą wartość (np. for(int i=1;i<20;i++). Co w przypadku gdy użytkownik chciałby policzyć medianę z liczb 1,4,,9,17?
2.Co do klasy List, niestety pierwszy raz widzę ją na oczy i daje mi ona jak na razie do myślenia.
3. Mój błąd. Teraz to przemyślałem i jest to kompletnie pozbawione sensu.

2

Wpadłem na pomysł, aby uszeregować rosnąco wyrazy w tablicy,a następnie wywołać indeks środkowy (nieparzysta ilość) lub sumę dwóch środkowych/2 (parzysta ilość). Czy rozumuję w dobrym kierunku? W sumie i tak nie wiem za bardzo jak te indeksy wywołać :(

0

Za Wikipedią:

Aby obliczyć medianę ze zbioru n obserwacji, sortujemy je w kolejności od najmniejszej do największej i numerujemy od 1 do n. Następnie, jeśli n jest nieparzyste, medianą jest wartość obserwacji w środku (czyli obserwacji numer (n+1)/2). Jeśli natomiast n jest parzyste, wynikiem jest średnia arytmetyczna między dwiema środkowymi obserwacjami, czyli obserwacją numer n/2 i obserwacją numer n/2 + 1.

Czyli wygląda na to, że idziesz w dobrym kierunku.

1.Owszem o pętlach słyszałem, jednak z mojej wiedzy wynika, iż np. dzięki pętli for możemy zwiększać coś o stałą wartość (np. for(int i=1;i<20;i++). Co w przypadku gdy użytkownik chciałby policzyć medianę z liczb 1,4,,9,17?
2.Co do klasy List, niestety pierwszy raz widzę ją na oczy i daje mi ona jak na razie do myślenia.

Chłopie, ja tego komentować nie będę - wpisz sobie teraz w google:
while + C#
for + C#
List + C#

I wróć jak będziesz wiedział o czym mówisz.

0

Napisałem coś takiego:

         double mediana;
        Console.WriteLine("Podaj rozmair tablicy");
        int n = Convert.ToInt32(Console.ReadLine());
        int[] tablica = new int[n];
        Random x = new Random(100);
        for (int i = 0; i < n; i++)
        { 
            tablica[i] = x.Next(100);
            System.Array.Sort(tablica);
            Console.WriteLine(i);
        }

        
        mediana=tablica[(((n/2)+(n/2+1))/2)];
        Console.WriteLine("Mediana wynosi " + mediana);

Liczy to medianę dla parzystego rozmiaru tablicy. Niestety brak mi pomysłu odnośnie liczb nieparzystych ;/

0

Przy nieparzystej ilości masz jeszcze łatwiej bo wybierasz tylko środkowy element. Sortowanie możesz wykonać raz po wczytaniu liczb będzie szybciej niż po każdorazowym dodaniu liczby do zbioru w pętli.

0

To mediana=tablica[(((n/2)+(n/2+1))/2)]; nie oblicza mediany dla tablicy o parzystej długości. Mediana powinna być średnią arytmetyczną dwóch wyrazów tablicy.

0
bogdans napisał(a):

To mediana=tablica[(((n/2)+(n/2+1))/2)]; nie oblicza mediany dla tablicy o parzystej długości. Mediana powinna być średnią arytmetyczną dwóch wyrazów tablicy.

Fakt to nie działa ;/ Mógłbym prosić o pomoc w rozwiązaniu tego? Brak mi już pomysłów

0

Tak wygląda mój program:

double mediana;
Console.WriteLine("Podaj rozmair tablicy");
int n = Convert.ToInt32(Console.ReadLine());
int[] tablica = new int[n];
Random x = new Random(100);
for (int i = 0; i < n; i++)
{
tablica[i] = x.Next(100);
} System.Array.Sort(tablica);
{
foreach(int i in tablica)
Console.WriteLine(i);

        }

        if (n % 2 == 0)
        {
            int c, v;
            c = tablica[n / 2];
            v = tablica[(n / 2) + 1];
            mediana = tablica[((c+v)/2)];
            Console.WriteLine("Mediana wynosi " + mediana);

        }
        else
        {
            mediana = tablica[(n / 2)];
            Console.WriteLine("Mediana wynosi " + mediana);

Wydaje mi się, iż powinien działać, jednak mam problem z losowaniem liczb. Z komunikatu wnioskuję, iż Random x = new Random(100); losuje tylko liczby całkowite. Mediana z liczb parzystych może wyjść z przecinkiem. Jeśli zadeklaruję wsyzstkie zmienne jako double wyskakuje mi błąd przy (int[] tablica = new int[n];) n - iż nie może konwertować int to double. Jak się z tym uporać?

0

double[] tablica = new double[n];

0
 
mediana = tablica[((c+v)/2)];

W tej linii nie wyliczasz mediany. Sięgasz po jedną z wartości w tablicy o indeksie równym (c+v)/2. Poza tym w c# tablice indeksuje się od 0, bierzesz do tej średniej niewłaściwe wartości. Zamiast tablica[n/2] i tablica[n/2 + 1] powinieneś brać tablica[n/2 - 1] i tablica[n/2].

0

Dokładnie tak zrobiłem wcześniej, jednak wtedy wyskakuję błąd przy

c = tablica[n / 2];
v = tablica[(n / 2) + 1];

Cannot implicitly convert type 'double' to 'int'. An explicit conversion exists (are you missing a cast?)

Gdy reszte pozmieniam na double, to wszędzie wyskakują błędy.

0

c i v zmieniłem na double również

double mediana, c, v;
Console.WriteLine("Podaj rozmair tablicy");
int n = Convert.ToInt32(Console.ReadLine());
double[] tablica = new double[n];
Random x = new Random(100);
for (int i = 0; i < n; i++)
{
tablica[i] = x.Next(100);
} System.Array.Sort(tablica);
{
foreach (int i in tablica)
Console.WriteLine(i);

        }

        if (n % 2 == 0)
        {
            
            c = tablica[(n / 2)-1];
            v = tablica[(n / 2)];
            mediana = tablica[((c + v) / 2)];
            Console.WriteLine("Mediana wynosi " + mediana);

        }
        else
        {
            mediana = tablica[(n / 2)];
            Console.WriteLine("Mediana wynosi " + mediana);

Nadal ten sam błąd ;/

0

Wybaczcie, żę jestem taki upierdliwy, ale naprawde robie i nie bardzo mi wychodzi. Muszę to jeszcze zrobić(zadeklarować) jako nową(własną metodę), a czas do jutra ;/

1
 
        static double Mediana(double [] tablica)
        {
            int n = tablica.Length;
            double c, v;
            if (n % 2 == 0)
            {
                c = tablica[(n / 2)-1];
                v = tablica[(n / 2)];
                return (c + v) / 2;          
            }
            else return tablica[(n/2)];
        }

        static void Main(string[] args)
        {
            
            Console.WriteLine("Podaj rozmair tablicy");
            int n = Convert.ToInt32(Console.ReadLine());
            double[] tablica = new double[n];
            Random x = new Random();
            for (int i = 0; i < n; i++)
            {
                tablica[i] = x.Next(100);
            } 
            System.Array.Sort(tablica);
            foreach (int i in tablica)
                Console.WriteLine(i);
            Console.WriteLine("Mediana wynosi " + Mediana(tablica));
            Console.ReadLine();
        }
0

Dziękuję bardzo! Następnym razem zarezerwuje sobie więcej czasu na rozwiązywanie takich (dla mnie jeszcze dość skomplikowanych) problemów. Jeszcze jedna sprawa. Możesz mi powiedzieć czy moje rozumowanie jest prawidłowe?

static double Mediana(double[] tablica) <-parametry ktore musza byc przeslane do metody aby wykonac dana operacje
foreach (int i in tablica) <- generalnie chodzi o wyswietlanie i (widze roznice, bez i z tym, ale dokladnie nie wiem w jaki sposob dziala)
Console.WriteLine("Mediana wynosi " + Mediana(tablica)); <- odwolanie sie do metody Mediana i wykonanie operacji na zmiennej(tablicy) o nazwie tablica?

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