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

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);

            }
0

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

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-pl/dotnet/csharp/programming-guide/arrays/using-foreach-with-arrays

Pozdrawiam

@Mondonno :)

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];
                }
            }
}
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.

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?

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ć.

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?

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ę?

0
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);
            }
0

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

0

Wielkie dzięki za pomoc. Tymczasowo zrobiłem to trochę inaczej ale w wolnej chwili przerobie tak jak trzeba. Najważniejsze że sama koncepcja działa. Pozdrawiam.

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