Wiam,
chciałbym prosić o pomoc, nakierowanie jak zrobić taką funkcjonalność. Mianowicie mam do zrobienia program formularzowy, który będzie wyświetlał wyniki użytkownikowi w formie tabeli dataGridView w dwóch kolumnach, w pierwszej 'x' a w drugiej 'f(x).

Xd, Xg - dolna i górna granica przedziału x
h - krok (przyrost) zmian wartości x
Do tego wartość funkcji jest obliczana ze wzoru na sumę szeregu potęgowego.

Według tej tabelki:

title
Problem mam z:

** jak wpisać zmieniające się Xd + h (czyli dolną granicę przedziału x z krokiem h) do wzoru w metodzie SumaSzeregu?*

** czy, żeby program obliczał te nowe sumy aż do górnej granicy przedziału Xg, to wystarczy to for(...) w kodzie poniżej?*

** czy zrobić jeszcze jedną metodę na obliczanie tego wszystkiego specjalnie do tabelki?*


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;


namespace 
{
    public partial class Form1 : Form
    {
        void TabelarycznaWizualizacjaSumySzeregu(ref float[,] T, float db_Xd, float db_h, float db_SumaSzeregu, float db_Xg)  
        {
            float db_Xp;    //pierwszy x
            float db_WarFunkcji;    //obliczona wartości f(x)

            db_Xp = db_Xd;  //początkowy x to x odpowiadający górnej granicy przedziału
            db_WarFunkcji = db_SumaSzeregu; //wartość funkcji obliczana z metody SumaSzeregu

            for(int i =0; i <= db_Xg; i++)  //tutaj nie wiem czy dobrze, ale zamysł jest żeby brało następne x aż do ostatniego xd dla którego (Xd + h) <= Xg 
            {
                T[i, 0] = db_Xp;    //w 1 kolumnie tabeli będą zmienne x
                T[i, 1] = db_WarFunkcji;    //w 2 kolumnie będą obliczone f(x)
            }

            db_Xp = db_Xp + db_h;   //tutaj do następnego x ma być dodany krok h 
            //???


        }
        
        bool PobierzDaneWejściowe(out float db_x, out float db_Eps, out float db_Xd, out float db_Xg, out float db_h)
        {
            db_x = 0.0f;    //zmienna x
            db_Eps = 0.0f;  //dokładność obliczeń Epsilon   
            db_Xd = 0.0f;   //dolna granica przedziału dla x
            db_Xg = 0.0f;   //górna granica przedziału dla x
            db_h = 0.0f;    //krok (przyrost) zmian wartości zmiennej x

            if (string.IsNullOrEmpty(txtX.Text))
            {
                errorProvider1.SetError(txtX, "ERROR: proszę podać wartość zmiennej niezależnej x");
                return false;
            }
            else
                errorProvider1.Dispose();
            if (!float.TryParse(txtX.Text, out db_x))
            {
                errorProvider1.SetError(txtX,
                    "ERROR: w zapisie wartości zmiennej niezależnej x wystąpiły niedozwolone znaki");
                return false;
            }
            else errorProvider1.Dispose();
            txtX.Enabled = false;

            if (string.IsNullOrEmpty(txtEps.Text))
            {
                errorProvider1.SetError(txtEps,
                    "ERROR: proszę podać wartość dokładności obliczeń Eps");
                return false;
            }
            else
                errorProvider1.Dispose();
            if (!float.TryParse(txtEps.Text, out db_Eps))
            {
                errorProvider1.SetError(txtEps,
                    "ERROR: w zapisie wartości dokładności obliczeń Eps wystąpiły niedozwolone znaki");
                return false;
            }
            else errorProvider1.Dispose();
            if ((db_Eps <= 0) || (db_Eps >= 1))
            {
                errorProvider1.SetError(txtEps,
                    "ERROR: proszę podać dokładność obliczeń Eps z przedziału (0,1)");
                return false;
            }
            else errorProvider1.Dispose();
            txtEps.Enabled = false;

            if (string.IsNullOrEmpty(txtH.Text))
            {
                errorProvider1.SetError(txtH,
                    "ERROR: proszę podać wartość kroku h zmian wartości zmiennej niezależnej x ");
                return false;
            }
            else errorProvider1.Dispose();

            if (!float.TryParse(txtH.Text, out db_h))
            {
                errorProvider1.SetError(txtH,
                    "ERROR: w zapisie wartości kroku h zmian wartości zmiennej niezależnej x wystąpiły niedozwolone znaki");
                return false;
            }
            else
                errorProvider1.Dispose();
            txtH.Enabled = false;

            if (string.IsNullOrEmpty(txtXd.Text))
            {
                errorProvider1.SetError(txtXd,
                    "ERROR: proszę podać wartość dolnej granicy przedziału");
                return false;
            }
            else
                errorProvider1.Dispose();
            if (!float.TryParse(txtXd.Text, out db_Xd))
            {
                errorProvider1.SetError(txtXd,
                    "ERROR: w zapisie dolnej granicy przedziału wystąpiły niedozwolone znaki");
                return false;
            }
            else
                errorProvider1.Dispose();
            txtXd.Enabled = false;

            if (string.IsNullOrEmpty(txtXg.Text))
            {
                errorProvider1.SetError(txtXg,
                    "ERROR: proszę podać wartość górnej granicy przedziału");
                return false;
            }
            else
                errorProvider1.Dispose();
            if (!float.TryParse(txtXg.Text, out db_Xg))
            {
                errorProvider1.SetError(txtXg,
                    "ERROR: w zapisie wartości górnej granicy przedziału wystąpiły niedozwolone znaki");
                return false;
            }
            else
                errorProvider1.Dispose();
            txtXg.Enabled = false;

            return true;
        }
        
        static void db_SumaSzereguFunkcyjnego(float db_x, float db_Eps, out float
       db_SumaSzeregu, out int db_LicznikWyrazówSzeregu)
        {   //deklaracje lokalne
            float db_a;//wyraz szeregu funkcyjnego
            int db_k;//nr wyrazu szeregu funkcyjnego
            //ustawienie początkowego stanu obliczeń
            db_a = 2 - db_x;//wartość 1. wyrazu
            db_k = 1;//licznik wyrazów
            db_SumaSzeregu = db_a;
            //wyznaczenie sumy szeregu funkcyjnego
            do
            {
                //wyznaczenie indeksu(numeru) kolejnego wyrazu szeregu
                db_k++;
                //wyznaczenie k-tego wyrazu szeregu
                db_a *= (float)Math.Sqrt(1 - (1 / db_k)) * (2 - db_x);
                //obliczenie sumy k wyrazów szeregu
                db_SumaSzeregu += db_a;

            } while (Math.Abs(db_a) > db_Eps);
            //przekazanie liczby zsumowanych wyrazów szeregu przez
            //parametr wyjściowy (out) LicznikWyrazówSzeregu
            db_LicznikWyrazówSzeregu = db_k;
        }
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void wykresToolStripMenuItem_Click(object sender, EventArgs e)
        {

        }

        private void button3_Click(object sender, EventArgs e)
        {
            float db_x, db_Eps, db_Xd, db_Xg,db_h;
            float db_SumaSzeregu;
            int db_LicznikZsumowanychWyrazów;



            if(!PobierzDaneWejściowe(out db_x, out db_Eps, out  db_Xd, out  db_Xg, out db_h))
            {
                errorProvider1.SetError(btnObliczWartośćFunkcji,
                    "ERROR: błąd w pobieraniu danych wejściowych");
                return;
            }

            db_SumaSzereguFunkcyjnego(db_x, db_Eps, out db_SumaSzeregu, out db_LicznikZsumowanychWyrazów);

            txtWynik.Text = db_SumaSzeregu.ToString();
            txtWynik.Enabled = false;

        }

        private void dgvTabela_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }

        private void txtWynik_TextChanged(object sender, EventArgs e)
        {

        }

        private void kolorTłaToolStripMenuItem_Click(object sender, EventArgs e)
        {
           
        }

        private void kolorLiniiWykresuToolStripMenuItem_Click(object sender, EventArgs e)
        {
           
        }

        private void chartWykres_Click(object sender, EventArgs e)
        {

        }

        private void btnGraficzna_Click(object sender, EventArgs e)
        {

        }

        private void oProgramieToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Program", "Informacja o programie", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {

        }

        private void btnTabela_Click(object sender, EventArgs e)    //metoda obsługi kliknięcia 'Tabelaryczna Wizualizacja Funkcji'
        {
            /*float db_x, db_Eps, db_Xd, db_Xg, db_h, db_SumaSzeregu;
            if (!PobierzDaneWejściowe(out db_x, out db_Eps, out db_Xd, out db_Xg, out db_h))
                return;

            float[,] TRL = new float [] ------------> ???
            
             */
        }
    }
}