Działanie w pętli i zapis wyników do tablicy

Odpowiedz Nowy wątek
2020-03-26 12:11

Rejestracja: 2 miesiące temu

Ostatnio: 1 miesiąc temu

0

Witam szanownych forumowiczów. Swoją przygodę z programowaniem zacząłem 3 tygodnie temu. Piszę swój pierwszy program i dopiero się uczę o co chodzi w programowaniu (największy sukces to 20 lat temu napisałem program wyświetlający "Hello World" w Pascalu :)). Nie mniej jednak proszę o pomoc bo od kilku dni nie mogę łyknąć pewnego problemu:
Mam równanie:
P2f = (P1 P1a) Math.Exp((-(S Sa) / (V / Va)) Rf);
P1,P1a,S,Sa,V i Va są zmiennymi które deklaruje na początku programu. Potrzebuję zrobić aby powyższe równanie było rozwiązywane tak, że zaczyna tak, że na początku Rf=0 i rozwiązanie równanie podaje P2f (akurat tez wyjdzie 0). Zapisuje użyte Rf i wynik (P2f) do tabeli dwuwymiarowej jako X i Y. Potem zwiększa Rf o zmienną x =Rf*0.01, znowu rozwiązuje równanie i zapisuje podstawione Rf i nowe P2f w kolejne okienka tablicy pod poprzednimi danymi. I tak 100 razy aż x będzie równe Rf. Potem muszę tę tablicę wyświetlić jako chart ale to już opanowałem i myślę ,że sobie poradzę. Poniżej fragment kodu który już napisałem żeby nie było, że liczę tylko na pomoc a sam nawet nie zajrzę do internetu.

  private void button1_Click(object sender, EventArgs e)
        {
            P1 = double.Parse(textBox1.Text);
            P2 = double.Parse(textBox2.Text);
            V = double.Parse(textBox3.Text);
            S = double.Parse(textBox4.Text);
            R = ((V / Va) / (S * Sa) * Math.Log((P1 * P1a) / (P2 * P2a))) * Ra; // pompowanie wstępne
            textBox5.Text = R.ToString();

            for ( double Rf=0; Rf<=R; Rf=R*0.1)
            {
                P2f = (P1 * P1a) * Math.Exp((-(S * Sa) / (V / Va)) * Rf);

            }
edytowany 2x, ostatnio: Ktos, 2020-03-26 21:54
Opublikuj to z syntaxem - AnyKtokolwiek 2020-03-26 13:59
Nie bardzo wiem co to syntax. Cały kod programu ? - sholler 2020-03-26 14:06
Chodziło o oznaczenie kodu, aby się tak nie rozwalał. - Ktos 2020-03-26 21:55

Pozostało 580 znaków

2020-03-26 14:17

Rejestracja: 2 miesiące temu

Ostatnio: 1 miesiąc temu

0

Dołączyłem plik z całym kodem

edytowany 1x, ostatnio: sholler, 2020-03-26 14:19

Pozostało 580 znaków

2020-03-26 21:41

Rejestracja: 11 miesięcy temu

Ostatnio: 11 godzin temu

0

Musisz zrobić string do którego bedziesz to zwracał i wykorzystywał ( Jeśli to bedzie nie jasne to napisz bo jestem na telefonie i pisze na szybko )

Przykładowy kod stringa:

string Test(){

for ( double Rf=0; Rf<=R; Rf=R*0.1)
        {
            P2f = (P1 * P1a) * Math.Exp((-(S * Sa) / (V / Va)) * Rf);

        }

return P2f;

}

Przykład wykorzystania:

System.Console.WriteLine(Test());

I gotowe! Ten pomysł który ci podałem można wykorzystać na wiele sposobów. To co pokazałem to tylko takie demo ;) Mam nadzieję że zrozumiałem twoje pytanie. Jeśli pomogłem zaznacz ptaszek przy mojej odpowiedzi

P. S. Co do pętli w tablicsch to polecam pętlę foreach: https://docs.microsoft.com/pl[...]ays/using-foreach-with-arrays

Pozdrawiam

@Mondonno :)


edytowany 2x, ostatnio: Mondonno, 2020-03-26 21:54

Pozostało 580 znaków

2020-03-27 14:38

Rejestracja: 2 miesiące temu

Ostatnio: 1 miesiąc temu

0

Dzięki za nakierowanie mnie. Nie bardzo kapuje jak mam teraz wypełnić tabelę wartościami Rf i P2f po każdorazowym kroku pętli równania. Poniżej jest co wymyśliłem ale to nie działa i nie bardzo wiem co dalej.

  1. Trzeba utworzyć tablicę, w sumie to nie 100 na 100 ale dynamiczną.
  2. Dalej jest podany kod dla pętli
  3. Poniżej próba wypisania tej tabl;icy dwuwymiarowej.

Proszę o pomoc tylko jak można to z krótkim komentarzem dlaczego tak właśnie. Nie chce spisywać jak małpa tylko się nauczyć.

double[,] table1 = new double[100, 100]; //tworzenie tablicy 1

            double Test()
            {

                for (double Rf = 0; Rf <= R; Rf =R*0.1)
                {
                    P2f = (P1 * P1a) * Math.Exp((-(S * Sa) / (V / Va)) * Rf);

                }

                return P2f;

            }
            for (int i = 0; i <=table1.Length; i++)
            {
                for (int j = 0; j < table1.Length; j++)
                {
                    tab[i, j] = [P2f, Rf];
                }
            }
}
edytowany 3x, ostatnio: sholler, 2020-03-27 14:59
Hej! Twój post prawdopodobnie zawiera niesformatowany kod. Użyj znaczników ``` aby oznaczyć, co jest kodem, będzie łatwiej czytać. (jestem botem, ta akcja została wykonana automatycznie, prawdopodobieństwo 0.9986364) - Tasmanian Devil 2020-03-27 14:57

Pozostało 580 znaków

2020-03-30 18:03

Rejestracja: 2 miesiące temu

Ostatnio: 1 miesiąc temu

0

Próbuje to zrobic przez tablice 1 wymiarową w następujący sposób:

 string Test(double p2f)
            {

                for (double Rf = 0; Rf <= R; Rf = R * 0.1)
                {
                    P2f = (P1 * P1a) * Math.Exp((-(S * Sa) / (V / Va)) * Rf);

                }

                return P2f.ToString();

            }

           string[] tablica1 = new string[100];

            foreach (string i in tablica1)
            {
                tablica1[i] = Test();

            }

Nie bardzo wiem czemu wartości P2f nie wchodzą do tabeli.

umieść kod w znacznik <code=csharp> - Grzegorz Świdwa 2020-03-31 15:07

Pozostało 580 znaków

2020-03-31 14:58

Rejestracja: 9 miesięcy temu

Ostatnio: 17 minut temu

0

Nie wiem co robi ten kod ale jestem prawie pewny że coś tu jet nie tak

for (double Rf = 0; Rf <= R; Rf = R * 0.1)
                {
                    P2f = (P1 * P1a) * Math.Exp((-(S * Sa) / (V / Va)) * Rf);

                }

Z każdym wykonaniem pętli zmieniasz wartość, więc bez sensu ta pętla

Dodatkowo

double Rf = 0; Rf <= R; Rf = R * 0.1

Czy to nie jest pętla nieskończona jeżeli pierwsze sprawdzanie warunku będzie prawdziwe?

edytowany 2x, ostatnio: Grzegorz Świdwa, 2020-03-31 15:01

Pozostało 580 znaków

2020-03-31 15:18

Rejestracja: 2 miesiące temu

Ostatnio: 1 miesiąc temu

0
for (double Rf = 0; Rf <= R; Rf = R * 0.1)
                {
                    P2f = (P1 * P1a) * Math.Exp((-(S * Sa) / (V / Va)) * Rf);

Wszystkie wartości oprócz P2f są znane, podstawiane Rf tez sa znane bo są kolejnymi wartościami (R*0.1) wartości R którą tez znam.
Chodzi o to aby Wykonywać te równanie wielokrotnie za każdą razą podstawiając kolejne wartości Rf. Za każdą razą potrzebuje zapisać wartość Rf którą podstawiam i wartość P2f która wyszła. Najlepiej zapisać do tablicy tak aby można było zrobić wykres wartości P2f w funkcji Rf. Siedzę nad tym już od tygodnia i nie wiem jak to zrobić.

Pozostało 580 znaków

2020-03-31 15:24

Rejestracja: 9 miesięcy temu

Ostatnio: 17 minut temu

0
(double Rf = 0; Rf <= R; Rf = R * 0.1)

Rf = 0 - poczatek
Rf <= R - Warunek kolejnego wykonania pętli
Rf = R * 0.1 - Operacja po każdym wykonaniu pętli

Twój Rf zawsze będzie mniejszy lub równy R, ponieważ po każdym wykonaniu pętli ustawiasz Rf na 1/10 R. Masz pętlę nieskończoną
Poza tym powiedz co nie działa: Dostajesz wyjątek? masz zły wynik? program się zawiesza?

edytowany 2x, ostatnio: Grzegorz Świdwa, 2020-03-31 21:11
Hej! Twój post prawdopodobnie zawiera niesformatowany kod. Użyj znaczników ``` aby oznaczyć, co jest kodem, będzie łatwiej czytać. (jestem botem, ta akcja została wykonana automatycznie, prawdopodobieństwo 0.9929574) - Tasmanian Devil 2020-03-31 15:33
Nieprawda bocie ! - Grzegorz Świdwa 2020-03-31 15:35
Z tego co widzę, to bot uznał, że double Rf = 0; jest kodem, co w zasadzie jest prawdą :) - Ktos 2020-03-31 17:45
Nie, to był cytat nieopakowany w znacznik cytatu ;D Ale bot powinien się domyśleć ! ^^ - Grzegorz Świdwa 2020-03-31 21:11
Dobra. Bot jest mądrzejszy ode mnie. poprawione - Grzegorz Świdwa 2020-03-31 21:11

Pozostało 580 znaków

2020-03-31 15:35

Rejestracja: 2 miesiące temu

Ostatnio: 1 miesiąc temu

0
Grzegorz Świdwa napisał(a):

(double Rf = 0; Rf <= R; Rf = R 0.1)
Rf = 0 - poczatek
Rf <= R - Warunek kolejnego wykonania pętli
Rf = R
0.1 - Operacja po każdym wykonaniu pętli

Twój Rf zawsze będzie mniejszy lub równy R, ponieważ po każdym wykonaniu pętli ustawiasz Rf na 1/10 R. Masz pętlę nieskończoną
Poza tym powiedz co nie działa: Dostajesz wyjątek? masz zły wynik? program się zawiesza?

Najczęściej to mi się zawieszał program. Myślałem, że po dojściu do Rf=R na końcu pętli zakończy pracę pętli i przejdzie dalej.Czy to powinno być tak?
(double Rf=0;Rf>R;Rf=R0.1). Zdawało mi się, że kiedy podczas iteracji Rf będzie wieksze to wtedy sie zatrzyma. No bo podstawiane jest Rf za każdą razą większe o wartość R0.1, czyli potem R0.2, R0.3 ,....aż do Rf=R, i kiedy zwiększy do Rf=R*1.1 to sie niezrobi bo warunek jest nie spelniony. Czy coś źle myślę?

Pozostało 580 znaków

2020-03-31 15:38

Rejestracja: 9 miesięcy temu

Ostatnio: 17 minut temu

Rf += 0.1*R

to co innego w porównaniu do

Rf = 0.1*R
public class Obliczenia
        {
            double P1, P2, V, S, R, P1a, Sa, Va;

            public IEnumerable<double> Wyniki
            {
                get
                {
                    for (double Rf = 0; Rf <= R; Rf += R * 0.1)
                    {
                        yield return (P1 * P1a) * Math.Exp((-(S * Sa) / (V / Va)) * Rf);
                    }
                }
            }
        }
Obliczenia o = new Obliczenia();
            foreach(double wynik in o.Wyniki)
            {
                Console.WriteLine(wynik);
            }
edytowany 2x, ostatnio: Grzegorz Świdwa, 2020-03-31 15:40

Pozostało 580 znaków

2020-03-31 15:52

Rejestracja: 2 miesiące temu

Ostatnio: 1 miesiąc temu

0

No faktycznie różnica jest. Dzięki wielkie. Później sprawdzę wzór kodu który podesłałeś.

edytowany 1x, ostatnio: sholler, 2020-03-31 15:52

Pozostało 580 znaków

Odpowiedz

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