Obliczanie średniej kwadratowej - co jest nie tak?

0

Witam, próbowałem zrobić na zaliczenie program do liczenia średniej kwadratowej wg wzoru na nią, ale wynik końcowy wychodzi zły. Próbowałem na różne strony to zmieniać itd. ale już nie mam pomysłu. Być może błąd jest w części gdzie każdy wyraz licznika trzeba podnieść do potęgi i potem zsumować. Nie wiem jak to inaczej zrobić. :(

Proszę o pomoc albo wskazówki.

Problem: wychodzi zły wynik końcowy.
Jak ma działać: obliczać prawidłowo średnią kwadratową podanych wyrazów.

  {
                    {
                        int db_n;
                        float db_wynik;
                        float db_a, db_D, db_S = 0.0f;
                        Console.WriteLine("\n\tObliczamy średnią kwadratową wyrazów ciągu arytmetycznego");

                        do  //dla zapewnienia spełnienia warunku wejściowego dla n, n>0
                        {   //wczytanie wartości n
                            Console.Write("\n\tPodaj wartość (liczbę) n: ");
                            while (!int.TryParse(Console.ReadLine(), out db_n))
                            {
                                Console.WriteLine("\n\tERROR: w zapisie liczby n wystąpił niedozwolony znak");
                                Console.Write("\n\tPodaj wartość n jeszcze raz, ale uważaj, co piszesz.");
                            }

                            //sprawdzenie warunku wejściowego
                            if (db_n <= 0)
                            {
                                Console.WriteLine("\n\tERROR: liczba musi być > 0");
                                Console.Write("\n\tPodaj wartość n jeszcze raz, ale uważaj, co piszesz.");
                            }
                        } while (db_n <= 0); /* gdy warunek n <= 0 przyjmie wartość true, 
                                 to nastąpi powtórzenie wartości n */

                        //obliczenie sumy wyrazów ciągu liczbowego
                        for (int db_i = 1; db_i <= db_n; db_i++)
                        {
                            Console.Write("\n\tPodaj {0}-ą wartość ciągu liczbowego: ", db_i);
                            while (!float.TryParse(Console.ReadLine(), out db_a))
                            {
                                Console.WriteLine("\n\tERROR: w zapisie {0}-go wyrazu ciągu liczbowego"
                                    + "wystąpił niedozwolony \n\t\t znak", db_i);
                                Console.Write("\n\tPodaj wartość wyrazu ciągu liczbowego jeszcze raz,"
                                    + "ale uważaj\n\t co piszesz: ");

                            }
                            /*w tym miejscu wartość wyrazu a jest "poprawna"
                             * obliczenie wyniku ze wzoru na średnią kwadratową */
                            db_S = (float)Math.Pow(db_S, 2) + (float)Math.Pow(db_a, 2); //sumowanie licznika
                           
                        }
                        
                        db_D = db_S / db_n;     //podzielenie licznika przez n
                        db_wynik = (float)Math.Sqrt(db_D);  //pierwiastek kw. z otrzymanej liczby
                        Console.WriteLine("\n\tŚrednia kwadratowa podanych wyrazów jest równa {0,6:F3}", db_wynik);
                    Console.WriteLine("\n\tDla kontynuacji programu naciśnij dowolny klawisz");
                    Console.ReadKey();

                } 
0
db_S = (float)Math.Pow(db_S, 2) + (float)Math.Pow(db_a, 2);

za każdą iteracją podnosisz cały wynik do kwadratu, wiec wychodzi ci jakaś astronomiczna wielkość.

Poza tym tak się tego nie robi.
Zrób z tego kolekcję danych i oblicz wynik z tej kolekcji za pomocą osobnej funkcji.

W zasadzie każda funkcja, która ma więcej niż 20 linii (albo więcej niż 3 instrukcje sterujące: if, while, switch) prawie na pewno będzie źle, bo mało kto coś takiego ogarnie.

Poza tym im szybciej nauczysz się korzystać z Debuggera tym lepiej (wtedy sam byś to wypatrzył w maks 2 minuty)

1

korzystaj z dobroci jezyka

using System;
using System.Collections.Generic;
using System.Linq;

public class Test
{
	public static void Main()
	{
		List<int> liczby = new List<int> {1,2,3,4,5,6,7,8,9};
		var liczbyDoKwadratu = liczby.Select( liczba => liczba*liczba);
		var suma = liczbyDoKwadratu.Sum();
		
		Console.WriteLine(Math.Sqrt(suma / liczby.Count));
		
	}
} 

liczby jest to to dynamiczna lista typu int
liczbyDoKwadratu jest ta sama lista tylko wszystkie liczby zostaly podniesione do kwadratu za pomoca funkcji lambda

liczba => liczba*liczba 

Pozniej mamy suma (jest typu int). Mozesz to polaczyc razem, ale dla przykladu zrobilem to osobno zeby bylo bardziej czytelnie dla Ciebie. Bo mozesz zrobic tak

var suma = liczby.Sum(liczba => liczba*liczba); 
0

Kolekcji danych jeszcze nie miałem i raczej nie mogę tu używać. Tak jak wyżej, analogicznie, robił wykładowca i wg tego kazał nam zrobić projekt. Szczerze, sam bym tego nie napisał całego, tylko dopisałem to co umiałem pod ten wzór.

0

Zapytaj sie wykladowcy czy mozesz uzywac kolekcji i jezeli nie to zapytaj sie dlaczego

To samo co ja napisalem, mozesz napisac na tablicy. Bo tablica jest tez kolekcja w C# (a dokladniej dziedziczy po IEnumerbale)

tutaj dowod

http://ideone.com/NOnXZc

0

Dziękuję bardzo za pomoc, ale sobie to podaruje i po prostu oddam, to co niby działa.
Nie wiem nawet jak zrobić, żeby do tego Twojego kodu poszły liczby, które użytkownik wpisuje.

0
List<int> userInts = new List<int>();

for (int i = 0; i < 5; i++)
{
    string userValue = Console.ReadLine();
    int userInt;
    if (int.TryParse(userValue, out userInt))
    {
        userInts.Add(userInt);
    }
} 

https://www.google.nl/search?q=user+input+as+int+to+list+C%23&oq=user+input+as+int+to+list+C%23&aqs=chrome..69i57.8255j0j7&sourceid=chrome&ie=UTF-8

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